diff --git a/apps/web/app/globals.css b/apps/web/app/globals.css
index c5f2a21..3160095 100644
--- a/apps/web/app/globals.css
+++ b/apps/web/app/globals.css
@@ -158,3 +158,60 @@ body {
.animate-pulse-glow {
animation: pulse-glow 4s ease-in-out infinite;
}
+
+/* Focus states for accessibility */
+.btn-primary:focus-visible,
+.btn-secondary:focus-visible {
+ outline: none;
+ ring: 2px;
+ ring-offset: 2px;
+ ring-color: rgba(233, 69, 96, 0.8);
+ box-shadow: 0 0 0 2px var(--background), 0 0 0 4px var(--primary);
+}
+
+a:focus-visible {
+ outline: 2px solid var(--primary);
+ outline-offset: 2px;
+ border-radius: 4px;
+}
+
+button:focus-visible {
+ outline: 2px solid var(--primary);
+ outline-offset: 2px;
+}
+
+/* Reduced motion support */
+@media (prefers-reduced-motion: reduce) {
+ *,
+ *::before,
+ *::after {
+ animation-duration: 0.01ms !important;
+ animation-iteration-count: 1 !important;
+ transition-duration: 0.01ms !important;
+ }
+
+ .animate-float,
+ .animate-pulse-glow {
+ animation: none;
+ }
+}
+
+/* Card tilt effect */
+.card-tilt {
+ transition: transform 0.3s ease;
+ transform-style: preserve-3d;
+}
+
+.card-tilt:hover {
+ transform: perspective(1000px) rotateX(2deg) rotateY(-2deg) translateY(-4px);
+}
+
+/* Phone tilt effect */
+.phone-tilt {
+ transition: transform 0.4s ease;
+ transform-style: preserve-3d;
+}
+
+.phone-tilt:hover {
+ transform: perspective(1000px) rotateY(-8deg) rotateX(4deg) scale(1.02);
+}
diff --git a/apps/web/app/page.tsx b/apps/web/app/page.tsx
index 840e27f..22a9f02 100644
--- a/apps/web/app/page.tsx
+++ b/apps/web/app/page.tsx
@@ -3,6 +3,7 @@ import Hero from '@/components/Hero'
import Features from '@/components/Features'
import HowItWorks from '@/components/HowItWorks'
import Pricing from '@/components/Pricing'
+import FAQ from '@/components/FAQ'
import CTA from '@/components/CTA'
import Footer from '@/components/Footer'
@@ -14,6 +15,7 @@ export default function Home() {
+
diff --git a/apps/web/components/FAQ.tsx b/apps/web/components/FAQ.tsx
new file mode 100644
index 0000000..bbdd0f6
--- /dev/null
+++ b/apps/web/components/FAQ.tsx
@@ -0,0 +1,122 @@
+'use client'
+
+import { useState } from 'react'
+import { motion, AnimatePresence } from 'framer-motion'
+import { ChevronDown } from 'lucide-react'
+
+const faqs = [
+ {
+ question: 'How does matching work?',
+ answer:
+ "When you and your partner both answer positively to the same question (yes or maybe), it's a match! You'll both be notified and a private chat thread opens for that question. Your individual answers remain private until there's a match.",
+ },
+ {
+ question: 'Are my answers private?',
+ answer:
+ "Absolutely. Your individual answers are never revealed to your partner. They only see questions where you've both answered positively. If you say no to something, your partner will never know.",
+ },
+ {
+ question: 'What happens if my partner says no to a question?',
+ answer:
+ "Nothing! They won't know you were interested, and you won't know they said no. The question simply doesn't become a match. This creates a safe space to be honest about your desires.",
+ },
+ {
+ question: 'Do both partners need Pro?',
+ answer:
+ "No! When one partner upgrades to Pro, both partners automatically get full access to all premium packs. One subscription covers your entire relationship.",
+ },
+ {
+ question: 'Is my data secure?',
+ answer:
+ 'Yes. All chat messages are end-to-end encrypted, meaning only you and your partner can read them. We take your privacy seriously and never share your data with third parties.',
+ },
+]
+
+function FAQItem({
+ question,
+ answer,
+ isOpen,
+ onClick,
+}: {
+ question: string
+ answer: string
+ isOpen: boolean
+ onClick: () => void
+}) {
+ return (
+
= [
{
number: '01',
title: 'Connect with Your Partner',
description: 'Create your account and invite your partner using a unique code. Your journey begins together.',
+ icon: UserPlus,
+ color: 'text-primary',
},
{
number: '02',
title: 'Browse Question Packs',
description: 'Choose from curated packs ranging from romantic to adventurous. Each pack contains thoughtful questions.',
+ icon: Layers,
+ color: 'text-secondary',
},
{
number: '03',
title: 'Swipe on Questions',
description: 'Answer each question honestly. Swipe right for yes, left for no, or up for maybe. Your answers stay private.',
+ icon: Hand,
+ color: 'text-orange-400',
},
{
number: '04',
title: 'Discover Your Matches',
description: 'When both partners answer positively, it\'s a match! Explore your shared desires through private chats.',
+ icon: Heart,
+ color: 'text-pink-400',
},
]
@@ -64,12 +79,17 @@ export default function HowItWorks() {
)}
-
-
- {step.number}
+
+
+
+ {step.number}
+
+
+
+
{step.title}
-
{step.description}
+
{step.description}
))}
diff --git a/apps/web/components/Navbar.tsx b/apps/web/components/Navbar.tsx
index 301547a..8c2bbd7 100644
--- a/apps/web/components/Navbar.tsx
+++ b/apps/web/components/Navbar.tsx
@@ -3,7 +3,7 @@
import { useState, useEffect } from 'react'
import Link from 'next/link'
import Image from 'next/image'
-import { motion } from 'framer-motion'
+import { motion, AnimatePresence } from 'framer-motion'
import { Menu, X } from 'lucide-react'
export default function Navbar() {
@@ -49,6 +49,9 @@ export default function Navbar() {
Pro
+
+ FAQ
+
{/* Mobile Menu */}
- {isMobileMenuOpen && (
-
-
When you upgrade to Pro, your partner automatically gets full access too.
- No separate purchases needed - you're in this together.
+ No separate purchases needed - you're in this together.