'use client'; import { useState, useRef } from 'react'; import { useTranslations } from 'next-intl'; import { Link } from '@/i18n/navigation'; import { motion, useInView, AnimatePresence } from 'framer-motion'; import { Briefcase, MapPin, Clock, Users, Heart, Zap, Coffee, GraduationCap, Plane, Building2, ChevronDown, ChevronRight, ArrowRight, Search, Code, LineChart, Headphones, Megaphone, type LucideIcon, } from 'lucide-react'; import { LandingHeader, LandingFooter } from '@/components/layout'; type BenefitKey = 'health' | 'remote' | 'wellbeing' | 'learning' | 'international' | 'stockOptions'; type StatKey = 'employees' | 'nationalities' | 'offices' | 'womenTech'; type CultureKey = 'item1' | 'item2' | 'item3' | 'item4'; type JobKey = 'frontend' | 'backend' | 'pm' | 'ae' | 'csm' | 'data'; type DepartmentValue = 'all' | 'Engineering' | 'Product' | 'Sales' | 'Customer Success' | 'Data'; type LocationValue = 'all' | 'Paris' | 'Rotterdam' | 'Hambourg'; const BENEFITS: { key: BenefitKey; icon: LucideIcon }[] = [ { key: 'health', icon: Heart }, { key: 'remote', icon: Plane }, { key: 'wellbeing', icon: Coffee }, { key: 'learning', icon: GraduationCap }, { key: 'international', icon: Users }, { key: 'stockOptions', icon: Zap }, ]; const STATS: { key: StatKey; value: string }[] = [ { key: 'employees', value: '50+' }, { key: 'nationalities', value: '15' }, { key: 'offices', value: '3' }, { key: 'womenTech', value: '40%' }, ]; const CULTURE_ITEMS: CultureKey[] = ['item1', 'item2', 'item3', 'item4']; type JobRecord = { id: number; key: JobKey; department: Exclude; location: Exclude; type: string; remote: boolean; salary: string; icon: LucideIcon; }; const JOBS: JobRecord[] = [ { id: 1, key: 'frontend', department: 'Engineering', location: 'Paris', type: 'CDI', remote: true, salary: '65K - 85K €', icon: Code, }, { id: 2, key: 'backend', department: 'Engineering', location: 'Paris', type: 'CDI', remote: true, salary: '55K - 75K €', icon: Code, }, { id: 3, key: 'pm', department: 'Product', location: 'Paris', type: 'CDI', remote: true, salary: '60K - 80K €', icon: LineChart, }, { id: 4, key: 'ae', department: 'Sales', location: 'Rotterdam', type: 'CDI', remote: false, salary: '50K - 70K € + variable', icon: Megaphone, }, { id: 5, key: 'csm', department: 'Customer Success', location: 'Paris', type: 'CDI', remote: true, salary: '45K - 60K €', icon: Headphones, }, { id: 6, key: 'data', department: 'Data', location: 'Hambourg', type: 'CDI', remote: true, salary: '50K - 65K €', icon: LineChart, }, ]; const DEPARTMENT_VALUES: DepartmentValue[] = [ 'all', 'Engineering', 'Product', 'Sales', 'Customer Success', 'Data', ]; const LOCATION_VALUES: LocationValue[] = ['all', 'Paris', 'Rotterdam', 'Hambourg']; const JOB_REQ_KEYS = ['req1', 'req2', 'req3', 'req4'] as const; export default function CareersPage() { const t = useTranslations('marketing.careers'); const [selectedDepartment, setSelectedDepartment] = useState('all'); const [selectedLocation, setSelectedLocation] = useState('all'); const [expandedJob, setExpandedJob] = useState(null); const heroRef = useRef(null); const benefitsRef = useRef(null); const jobsRef = useRef(null); const cultureRef = useRef(null); const isHeroInView = useInView(heroRef, { once: true }); const isBenefitsInView = useInView(benefitsRef, { once: true }); const isJobsInView = useInView(jobsRef, { once: true }); const isCultureInView = useInView(cultureRef, { once: true }); const filteredJobs = JOBS.filter(job => { const departmentMatch = selectedDepartment === 'all' || job.department === selectedDepartment; const locationMatch = selectedLocation === 'all' || job.location === selectedLocation; return departmentMatch && locationMatch; }); const containerVariants = { hidden: { opacity: 0, y: 50 }, visible: { opacity: 1, y: 0, transition: { duration: 0.6, staggerChildren: 0.1, }, }, }; const itemVariants = { hidden: { opacity: 0, y: 20 }, visible: { opacity: 1, y: 0, transition: { duration: 0.5 }, }, }; return (
{/* Hero Section */}
{t('badge')}

{t('title1')}
{t('title2')}

{t('intro')}

{t('viewJobs')} {t('learnMore')}
{/* Wave */}
{/* Stats Section */}
{STATS.map((stat, index) => (
{stat.value}
{t(`stats.${stat.key}`)}
))}
{/* Benefits Section */}

{t('benefitsTitle')}

{t('benefitsSubtitle')}

{BENEFITS.map(benefit => { const IconComponent = benefit.icon; return (

{t(`benefits.${benefit.key}.title`)}

{t(`benefits.${benefit.key}.description`)}

); })}
{/* Culture Section */}

{t('cultureTitle')}

{t('cultureBody')}

    {CULTURE_ITEMS.map((itemKey, index) => (
    {t(`culture.${itemKey}`)}
    ))}
{[1, 2, 3, 4].map(i => (
))}
{/* Jobs Section */}

{t('jobsTitle')}

{t('jobsSubtitle')}

{/* Filters */}
{/* Job Listings */} {filteredJobs.length === 0 ? (

{t('noJobs.title')}

{t('noJobs.body')}

) : ( filteredJobs.map(job => { const IconComponent = job.icon; const isExpanded = expandedJob === job.id; return (
setExpandedJob(isExpanded ? null : job.id)} >

{t(`jobs.${job.key}.title`)}

{t(`departments.${job.department}` as any)} {t(`locations.${job.location}` as any)} {job.type}
{job.remote && ( {t('jobCard.remote')} )} {job.salary}
{isExpanded && (

{t(`jobs.${job.key}.description`)}

{t('jobCard.profile')}

    {JOB_REQ_KEYS.map(reqKey => (
  • {t(`jobs.${job.key}.${reqKey}` as any)}
  • ))}
{t('jobCard.apply')}
)}
); }) )}
{/* CTA Section */}

{t('cta.title')}

{t('cta.body')}

{t('cta.spontaneous')}
); }