diff --git a/app/(pages)/(hackers)/_components/StarterKit/Ideate.tsx b/app/(pages)/(hackers)/_components/StarterKit/Ideate.tsx deleted file mode 100644 index 8c6b49011..000000000 --- a/app/(pages)/(hackers)/_components/StarterKit/Ideate.tsx +++ /dev/null @@ -1,3 +0,0 @@ -export default function Ideate() { - return
Ideate
; -} diff --git a/app/(pages)/(hackers)/_components/StarterKit/Ideate/Ideate.tsx b/app/(pages)/(hackers)/_components/StarterKit/Ideate/Ideate.tsx new file mode 100644 index 000000000..5b05ae97d --- /dev/null +++ b/app/(pages)/(hackers)/_components/StarterKit/Ideate/Ideate.tsx @@ -0,0 +1,15 @@ +import IdeateHero from './IdeateHero'; +import IdeateMentorCallout from './IdeateMentorCallout'; +import IdeatePrinciples from './IdeatePrinciples'; +import IdeateWinningHacks from './IdeateWinningHacks'; + +export default function Ideate() { + return ( +
+ + + + +
+ ); +} diff --git a/app/(pages)/(hackers)/_components/StarterKit/Ideate/IdeateHero.tsx b/app/(pages)/(hackers)/_components/StarterKit/Ideate/IdeateHero.tsx new file mode 100644 index 000000000..9d001c646 --- /dev/null +++ b/app/(pages)/(hackers)/_components/StarterKit/Ideate/IdeateHero.tsx @@ -0,0 +1,33 @@ +import Image from 'next/image'; +import podium from '@public/hackers/starter-kit/ideate/WinnableIdea.svg'; +import IdeateSection from './IdeateSection'; + +export default function IdeateHero() { + return ( + +
+
+

+ A winnable idea is{' '} + + not + {' '} + always the most complicated one. It is clear, purposeful, and rooted + in a real user need. +

+

+ When your team combines impact, audience awareness, and a unique + angle, your project is much more likely to stand out to judges. +

+
+
+ HackDavis animals celebrating on a podium +
+
+
+ ); +} diff --git a/app/(pages)/(hackers)/_components/StarterKit/Ideate/IdeateInfoCard.tsx b/app/(pages)/(hackers)/_components/StarterKit/Ideate/IdeateInfoCard.tsx new file mode 100644 index 000000000..f45171a22 --- /dev/null +++ b/app/(pages)/(hackers)/_components/StarterKit/Ideate/IdeateInfoCard.tsx @@ -0,0 +1,27 @@ +interface IdeateInfoCardProps { + visual: React.ReactNode; + title: string; + description: string; +} + +export default function IdeateInfoCard({ + visual, + title, + description, +}: IdeateInfoCardProps) { + return ( +
+
+ {visual} +
+
+

+ {title} +

+

+ {description} +

+
+
+ ); +} diff --git a/app/(pages)/(hackers)/_components/StarterKit/Ideate/IdeateMentorCallout.tsx b/app/(pages)/(hackers)/_components/StarterKit/Ideate/IdeateMentorCallout.tsx new file mode 100644 index 000000000..961588d1c --- /dev/null +++ b/app/(pages)/(hackers)/_components/StarterKit/Ideate/IdeateMentorCallout.tsx @@ -0,0 +1,56 @@ +import Image from 'next/image'; +import { ArrowRight } from 'lucide-react'; +import mentorGraphic from '@public/hackers/starter-kit/ideate/TalkMentor.svg'; +import IdeateSection from './IdeateSection'; + +export default function IdeateMentorCallout() { + const mentorDiscordLink = 'https://discord.gg/wc6QQEc'; + return ( + +
+
+ HackDavis mentor illustration +
+
+

+ Still Feel Stuck? +

+

+ No worries, we have a panel of industry mentors who are ready to + lend you help at any part of your development process. +

+
+

+ Note: If you have any questions + regarding hackathon events, please contact a{' '} + + director + + . +

+
+
+ + + Contact a mentor + +
+
+
+
+ ); +} diff --git a/app/(pages)/(hackers)/_components/StarterKit/Ideate/IdeatePrinciples.tsx b/app/(pages)/(hackers)/_components/StarterKit/Ideate/IdeatePrinciples.tsx new file mode 100644 index 000000000..052acb4fb --- /dev/null +++ b/app/(pages)/(hackers)/_components/StarterKit/Ideate/IdeatePrinciples.tsx @@ -0,0 +1,57 @@ +import Image from 'next/image'; +import impactImage from '@public/hackers/starter-kit/ideate/Impact.svg'; +import audienceImage from '@public/hackers/starter-kit/ideate/Audience.svg'; +import apartImage from '@public/hackers/starter-kit/ideate/Apart.svg'; +import IdeateInfoCard from './IdeateInfoCard'; +import IdeateSection from './IdeateSection'; + +const principles = [ + { + title: 'Impact Level', + description: + 'Does your product solve a real problem? Strong projects are rooted in something people actually need help with!', + visual: ( + Impact level illustration + ), + }, + { + title: 'Tailor for Audience', + description: + 'Who are your users? What are their pain points? Know who you’re building for. The clearer your user is, the easier it is to make smart product decisions.', + visual: ( + Audience illustration + ), + }, + { + title: 'Set Yourself Apart', + description: + 'What makes your solution unique? Find your twist. Your project does not need to be huge, but it should have something that makes people remember it.', + visual: ( + Set yourself apart illustration + ), + }, +]; + +export default function IdeatePrinciples() { + return ( + +
+ {principles.map((principle) => ( + + ))} +
+
+ ); +} diff --git a/app/(pages)/(hackers)/_components/StarterKit/Ideate/IdeateSection.tsx b/app/(pages)/(hackers)/_components/StarterKit/Ideate/IdeateSection.tsx new file mode 100644 index 000000000..30797c1f2 --- /dev/null +++ b/app/(pages)/(hackers)/_components/StarterKit/Ideate/IdeateSection.tsx @@ -0,0 +1,41 @@ +interface IdeateSectionProps { + eyebrow: string; + title: string; + children: React.ReactNode; + action?: React.ReactNode; +} + +export default function IdeateSection({ + eyebrow, + title, + children, + action, +}: IdeateSectionProps) { + const normalizedEyebrow = eyebrow.trim(); + const normalizedTitle = title.trim(); + const hasHeaderContent = + Boolean(normalizedEyebrow) || Boolean(normalizedTitle) || Boolean(action); + + return ( +
+ {hasHeaderContent ? ( +
+
+ {normalizedEyebrow ? ( +

+ {normalizedEyebrow} +

+ ) : null} + {normalizedTitle ? ( +

+ {normalizedTitle} +

+ ) : null} +
+ {action} +
+ ) : null} + {children} +
+ ); +} diff --git a/app/(pages)/(hackers)/_components/StarterKit/Ideate/IdeateWinningHacks.tsx b/app/(pages)/(hackers)/_components/StarterKit/Ideate/IdeateWinningHacks.tsx new file mode 100644 index 000000000..0546d7a77 --- /dev/null +++ b/app/(pages)/(hackers)/_components/StarterKit/Ideate/IdeateWinningHacks.tsx @@ -0,0 +1,66 @@ +import patientSimImage from '@public/hackers/starter-kit/ideate/patient_sim_ai.png'; +import nomadImage from '@public/hackers/starter-kit/ideate/nomad.png'; +import skinScreenImage from '@public/hackers/starter-kit/ideate/SkinScreen.png'; +import { ArrowUpRight } from 'lucide-react'; +import { Button } from '@globals/components/ui/button'; +import IdeateSection from './IdeateSection'; +import WinningHackCard from './WinningHackCard'; + +const devPostLink = 'https://hackdavis-2024.devpost.com/project-gallery'; + +const winningHacks = [ + { + award: 'Best Hack for Social Good', + year: '2024', + title: 'PatientSimAI', + description: + 'PatientSimAI is a web app using AI and GPT-4 to simulate patient interactions, aiding clinical training, enhancing medical education, and building practical skills.', + link: 'https://devpost.com/software/patientsimai', + image: patientSimImage, + }, + { + award: 'Best Hack for Social Good', + year: '2024', + title: 'nomad /\\', + description: + 'Users can place pins for homeless individuals or lost animals, alerting organizations to assist. The app also encourages donations, volunteering, and offers local business rewards.', + link: 'https://devpost.com/software/nomad-xmlf65', + image: nomadImage, + }, + { + award: 'Best Health Hack', + year: '2023', + title: 'SkinScreen', + description: + 'SkinScreen is a mobile app that uses deep learning to analyze photos of skin lesions and identify potential skin conditions, helping users detect possible skin cancer early and access educational resources for better skin health.', + link: devPostLink, + image: skinScreenImage, + }, +]; + +export default function IdeateWinningHacks() { + return ( + + + + See All + + + } + > +
+ {winningHacks.map((hack) => ( + + ))} +
+
+ ); +} diff --git a/app/(pages)/(hackers)/_components/StarterKit/Ideate/WinningHackCard.tsx b/app/(pages)/(hackers)/_components/StarterKit/Ideate/WinningHackCard.tsx new file mode 100644 index 000000000..8f256a419 --- /dev/null +++ b/app/(pages)/(hackers)/_components/StarterKit/Ideate/WinningHackCard.tsx @@ -0,0 +1,57 @@ +import Image, { StaticImageData } from 'next/image'; + +interface WinningHackCardProps { + award: string; + year: string; + title: string; + description: string; + link: string; + image?: StaticImageData; + visual?: React.ReactNode; +} + +export default function WinningHackCard({ + award, + year, + title, + description, + link, + image, + visual, +}: WinningHackCardProps) { + return ( + +
+
+ {image ? ( + {title} + ) : ( + visual + )} +
+
+

+ {award} {year} +

+

+ {title} +

+

+ {description} +

+
+
+
+ ); +} diff --git a/app/(pages)/(hackers)/_components/StarterKit/Introduction.tsx b/app/(pages)/(hackers)/_components/StarterKit/Introduction.tsx index 4731389ac..e18da08f8 100644 --- a/app/(pages)/(hackers)/_components/StarterKit/Introduction.tsx +++ b/app/(pages)/(hackers)/_components/StarterKit/Introduction.tsx @@ -3,7 +3,7 @@ import mascots from '@public/hackers/starter-kit/introduction/startkit_mascots.s export default function Introduction() { return ( -
+
hackdavis mascots looking at computer
diff --git a/app/(pages)/(hackers)/_components/StarterKit/StarterKit.tsx b/app/(pages)/(hackers)/_components/StarterKit/StarterKit.tsx index 7fc10ee08..96332955d 100644 --- a/app/(pages)/(hackers)/_components/StarterKit/StarterKit.tsx +++ b/app/(pages)/(hackers)/_components/StarterKit/StarterKit.tsx @@ -2,7 +2,7 @@ import DesignResources from './DesignResources'; import DevResources from './DevResources'; -import Ideate from './Ideate'; +import Ideate from './Ideate/Ideate'; import Introduction from './Introduction'; import MoreTips from './MoreTips'; import TeamBuilding from './TeamBuilding'; diff --git a/public/hackers/starter-kit/ideate/Apart.svg b/public/hackers/starter-kit/ideate/Apart.svg new file mode 100644 index 000000000..86c5eb708 --- /dev/null +++ b/public/hackers/starter-kit/ideate/Apart.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/hackers/starter-kit/ideate/Audience.svg b/public/hackers/starter-kit/ideate/Audience.svg new file mode 100644 index 000000000..f68c28ebd --- /dev/null +++ b/public/hackers/starter-kit/ideate/Audience.svg @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/hackers/starter-kit/ideate/Impact.svg b/public/hackers/starter-kit/ideate/Impact.svg new file mode 100644 index 000000000..8f0167554 --- /dev/null +++ b/public/hackers/starter-kit/ideate/Impact.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/hackers/starter-kit/ideate/SkinScreen.png b/public/hackers/starter-kit/ideate/SkinScreen.png new file mode 100644 index 000000000..a9bd4f1e8 Binary files /dev/null and b/public/hackers/starter-kit/ideate/SkinScreen.png differ diff --git a/public/hackers/starter-kit/ideate/TalkMentor.svg b/public/hackers/starter-kit/ideate/TalkMentor.svg new file mode 100644 index 000000000..e0c6e9ef1 --- /dev/null +++ b/public/hackers/starter-kit/ideate/TalkMentor.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/public/hackers/starter-kit/ideate/WinnableIdea.svg b/public/hackers/starter-kit/ideate/WinnableIdea.svg new file mode 100644 index 000000000..0f75a2dcb --- /dev/null +++ b/public/hackers/starter-kit/ideate/WinnableIdea.svg @@ -0,0 +1,133 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +