'use client' import React, { useEffect, useMemo, useState } from "react" import { motion } from "framer-motion" import { Check, Star, BadgeCheck, Sparkles, Play, Mail, Phone, Calendar, Building2, ShieldCheck, Clock4, Users2, Zap, Award, Heart } from "lucide-react" import Image from 'next/image' import { FadeUp, StaggerContainer, StaggerItem, ScaleIn, SlideInLeft, SlideInRight, HoverCard, MagneticButton, CountUp, ParallaxElement } from '@/components/ScrollAnimations' import { AnimatedFAQ } from '@/components/AnimatedFAQ' import { VideoPlayer } from '@/components/VideoPlayer' // ---- Main Component ---- export default function MagicianLandingPage() { const [active, setActive] = useState("home") // Simple scroll function const scrollToSection = (sectionId: string) => { console.log('Scrolling to:', sectionId) // Debug log const element = document.getElementById(sectionId) if (element) { const headerOffset = 100 const elementPosition = element.getBoundingClientRect().top const offsetPosition = elementPosition + window.pageYOffset - headerOffset window.scrollTo({ top: offsetPosition, behavior: 'smooth' }) } else { console.log('Element not found:', sectionId) // Debug log } } // Observe sections to highlight active link useEffect(() => { const ids = ["home", "proof", "showreel", "acts", "usecases", "testimonials", "about", "faq", "contact"] const obs = new IntersectionObserver( (entries) => { const visible = entries .filter((e) => e.isIntersecting) .sort((a, b) => b.intersectionRatio - a.intersectionRatio)[0] if (visible) setActive(visible.target.id) }, { rootMargin: "-50% 0px -45% 0px", threshold: [0.15, 0.35, 0.6] } ) ids.forEach((id) => { const el = document.getElementById(id) if (el) obs.observe(el) }) return () => obs.disconnect() }, []) // Data const proof = useMemo( () => ({ rating: 5, reviews: 12, bookings: 20, travel: ">1000 km", logos: ["SAT.1", "WDR", "ZDF", "Amazon Prime Video"], clients: [ "Mercedes-Benz AG", "Materna TMT", "VIVA Cruises", "AMADA", "IHK", "Lexus", ], }), [] ) const acts = [ { title: "Close-up Magic (Walking)", desc: "Hautnah am Tisch – perfekter Eisbrecher & Gesprächszünder für Empfänge und Dinner.", points: ["Interaktiv mit Gästen", "Flexibel zwischen den Gängen", "Keine Technik nötig"], icon: , gradient: "from-blue-500/20 to-purple-500/20" }, { title: "Bühnenshow", desc: "Humorvoll, modern und gemeinschaftsstiftend – ideal für Kickoffs, Galas & Weihnachtsfeiern.", points: ["20–40 Minuten", "Publikumsbeteiligung", "Skalierbar für kleine & große Bühnen"], icon: , gradient: "from-yellow-500/20 to-orange-500/20" }, { title: "Taschendieb-Act", desc: "Respektvoll, sicher und spektakulär: scheinbarer Diebstahl von Uhr, Krawatte oder Handy – mit Lerneffekt.", points: ["Publikum lacht & lernt", "Immer mit Einverständnis", "Sofortige Wow-Momente"], icon: , gradient: "from-green-500/20 to-emerald-500/20" }, { title: "Signature: Gabelbiegen", desc: "Metall wird zur Erinnerung – bleibende Souvenirs für Ihre Gäste.", points: ["Starkes visuelles Finale", "Mitnahme-Souvenir", "Perfekt für Fotos"], icon: , gradient: "from-pink-500/20 to-rose-500/20" }, ] const testimonials = [ { name: "Corporate Event", quote: "Perfekter Eisbrecher, professionell und absolut verblüffend – unsere Gäste sprechen heute noch davon.", avatar: "🏢" }, { name: "Hochzeit", quote: "Familienfreundlich, charmant und mega eindrucksvoll. Die Fotos vom Gabelbiegen lieben wir!", avatar: "💒" }, { name: "Weihnachtsfeier", quote: "Zero Cringe, 100% Wow. Super zuverlässig, großartige Kommunikation und pünktlich auf die Minute.", avatar: "🎄" }, ] const faqs = [ { q: "Welche Programmlängen sind möglich?", a: "Close-up 60–90 Minuten (walking/tischweise) je nach Gästezahl; Bühne 20–40 Minuten – wir planen es passend zur Agenda.", }, { q: "Welche Technik wird benötigt?", a: "Close-up: keine. Bühne: Licht/PA nach Raumgröße – kann organisiert werden." }, { q: "Wo trittst du auf?", a: "NRW, deutschlandweit und international – Reise >1000 km möglich." }, { q: "Ist der Taschendieb-Act sicher?", a: "Ja – immer respektvoll, nur mit Einverständnis, haftpflichtversichert." }, ] return (