website/components/ClientFocus.tsx

209 lines
8.9 KiB
TypeScript

'use client';
import { motion } from "framer-motion";
import { useInView } from "framer-motion";
import { useRef } from "react";
import { Users, UserCheck, Globe } from "lucide-react";
import { useAppTheme } from "@/components/ThemeProvider";
export function ClientFocus() {
const ref = useRef(null);
const isInView = useInView(ref, { once: true, margin: "-100px" });
const { theme } = useAppTheme();
const isDark = theme === "dark";
const ages = [
"Children (6 to 10)",
"Teen",
"Adults",
"Elders (65+)"
];
return (
<section
id="client-focus"
ref={ref}
className="relative py-20 px-4 overflow-hidden"
>
{/* Background Image */}
<div
className="absolute inset-0 z-0"
style={{
backgroundSize: 'cover',
backgroundPosition: 'center',
backgroundRepeat: 'no-repeat',
}}
/>
{/* Minimal overlay - allowing background image to show at near original opaqueness */}
<div
className="absolute inset-0 z-[1]"
style={{
backgroundColor: isDark ? 'rgba(0, 0, 0, 0.15)' : 'rgba(255, 255, 255, 0.10)'
}}
/>
{/* Very subtle gradient overlay */}
{!isDark && (
<div className="absolute inset-0 z-[2] bg-gradient-to-br from-rose-50/10 via-pink-50/8 to-orange-50/10" />
)}
{isDark && (
<div className="absolute inset-0 z-[2] bg-gradient-to-br from-gray-900/10 via-gray-800/8 to-gray-900/10" />
)}
{/* Subtle animated blobs */}
<div className="absolute inset-0 overflow-hidden z-[3]">
<motion.div
className="absolute top-20 right-20 w-72 h-72 bg-pink-100 dark:bg-pink-900/20 rounded-full mix-blend-multiply dark:mix-blend-lighten filter blur-xl opacity-30 dark:opacity-50"
animate={{
x: [0, -90, 0],
y: [0, 50, 0],
scale: [1, 1.2, 1],
}}
transition={{
duration: 20,
repeat: Infinity,
ease: 'easeInOut',
}}
/>
<motion.div
className="absolute bottom-10 left-20 w-96 h-96 bg-orange-100 dark:bg-orange-900/20 rounded-full mix-blend-multiply dark:mix-blend-lighten filter blur-xl opacity-30 dark:opacity-50"
animate={{
x: [0, 70, 0],
y: [0, -60, 0],
scale: [1, 1.15, 1],
}}
transition={{
duration: 24,
repeat: Infinity,
ease: 'easeInOut',
}}
/>
</div>
<div className="container max-w-6xl mx-auto relative z-10">
<motion.div
initial={{ opacity: 0, y: 30 }}
animate={isInView ? { opacity: 1, y: 0 } : {}}
transition={{ duration: 0.8 }}
className="text-center mb-16"
>
<motion.h2
className="text-4xl md:text-5xl font-bold mb-6 bg-gradient-to-r from-rose-600 via-pink-600 to-orange-600 bg-clip-text text-transparent"
initial={{ opacity: 0, y: 20 }}
animate={isInView ? { opacity: 1, y: 0 } : {}}
transition={{ duration: 0.8, delay: 0.2 }}
>
Client Focus
</motion.h2>
</motion.div>
<div className="grid md:grid-cols-3 gap-6">
{/* Age */}
<motion.div
initial={{ opacity: 0, y: 20 }}
animate={isInView ? { opacity: 1, y: 0 } : {}}
transition={{ duration: 0.5, delay: 0.2 }}
className="bg-card/50 backdrop-blur-sm rounded-2xl p-6 border border-border/50 hover:border-rose-500/50 hover:shadow-lg hover:shadow-rose-500/10 hover:scale-105 transition-all duration-300"
>
<div className="flex items-center gap-3 mb-4">
<div className="bg-gradient-to-br from-rose-500/20 via-pink-500/20 to-orange-500/20 dark:from-rose-500/30 dark:via-pink-500/30 dark:to-orange-500/30 p-3 rounded-xl">
<Users className="h-6 w-6 text-rose-600 dark:text-rose-400" />
</div>
<h3 className="text-xl font-semibold text-foreground">Age</h3>
</div>
<ul className="space-y-2">
{ages.map((age, index) => (
<motion.li
key={age}
initial={{ opacity: 0, x: -10 }}
animate={isInView ? { opacity: 1, x: 0 } : {}}
transition={{ duration: 0.3, delay: 0.3 + index * 0.05 }}
className="text-muted-foreground"
>
{age}
</motion.li>
))}
</ul>
</motion.div>
{/* Participants */}
<motion.div
initial={{ opacity: 0, y: 20 }}
animate={isInView ? { opacity: 1, y: 0 } : {}}
transition={{ duration: 0.5, delay: 0.3 }}
className="bg-card/50 backdrop-blur-sm rounded-2xl p-6 border border-border/50 hover:border-rose-500/50 hover:shadow-lg hover:shadow-rose-500/10 hover:scale-105 transition-all duration-300"
>
<div className="flex items-center gap-3 mb-4">
<div className="bg-gradient-to-br from-rose-500/20 via-pink-500/20 to-orange-500/20 dark:from-rose-500/30 dark:via-pink-500/30 dark:to-orange-500/30 p-3 rounded-xl">
<UserCheck className="h-6 w-6 text-rose-600 dark:text-rose-400" />
</div>
<h3 className="text-xl font-semibold text-foreground">Participants</h3>
</div>
<p className="text-muted-foreground">Individuals</p>
</motion.div>
{/* Communities */}
<motion.div
initial={{ opacity: 0, y: 20 }}
animate={isInView ? { opacity: 1, y: 0 } : {}}
transition={{ duration: 0.5, delay: 0.4 }}
className="bg-card/50 backdrop-blur-sm rounded-2xl p-6 border border-border/50 hover:border-rose-500/50 hover:shadow-lg hover:shadow-rose-500/10 hover:scale-105 transition-all duration-300"
>
<div className="flex items-center gap-3 mb-4">
<div className="bg-gradient-to-br from-rose-500/20 via-pink-500/20 to-orange-500/20 dark:from-rose-500/30 dark:via-pink-500/30 dark:to-orange-500/30 p-3 rounded-xl">
<Globe className="h-6 w-6 text-rose-600 dark:text-rose-400" />
</div>
<h3 className="text-xl font-semibold text-foreground">Client Focus</h3>
</div>
<div className="space-y-3">
<div className="flex flex-wrap gap-3 justify-center items-center">
{[
{ flag: '🇭🇹', name: 'Haitian', type: 'emoji' },
{ flag: '🇯🇲', name: 'Jamaican', type: 'emoji' },
{ flag: '🇧🇸', name: 'Bahamian', type: 'emoji' },
{ flag: 'pan-african', name: 'Pan-African', type: 'css' },
{ flag: '🇮🇱', name: 'Israeli', type: 'emoji' },
{ flag: '🇻🇪', name: 'Venezuelan', type: 'emoji' },
{ flag: 'pride', name: 'LGBTQ+', type: 'css' },
].map((community, index) => (
<motion.div
key={community.name}
initial={{ opacity: 0, scale: 0.8 }}
animate={isInView ? { opacity: 1, scale: 1 } : {}}
transition={{ duration: 0.3, delay: 0.5 + index * 0.05 }}
className="p-2 rounded-lg hover:bg-rose-50 dark:hover:bg-rose-900/20 transition-colors"
title={community.name}
>
{community.type === 'emoji' ? (
<span className="text-2xl sm:text-3xl" role="img" aria-label={community.name}>
{community.flag}
</span>
) : community.flag === 'pan-african' ? (
<div className="w-8 h-6 sm:w-10 sm:h-7 rounded border border-gray-300 dark:border-gray-600 overflow-hidden flex flex-col">
<div className="h-1/3 bg-red-600"></div>
<div className="h-1/3 bg-black"></div>
<div className="h-1/3 bg-green-600"></div>
</div>
) : community.flag === 'pride' ? (
<div className="w-8 h-6 sm:w-10 sm:h-7 rounded border border-gray-300 dark:border-gray-600 overflow-hidden flex flex-col">
<div className="h-1/6 bg-red-500"></div>
<div className="h-1/6 bg-orange-500"></div>
<div className="h-1/6 bg-yellow-400"></div>
<div className="h-1/6 bg-green-500"></div>
<div className="h-1/6 bg-blue-500"></div>
<div className="h-1/6 bg-purple-600"></div>
</div>
) : null}
</motion.div>
))}
</div>
</div>
</motion.div>
</div>
</div>
</section>
);
}