diff --git a/public/cindy.jpg b/public/cindy.jpg new file mode 100644 index 0000000..a1dc6e4 Binary files /dev/null and b/public/cindy.jpg differ diff --git a/public/huajie.png b/public/huajie.png new file mode 100644 index 0000000..6dab303 Binary files /dev/null and b/public/huajie.png differ diff --git a/public/nick.jpg b/public/nick.jpg new file mode 100644 index 0000000..9f9b026 Binary files /dev/null and b/public/nick.jpg differ diff --git a/public/pratyush.jpg b/public/pratyush.jpg new file mode 100644 index 0000000..fb9280b Binary files /dev/null and b/public/pratyush.jpg differ diff --git a/src/app/page.tsx b/src/app/page.tsx index a8c87d9..289c728 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -4,6 +4,7 @@ import { AuthButtons } from "@ui/auth-buttons"; import { Button } from "@/components/ui/button"; import { TypesGrid } from "@/components/types-grid"; import { config } from "@/lib/config"; +import ResultsMain from "@/components/results/main"; async function getSurveyCount() { try { @@ -87,8 +88,8 @@ export default async function Home() { - {/* Types Section */} - + {/* Results Section */} + ); } diff --git a/src/app/type/[typeCode]/page.tsx b/src/app/type/[typeCode]/page.tsx new file mode 100644 index 0000000..b298f4b --- /dev/null +++ b/src/app/type/[typeCode]/page.tsx @@ -0,0 +1,79 @@ +import { COUPLE_TYPES, CoupleTypeCode } from "@/lib/constants/coupleTypes"; +import { notFound } from "next/navigation"; +import Image from "next/image"; +import dynamic from "next/dynamic"; + +interface TypePageProps { + params: Promise<{ + typeCode: string; + }>; +} + +export default async function TypePage({ params }: TypePageProps) { + // Await params in Next.js 15+ + const { typeCode } = await params; + + // Fixes naming scheme + const enumKey = typeCode.toUpperCase().replace(/-/g, '_') as CoupleTypeCode; + const coupleType = COUPLE_TYPES[enumKey]; + + // If type not found, show 404 + if (!coupleType) { + notFound(); + } + + // Import Component for later + const Component = dynamic( + () => import(`@/components/types/${typeCode}`), + { + loading: () =>
Loading...
, + ssr: true + } + ); + + return ( +
+
+
+ {/* Header Section probs should just render evevrything in component in final draft but im lazy for this*/} +
+
+
+ {coupleType.displayName} +
+
+

{coupleType.displayName}

+

{coupleType.shortDescription}

+
+ + {/* Content Section - Render the actual component */} +
+ +
+
+
+
+ ); +} + +export async function generateStaticParams() { + return Object.values(COUPLE_TYPES).map((type) => ({ + typeCode: type.code.toLowerCase().replace(/_/g, '-'), + })); +} diff --git a/src/app/type/page.tsx b/src/app/type/page.tsx new file mode 100644 index 0000000..d190328 --- /dev/null +++ b/src/app/type/page.tsx @@ -0,0 +1,140 @@ +import { COUPLE_TYPES } from "@/lib/constants/coupleTypes"; +import { Button } from "@/components/ui/button"; +import Link from "next/link"; +import Image from "next/image"; + +export default function CoupleTypesPage() { + const coupleTypes = Object.values(COUPLE_TYPES); + + return ( +
+ {/* Row 1 - Types 1-4 */} +
+
+
+ {coupleTypes.slice(0, 4).map((type, index) => ( +
+
+ {type.displayName} +
+
+

{type.displayName}

+

+ {type.shortDescription} +

+ + + +
+
+ ))} +
+
+
+ + {/* Row 2 - Types 5-8 */} +
+
+
+ {coupleTypes.slice(4, 8).map((type, index) => ( +
+
+ {type.displayName} +
+
+

{type.displayName}

+

+ {type.shortDescription} +

+ + + +
+
+ ))} +
+
+
+ + {/* Row 3 - Types 9-12 */} +
+
+
+ {coupleTypes.slice(8, 12).map((type, index) => ( +
+
+ {type.displayName} +
+
+

{type.displayName}

+

+ {type.shortDescription} +

+ + + +
+
+ ))} +
+
+
+ + {/* Row 4 - Types 13-16 */} +
+
+
+ {coupleTypes.slice(12, 16).map((type, index) => ( +
+
+ {type.displayName} +
+
+

{type.displayName}

+

+ {type.shortDescription} +

+ + + +
+
+ ))} +
+
+
+
+ ); +} \ No newline at end of file diff --git a/src/components/navbar/desktop.tsx b/src/components/navbar/desktop.tsx index ea2c983..2609291 100644 --- a/src/components/navbar/desktop.tsx +++ b/src/components/navbar/desktop.tsx @@ -17,6 +17,7 @@ import { NavigationMenuList, } from "@/components/ui/navigation-menu"; import { navigationItems, type NavItem } from "./nav-config"; +import { TypeIndicatorDropdown } from "./type-indicator-dropdown"; export function DesktopNavbar() { const { data: session } = useSession(); @@ -40,14 +41,18 @@ export function DesktopNavbar() { {filteredNavItems.map((item) => ( - - - {item.label} - - + {item.label === "Type Indicator" ? ( + + ) : ( + + + {item.label} + + + )} ))} diff --git a/src/components/navbar/nav-config.ts b/src/components/navbar/nav-config.ts index 8a8dcac..7dfe645 100644 --- a/src/components/navbar/nav-config.ts +++ b/src/components/navbar/nav-config.ts @@ -19,4 +19,8 @@ export const navigationItems: NavItem[] = [ label: "About", href: "/about", }, + { + label: "Type Indicator", + href: "/type", + } ]; diff --git a/src/components/navbar/type-indicator-dropdown.tsx b/src/components/navbar/type-indicator-dropdown.tsx new file mode 100644 index 0000000..6cb81f4 --- /dev/null +++ b/src/components/navbar/type-indicator-dropdown.tsx @@ -0,0 +1,101 @@ +"use client"; + +import Link from "next/link"; +import { COUPLE_TYPES } from "@/lib/constants/coupleTypes"; +import { + NavigationMenu, + NavigationMenuContent, + NavigationMenuItem, + NavigationMenuLink, + NavigationMenuList, + NavigationMenuTrigger, +} from "@/components/ui/navigation-menu"; + +export interface DropdownItem { + label: string; + href: string; +} + +// Generate dropdown items from couple types +const generateTypeIndicatorDropdown = (): DropdownItem[] => { + return Object.values(COUPLE_TYPES) + .filter(coupleType => coupleType && coupleType.displayName && coupleType.code) + .map((coupleType) => ({ + label: coupleType.displayName, + href: `/type/${coupleType.code.toLowerCase().replace(/_/g, '-')}`, + })); +}; + +interface TypeIndicatorDropdownProps { + dropdown?: DropdownItem[]; +} + +export function TypeIndicatorDropdown({ dropdown = generateTypeIndicatorDropdown() }: TypeIndicatorDropdownProps) { + return ( + + + + + Type Indicator + + + {/* Row 1 */} +
+ {dropdown.slice(0, 4).map((dropdownItem, index) => ( + + +
+ {dropdownItem.label || 'Loading...'} +
+ +
+ ))} +
+
+ + {/* Row 2 */} +
+ {dropdown.slice(4, 8).map((dropdownItem, index) => ( + + +
+ {dropdownItem.label || 'Loading...'} +
+ +
+ ))} +
+
+ + {/* Row 3 */} +
+ {dropdown.slice(8, 12).map((dropdownItem, index) => ( + + +
+ {dropdownItem.label || 'Loading...'} +
+ +
+ ))} +
+
+ + {/* Row 4 */} +
+ {dropdown.slice(12, 16).map((dropdownItem, index) => ( + + +
+ {dropdownItem.label || 'Loading...'} +
+ +
+ ))} +
+
+
+
+
+ ); +} \ No newline at end of file diff --git a/src/components/results/dateIdeas.tsx b/src/components/results/dateIdeas.tsx new file mode 100644 index 0000000..10f231f --- /dev/null +++ b/src/components/results/dateIdeas.tsx @@ -0,0 +1,50 @@ +import React from 'react'; +import { CoupleTypeDefinition } from '../../lib/constants/coupleTypes'; + +interface DateIdeaProps { + coupleType: CoupleTypeDefinition +} + +const DateIdeas: React.FC = ({ coupleType }) => { + return ( + <> +
+

Date Ideas:

+
+ {coupleType.description.dateIdeas && coupleType.description.dateIdeas.length > 0 ? ( +
    + {coupleType.description.dateIdeas.map((idea, index) => ( +
  • {idea}
  • + ))} +
+ ) : ( +

No date ideas available for this couple type yet.

+ )} +
+
+ + {/* How to Resolve Conflict */} +
+

How to Resolve Conflict

+
+ {coupleType.description.conflictResolution ? ( +
+

{coupleType.description.conflictResolution.style}

+ {coupleType.description.conflictResolution.tips && coupleType.description.conflictResolution.tips.length > 0 && ( +
    + {coupleType.description.conflictResolution.tips.map((tip, index) => ( +
  • {tip}
  • + ))} +
+ )} +
+ ) : ( +

Conflict resolution guidance coming soon.

+ )} +
+
+ + ); +}; + +export default DateIdeas; \ No newline at end of file diff --git a/src/components/results/descriptions.tsx b/src/components/results/descriptions.tsx new file mode 100644 index 0000000..c11e778 --- /dev/null +++ b/src/components/results/descriptions.tsx @@ -0,0 +1,45 @@ +import React from 'react'; +import { CoupleTypeDefinition } from '../../lib/constants/coupleTypes'; + +interface DescriptionsProps { + coupleType: CoupleTypeDefinition; +} + +const Descriptions: React.FC = ({ coupleType }) => { + return ( +
+

{coupleType.displayName}

+
+

{coupleType.shortDescription}

+ + {coupleType.description.summary && ( +

{coupleType.description.summary}

+ )} + + {coupleType.description.traits && coupleType.description.traits.length > 0 && ( +
+

Key Traits:

+
    + {coupleType.description.traits.map((trait, index) => ( +
  • {trait}
  • + ))} +
+
+ )} + + {coupleType.description.strengths && coupleType.description.strengths.length > 0 && ( +
+

Strengths:

+
    + {coupleType.description.strengths.map((strength, index) => ( +
  • {strength}
  • + ))} +
+
+ )} +
+
+ ); +}; + +export default Descriptions; \ No newline at end of file diff --git a/src/components/results/loveLanguages.tsx b/src/components/results/loveLanguages.tsx new file mode 100644 index 0000000..55ac4fb --- /dev/null +++ b/src/components/results/loveLanguages.tsx @@ -0,0 +1,57 @@ + +import React from 'react'; +import { CoupleTypeDefinition } from '../../lib/constants/coupleTypes'; + +interface LoveLanguagesProps { + coupleType: CoupleTypeDefinition; +} + +const LoveLanguages: React.FC = ({ coupleType }) => { + return ( +
+

Love Languages

+ + {coupleType.description.loveLanguages ? ( +
+ {/* Primary Love Languages - Left Side */} +
+

Primary Love Languages:

+ {coupleType.description.loveLanguages.primary && coupleType.description.loveLanguages.primary.length > 0 ? ( +
+ {coupleType.description.loveLanguages.primary.map((language, index) => ( +
+
+ {language} +
+ ))} +
+ ) : ( +

No primary love languages defined

+ )} +
+ + {/* Secondary Love Languages - Right Side */} +
+

Secondary Love Languages:

+ {coupleType.description.loveLanguages.secondary && coupleType.description.loveLanguages.secondary.length > 0 ? ( +
+ {coupleType.description.loveLanguages.secondary.map((language, index) => ( +
+
+ {language} +
+ ))} +
+ ) : ( +

No secondary love languages defined

+ )} +
+
+ ) : ( +

Love language information coming soon.

+ )} +
+ ); +}; + +export default LoveLanguages; diff --git a/src/components/results/main.tsx b/src/components/results/main.tsx new file mode 100644 index 0000000..4f6e473 --- /dev/null +++ b/src/components/results/main.tsx @@ -0,0 +1,40 @@ +import React from 'react'; +import WeirdAcronyms from './weirdAcroynms'; +import Descriptions from './descriptions'; +import DateIdeas from './dateIdeas'; +import LoveLanguages from './loveLanguages'; +import { COUPLE_TYPES, CoupleTypeCode } from '../../lib/constants/coupleTypes'; + +const ResultsMain: React.FC = () => { + // Default to COZY_HOMEBODIES for testing purposes + const defaultCoupleType = COUPLE_TYPES[CoupleTypeCode.COZY_HOMEBODIES]; + + return ( +
+
+ + {/* Top Row */} +
+ {/* Descriptions Box */} +
+ +
+ {/* Type Indicators */} +
+ +
+
+ + {/* Middle Row */} +
+ +
+ + {/* Bottom Row */} + +
+
+ ); +}; + +export default ResultsMain; \ No newline at end of file diff --git a/src/components/results/weirdAcroynms.tsx b/src/components/results/weirdAcroynms.tsx new file mode 100644 index 0000000..bf67252 --- /dev/null +++ b/src/components/results/weirdAcroynms.tsx @@ -0,0 +1,75 @@ +"use client"; + +import React, { useState } from 'react'; +import { CoupleTypeDefinition } from '../../lib/constants/coupleTypes'; + +interface WeirdAcronymsProps { + coupleType: CoupleTypeDefinition; +} + +const WeirdAcronyms: React.FC = ({ coupleType }) => { + const [selectedTab, setSelectedTab] = useState('s&p'); + + const tabs = [ + { key: 's&p', label: 'S & P' }, + { key: 'p&e', label: 'P & E' }, + { key: 'a&r', label: 'A & R' } + ]; + + const getDescriptorContent = (key: string) => { + const baseDescriptor = coupleType.description.descriptorWords?.[key as keyof typeof coupleType.description.descriptorWords] || ''; + + switch (key) { + case 's&p': + return { + title: 'Structured & Planned', + content: `${baseDescriptor}. You both thrive when there's a clear plan in place. Whether it's organizing your weekly schedules, planning vacations months in advance, or maintaining organized living spaces, structure brings you comfort and success. You appreciate routines and find security in predictability.` + }; + case 'p&e': + return { + title: 'Private & Emotional', + content: `${baseDescriptor}. Your relationship flourishes in intimate, private settings where you can be vulnerable and authentic with each other. You value deep emotional connections over surface-level interactions. Heart-to-heart conversations, meaningful gestures, and creating safe spaces for sharing feelings are central to your bond.` + }; + case 'a&r': + return { + title: 'Analytical & Reflective', + content: `${baseDescriptor}. You both enjoy thinking deeply about life, relationships, and personal growth. You approach challenges thoughtfully, prefer to understand the 'why' behind things, and often process experiences through discussion and reflection. Your conversations tend to be meaningful and thought-provoking.` + }; + default: + return { title: '', content: '' }; + } + }; + + return ( +
+ {/* Tab Buttons */} + {tabs.map((tab) => ( + + ))} + + {/* Descriptor Box */} +
+
+

+ {getDescriptorContent(selectedTab).title} +

+

+ {getDescriptorContent(selectedTab).content} +

+
+
+
+ ); +}; + +export default WeirdAcronyms; \ No newline at end of file diff --git a/src/components/types/adventurous-planners.tsx b/src/components/types/adventurous-planners.tsx new file mode 100644 index 0000000..b6694fd --- /dev/null +++ b/src/components/types/adventurous-planners.tsx @@ -0,0 +1,7 @@ +export default function AdventurousPlanners() { + return ( +
+

Hello World - The Adventure Planners

+
+ ); +} diff --git a/src/components/types/ambitious-achievers.tsx b/src/components/types/ambitious-achievers.tsx new file mode 100644 index 0000000..95e3585 --- /dev/null +++ b/src/components/types/ambitious-achievers.tsx @@ -0,0 +1,7 @@ +export default function AmbitiousAchievers() { + return ( +
+

Hello World - The Ambitious Achievers

+
+ ); +} diff --git a/src/components/types/balanced-partners.tsx b/src/components/types/balanced-partners.tsx new file mode 100644 index 0000000..a569a6b --- /dev/null +++ b/src/components/types/balanced-partners.tsx @@ -0,0 +1,7 @@ +export default function BalancedPartners() { + return ( +
+

Hello World - The Balanced Partners

+
+ ); +} diff --git a/src/components/types/cozy-homebodies.tsx b/src/components/types/cozy-homebodies.tsx new file mode 100644 index 0000000..79f18a2 --- /dev/null +++ b/src/components/types/cozy-homebodies.tsx @@ -0,0 +1,7 @@ +export default function CozyHomebodies() { + return ( +
+

Hello World - The Cozy Homebodies

+
+ ); +} diff --git a/src/components/types/creative-collaborators.tsx b/src/components/types/creative-collaborators.tsx new file mode 100644 index 0000000..515479b --- /dev/null +++ b/src/components/types/creative-collaborators.tsx @@ -0,0 +1,7 @@ +export default function CreativeCollaborators() { + return ( +
+

Hello World - The Creative Collaborators

+
+ ); +} diff --git a/src/components/types/independent-together.tsx b/src/components/types/independent-together.tsx new file mode 100644 index 0000000..d4cd7a0 --- /dev/null +++ b/src/components/types/independent-together.tsx @@ -0,0 +1,7 @@ +export default function IndependentTogether() { + return ( +
+

Hello World - The Independent Together

+
+ ); +} diff --git a/src/components/types/intellectual-explorers.tsx b/src/components/types/intellectual-explorers.tsx new file mode 100644 index 0000000..3c74d78 --- /dev/null +++ b/src/components/types/intellectual-explorers.tsx @@ -0,0 +1,7 @@ +export default function IntellectualExplorers() { + return ( +
+

Hello World - The Intellectual Explorers

+
+ ); +} diff --git a/src/components/types/mindful-matches.tsx b/src/components/types/mindful-matches.tsx new file mode 100644 index 0000000..66fcd0c --- /dev/null +++ b/src/components/types/mindful-matches.tsx @@ -0,0 +1,7 @@ +export default function MindfulMatches() { + return ( +
+

Hello World - The Mindful Matches

+
+ ); +} diff --git a/src/components/types/playful-companions.tsx b/src/components/types/playful-companions.tsx new file mode 100644 index 0000000..00c919a --- /dev/null +++ b/src/components/types/playful-companions.tsx @@ -0,0 +1,7 @@ +export default function PlayfulCompanions() { + return ( +
+

Hello World - The Playful Companions

+
+ ); +} diff --git a/src/components/types/practical-partners.tsx b/src/components/types/practical-partners.tsx new file mode 100644 index 0000000..f7e3cb2 --- /dev/null +++ b/src/components/types/practical-partners.tsx @@ -0,0 +1,7 @@ +export default function PracticalPartners() { + return ( +
+

Hello World - The Practical Partners

+
+ ); +} diff --git a/src/components/types/relaxed-romantics.tsx b/src/components/types/relaxed-romantics.tsx new file mode 100644 index 0000000..8be9251 --- /dev/null +++ b/src/components/types/relaxed-romantics.tsx @@ -0,0 +1,7 @@ +export default function RelaxedRomantics() { + return ( +
+

Hello World - The Relaxed Romantics

+
+ ); +} diff --git a/src/components/types/social-butterflies.tsx b/src/components/types/social-butterflies.tsx new file mode 100644 index 0000000..f604ea1 --- /dev/null +++ b/src/components/types/social-butterflies.tsx @@ -0,0 +1,7 @@ +export default function SocialButterflies() { + return ( +
+

Hello World - The Social Butterflies

+
+ ); +} diff --git a/src/components/types/spontaneous-adventurers.tsx b/src/components/types/spontaneous-adventurers.tsx new file mode 100644 index 0000000..aefe102 --- /dev/null +++ b/src/components/types/spontaneous-adventurers.tsx @@ -0,0 +1,7 @@ +export default function SpontaneousAdventurers() { + return ( +
+

Hello World - The Spontaneous Adventurers

+
+ ); +} diff --git a/src/components/types/supportive-companions.tsx b/src/components/types/supportive-companions.tsx new file mode 100644 index 0000000..06008d2 --- /dev/null +++ b/src/components/types/supportive-companions.tsx @@ -0,0 +1,7 @@ +export default function SupportiveCompanions() { + return ( +
+

Hello World - The Supportive Companions

+
+ ); +} diff --git a/src/components/types/thoughtful-deep-thinkers.tsx b/src/components/types/thoughtful-deep-thinkers.tsx new file mode 100644 index 0000000..dc0a318 --- /dev/null +++ b/src/components/types/thoughtful-deep-thinkers.tsx @@ -0,0 +1,7 @@ +export default function ThoughtfulDeepThinkers() { + return ( +
+

Hello World - The Thoughtful Deep Thinkers

+
+ ); +} diff --git a/src/components/types/traditional-sweethearts.tsx b/src/components/types/traditional-sweethearts.tsx new file mode 100644 index 0000000..d3993a2 --- /dev/null +++ b/src/components/types/traditional-sweethearts.tsx @@ -0,0 +1,7 @@ +export default function TraditionalSweethearts() { + return ( +
+

Hello World - The Traditional Sweethearts

+
+ ); +} diff --git a/src/lib/constants/coupleTypes.ts b/src/lib/constants/coupleTypes.ts index 1979e5b..96e3a44 100644 --- a/src/lib/constants/coupleTypes.ts +++ b/src/lib/constants/coupleTypes.ts @@ -39,6 +39,12 @@ export interface CoupleTypeDefinition { primary: string[]; secondary: string[]; }; + dateIdeas?: string[]; + descriptorWords?: { + "s&p": string; + "p&e": string; + "a&r": string; + }; }; graphic: { iconUrl: string; @@ -135,7 +141,7 @@ export const COUPLE_TYPES: Record = { }, }, graphic: { - iconUrl: "/icons/adventure-planners.svg", + iconUrl: "/huajie.png", colorScheme: { primary: "#4F46E5", secondary: "#7C3AED", @@ -169,9 +175,19 @@ export const COUPLE_TYPES: Record = { primary: ["Physical Touch", "Quality Time"], secondary: ["Acts of Service", "Words of Affirmation"], }, + dateIdeas: [ + "Cat cafe meetup", + "Super Smash Brothers Ultimate Tournament", + "Organic Chem Tutor Watch Party", + ], + descriptorWords: { + "s&p": "You value routine and comfort in familiar patterns", + "p&e": "You cherish intimate moments away from the outside world", + "a&r": "You prefer contemplating life's simple pleasures together", + }, }, graphic: { - iconUrl: "/icons/cozy-homebodies.svg", + iconUrl: "/huajie.png", colorScheme: { primary: "#DC2626", secondary: "#F97316", @@ -179,7 +195,6 @@ export const COUPLE_TYPES: Record = { }, }, }, - // Add placeholders for other types - you can fill these in later [CoupleTypeCode.SOCIAL_BUTTERFLIES]: { code: CoupleTypeCode.SOCIAL_BUTTERFLIES,