Files
miracles_in_motion/src/components/sections/ProgramsSection.tsx

111 lines
3.9 KiB
TypeScript
Raw Normal View History

feat: Add ProgramsSection component for comprehensive student support - Implemented ProgramsSection with various support programs including School Supplies, Clothing Support, Emergency Assistance, Educational Technology, Mentorship Programs, and Family Support Services. - Integrated framer-motion for animations and transitions. - Added a call-to-action button for requesting program support. test: Create unit tests for HeroSection component - Developed tests for rendering, accessibility, and functionality of the HeroSection component using Vitest and Testing Library. - Mocked framer-motion for testing purposes. refactor: Update sections index file to include ProgramsSection - Modified index.tsx to export ProgramsSection alongside existing sections. feat: Implement LazyImage component for optimized image loading - Created LazyImage component with lazy loading, error handling, and blur placeholder support. - Utilized framer-motion for loading animations. feat: Add PerformanceMonitor component for real-time performance metrics - Developed PerformanceMonitor to display web vitals and bundle performance metrics. - Included toggle functionality for development mode. feat: Create usePerformance hook for performance monitoring - Implemented usePerformance hook to track web vitals such as FCP, LCP, FID, CLS, and TTFB. - Added useBundlePerformance hook for monitoring bundle size and loading performance. test: Set up testing utilities and mocks for components - Established testing utilities for rendering components with context providers. - Mocked common hooks and framer-motion components for consistent testing. feat: Introduce bundleAnalyzer utility for analyzing bundle performance - Created BundleAnalyzer class to analyze bundle size, suggest optimizations, and generate reports. - Implemented helper functions for Vite integration and performance monitoring. chore: Configure Vitest for testing environment and coverage - Set up Vitest configuration with global variables, jsdom environment, and coverage thresholds.
2025-10-05 09:42:05 -07:00
import { motion } from 'framer-motion'
import { Backpack, Shirt, Users, Heart, School, Home } from 'lucide-react'
import { SectionHeader } from '../ui/SectionHeader'
export function ProgramsSection() {
const programs = [
{
icon: Backpack,
title: "School Supplies",
description: "Essential learning materials including notebooks, pens, calculators, and art supplies",
impact: "2,847 students equipped",
color: "from-blue-500 to-blue-600"
},
{
icon: Shirt,
title: "Clothing Support",
description: "Quality clothing, shoes, and seasonal items to help students feel confident",
impact: "1,203 wardrobes completed",
color: "from-green-500 to-green-600"
},
{
icon: Users,
title: "Emergency Assistance",
description: "Rapid response for urgent family needs including food, shelter, and utilities",
impact: "856 families supported",
color: "from-red-500 to-red-600"
},
{
icon: School,
title: "Educational Technology",
description: "Laptops, tablets, and internet access for remote learning success",
impact: "645 devices provided",
color: "from-purple-500 to-purple-600"
},
{
icon: Heart,
title: "Mentorship Programs",
description: "One-on-one support and guidance for academic and personal growth",
impact: "432 mentor relationships",
color: "from-pink-500 to-pink-600"
},
{
icon: Home,
title: "Family Support Services",
description: "Comprehensive assistance for housing, transportation, and childcare",
impact: "298 families stabilized",
color: "from-orange-500 to-orange-600"
}
]
return (
<section className="py-20 bg-white dark:bg-gray-900">
<div className="mx-auto max-w-7xl px-4 sm:px-6 lg:px-8">
<SectionHeader
eyebrow="Our Programs"
title="Comprehensive Student Support"
subtitle="We provide holistic assistance that addresses the full spectrum of student needs"
/>
<div className="mt-16 grid md:grid-cols-2 lg:grid-cols-3 gap-8">
{programs.map((program, index) => (
<motion.div
key={index}
initial={{ opacity: 0, y: 20 }}
whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true }}
transition={{ delay: index * 0.1 }}
className="card group hover:shadow-xl transition-all duration-300"
>
<div className={`w-16 h-16 mb-6 bg-gradient-to-br ${program.color} rounded-xl flex items-center justify-center group-hover:scale-110 transition-transform duration-300`}>
<program.icon className="h-8 w-8 text-white" />
</div>
<h3 className="text-xl font-semibold mb-3 text-gray-900 dark:text-white">
{program.title}
</h3>
<p className="text-gray-600 dark:text-gray-300 mb-4 leading-relaxed">
{program.description}
</p>
<div className="pt-4 border-t border-gray-200 dark:border-gray-700">
<p className="text-sm font-medium text-primary-600 dark:text-primary-400">
📊 {program.impact}
</p>
</div>
</motion.div>
))}
</div>
{/* Call to Action */}
<motion.div
initial={{ opacity: 0, y: 20 }}
whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true }}
className="mt-16 text-center"
>
<a
href="#/request-assistance"
className="btn-primary inline-flex items-center justify-center"
>
Request Program Support
<Backpack className="ml-2 h-5 w-5" />
</a>
</motion.div>
</div>
</section>
)
}
export default ProgramsSection