diff --git a/package.json b/package.json index 51195ca..9ede417 100644 --- a/package.json +++ b/package.json @@ -37,6 +37,7 @@ "dotenv": "^17.4.2", "drizzle-orm": "^0.45.2", "lucide-react": "^1.17.0", + "motion": "^12.42.0", "next": "16.2.6", "next-themes": "^0.4.6", "pg": "^8.21.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8cb746e..9b16853 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -68,6 +68,9 @@ importers: lucide-react: specifier: ^1.17.0 version: 1.20.0(react@19.2.4) + motion: + specifier: ^12.42.0 + version: 12.42.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) next: specifier: 16.2.6 version: 16.2.6(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) @@ -3781,6 +3784,20 @@ packages: resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} engines: {node: '>= 0.6'} + framer-motion@12.42.0: + resolution: {integrity: sha512-wp7EJnfWaaEScVygKv3e20udoRz+LbtxScsuTkakAxfXmt+ReC6WyPW2nINRAGvd+hG9odwcjBLyOTPjH5pBRA==} + peerDependencies: + '@emotion/is-prop-valid': '*' + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@emotion/is-prop-valid': + optional: true + react: + optional: true + react-dom: + optional: true + fresh@2.0.0: resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} engines: {node: '>= 0.8'} @@ -4450,6 +4467,26 @@ packages: module-details-from-path@1.0.4: resolution: {integrity: sha512-EGWKgxALGMgzvxYF1UyGTy0HXX/2vHLkw6+NvDKW2jypWbHpjQuj4UMcqQWXHERJhVGKikolT06G3bcKe4fi7w==} + motion-dom@12.42.0: + resolution: {integrity: sha512-M63h4n8R+quJdNhBwuLlgxM+OLYa9+I/T2pzDRboB9fLXRdbou+Gw7Zury+SkpaCyACP1JHSjHgZ1EgTkBr30w==} + + motion-utils@12.39.0: + resolution: {integrity: sha512-8nadJAJjTtqRkmRF36FoJTrywK9nnFmnPwnSMyxaOCU7GDjN9RTMJIxx9De8ErM+vpPhMccr/6fo5WciyQLnMQ==} + + motion@12.42.0: + resolution: {integrity: sha512-Qhwvu9sVl5/URSq5CNzwMCpSKK8Uhnrwb6VO977kZyj/wOCS7mWebJUnBoHx5cZU1Zv8a9BD5CSICWKAlrLJgA==} + peerDependencies: + '@emotion/is-prop-valid': '*' + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@emotion/is-prop-valid': + optional: true + react: + optional: true + react-dom: + optional: true + ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} @@ -9238,6 +9275,15 @@ snapshots: forwarded@0.2.0: {} + framer-motion@12.42.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4): + dependencies: + motion-dom: 12.42.0 + motion-utils: 12.39.0 + tslib: 2.8.1 + optionalDependencies: + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + fresh@2.0.0: {} fs-extra@11.3.5: @@ -9821,6 +9867,20 @@ snapshots: module-details-from-path@1.0.4: {} + motion-dom@12.42.0: + dependencies: + motion-utils: 12.39.0 + + motion-utils@12.39.0: {} + + motion@12.42.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4): + dependencies: + framer-motion: 12.42.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + tslib: 2.8.1 + optionalDependencies: + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + ms@2.1.3: {} nanoid@3.3.12: {} diff --git a/src/features/marketing/components/contact-hero-section.tsx b/src/features/marketing/components/contact-hero-section.tsx index 757a470..4b7175d 100644 --- a/src/features/marketing/components/contact-hero-section.tsx +++ b/src/features/marketing/components/contact-hero-section.tsx @@ -167,10 +167,13 @@ export function ContactHeroSection() { diff --git a/src/features/marketing/components/course-detail-content-section.tsx b/src/features/marketing/components/course-detail-content-section.tsx index 7f9bdc7..1c89416 100644 --- a/src/features/marketing/components/course-detail-content-section.tsx +++ b/src/features/marketing/components/course-detail-content-section.tsx @@ -1,9 +1,10 @@ +"use client" + import Image from "next/image" import Link from "next/link" import { ArrowRight, ChevronDown, - ChevronUp, Clock, Languages, Layers, @@ -11,6 +12,7 @@ import { Star, User, } from "lucide-react" +import { useState } from "react" import { Button } from "@/shared/ui/button" @@ -28,17 +30,105 @@ const modules = [ "Beginner-friendly digital business models", ], }, - { title: "Week 2: AI Productivity & Prompting" }, - { title: "Week 3: Business Validation & Fast Monetization Planning" }, - { title: "Week 4: Branding & Digital Presence" }, - { title: "Week 5: Product & Service Creation" }, - { title: "Week 6: Marketing & Public Launch" }, - { title: "Week 7: Client Acquisition & Sales Systems" }, - { title: "Week 8: Revenue Optimization & Sustainability" }, - { title: "Week 9: Automation & Efficiency" }, - { title: "Week 10: Portfolio & Authority Building" }, - { title: "Week 11: Scaling Small Businesses" }, - { title: "Week 12: Demo Day & Graduation" }, + { + title: "Week 2: AI Productivity & Prompting", + topics: [ + "Crafting effective AI prompts", + "Automating daily workflows with AI", + "AI tools for task management", + "Integrating AI into existing tools", + ], + }, + { + title: "Week 3: Business Validation & Fast Monetization Planning", + topics: [ + "Identifying market problems & opportunities", + "Lean validation techniques", + "Fast monetization strategies", + "Building a minimum viable offer", + ], + }, + { + title: "Week 4: Branding & Digital Presence", + topics: [ + "Defining your brand identity", + "Building a simple website", + "Social media positioning", + "Content creation fundamentals", + ], + }, + { + title: "Week 5: Product & Service Creation", + topics: [ + "Designing digital products", + "Service packaging and pricing", + "AI-assisted product development", + "Testing and iterating your offer", + ], + }, + { + title: "Week 6: Marketing & Public Launch", + topics: [ + "Launch campaign planning", + "Organic marketing channels", + "Paid advertising basics", + "Building launch momentum", + ], + }, + { + title: "Week 7: Client Acquisition & Sales Systems", + topics: [ + "Sales funnel fundamentals", + "Lead generation strategies", + "CRM and follow-up systems", + "Closing techniques for beginners", + ], + }, + { + title: "Week 8: Revenue Optimization & Sustainability", + topics: [ + "Pricing strategy refinement", + "Upselling and cross-selling", + "Customer retention tactics", + "Financial management basics", + ], + }, + { + title: "Week 9: Automation & Efficiency", + topics: [ + "Workflow automation tools", + "AI chatbots for customer support", + "Email marketing automation", + "Analytics and performance tracking", + ], + }, + { + title: "Week 10: Portfolio & Authority Building", + topics: [ + "Creating a professional portfolio", + "Publishing thought leadership content", + "Speaking and networking opportunities", + "Building social proof", + ], + }, + { + title: "Week 11: Scaling Small Businesses", + topics: [ + "Hiring and delegation basics", + "Systems and SOPs for growth", + "Expanding product lines", + "Partnership and collaboration strategies", + ], + }, + { + title: "Week 12: Demo Day & Graduation", + topics: [ + "Presenting your business pitch", + "Demo day preparation", + "Graduation and next steps", + "Community and alumni network", + ], + }, ] const reviews = [ @@ -66,51 +156,62 @@ const courseInformation = [ function CourseModule({ title, topics, - open = false, + open: defaultOpen = false, }: { title: string topics?: string[] open?: boolean }) { + const [open, setOpen] = useState(defaultOpen) + return ( -
- + + - {topics ? ( -
-

Topics:

- -
- ) : null} -
+
+ {topics ? ( +
+

Topics:

+ +
+ ) : null} +
+ ) } function TutorCard() { return ( -
-
+
+
Mr. Maxwell

{review.text}

-
+
))} - +
+ +
) diff --git a/src/features/marketing/components/course-detail-hero-section.tsx b/src/features/marketing/components/course-detail-hero-section.tsx index 24df755..c3a9444 100644 --- a/src/features/marketing/components/course-detail-hero-section.tsx +++ b/src/features/marketing/components/course-detail-hero-section.tsx @@ -79,11 +79,14 @@ export function CourseDetailHeroSection() {
diff --git a/src/features/marketing/components/courses-hero-section.tsx b/src/features/marketing/components/courses-hero-section.tsx index 788b827..d184783 100644 --- a/src/features/marketing/components/courses-hero-section.tsx +++ b/src/features/marketing/components/courses-hero-section.tsx @@ -24,7 +24,7 @@ function CourseCard({ course }: { course: Course }) { return (
{course.thumbnailUrl ? ( diff --git a/src/features/marketing/components/cta-section.tsx b/src/features/marketing/components/cta-section.tsx index 0d9045a..89316d7 100644 --- a/src/features/marketing/components/cta-section.tsx +++ b/src/features/marketing/components/cta-section.tsx @@ -17,10 +17,13 @@ export function CtaSection() {
Book a free consultation -
diff --git a/src/features/marketing/components/donation-support-section.tsx b/src/features/marketing/components/donation-support-section.tsx index 13a453b..965b70f 100644 --- a/src/features/marketing/components/donation-support-section.tsx +++ b/src/features/marketing/components/donation-support-section.tsx @@ -122,10 +122,13 @@ export function DonationSupportSection() {
diff --git a/src/features/marketing/components/faq.tsx b/src/features/marketing/components/faq.tsx index d5f4baa..2d78e85 100644 --- a/src/features/marketing/components/faq.tsx +++ b/src/features/marketing/components/faq.tsx @@ -1,15 +1,48 @@ +"use client" + import { Plus } from "lucide-react" +import { useState } from "react" const faqs = [ - "Who is ModernAdvocates Inc. for?", - "Is the consultation really free?", - "What kind of AI workforce training do you offer?", - "Do I need any prior experience to join the training programs?", - "How does ModernAdvocates help with healthcare resources?", - "How can I support your mission?", + { + question: "Who is ModernAdvocates Inc. for?", + answer: + "ModernAdvocates Inc. serves low-to-moderate income individuals, caregivers, and families navigating health challenges or career transitions who need practical AI guidance and human-centered support.", + }, + { + question: "Is the consultation really free?", + answer: + "Yes, our initial consultation is completely free with no obligation. We believe everyone deserves access to guidance before making any commitment.", + }, + { + question: "What kind of AI workforce training do you offer?", + answer: + "We offer hands-on training in AI-powered tools, workflow automation, and digital skills designed for real-world application — no tech background required.", + }, + { + question: "Do I need any prior experience to join the training programs?", + answer: + "Not at all. Our programs are built for beginners and meet you where you are. We provide step-by-step guidance and ongoing support throughout your learning journey.", + }, + { + question: "How does ModernAdvocates help with healthcare resources?", + answer: + "We help you navigate the healthcare system by providing guidance on accessing care, understanding your options, and using AI tools to advocate for your health.", + }, + { + question: "How can I support your mission?", + answer: + "You can support our mission by donating, volunteering your expertise, or spreading the word. Every contribution helps us reach more individuals in need.", + }, ] export function Faq() { + const [openIndex, setOpenIndex] = useState(null) + + function toggle(index: number) { + setOpenIndex(openIndex === index ? null : index) + } + return (
- {faqs.map((question) => ( - + + +
+

+ {faq.answer} +

+
+
))}
diff --git a/src/features/marketing/components/footer.tsx b/src/features/marketing/components/footer.tsx index 618e4f1..b7b0f95 100644 --- a/src/features/marketing/components/footer.tsx +++ b/src/features/marketing/components/footer.tsx @@ -80,10 +80,16 @@ export function Footer() { /> diff --git a/src/features/marketing/components/hero-section.tsx b/src/features/marketing/components/hero-section.tsx index 9344f95..73b4008 100644 --- a/src/features/marketing/components/hero-section.tsx +++ b/src/features/marketing/components/hero-section.tsx @@ -1,3 +1,5 @@ +"use client" +import { motion } from "motion/react" import Image from "next/image" import Link from "next/link" import { ArrowRight, Star } from "lucide-react" @@ -58,10 +60,16 @@ export function HeroSection() {
- Book consultation -