'use client'; import { motion } from 'framer-motion'; import { useTranslations } from 'next-intl'; import { cn } from '@/lib/utils'; import { staggerContainerWide, slideLeftVariants, fadeVariants, viewportOnce, } from '@/lib/animations'; import { Link } from '@/i18n/navigation'; import { Lock, Clock, ArrowRight } from 'lucide-react'; // ─── Types ──────────────────────────────────────────────────────────────────── interface Project { title: string; description: string; tags: string[]; slug: string; featured?: boolean; } interface ComingSoonItem { title: string; subtitle: string; } // ─── Data ────────────────────────────────────────────────────────────────────── const PROJECTS: Project[] = [ { title: 'Monaco Ocean Protection Challenge', description: "A comprehensive judging and analytics system with advanced AI jury integration for one of the Mediterranean's most prestigious conservation events.", tags: ['AI Integration', 'Platform'], slug: 'monaco-ocean', featured: true, }, { title: 'Port Nimara', description: 'Scalable digital hub for maritime logistics.', tags: ['Website', 'Infrastructure'], slug: 'port-nimara', }, { title: 'Port Amador', description: 'Premium digital experience for elite nautical services.', tags: ['Website', 'Infrastructure'], slug: 'port-amador', }, ]; const COMING_SOON: ComingSoonItem[] = [ { title: 'Confidential Riviera Project', subtitle: 'Coming Soon' }, { title: 'Sophia Antipolis AI Startup', subtitle: 'Launching Q4' }, ]; // ─── Animation Variants ─────────────────────────────────────────────────────── const ease = [0.16, 1, 0.3, 1] as const; const featuredCardVariants = { hidden: { opacity: 0, y: 48 }, visible: { opacity: 1, y: 0, transition: { duration: 0.7, ease }, }, }; const smallCardVariants = { hidden: { opacity: 0, y: 32 }, visible: { opacity: 1, y: 0, transition: { duration: 0.6, ease }, }, }; const comingSoonVariants = { hidden: { opacity: 0, y: 24 }, visible: { opacity: 1, y: 0, transition: { duration: 0.55, ease }, }, }; // ─── Geometric Placeholder ──────────────────────────────────────────────────── function GeometricPlaceholder({ variant = 'featured', cardVariant = 'default', className, }: { variant?: 'featured' | 'small'; cardVariant?: 'default' | 'nimara' | 'amador'; className?: string; }) { const isFeatured = variant === 'featured'; // Different gradient bases per card so secondary cards look distinct const gradientMap = { default: 'from-primary-dark/90 to-primary/70', nimara: 'from-navy/95 to-primary-dark/75', amador: 'from-[#1a3a4a]/95 to-primary/60', }; return (
); } // ─── Tag Chip ───────────────────────────────────────────────────────────────── function TagChip({ label, showDot = false }: { label: string; showDot?: boolean }) { return ( {showDot && ( )} {label} ); } // ─── Featured Card ──────────────────────────────────────────────────────────── function FeaturedCard({ project, readLabel }: { project: Project; readLabel: string }) { return ({project.description}
{/* CTA */} {readLabel}{project.description}
{/* CTA */} {readLabel}{item.title}
{item.subtitle}
{t('work.eyebrow')}