Files
miracles_in_motion/src/components/sections/ProgramsSection.tsx
defiQUG 0b81bcb4f5 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

111 lines
3.9 KiB
TypeScript

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