3d-effect-cinema 0.4.1 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/components/AnimatedBackground.tsx","../src/components/3d/AnimatedLetter.tsx","../src/components/3d/SceneParticles.tsx","../src/components/3d/CameraRig.tsx","../src/components/3d/ClickFireSparks.tsx","../src/components/3d/ClickShockwave.tsx","../src/components/3d/ElectricPlasma.tsx","../src/components/3d/FireFlames.tsx","../src/components/3d/PlasmaBlobs.tsx","../src/components/CinemaHome.tsx","../src/i18n/routing.ts","../src/components/LocaleSwitcher.tsx","../src/components/ui/button.tsx","../src/lib/utils.ts","../src/components/hoc/withCinema3D.tsx","../src/components/CinemaBackground.tsx","../src/components/3d/CinemaLoader.tsx","../src/components/3d/LoaderOverlay.tsx"],"sourcesContent":["// Main Component Export\nexport { default as AnimatedBackground, type AnimatedBackgroundProps, type EffectType } from \"./components/AnimatedBackground\";\nexport { default } from \"./components/AnimatedBackground\";\n\n// Core HOC & Background Components\nexport { withCinema3D, type WithCinema3DOptions } from \"./components/hoc/withCinema3D\";\nexport { default as CinemaBackground, type CinemaBackgroundProps } from \"./components/CinemaBackground\";\nexport { default as CinemaLoader } from \"./components/3d/CinemaLoader\";\n\n// 3D Effect Modules\nexport { default as FireFlames } from \"./components/3d/FireFlames\";\nexport { default as PlasmaBlobs } from \"./components/3d/PlasmaBlobs\";\nexport { default as ClickFireSparks } from \"./components/3d/ClickFireSparks\";\nexport { default as ClickShockwave } from \"./components/3d/ClickShockwave\";\nexport { default as ElectricPlasma } from \"./components/3d/ElectricPlasma\";\nexport { default as SceneParticles } from \"./components/3d/SceneParticles\";\nexport { default as AnimatedLetter, type MaterialTheme } from \"./components/3d/AnimatedLetter\";\nexport { default as CameraRig } from \"./components/3d/CameraRig\";\nexport { default as LoaderOverlay, type EffectState } from \"./components/3d/LoaderOverlay\";\n\n// Templates & Views\nexport { default as CinemaHome } from \"./components/CinemaHome\";\n","\"use client\";\n\nimport React, { Suspense, useMemo, useState, useEffect } from \"react\";\nimport { Canvas } from \"@react-three/fiber\";\nimport { Environment, Center } from \"@react-three/drei\";\nimport { EffectComposer, Bloom, Vignette, Noise } from \"@react-three/postprocessing\";\nimport AnimatedLetter, { type MaterialTheme } from \"./3d/AnimatedLetter\";\nimport SceneParticles from \"./3d/SceneParticles\";\nimport CameraRig from \"./3d/CameraRig\";\nimport ClickFireSparks from \"./3d/ClickFireSparks\";\nimport ClickShockwave from \"./3d/ClickShockwave\";\nimport ElectricPlasma from \"./3d/ElectricPlasma\";\nimport FireFlames from \"./3d/FireFlames\";\nimport PlasmaBlobs from \"./3d/PlasmaBlobs\";\nimport CinemaHome from \"./CinemaHome\";\n\nexport type SingleEffectType =\n | \"fire\"\n | \"flames\"\n | \"crystal-flames\"\n | \"fluid-flames\"\n | \"blobs\"\n | \"energy-blobs\"\n | \"plasma-blobs\"\n | \"inferno\"\n | \"sparks\"\n | \"shockwave\"\n | \"wave\"\n | \"plasma\"\n | \"electric\"\n | \"embers\"\n | \"supernova\"\n | \"all\";\n\nexport type EffectType = SingleEffectType | SingleEffectType[] | string;\n\nexport interface AnimatedBackgroundProps {\n /** View template or component to display (\"lhome\", \"home\", or custom React component) */\n containerToDisplay?: string | React.ReactNode;\n /** DOM element ID/class or container target to attach as background (e.g. \"home\", \"#main-hero\", \"lhome\") */\n containerSelector?: string;\n /** 3D Effect type or multiple effects (e.g. \"blobs,onda\" or [\"flames\", \"shockwave\"]) */\n effect?: EffectType;\n /** 3D Title rendered in world space (omit or pass \"\" for blank pure background effects) */\n title?: string;\n /** Background color or gradient (supports Spanish names like \"rojo\", \"azul\", \"verde\", \"dorado\" or #HEX / CSS colors) */\n backgroundColor?: string;\n /** Custom color for ALL 3D WebGL effects (e.g. \"azul\", \"verde\", \"magenta\", \"#00e5ff\", \"#ff0055\") */\n effectColor?: string;\n /** Speed multiplier for 3D motion & animation (default 0.5 for smooth relaxing motion) */\n effectSpeed?: number;\n /** Density / quantity of flame & WebGL particles (range 0.1 to 1.0, default 0.3 for clean elegant flames) */\n effectDensity?: number;\n /** Automatically scale 3D text to fit parent container perfectly (default true) */\n autoFitText?: boolean;\n /** Optional duration in seconds when used as a Loader / Splash screen animation */\n loaderDuration?: number;\n /** Optional URL to redirect to automatically when loaderDuration timer reaches 0 */\n redirectUrl?: string;\n /** Optional callback triggered when loaderDuration timer finishes */\n onComplete?: () => void;\n /** 3D Font Family (\"cinema\", \"helvetiker\", \"gentilis\", \"optimer\" or custom font URL) */\n fontFamily?: \"cinema\" | \"helvetiker\" | \"gentilis\" | \"optimer\" | string;\n /** Custom 3D Typeface JSON URL */\n fontUrl?: string;\n /** 3D Material theme */\n theme?: MaterialTheme;\n /** Letter spacing multiplier (default 0.85 to prevent text overlaps) */\n letterSpacing?: number;\n /** Container CSS class name */\n className?: string;\n /** Inline CSS styles */\n style?: React.CSSProperties;\n /** Custom children overlay */\n children?: React.ReactNode;\n}\n\nconst FONT_PRESETS: Record<string, string> = {\n cinema: \"/fonts/cinema_display.typeface.json\",\n helvetiker: \"https://threejs.org/examples/fonts/helvetiker_bold.typeface.json\",\n gentilis: \"https://threejs.org/examples/fonts/gentilis_bold.typeface.json\",\n optimer: \"https://threejs.org/examples/fonts/optimer_bold.typeface.json\",\n};\n\nconst SPANISH_COLOR_MAP: Record<string, string> = {\n rojo: \"#3b0712\",\n azul: \"#021a38\",\n verde: \"#032117\",\n esmeralda: \"#032117\",\n dorado: \"#1c1503\",\n negro: \"#07080c\",\n purpura: \"#21032a\",\n};\n\nconst THEME_BACKGROUNDS: Record<MaterialTheme, string> = {\n gold: \"radial-gradient(circle at center, #1c1503 0%, #080601 60%, #020201 100%)\",\n neon: \"radial-gradient(circle at center, #021a1e 0%, #030d14 60%, #010408 100%)\",\n emerald: \"radial-gradient(circle at center, #032117 0%, #02120d 60%, #010705 100%)\",\n crimson: \"radial-gradient(circle at center, #240409 0%, #120205 60%, #060102 100%)\",\n obsidian: \"radial-gradient(circle at center, #120d24 0%, #080512 60%, #030206 100%)\",\n glass: \"radial-gradient(circle at center, #0f172a 0%, #070b14 60%, #020205 100%)\",\n};\n\nfunction computeLetterPositions(\n text: string,\n spacing: number = 0.85\n): [number, number, number][] {\n const totalWidth = text.length * spacing;\n const startX = -totalWidth / 2 + spacing / 2;\n\n return text.split(\"\").map((_, i) => [startX + i * spacing, 0, 0]);\n}\n\n/**\n * Parses single, array, or comma-separated effect props into boolean active flags\n */\nfunction parseActiveEffects(effectInput?: EffectType): {\n enableFluidFlames: boolean;\n enableCrystalFlames: boolean;\n enableBlobs: boolean;\n enableSparks: boolean;\n enableShockwave: boolean;\n enablePlasma: boolean;\n enableEmbers: boolean;\n} {\n let list: string[] = [];\n if (!effectInput) {\n list = [\"flames\"];\n } else if (Array.isArray(effectInput)) {\n list = effectInput.map((e) => String(e).toLowerCase().trim());\n } else if (typeof effectInput === \"string\") {\n list = effectInput.toLowerCase().split(\",\").map((s) => s.trim());\n }\n\n const isAll = list.includes(\"all\") || list.includes(\"todos\") || list.includes(\"supernova\") || list.includes(\"inferno\");\n\n const enableFluidFlames =\n isAll ||\n list.includes(\"flames\") ||\n list.includes(\"fluid-flames\") ||\n list.includes(\"llamas\") ||\n list.includes(\"llamas-organicas\");\n\n const enableCrystalFlames =\n isAll ||\n list.includes(\"fire\") ||\n list.includes(\"crystal-flames\") ||\n list.includes(\"cristales\") ||\n list.includes(\"fuego\");\n\n const enableBlobs =\n isAll ||\n list.includes(\"blobs\") ||\n list.includes(\"energy-blobs\") ||\n list.includes(\"plasma-blobs\") ||\n list.includes(\"nubes\");\n\n const enableSparks =\n isAll ||\n list.includes(\"sparks\") ||\n list.includes(\"chispas\");\n\n const enableShockwave =\n isAll ||\n list.includes(\"shockwave\") ||\n list.includes(\"wave\") ||\n list.includes(\"onda\") ||\n list.includes(\"onda-3d\");\n\n const enablePlasma =\n isAll ||\n list.includes(\"plasma\") ||\n list.includes(\"electric\");\n\n const enableEmbers =\n isAll ||\n list.includes(\"embers\") ||\n list.includes(\"ascuas\") ||\n enableFluidFlames ||\n enableCrystalFlames ||\n enableBlobs;\n\n return {\n enableFluidFlames,\n enableCrystalFlames,\n enableBlobs,\n enableSparks,\n enableShockwave,\n enablePlasma,\n enableEmbers,\n };\n}\n\n/**\n * Main Animated Background Component for 3d-effect-cinema.\n * Supports permanent 3D background mode OR cinematic Splash Screen / Loader mode (with loaderDuration & redirectUrl).\n * Can be targeted to a DOM container via `containerSelector` (e.g. containerSelector=\"home\").\n */\nexport default function AnimatedBackground({\n containerToDisplay,\n containerSelector,\n effect = \"flames\",\n title,\n backgroundColor,\n effectColor,\n effectSpeed = 0.5,\n effectDensity = 0.3,\n autoFitText = true,\n loaderDuration,\n redirectUrl,\n onComplete,\n fontFamily = \"cinema\",\n fontUrl,\n theme = \"crimson\",\n letterSpacing = 0.85,\n className = \"\",\n style,\n children,\n}: AnimatedBackgroundProps) {\n const activeTitle = title !== undefined && title !== null ? title.trim().toUpperCase() : \"\";\n const letters = activeTitle ? activeTitle.split(\"\") : [];\n const positions = useMemo(\n () => computeLetterPositions(activeTitle, letterSpacing),\n [activeTitle, letterSpacing]\n );\n\n // Loader Countdown State\n const isLoaderActive = Boolean(loaderDuration && loaderDuration > 0 && (redirectUrl || onComplete));\n const [loaderProgress, setLoaderProgress] = useState(0);\n\n useEffect(() => {\n if (!isLoaderActive || !loaderDuration) return;\n\n const totalMs = loaderDuration * 1000;\n const intervalMs = 50;\n let elapsedMs = 0;\n\n const timer = setInterval(() => {\n elapsedMs += intervalMs;\n const currentPct = Math.min(100, (elapsedMs / totalMs) * 100);\n setLoaderProgress(currentPct);\n\n if (elapsedMs >= totalMs) {\n clearInterval(timer);\n onComplete?.();\n if (redirectUrl) {\n window.location.href = redirectUrl;\n }\n }\n }, intervalMs);\n\n return () => clearInterval(timer);\n }, [isLoaderActive, loaderDuration, redirectUrl, onComplete]);\n\n // Active 3D Typeface JSON URL\n const activeFontUrl = useMemo(() => {\n if (fontUrl) return fontUrl;\n const key = String(fontFamily).toLowerCase().trim();\n return FONT_PRESETS[key] || FONT_PRESETS.cinema;\n }, [fontFamily, fontUrl]);\n\n // Window width tracking for mobile viewport 3D text auto-fitting\n const [windowWidth, setWindowWidth] = useState<number>(\n typeof window !== \"undefined\" ? window.innerWidth : 1200\n );\n\n useEffect(() => {\n const handleResize = () => setWindowWidth(window.innerWidth);\n window.addEventListener(\"resize\", handleResize);\n return () => window.removeEventListener(\"resize\", handleResize);\n }, []);\n\n // Dynamic text auto-scaling to prevent overflowing container on mobile and desktop\n const calculatedScale = useMemo(() => {\n if (!autoFitText || !letters.length) return 1.0;\n const len = letters.length;\n let baseScale = 1.0;\n if (len <= 4) baseScale = 1.0;\n else if (len <= 7) baseScale = 0.85;\n else if (len <= 10) baseScale = 0.7;\n else if (len <= 14) baseScale = 0.55;\n else baseScale = 0.45;\n\n // Apply viewport scale multiplier for mobile screen width\n if (windowWidth < 480) {\n return baseScale * 0.55;\n } else if (windowWidth < 768) {\n return baseScale * 0.75;\n }\n return baseScale;\n }, [autoFitText, letters.length, windowWidth]);\n\n // Determine active background color / gradient\n const activeBg = useMemo(() => {\n if (!backgroundColor) return THEME_BACKGROUNDS[theme] || THEME_BACKGROUNDS.gold;\n const lower = backgroundColor.toLowerCase().trim();\n if (SPANISH_COLOR_MAP[lower]) return SPANISH_COLOR_MAP[lower];\n if (backgroundColor.startsWith(\"#\") || backgroundColor.startsWith(\"rgb\") || backgroundColor.includes(\"gradient\")) {\n return backgroundColor;\n }\n return backgroundColor;\n }, [backgroundColor, theme]);\n\n // Parse active 3D effects\n const activeEffects = useMemo(() => parseActiveEffects(effect), [effect]);\n\n const flameMode: \"fluid\" | \"crystal\" | \"all\" =\n activeEffects.enableFluidFlames && activeEffects.enableCrystalFlames\n ? \"all\"\n : activeEffects.enableCrystalFlames\n ? \"crystal\"\n : \"fluid\";\n\n const enableAnyFlames = activeEffects.enableFluidFlames || activeEffects.enableCrystalFlames;\n\n const targetSelector = containerSelector || (typeof containerToDisplay === \"string\" ? containerToDisplay : undefined);\n\n const renderContainerContent = () => {\n if (targetSelector === \"lhome\" || targetSelector === \"home\" || containerToDisplay === \"lhome\" || containerToDisplay === \"home\") {\n return <CinemaHome cinemaName={activeTitle || \"NOVA\"} webTheme={theme} />;\n }\n if (typeof containerToDisplay === \"string\" && containerToDisplay !== \"lhome\" && containerToDisplay !== \"home\") {\n return (\n <div className=\"text-center text-white p-8 bg-black/40 backdrop-blur-md rounded-2xl border border-white/10\">\n <h2 className=\"text-3xl font-bold tracking-widest uppercase mb-2\">\n {containerToDisplay}\n </h2>\n <p className=\"text-sm text-white/60\">3D Interactive WebGL Background</p>\n </div>\n );\n }\n if (containerToDisplay && typeof containerToDisplay !== \"string\") {\n return containerToDisplay;\n }\n return children;\n };\n\n return (\n <div\n id={containerSelector}\n data-container-selector={containerSelector}\n className={`relative w-full h-full overflow-hidden select-none ${className}`}\n style={{ background: activeBg, ...style }}\n >\n {/* Sleek Progress Bar overlay when used in Loader / Splash screen mode */}\n {isLoaderActive && (\n <div className=\"absolute top-0 left-0 right-0 z-30 h-1 bg-white/10 pointer-events-none\">\n <div\n className=\"h-full bg-gradient-to-r from-amber-400 via-rose-500 to-cyan-400 transition-all duration-75\"\n style={{ width: `${loaderProgress}%` }}\n />\n </div>\n )}\n\n {/* 3D WebGL Canvas Layer */}\n <div className=\"absolute inset-0 z-0 pointer-events-auto\">\n <Canvas\n camera={{ position: [0, 0, 14], fov: 45, near: 0.1, far: 50 }}\n dpr={[1, 2]}\n gl={{\n antialias: true,\n toneMapping: 4,\n toneMappingExposure: 1.2,\n }}\n >\n <Suspense fallback={null}>\n <Environment preset=\"studio\" />\n <ambientLight intensity={0.3} />\n <directionalLight position={[5, 8, 5]} intensity={1.5} color=\"#ffffff\" />\n <pointLight\n position={[-5, -3, -5]}\n intensity={0.6}\n color={\n theme === \"emerald\"\n ? \"#10b981\"\n : theme === \"crimson\"\n ? \"#ff1744\"\n : theme === \"neon\"\n ? \"#00ffff\"\n : \"#FFD700\"\n }\n />\n\n <CameraRig phase={isLoaderActive ? \"entering\" : \"idle\"} effectSpeed={effectSpeed} />\n\n {/* Mind-Blowing Dual-Mode Fire Flames (Fluid & Crystal modes) */}\n <FireFlames\n enabled={enableAnyFlames}\n theme={theme}\n effectColor={effectColor}\n effectSpeed={effectSpeed}\n effectDensity={effectDensity}\n mode={flameMode}\n />\n\n {/* Bioluminescent Liquid Energy Blobs Effect (Exact User Screenshot Effect) */}\n <PlasmaBlobs\n enabled={activeEffects.enableBlobs}\n theme={theme}\n effectColor={effectColor}\n effectSpeed={effectSpeed}\n effectDensity={effectDensity}\n />\n\n {/* Interactive 3D Effects */}\n <ClickFireSparks enabled={activeEffects.enableSparks} theme={theme} effectColor={effectColor} effectSpeed={effectSpeed} />\n <ClickShockwave enabled={activeEffects.enableShockwave} theme={theme} effectColor={effectColor} effectSpeed={effectSpeed} />\n <ElectricPlasma enabled={activeEffects.enablePlasma} theme={theme} effectColor={effectColor} effectSpeed={effectSpeed} />\n\n {/* 3D Typography with autoFitText scaling */}\n {letters.length > 0 && (\n <Center disableY disableZ>\n <group scale={calculatedScale}>\n {letters.map((char, i) => (\n <AnimatedLetter\n key={`${char}-${i}`}\n char={char}\n index={i}\n totalLetters={letters.length}\n position={positions[i]}\n phase={isLoaderActive ? \"entering\" : \"idle\"}\n theme={theme}\n fontUrl={activeFontUrl}\n />\n ))}\n </group>\n </Center>\n )}\n\n {/* Floating particles */}\n <SceneParticles theme={theme} effectColor={effectColor} effectSpeed={effectSpeed} visible={activeEffects.enableEmbers} />\n\n {/* Post-Processing */}\n <EffectComposer>\n <Bloom\n luminanceThreshold={0.7}\n luminanceSmoothing={0.9}\n intensity={theme === \"neon\" || theme === \"crimson\" ? 1.4 : 0.9}\n mipmapBlur\n />\n <Vignette offset={0.3} darkness={0.85} />\n <Noise opacity={0.025} />\n </EffectComposer>\n </Suspense>\n </Canvas>\n </div>\n\n {/* Overlaid UI / Container Content */}\n {renderContainerContent() && (\n <div className=\"relative z-10 w-full h-full pointer-events-none flex flex-col items-center justify-center\">\n <div className=\"pointer-events-auto w-full h-full\">\n {renderContainerContent()}\n </div>\n </div>\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport { useRef, useMemo } from \"react\";\nimport { useFrame } from \"@react-three/fiber\";\nimport { Text3D } from \"@react-three/drei\";\nimport * as THREE from \"three\";\n\nexport type MaterialTheme = \"gold\" | \"neon\" | \"emerald\" | \"crimson\" | \"obsidian\" | \"glass\";\n\ninterface AnimatedLetterProps {\n char: string;\n index: number;\n totalLetters: number;\n position: [number, number, number];\n phase: \"loading\" | \"entering\" | \"idle\" | \"exiting\";\n theme: MaterialTheme;\n fontUrl: string;\n}\n\nconst THEME_CONFIGS: Record<\n MaterialTheme,\n {\n color: string;\n metalness: number;\n roughness: number;\n clearcoat: number;\n emissive: string;\n emissiveIntensity: number;\n envMapIntensity: number;\n transmission?: number;\n ior?: number;\n thickness?: number;\n transparent?: boolean;\n }\n> = {\n gold: {\n color: \"#FFD700\",\n metalness: 1.0,\n roughness: 0.15,\n clearcoat: 1.0,\n emissive: \"#1a0f00\",\n emissiveIntensity: 0.3,\n envMapIntensity: 2.0,\n },\n neon: {\n color: \"#00ffff\",\n metalness: 0.0,\n roughness: 1.0,\n clearcoat: 0.0,\n emissive: \"#00ffff\",\n emissiveIntensity: 2.5,\n envMapIntensity: 0.5,\n },\n emerald: {\n color: \"#10b981\",\n metalness: 0.9,\n roughness: 0.1,\n clearcoat: 1.0,\n emissive: \"#065f46\",\n emissiveIntensity: 1.2,\n envMapIntensity: 2.5,\n },\n crimson: {\n color: \"#ff1744\",\n metalness: 0.8,\n roughness: 0.15,\n clearcoat: 1.0,\n emissive: \"#880e4f\",\n emissiveIntensity: 1.8,\n envMapIntensity: 2.0,\n },\n obsidian: {\n color: \"#1a1a2e\",\n metalness: 1.0,\n roughness: 0.05,\n clearcoat: 1.0,\n emissive: \"#0a0a1a\",\n emissiveIntensity: 0.1,\n envMapIntensity: 3.0,\n },\n glass: {\n color: \"#ffffff\",\n metalness: 0.0,\n roughness: 0.0,\n clearcoat: 0.0,\n emissive: \"#000000\",\n emissiveIntensity: 0.0,\n envMapIntensity: 1.5,\n transmission: 0.95,\n ior: 1.5,\n thickness: 0.5,\n transparent: true,\n },\n};\n\nexport default function AnimatedLetter({\n char,\n index,\n totalLetters,\n position,\n phase,\n theme,\n fontUrl,\n}: AnimatedLetterProps) {\n const meshRef = useRef<THREE.Group>(null);\n const startTimeRef = useRef<number | null>(null);\n\n // Randomized starting offsets for the entrance animation\n const entryOffset = useMemo(() => {\n const angle = (index / totalLetters) * Math.PI * 2;\n return {\n x: Math.cos(angle) * 4 + (Math.random() - 0.5) * 2,\n y: -3 + Math.random() * -3,\n z: -5 + Math.random() * -3,\n rotX: (Math.random() - 0.5) * Math.PI * 2,\n rotY: (Math.random() - 0.5) * Math.PI * 2,\n };\n }, [index, totalLetters]);\n\n const themeConfig = THEME_CONFIGS[theme];\n\n useFrame((state) => {\n if (!meshRef.current) return;\n const time = state.clock.getElapsedTime();\n\n if (startTimeRef.current === null) {\n startTimeRef.current = time;\n }\n\n const elapsed = time - startTimeRef.current;\n const staggerDelay = index * 0.12;\n\n if (phase === \"loading\") {\n meshRef.current.position.set(\n position[0] + entryOffset.x,\n position[1] + entryOffset.y,\n position[2] + entryOffset.z\n );\n meshRef.current.rotation.set(entryOffset.rotX, entryOffset.rotY, 0);\n meshRef.current.scale.setScalar(0);\n return;\n }\n\n if (phase === \"entering\") {\n const t = Math.max(0, elapsed - staggerDelay);\n // Smooth spring-like easing\n const progress = 1 - Math.exp(-t * 3);\n // Overshoot for bounciness\n const bounce = 1 + Math.sin(t * 8) * Math.max(0, 0.15 - t * 0.1);\n\n meshRef.current.position.set(\n THREE.MathUtils.lerp(\n position[0] + entryOffset.x,\n position[0],\n progress\n ),\n THREE.MathUtils.lerp(\n position[1] + entryOffset.y,\n position[1],\n progress\n ),\n THREE.MathUtils.lerp(\n position[2] + entryOffset.z,\n position[2],\n progress\n )\n );\n\n meshRef.current.rotation.set(\n THREE.MathUtils.lerp(entryOffset.rotX, 0, progress),\n THREE.MathUtils.lerp(entryOffset.rotY, 0, progress),\n 0\n );\n\n meshRef.current.scale.setScalar(\n Math.min(progress * bounce, 1.05)\n );\n return;\n }\n\n if (phase === \"idle\") {\n // Gentle breathing oscillation\n const breathe =\n Math.sin(time * 1.2 + index * 0.5) * 0.015;\n const sway =\n Math.sin(time * 0.8 + index * 0.3) * 0.008;\n\n meshRef.current.position.set(\n position[0] + sway,\n position[1] + breathe,\n position[2]\n );\n meshRef.current.rotation.set(\n Math.sin(time * 0.5 + index) * 0.01,\n Math.sin(time * 0.3 + index * 0.7) * 0.01,\n 0\n );\n meshRef.current.scale.setScalar(1);\n return;\n }\n\n if (phase === \"exiting\") {\n const t = Math.max(0, elapsed - staggerDelay * 0.5);\n const progress = Math.min(t * 2, 1);\n const eased = progress * progress;\n\n meshRef.current.position.set(\n position[0] + entryOffset.x * eased * 0.5,\n position[1],\n position[2] - eased * 8\n );\n meshRef.current.scale.setScalar(Math.max(1 - eased, 0));\n meshRef.current.rotation.y += 0.05;\n }\n });\n\n // Skip spaces\n if (char === \" \") return null;\n\n return (\n <group ref={meshRef} position={position}>\n <Text3D\n font={fontUrl}\n size={0.8}\n height={0.35}\n bevelEnabled\n bevelSize={0.02}\n bevelThickness={0.01}\n bevelSegments={3}\n curveSegments={12}\n >\n {char}\n <meshPhysicalMaterial\n color={themeConfig.color}\n metalness={themeConfig.metalness}\n roughness={themeConfig.roughness}\n clearcoat={themeConfig.clearcoat}\n emissive={themeConfig.emissive}\n emissiveIntensity={themeConfig.emissiveIntensity}\n envMapIntensity={themeConfig.envMapIntensity}\n transmission={themeConfig.transmission}\n ior={themeConfig.ior}\n thickness={themeConfig.thickness}\n transparent={themeConfig.transparent}\n toneMapped={theme !== \"neon\"}\n />\n </Text3D>\n </group>\n );\n}\n","\"use client\";\n\nimport { useRef, useMemo } from \"react\";\nimport { useFrame } from \"@react-three/fiber\";\nimport { Sparkles } from \"@react-three/drei\";\nimport * as THREE from \"three\";\nimport type { MaterialTheme } from \"./AnimatedLetter\";\n\ninterface SceneParticlesProps {\n theme: MaterialTheme;\n effectColor?: string;\n effectSpeed?: number;\n visible: boolean;\n}\n\nconst THEME_PARTICLE_COLORS: Record<MaterialTheme, string> = {\n gold: \"#FFD700\",\n neon: \"#00ffff\",\n emerald: \"#10b981\",\n crimson: \"#ff1744\",\n obsidian: \"#a855f7\",\n glass: \"#ffffff\",\n};\n\nconst SPANISH_COLOR_HEX: Record<string, string> = {\n azul: \"#00e5ff\",\n verde: \"#00e676\",\n rojo: \"#ff3d00\",\n dorado: \"#ffb300\",\n purpura: \"#d500f9\",\n magenta: \"#ff007f\",\n esmeralda: \"#10b981\",\n};\n\n/**\n * Custom slow-orbit dust motes for depth parallax\n */\nfunction DustMotes({ color, speedMultiplier = 0.5, count = 60 }: { color: string; speedMultiplier?: number; count?: number }) {\n const meshRef = useRef<THREE.InstancedMesh>(null);\n const dummy = useRef(new THREE.Object3D());\n const speeds = useRef<Float32Array | null>(null);\n const offsets = useRef<Float32Array | null>(null);\n\n if (!speeds.current) {\n speeds.current = new Float32Array(count);\n offsets.current = new Float32Array(count * 3);\n for (let i = 0; i < count; i++) {\n speeds.current[i] = 0.1 + Math.random() * 0.3;\n offsets.current[i * 3] = (Math.random() - 0.5) * 16;\n offsets.current[i * 3 + 1] = (Math.random() - 0.5) * 10;\n offsets.current[i * 3 + 2] = (Math.random() - 0.5) * 12;\n }\n }\n\n useFrame((state) => {\n if (!meshRef.current || !speeds.current || !offsets.current) return;\n const time = state.clock.getElapsedTime() * speedMultiplier;\n\n for (let i = 0; i < count; i++) {\n const speed = speeds.current[i];\n const ox = offsets.current[i * 3];\n const oy = offsets.current[i * 3 + 1];\n const oz = offsets.current[i * 3 + 2];\n\n dummy.current.position.set(\n ox + Math.sin(time * speed + i) * 2,\n oy + Math.cos(time * speed * 0.7 + i * 0.5) * 1.5,\n oz + Math.sin(time * speed * 0.5 + i * 0.3) * 2\n );\n dummy.current.scale.setScalar(0.015 + Math.sin(time + i) * 0.005);\n dummy.current.updateMatrix();\n meshRef.current.setMatrixAt(i, dummy.current.matrix);\n }\n meshRef.current.instanceMatrix.needsUpdate = true;\n });\n\n return (\n <instancedMesh ref={meshRef} args={[undefined, undefined, count]}>\n <sphereGeometry args={[1, 6, 6]} />\n <meshBasicMaterial\n color={color}\n transparent\n opacity={0.3}\n toneMapped={false}\n />\n </instancedMesh>\n );\n}\n\nexport default function SceneParticles({ theme, effectColor, effectSpeed = 0.5, visible }: SceneParticlesProps) {\n const activeColor = useMemo(() => {\n if (!effectColor) return THEME_PARTICLE_COLORS[theme] || THEME_PARTICLE_COLORS.gold;\n const lower = effectColor.toLowerCase().trim();\n if (SPANISH_COLOR_HEX[lower]) return SPANISH_COLOR_HEX[lower];\n return effectColor;\n }, [effectColor, theme]);\n\n if (!visible) return null;\n\n return (\n <group>\n {/* Primary sparkles — bright, close */}\n <Sparkles\n count={150}\n scale={10}\n size={4}\n speed={0.3 * effectSpeed}\n opacity={0.8}\n color={activeColor}\n noise={0.6}\n />\n\n {/* Secondary sparkles — dim, distant, slower */}\n <Sparkles\n count={80}\n scale={16}\n size={2}\n speed={0.15 * effectSpeed}\n opacity={0.4}\n color=\"#ffffff\"\n noise={0.8}\n />\n\n {/* Custom dust motes for depth parallax */}\n <DustMotes color={activeColor} speedMultiplier={effectSpeed} count={50} />\n </group>\n );\n}\n","\"use client\";\n\nimport { useRef } from \"react\";\nimport { useFrame, useThree } from \"@react-three/fiber\";\nimport * as THREE from \"three\";\n\ninterface CameraRigProps {\n phase: \"loading\" | \"entering\" | \"idle\" | \"exiting\";\n effectSpeed?: number;\n}\n\nexport default function CameraRig({ phase, effectSpeed = 0.5 }: CameraRigProps) {\n const { camera, pointer } = useThree();\n const startTimeRef = useRef<number | null>(null);\n const phaseRef = useRef(phase);\n\n if (phaseRef.current !== phase) {\n phaseRef.current = phase;\n startTimeRef.current = null;\n }\n\n useFrame((state) => {\n const time = state.clock.getElapsedTime() * effectSpeed;\n\n if (startTimeRef.current === null) {\n startTimeRef.current = time;\n }\n\n const elapsed = time - startTimeRef.current;\n\n if (phase === \"loading\") {\n camera.position.set(0, 0, 14);\n camera.lookAt(0, 0, 0);\n return;\n }\n\n if (phase === \"entering\") {\n const t = Math.min(elapsed / 3, 1);\n const eased = 1 - Math.pow(1 - t, 3);\n const z = THREE.MathUtils.lerp(14, 6, eased);\n const y = THREE.MathUtils.lerp(1, 0.2, eased);\n\n camera.position.set(0, y, z);\n camera.lookAt(0, 0, 0);\n return;\n }\n\n // Calculate target Z distance dynamically based on viewport aspect ratio\n const aspect = state.viewport.width / (state.viewport.height || 1);\n const targetZ = aspect < 1 ? Math.max(6, 6 / Math.max(0.45, aspect * 0.85)) : 6;\n\n if (phase === \"idle\") {\n // Very gentle slow circular drift + subtle mouse parallax\n const driftX = Math.sin(time * 0.1) * 0.2;\n const driftY = Math.cos(time * 0.08) * 0.1 + 0.2;\n\n const mouseX = pointer.x * 0.2;\n const mouseY = pointer.y * 0.1;\n\n camera.position.x = THREE.MathUtils.damp(\n camera.position.x,\n driftX + mouseX,\n 3,\n 0.016\n );\n camera.position.y = THREE.MathUtils.damp(\n camera.position.y,\n driftY + mouseY,\n 3,\n 0.016\n );\n camera.position.z = THREE.MathUtils.damp(\n camera.position.z,\n targetZ,\n 3,\n 0.016\n );\n camera.lookAt(0, 0, 0);\n return;\n }\n\n if (phase === \"exiting\") {\n const t = Math.min(elapsed / 1.5, 1);\n const eased = t * t * t;\n const z = THREE.MathUtils.lerp(6, -8, eased);\n\n camera.position.set(0, 0, z);\n camera.lookAt(0, 0, 0);\n }\n });\n\n return null;\n}\n","\"use client\";\n\nimport { useState, useRef, useCallback, useEffect, useMemo } from \"react\";\nimport { useFrame, useThree } from \"@react-three/fiber\";\nimport * as THREE from \"three\";\nimport type { MaterialTheme } from \"./AnimatedLetter\";\n\ninterface Spark {\n id: number;\n position: THREE.Vector3;\n velocity: THREE.Vector3;\n color: THREE.Color;\n size: number;\n life: number; // 0 to 1\n maxLife: number;\n}\n\ninterface SparkBurst {\n id: number;\n origin: THREE.Vector3;\n sparks: Spark[];\n color: string;\n lightIntensity: number;\n time: number;\n}\n\nconst THEME_SPARK_COLORS: Record<MaterialTheme, string[]> = {\n gold: [\"#FFD700\", \"#FF8C00\", \"#FF4500\", \"#FFF8DC\"],\n neon: [\"#00ffff\", \"#0088ff\", \"#ff00ff\", \"#ffffff\"],\n emerald: [\"#00ff88\", \"#10b981\", \"#059669\", \"#a7f3d0\"],\n crimson: [\"#ff1744\", \"#d50000\", \"#ff5252\", \"#ffb74d\"],\n obsidian: [\"#a855f7\", \"#6366f1\", \"#3b82f6\", \"#ffffff\"],\n glass: [\"#ffffff\", \"#e0e7ff\", \"#93c5fd\", \"#60a5fa\"],\n};\n\nconst SPANISH_COLOR_HEX: Record<string, string> = {\n azul: \"#00e5ff\",\n verde: \"#00e676\",\n rojo: \"#ff3d00\",\n dorado: \"#ffb300\",\n purpura: \"#d500f9\",\n magenta: \"#ff007f\",\n esmeralda: \"#10b981\",\n};\n\nexport default function ClickFireSparks({\n theme = \"gold\",\n effectColor,\n effectSpeed = 0.5,\n enabled = true,\n}: {\n theme?: MaterialTheme;\n effectColor?: string;\n effectSpeed?: number;\n enabled?: boolean;\n}) {\n const { camera, raycaster } = useThree();\n const [bursts, setBursts] = useState<SparkBurst[]>([]);\n const nextId = useRef(0);\n\n const activePalette = useMemo(() => {\n if (!effectColor) return THEME_SPARK_COLORS[theme] || THEME_SPARK_COLORS.gold;\n const lower = effectColor.toLowerCase().trim();\n const primaryHex = SPANISH_COLOR_HEX[lower] || effectColor;\n return [primaryHex, \"#ffffff\", primaryHex];\n }, [effectColor, theme]);\n\n const handlePointerDown = useCallback(\n (event: MouseEvent | TouchEvent) => {\n if (!enabled) return;\n let clientX = 0;\n let clientY = 0;\n\n if (\"touches\" in event && event.touches.length > 0) {\n clientX = event.touches[0].clientX;\n clientY = event.touches[0].clientY;\n } else if (\"clientX\" in event) {\n clientX = (event as MouseEvent).clientX;\n clientY = (event as MouseEvent).clientY;\n } else {\n return;\n }\n\n const ndc = new THREE.Vector2(\n (clientX / window.innerWidth) * 2 - 1,\n -(clientY / window.innerHeight) * 2 + 1\n );\n\n raycaster.setFromCamera(ndc, camera);\n\n const plane = new THREE.Plane(new THREE.Vector3(0, 0, 1), 0);\n const intersectionPoint = new THREE.Vector3();\n raycaster.ray.intersectPlane(plane, intersectionPoint);\n\n if (!intersectionPoint) return;\n\n const sparkCount = 35;\n const newSparks: Spark[] = [];\n\n for (let i = 0; i < sparkCount; i++) {\n const angle = Math.random() * Math.PI * 2;\n const speed = (1.5 + Math.random() * 4.5) * effectSpeed;\n const elevation = (Math.random() - 0.3) * 3 * effectSpeed;\n\n const velocity = new THREE.Vector3(\n Math.cos(angle) * speed,\n Math.sin(angle) * speed + elevation,\n (Math.random() - 0.5) * speed * 0.8\n );\n\n const hexColor = activePalette[Math.floor(Math.random() * activePalette.length)];\n\n newSparks.push({\n id: i,\n position: intersectionPoint.clone(),\n velocity,\n color: new THREE.Color(hexColor),\n size: 0.08 + Math.random() * 0.12,\n life: 1.0,\n maxLife: (0.6 + Math.random() * 0.8) / Math.max(0.2, effectSpeed),\n });\n }\n\n const newBurst: SparkBurst = {\n id: nextId.current++,\n origin: intersectionPoint.clone(),\n sparks: newSparks,\n color: activePalette[0],\n lightIntensity: 4.0,\n time: 0,\n };\n\n setBursts((prev) => [...prev.slice(-4), newBurst]);\n },\n [camera, raycaster, activePalette, effectSpeed, enabled]\n );\n\n useEffect(() => {\n window.addEventListener(\"pointerdown\", handlePointerDown);\n return () => {\n window.removeEventListener(\"pointerdown\", handlePointerDown);\n };\n }, [handlePointerDown]);\n\n // Physics animation frame loop\n useFrame((_, delta) => {\n if (bursts.length === 0) return;\n\n setBursts((prevBursts) =>\n prevBursts\n .map((burst) => {\n const updatedTime = burst.time + delta * effectSpeed;\n const updatedLight = Math.max(0, burst.lightIntensity - delta * 8.0 * effectSpeed);\n\n const updatedSparks = burst.sparks\n .map((spark) => {\n const newLife = spark.life - (delta * effectSpeed) / spark.maxLife;\n if (newLife <= 0) return null;\n\n const newPos = spark.position\n .clone()\n .addScaledVector(spark.velocity, delta * effectSpeed);\n spark.velocity.y -= delta * 3.5 * effectSpeed; // Gravity\n spark.velocity.multiplyScalar(0.96); // Drag\n\n return {\n ...spark,\n position: newPos,\n life: newLife,\n };\n })\n .filter(Boolean) as Spark[];\n\n if (updatedSparks.length === 0 && updatedLight <= 0) return null;\n\n return {\n ...burst,\n time: updatedTime,\n lightIntensity: updatedLight,\n sparks: updatedSparks,\n };\n })\n .filter(Boolean) as SparkBurst[]\n );\n });\n\n return (\n <group>\n {bursts.map((burst) => (\n <group key={burst.id}>\n {burst.lightIntensity > 0.05 && (\n <pointLight\n position={burst.origin}\n intensity={burst.lightIntensity * 3}\n distance={6}\n color={burst.color}\n />\n )}\n\n {burst.sparks.map((spark) => (\n <mesh key={spark.id} position={spark.position}>\n <sphereGeometry args={[spark.size * spark.life, 6, 6]} />\n <meshBasicMaterial\n color={spark.color}\n transparent\n opacity={spark.life}\n toneMapped={false}\n />\n </mesh>\n ))}\n </group>\n ))}\n </group>\n );\n}\n","\"use client\";\n\nimport { useState, useRef, useCallback, useEffect, useMemo } from \"react\";\nimport { useFrame, useThree } from \"@react-three/fiber\";\nimport * as THREE from \"three\";\nimport type { MaterialTheme } from \"./AnimatedLetter\";\n\ninterface RingWave {\n id: number;\n origin: THREE.Vector3;\n radius: number;\n maxRadius: number;\n life: number; // 1 to 0\n color: THREE.Color;\n}\n\nconst THEME_WAVE_COLORS: Record<MaterialTheme, string> = {\n gold: \"#FFD700\",\n neon: \"#00ffff\",\n emerald: \"#10b981\",\n crimson: \"#ff1744\",\n obsidian: \"#a855f7\",\n glass: \"#ffffff\",\n};\n\nconst SPANISH_COLOR_HEX: Record<string, string> = {\n azul: \"#00e5ff\",\n verde: \"#00e676\",\n rojo: \"#ff3d00\",\n dorado: \"#ffb300\",\n purpura: \"#d500f9\",\n magenta: \"#ff007f\",\n esmeralda: \"#10b981\",\n};\n\nexport default function ClickShockwave({\n theme = \"gold\",\n effectColor,\n effectSpeed = 0.5,\n enabled = true,\n}: {\n theme?: MaterialTheme;\n effectColor?: string;\n effectSpeed?: number;\n enabled?: boolean;\n}) {\n const { camera, raycaster } = useThree();\n const [waves, setWaves] = useState<RingWave[]>([]);\n const nextId = useRef(0);\n\n const activeColorHex = useMemo(() => {\n if (!effectColor) return THEME_WAVE_COLORS[theme] || THEME_WAVE_COLORS.gold;\n const lower = effectColor.toLowerCase().trim();\n if (SPANISH_COLOR_HEX[lower]) return SPANISH_COLOR_HEX[lower];\n return effectColor;\n }, [effectColor, theme]);\n\n const handlePointerDown = useCallback(\n (event: MouseEvent | TouchEvent) => {\n if (!enabled) return;\n\n let clientX = 0;\n let clientY = 0;\n\n if (\"touches\" in event && event.touches.length > 0) {\n clientX = event.touches[0].clientX;\n clientY = event.touches[0].clientY;\n } else if (\"clientX\" in event) {\n clientX = (event as MouseEvent).clientX;\n clientY = (event as MouseEvent).clientY;\n } else {\n return;\n }\n\n const ndc = new THREE.Vector2(\n (clientX / window.innerWidth) * 2 - 1,\n -(clientY / window.innerHeight) * 2 + 1\n );\n\n raycaster.setFromCamera(ndc, camera);\n\n const plane = new THREE.Plane(new THREE.Vector3(0, 0, 1), 0);\n const intersectionPoint = new THREE.Vector3();\n raycaster.ray.intersectPlane(plane, intersectionPoint);\n\n if (!intersectionPoint) return;\n\n const newWave: RingWave = {\n id: nextId.current++,\n origin: intersectionPoint.clone(),\n radius: 0.1,\n maxRadius: 3.5,\n life: 1.0,\n color: new THREE.Color(activeColorHex),\n };\n\n setWaves((prev) => [...prev.slice(-4), newWave]);\n },\n [camera, raycaster, activeColorHex, enabled]\n );\n\n useEffect(() => {\n window.addEventListener(\"pointerdown\", handlePointerDown);\n return () => {\n window.removeEventListener(\"pointerdown\", handlePointerDown);\n };\n }, [handlePointerDown]);\n\n useFrame((_, delta) => {\n if (waves.length === 0) return;\n\n setWaves((prev) =>\n prev\n .map((wave) => {\n const newLife = wave.life - delta * 1.8 * effectSpeed;\n if (newLife <= 0) return null;\n\n const newRadius = wave.radius + delta * 5.0 * effectSpeed;\n\n return {\n ...wave,\n life: newLife,\n radius: newRadius,\n };\n })\n .filter(Boolean) as RingWave[]\n );\n });\n\n if (!enabled) return null;\n\n return (\n <group>\n {waves.map((wave) => (\n <mesh key={wave.id} position={wave.origin} rotation={[0, 0, 0]}>\n <ringGeometry args={[wave.radius * 0.9, wave.radius, 48]} />\n <meshBasicMaterial\n color={wave.color}\n transparent\n opacity={wave.life * 0.75}\n side={THREE.DoubleSide}\n toneMapped={false}\n />\n </mesh>\n ))}\n </group>\n );\n}\n","\"use client\";\n\nimport { useRef, useMemo } from \"react\";\nimport { useFrame, useThree } from \"@react-three/fiber\";\nimport * as THREE from \"three\";\nimport type { MaterialTheme } from \"./AnimatedLetter\";\n\ninterface ElectricPlasmaProps {\n theme?: MaterialTheme;\n effectColor?: string;\n effectSpeed?: number;\n enabled?: boolean;\n}\n\nconst PLASMA_COLORS: Record<MaterialTheme, string> = {\n gold: \"#ffaa00\",\n neon: \"#00ffff\",\n emerald: \"#00ffaa\",\n crimson: \"#ff0055\",\n obsidian: \"#9900ff\",\n glass: \"#88ccff\",\n};\n\nconst SPANISH_COLOR_HEX: Record<string, string> = {\n azul: \"#00e5ff\",\n verde: \"#00e676\",\n rojo: \"#ff3d00\",\n dorado: \"#ffb300\",\n purpura: \"#d500f9\",\n magenta: \"#ff007f\",\n esmeralda: \"#10b981\",\n};\n\nexport default function ElectricPlasma({\n theme = \"neon\",\n effectColor,\n effectSpeed = 0.5,\n enabled = true,\n}: ElectricPlasmaProps) {\n const { pointer } = useThree();\n const lineRef = useRef<THREE.LineSegments>(null);\n\n const activeColor = useMemo(() => {\n if (!effectColor) return PLASMA_COLORS[theme] || PLASMA_COLORS.neon;\n const lower = effectColor.toLowerCase().trim();\n if (SPANISH_COLOR_HEX[lower]) return SPANISH_COLOR_HEX[lower];\n return effectColor;\n }, [effectColor, theme]);\n\n const segmentCount = 30;\n const geometry = useMemo(() => {\n const geom = new THREE.BufferGeometry();\n const positions = new Float32Array(segmentCount * 2 * 3);\n geom.setAttribute(\"position\", new THREE.BufferAttribute(positions, 3));\n return geom;\n }, [segmentCount]);\n\n useFrame((state) => {\n if (!lineRef.current || !enabled) return;\n const time = state.clock.getElapsedTime() * effectSpeed;\n const posAttr = lineRef.current.geometry.attributes.position as THREE.BufferAttribute;\n const positions = posAttr.array as Float32Array;\n\n const targetX = pointer.x * 6;\n const targetY = pointer.y * 3;\n\n for (let i = 0; i < segmentCount; i++) {\n const idx = i * 6;\n const angle = (i / segmentCount) * Math.PI * 2 + time * 1.5;\n const radius = 2.5 + Math.sin(time * 3 + i) * 0.5;\n\n const x1 = Math.cos(angle) * radius;\n const y1 = Math.sin(angle) * radius;\n const z1 = (Math.random() - 0.5) * 1.5;\n\n // Jitter electric arc towards pointer target\n const x2 = x1 + (targetX - x1) * 0.3 + (Math.random() - 0.5) * 0.8;\n const y2 = y1 + (targetY - y1) * 0.3 + (Math.random() - 0.5) * 0.8;\n const z2 = z1 + (Math.random() - 0.5) * 0.8;\n\n positions[idx] = x1;\n positions[idx + 1] = y1;\n positions[idx + 2] = z1;\n\n positions[idx + 3] = x2;\n positions[idx + 4] = y2;\n positions[idx + 5] = z2;\n }\n\n posAttr.needsUpdate = true;\n });\n\n if (!enabled) return null;\n\n return (\n <lineSegments ref={lineRef} geometry={geometry}>\n <lineBasicMaterial\n color={activeColor}\n transparent\n opacity={0.75}\n linewidth={2}\n toneMapped={false}\n />\n </lineSegments>\n );\n}\n","\"use client\";\n\nimport { useRef, useMemo, useEffect, useCallback } from \"react\";\nimport { useFrame, useThree } from \"@react-three/fiber\";\nimport * as THREE from \"three\";\nimport type { MaterialTheme } from \"./AnimatedLetter\";\n\ninterface FireFlamesProps {\n theme?: MaterialTheme;\n effectColor?: string;\n effectSpeed?: number;\n effectDensity?: number;\n mode?: \"fluid\" | \"crystal\" | \"all\";\n enabled?: boolean;\n}\n\nconst FLAME_PALETTES: Record<MaterialTheme, { color1: string; color2: string; light: string }> = {\n crimson: { color1: \"#ff3d00\", color2: \"#ff9100\", light: \"#ff1744\" },\n gold: { color1: \"#ffb300\", color2: \"#ffe082\", light: \"#FFD700\" },\n emerald: { color1: \"#00e676\", color2: \"#a7f3d0\", light: \"#10b981\" },\n neon: { color1: \"#00e5ff\", color2: \"#80d8ff\", light: \"#00ffff\" },\n obsidian: { color1: \"#d500f9\", color2: \"#ea80fc\", light: \"#a855f7\" },\n glass: { color1: \"#80d8ff\", color2: \"#ffffff\", light: \"#60a5fa\" },\n};\n\nconst SPANISH_COLOR_HEX: Record<string, string> = {\n azul: \"#00e5ff\",\n verde: \"#00e676\",\n rojo: \"#ff3d00\",\n dorado: \"#ffb300\",\n purpura: \"#d500f9\",\n magenta: \"#ff007f\",\n esmeralda: \"#10b981\",\n};\n\n/**\n * Creates an ultra-soft liquid energy flame sprite texture\n */\nfunction createLiquidEnergyTexture(): THREE.CanvasTexture {\n const canvas = document.createElement(\"canvas\");\n canvas.width = 128;\n canvas.height = 128;\n const ctx = canvas.getContext(\"2d\");\n\n if (ctx) {\n const gradient = ctx.createRadialGradient(64, 64, 0, 64, 64, 64);\n gradient.addColorStop(0, \"rgba(255, 255, 255, 1)\");\n gradient.addColorStop(0.3, \"rgba(255, 255, 255, 0.9)\");\n gradient.addColorStop(0.65, \"rgba(255, 255, 255, 0.35)\");\n gradient.addColorStop(1, \"rgba(0, 0, 0, 0)\");\n\n ctx.fillStyle = gradient;\n ctx.fillRect(0, 0, 128, 128);\n }\n\n const texture = new THREE.CanvasTexture(canvas);\n texture.needsUpdate = true;\n return texture;\n}\n\ninterface DragBurst {\n x: number;\n y: number;\n z: number;\n life: number;\n size: number;\n}\n\n/**\n * Dual-Engine Fire Flames Component:\n * Offers both Organic Liquid Energy Flame Clouds (mode=\"fluid\") and 3D Crystal Flame Geometries (mode=\"crystal\" or mode=\"all\")\n */\nexport default function FireFlames({\n theme = \"crimson\",\n effectColor,\n effectSpeed = 0.5,\n effectDensity = 0.3,\n mode = \"fluid\",\n enabled = true,\n}: FireFlamesProps) {\n const { pointer } = useThree();\n const fluidMeshRef = useRef<THREE.InstancedMesh>(null);\n const crystalMeshRef = useRef<THREE.InstancedMesh>(null);\n const lightRef = useRef<THREE.PointLight>(null);\n const dummy = useRef(new THREE.Object3D());\n const isPointerDown = useRef(false);\n const dragBursts = useRef<DragBurst[]>([]);\n\n const clampedDensity = Math.max(0.1, Math.min(1.0, effectDensity));\n const flameCount = Math.round(110 * clampedDensity);\n\n const texture = useMemo(() => createLiquidEnergyTexture(), []);\n\n // Determine active color\n const activeColor = useMemo(() => {\n if (!effectColor) {\n const p = FLAME_PALETTES[theme] || FLAME_PALETTES.crimson;\n return p.color1;\n }\n const lower = effectColor.toLowerCase().trim();\n if (SPANISH_COLOR_HEX[lower]) return SPANISH_COLOR_HEX[lower];\n return effectColor;\n }, [effectColor, theme]);\n\n // Particle data with organic convection physics\n const particles = useMemo(() => {\n const data = [];\n const sizeFactor = 0.4 + Math.sqrt(clampedDensity) * 0.55;\n for (let i = 0; i < flameCount; i++) {\n data.push({\n x: (Math.random() - 0.5) * 10,\n y: -2.0 + Math.random() * 0.4,\n z: (Math.random() - 0.5) * 2 - 0.5,\n speedY: 0.8 + Math.random() * 1.8,\n speedX: (Math.random() - 0.5) * 0.5,\n size: (0.4 + Math.random() * 0.6) * sizeFactor,\n phase: Math.random() * Math.PI * 2,\n life: Math.random(),\n });\n }\n return data;\n }, [flameCount, clampedDensity]);\n\n // Pointer drag event handlers\n const handlePointerDown = useCallback(() => {\n isPointerDown.current = true;\n }, []);\n\n const handlePointerUp = useCallback(() => {\n isPointerDown.current = false;\n }, []);\n\n useEffect(() => {\n window.addEventListener(\"pointerdown\", handlePointerDown);\n window.addEventListener(\"pointerup\", handlePointerUp);\n return () => {\n window.removeEventListener(\"pointerdown\", handlePointerDown);\n window.removeEventListener(\"pointerup\", handlePointerUp);\n };\n }, [handlePointerDown, handlePointerUp]);\n\n useFrame((state, delta) => {\n if (!enabled) return;\n const time = state.clock.getElapsedTime() * effectSpeed;\n\n // Pointer click/drag flame spawning\n if (isPointerDown.current) {\n const targetX = pointer.x * 7;\n const targetY = pointer.y * 4;\n if (dragBursts.current.length < 25) {\n dragBursts.current.push({\n x: targetX + (Math.random() - 0.5) * 0.8,\n y: targetY + (Math.random() - 0.5) * 0.8,\n z: (Math.random() - 0.5) * 1.5,\n life: 1.0,\n size: (0.5 + Math.random() * 0.6) * Math.sqrt(clampedDensity),\n });\n }\n }\n\n // Update drag bursts life\n dragBursts.current = dragBursts.current\n .map((b) => {\n b.life -= delta * 1.8 * effectSpeed;\n b.y += delta * 1.2 * effectSpeed;\n return b;\n })\n .filter((b) => b.life > 0);\n\n // Flickering dancing fire light\n if (lightRef.current) {\n lightRef.current.intensity = 2.2 + Math.sin(time * 10) * 0.6 + Math.cos(time * 15) * 0.3;\n lightRef.current.position.y = -1.0 + Math.sin(time * 3) * 0.2;\n }\n\n // 1. Render Organic Liquid Energy Flame Clouds (if mode is \"fluid\" or \"all\")\n if ((mode === \"fluid\" || mode === \"all\") && fluidMeshRef.current) {\n particles.forEach((p, i) => {\n p.life += delta * p.speedY * 0.35 * effectSpeed;\n if (p.life > 1) {\n p.life = 0;\n p.x = (Math.random() - 0.5) * 10;\n p.y = -2.0 + Math.random() * 0.4;\n }\n\n const progress = p.life;\n const currentY = p.y + progress * 3.8;\n const currentX = p.x + Math.sin(time * 2.5 + p.phase) * 0.5 + p.speedX * progress;\n const currentZ = p.z + Math.cos(time * 1.8 + p.phase) * 0.2;\n\n const scaleEnvelope = Math.sin(progress * Math.PI) * p.size * (1.2 - progress * 0.3);\n\n dummy.current.position.set(currentX, currentY, currentZ);\n dummy.current.rotation.set(0, 0, Math.sin(time * 1.5 + i) * 0.2);\n dummy.current.scale.set(scaleEnvelope, scaleEnvelope * 1.3, scaleEnvelope);\n dummy.current.updateMatrix();\n\n fluidMeshRef.current!.setMatrixAt(i, dummy.current.matrix);\n });\n\n // Drag bursts at top indices\n dragBursts.current.forEach((b, idx) => {\n const targetIdx = (flameCount - 1 - idx + flameCount) % flameCount;\n const scaleEnvelope = Math.sin(b.life * Math.PI) * b.size;\n\n dummy.current.position.set(b.x, b.y, b.z);\n dummy.current.rotation.set(0, 0, Math.sin(time * 3 + idx) * 0.3);\n dummy.current.scale.set(scaleEnvelope, scaleEnvelope * 1.4, scaleEnvelope);\n dummy.current.updateMatrix();\n\n fluidMeshRef.current!.setMatrixAt(targetIdx, dummy.current.matrix);\n });\n\n fluidMeshRef.current.instanceMatrix.needsUpdate = true;\n }\n\n // 2. Render 3D Crystal Flame Geometries (if mode is \"crystal\" or \"all\")\n if ((mode === \"crystal\" || mode === \"all\") && crystalMeshRef.current) {\n particles.forEach((p, i) => {\n const progress = p.life;\n const currentY = p.y + progress * 3.8;\n const currentX = p.x + Math.sin(time * 2.8 + p.phase) * 0.5 + p.speedX * progress;\n const currentZ = p.z + Math.cos(time * 2.0 + p.phase) * 0.3;\n\n const scaleEnvelope = Math.sin(progress * Math.PI) * p.size * 0.6;\n\n dummy.current.position.set(currentX, currentY, currentZ);\n dummy.current.rotation.set(time * 1.5 + i, time * 2, i);\n dummy.current.scale.set(scaleEnvelope, scaleEnvelope * 2.0, scaleEnvelope);\n dummy.current.updateMatrix();\n\n crystalMeshRef.current!.setMatrixAt(i, dummy.current.matrix);\n });\n\n crystalMeshRef.current.instanceMatrix.needsUpdate = true;\n }\n });\n\n if (!enabled) return null;\n\n return (\n <group>\n {/* Dancing Fire Point Light */}\n <pointLight\n ref={lightRef}\n position={[0, -1.0, 1.5]}\n color={activeColor}\n intensity={2.5}\n distance={10}\n />\n\n {/* 1. Organic Liquid Energy Flame Clouds (Additive Blending) */}\n {(mode === \"fluid\" || mode === \"all\") && (\n <instancedMesh ref={fluidMeshRef} args={[undefined, undefined, flameCount]}>\n <planeGeometry args={[1.2, 1.2]} />\n <meshBasicMaterial\n map={texture}\n color={activeColor}\n transparent\n blending={THREE.AdditiveBlending}\n depthWrite={false}\n side={THREE.DoubleSide}\n />\n </instancedMesh>\n )}\n\n {/* 2. 3D Crystal / Cone Flame Geometries */}\n {(mode === \"crystal\" || mode === \"all\") && (\n <instancedMesh ref={crystalMeshRef} args={[undefined, undefined, flameCount]}>\n <coneGeometry args={[0.3, 1.2, 5]} />\n <meshBasicMaterial\n color={activeColor}\n transparent\n opacity={0.65}\n blending={THREE.AdditiveBlending}\n depthWrite={false}\n />\n </instancedMesh>\n )}\n </group>\n );\n}\n","\"use client\";\n\nimport { useRef, useMemo, useEffect, useCallback } from \"react\";\nimport { useFrame, useThree } from \"@react-three/fiber\";\nimport * as THREE from \"three\";\nimport type { MaterialTheme } from \"./AnimatedLetter\";\n\ninterface PlasmaBlobsProps {\n theme?: MaterialTheme;\n effectColor?: string;\n effectSpeed?: number;\n effectDensity?: number;\n enabled?: boolean;\n}\n\nconst SPANISH_COLOR_HEX: Record<string, string> = {\n azul: \"#00e5ff\",\n verde: \"#00e676\",\n rojo: \"#ff3d00\",\n dorado: \"#ffb300\",\n purpura: \"#d500f9\",\n magenta: \"#ff007f\",\n esmeralda: \"#10b981\",\n};\n\n/**\n * Creates a soft bioluminescent energy blob texture\n */\nfunction createBlobTexture(): THREE.CanvasTexture {\n const canvas = document.createElement(\"canvas\");\n canvas.width = 256;\n canvas.height = 256;\n const ctx = canvas.getContext(\"2d\");\n\n if (ctx) {\n const gradient = ctx.createRadialGradient(128, 128, 0, 128, 128, 128);\n gradient.addColorStop(0, \"rgba(255, 255, 255, 1)\");\n gradient.addColorStop(0.2, \"rgba(0, 240, 200, 0.95)\");\n gradient.addColorStop(0.5, \"rgba(0, 200, 140, 0.6)\");\n gradient.addColorStop(0.8, \"rgba(0, 150, 100, 0.2)\");\n gradient.addColorStop(1, \"rgba(0, 0, 0, 0)\");\n\n ctx.fillStyle = gradient;\n ctx.fillRect(0, 0, 256, 256);\n }\n\n const texture = new THREE.CanvasTexture(canvas);\n texture.needsUpdate = true;\n return texture;\n}\n\ninterface DragBlob {\n x: number;\n y: number;\n z: number;\n life: number;\n size: number;\n}\n\n/**\n * Exact Bioluminescent Liquid Energy Blobs Effect (matching user screenshot)\n */\nexport default function PlasmaBlobs({\n theme = \"emerald\",\n effectColor = \"#00e676\",\n effectSpeed = 0.5,\n effectDensity = 0.5,\n enabled = true,\n}: PlasmaBlobsProps) {\n const { pointer } = useThree();\n const meshRef = useRef<THREE.InstancedMesh>(null);\n const lightRef = useRef<THREE.PointLight>(null);\n const dummy = useRef(new THREE.Object3D());\n const isPointerDown = useRef(false);\n const dragBlobs = useRef<DragBlob[]>([]);\n\n const clampedDensity = Math.max(0.1, Math.min(1.0, effectDensity));\n const blobCount = Math.round(60 * clampedDensity);\n\n const texture = useMemo(() => createBlobTexture(), []);\n\n const activeColor = useMemo(() => {\n if (!effectColor) return \"#00e676\";\n const lower = effectColor.toLowerCase().trim();\n if (SPANISH_COLOR_HEX[lower]) return SPANISH_COLOR_HEX[lower];\n return effectColor;\n }, [effectColor]);\n\n // Particle data for fluid energy blob clusters\n const particles = useMemo(() => {\n const data = [];\n const sizeFactor = 1.0 + Math.sqrt(clampedDensity) * 0.8;\n for (let i = 0; i < blobCount; i++) {\n data.push({\n x: (Math.random() - 0.5) * 12,\n y: (Math.random() - 0.5) * 6,\n z: (Math.random() - 0.5) * 3,\n speedY: (Math.random() - 0.5) * 0.8,\n speedX: (Math.random() - 0.5) * 0.8,\n size: (0.8 + Math.random() * 1.2) * sizeFactor,\n phase: Math.random() * Math.PI * 2,\n life: Math.random(),\n });\n }\n return data;\n }, [blobCount, clampedDensity]);\n\n const handlePointerDown = useCallback(() => {\n isPointerDown.current = true;\n }, []);\n\n const handlePointerUp = useCallback(() => {\n isPointerDown.current = false;\n }, []);\n\n useEffect(() => {\n window.addEventListener(\"pointerdown\", handlePointerDown);\n window.addEventListener(\"pointerup\", handlePointerUp);\n return () => {\n window.removeEventListener(\"pointerdown\", handlePointerDown);\n window.removeEventListener(\"pointerup\", handlePointerUp);\n };\n }, [handlePointerDown, handlePointerUp]);\n\n useFrame((state, delta) => {\n if (!meshRef.current || !enabled) return;\n const time = state.clock.getElapsedTime() * effectSpeed;\n\n if (isPointerDown.current) {\n const targetX = pointer.x * 7;\n const targetY = pointer.y * 4;\n if (dragBlobs.current.length < 15) {\n dragBlobs.current.push({\n x: targetX + (Math.random() - 0.5) * 0.5,\n y: targetY + (Math.random() - 0.5) * 0.5,\n z: (Math.random() - 0.5) * 1.0,\n life: 1.0,\n size: (1.2 + Math.random() * 0.8) * Math.sqrt(clampedDensity),\n });\n }\n }\n\n dragBlobs.current = dragBlobs.current\n .map((b) => {\n b.life -= delta * 1.2 * effectSpeed;\n return b;\n })\n .filter((b) => b.life > 0);\n\n if (lightRef.current) {\n lightRef.current.intensity = 2.5 + Math.sin(time * 6) * 0.5;\n }\n\n particles.forEach((p, i) => {\n const currentX = p.x + Math.sin(time * 1.2 + p.phase) * 1.5;\n const currentY = p.y + Math.cos(time * 0.9 + p.phase * 1.3) * 1.2;\n const currentZ = p.z + Math.sin(time * 0.7 + p.phase * 0.8) * 0.8;\n\n const scalePulse = p.size * (1.0 + Math.sin(time * 2.0 + i) * 0.25);\n\n dummy.current.position.set(currentX, currentY, currentZ);\n dummy.current.scale.set(scalePulse, scalePulse, scalePulse);\n dummy.current.updateMatrix();\n\n meshRef.current!.setMatrixAt(i, dummy.current.matrix);\n });\n\n dragBlobs.current.forEach((b, idx) => {\n const targetIdx = (blobCount - 1 - idx + blobCount) % blobCount;\n const scaleEnvelope = Math.sin(b.life * Math.PI) * b.size;\n\n dummy.current.position.set(b.x, b.y, b.z);\n dummy.current.scale.set(scaleEnvelope, scaleEnvelope, scaleEnvelope);\n dummy.current.updateMatrix();\n\n meshRef.current!.setMatrixAt(targetIdx, dummy.current.matrix);\n });\n\n meshRef.current.instanceMatrix.needsUpdate = true;\n });\n\n if (!enabled) return null;\n\n return (\n <group>\n <pointLight\n ref={lightRef}\n position={[0, 0, 2]}\n color={activeColor}\n intensity={3}\n distance={12}\n />\n\n <instancedMesh ref={meshRef} args={[undefined, undefined, blobCount]}>\n <planeGeometry args={[1.8, 1.8]} />\n <meshBasicMaterial\n map={texture}\n color={activeColor}\n transparent\n opacity={0.85}\n blending={THREE.NormalBlending}\n depthWrite={false}\n side={THREE.DoubleSide}\n />\n </instancedMesh>\n </group>\n );\n}\n","\"use client\";\n\nimport { useState } from \"react\";\nimport { useTranslations } from \"next-intl\";\nimport { Link } from \"@/i18n/routing\";\nimport LocaleSwitcher from \"./LocaleSwitcher\";\nimport { Button } from \"./ui/button\";\n\nexport default function CinemaHome({ \n cinemaName = \"NOVA\",\n webTheme = \"neon\" \n}: { \n cinemaName?: string, \n webTheme?: string \n}) {\n const t = useTranslations();\n const [mobileMenuOpen, setMobileMenuOpen] = useState(false);\n\n // Define overlay gradients based on theme\n const themeOverlay = \n webTheme === \"noir\" ? \"bg-slate-900/40 mix-blend-color\" :\n webTheme === \"crimson\" ? \"bg-red-900/30 mix-blend-color\" :\n \"bg-blue-900/20 mix-blend-color\"; // default neon\n\n return (\n <div className={`min-h-screen bg-black text-white selection:bg-white/30 font-sans transition-colors duration-1000 group theme-${webTheme}`}>\n {/* Navbar */}\n <nav className=\"absolute top-0 left-0 right-0 z-50 flex items-center justify-between px-4 sm:px-8 py-4 sm:py-6 bg-black/40 sm:bg-transparent backdrop-blur-md sm:backdrop-blur-none border-b border-white/10 sm:border-none\">\n <div className=\"flex items-center gap-6 lg:gap-12\">\n <Link href=\"/\" className=\"text-2xl sm:text-3xl font-bold tracking-tighter uppercase font-display text-white\">\n {cinemaName}.\n </Link>\n <div className=\"hidden md:flex items-center gap-6 lg:gap-8 text-sm font-semibold tracking-widest text-white/70\">\n <Link href=\"/schedule\" className=\"hover:text-white transition-colors\">{t(\"nav.schedule\")}</Link>\n <Link href=\"/experiences\" className=\"hover:text-white transition-colors\">{t(\"nav.experiences\")}</Link>\n <Link href=\"/membership\" className=\"hover:text-white transition-colors\">{t(\"nav.membership\")}</Link>\n </div>\n </div>\n\n <div className=\"flex items-center gap-3 sm:gap-6\">\n <LocaleSwitcher />\n <div className=\"hidden sm:flex items-center gap-4\">\n <Link href=\"/login\" className=\"text-sm font-semibold tracking-widest text-white/70 hover:text-white transition-colors\">\n {t(\"nav.login\")}\n </Link>\n <Button variant=\"outline\" className=\"rounded-none border-white/40 text-white bg-transparent hover:bg-white hover:text-black transition-colors font-semibold tracking-widest text-xs px-6 py-5 uppercase\">\n {t(\"nav.bookTickets\")}\n </Button>\n </div>\n\n {/* Mobile Hamburger Menu Toggle Button */}\n <button\n onClick={() => setMobileMenuOpen(!mobileMenuOpen)}\n className=\"md:hidden p-2 rounded-lg bg-white/10 hover:bg-white/20 text-white text-lg focus:outline-none transition-colors cursor-pointer\"\n aria-label=\"Toggle Navigation Menu\"\n >\n {mobileMenuOpen ? \"✕\" : \"☰\"}\n </button>\n </div>\n </nav>\n\n {/* Mobile Drawer Overlay */}\n {mobileMenuOpen && (\n <div className=\"fixed inset-0 z-40 bg-black/95 backdrop-blur-2xl md:hidden flex flex-col justify-between p-8 pt-24 animate-fade-in\">\n <div className=\"flex flex-col gap-6 text-xl font-bold tracking-wider uppercase font-display\">\n <Link\n href=\"/schedule\"\n onClick={() => setMobileMenuOpen(false)}\n className=\"py-2 border-b border-white/10 hover:text-amber-400 transition-colors\"\n >\n {t(\"nav.schedule\")}\n </Link>\n <Link\n href=\"/experiences\"\n onClick={() => setMobileMenuOpen(false)}\n className=\"py-2 border-b border-white/10 hover:text-amber-400 transition-colors\"\n >\n {t(\"nav.experiences\")}\n </Link>\n <Link\n href=\"/membership\"\n onClick={() => setMobileMenuOpen(false)}\n className=\"py-2 border-b border-white/10 hover:text-amber-400 transition-colors\"\n >\n {t(\"nav.membership\")}\n </Link>\n <Link\n href=\"/login\"\n onClick={() => setMobileMenuOpen(false)}\n className=\"py-2 border-b border-white/10 text-white/70 hover:text-white transition-colors\"\n >\n {t(\"nav.login\")}\n </Link>\n </div>\n\n <div className=\"flex flex-col gap-3 pt-6 border-t border-white/10\">\n <Button\n onClick={() => setMobileMenuOpen(false)}\n className=\"w-full rounded-none bg-amber-400 text-black hover:bg-amber-300 font-extrabold tracking-widest text-sm py-4 uppercase\"\n >\n {t(\"nav.bookTickets\")}\n </Button>\n </div>\n </div>\n )}\n\n {/* Hero Section */}\n <div className=\"relative h-screen w-full flex flex-col justify-end pb-28 sm:pb-24 px-4 sm:px-8 md:px-16 overflow-hidden\">\n {/* Background Video/Image simulation */}\n <div className=\"absolute inset-0 z-0\">\n <div className=\"absolute inset-0 bg-[url('https://images.unsplash.com/photo-1605810230434-7631ac76ec81?q=80&w=2560&auto=format&fit=crop')] bg-cover bg-center\" />\n {/* Dual-Tone Overlay via CSS variables */}\n <div className=\"absolute inset-0 bg-gradient-to-t from-black via-black/50 to-transparent z-10\" />\n <div className={`absolute inset-0 ${themeOverlay} z-10`} />\n </div>\n\n <div className=\"relative z-20 max-w-5xl\">\n <div className=\"flex items-center gap-2 sm:gap-3 mb-4 sm:mb-6 flex-wrap\">\n <span className=\"bg-blue-600 text-white text-[9px] sm:text-[10px] font-bold px-2.5 sm:px-3 py-1 tracking-widest\">\n {t(\"hero.genreImax\")}\n </span>\n <span className=\"border border-white/20 text-white/80 text-[9px] sm:text-[10px] font-bold px-2.5 sm:px-3 py-1 tracking-widest\">\n {t(\"hero.genreAction\")}\n </span>\n </div>\n \n <h1 className=\"text-4xl sm:text-6xl md:text-7xl lg:text-[8rem] leading-[0.9] sm:leading-[0.85] font-display font-black tracking-tighter mb-4 sm:mb-6 uppercase drop-shadow-2xl\">\n {t(\"hero.title\")}\n </h1>\n \n <p className=\"max-w-2xl text-sm sm:text-lg md:text-xl text-white/70 font-medium mb-6 sm:mb-10 leading-relaxed drop-shadow-md line-clamp-3 sm:line-clamp-none\">\n {t(\"hero.synopsis\")}\n </p>\n\n <div className=\"flex flex-col sm:flex-row items-stretch sm:items-center gap-3 sm:gap-4 w-full sm:w-auto\">\n <Button className=\"rounded-none bg-white text-black hover:bg-white/90 font-bold tracking-widest text-xs px-6 sm:px-8 py-5 sm:py-6 uppercase transition-transform hover:scale-105 active:scale-95 w-full sm:w-auto\">\n {t(\"hero.getTickets\")}\n </Button>\n <Button variant=\"outline\" className=\"rounded-none border-white/30 text-white bg-black/20 backdrop-blur-md hover:bg-white/10 transition-colors font-bold tracking-widest text-xs px-6 sm:px-8 py-5 sm:py-6 uppercase w-full sm:w-auto\">\n {t(\"hero.watchTrailer\")}\n </Button>\n </div>\n </div>\n </div>\n </div>\n );\n}\n","import { defineRouting } from \"next-intl/routing\";\nimport { createNavigation } from \"next-intl/navigation\";\n\nexport const routing = defineRouting({\n locales: [\"en\", \"es\"],\n defaultLocale: \"en\",\n});\n\nexport const { Link, redirect, usePathname, useRouter } =\n createNavigation(routing);\n","\"use client\";\n\nimport { useLocale } from \"next-intl\";\nimport { useRouter, usePathname } from \"@/i18n/routing\";\nimport { Globe } from \"lucide-react\";\n\nexport default function LocaleSwitcher() {\n const locale = useLocale();\n const router = useRouter();\n const pathname = usePathname();\n\n const toggleLocale = () => {\n const nextLocale = locale === \"en\" ? \"es\" : \"en\";\n router.replace(pathname, { locale: nextLocale });\n };\n\n return (\n <button\n onClick={toggleLocale}\n className=\"flex items-center gap-2 text-sm font-medium text-muted-foreground hover:text-white transition-colors uppercase tracking-wider\"\n >\n <Globe className=\"w-4 h-4\" />\n {locale === \"en\" ? \"ES\" : \"EN\"}\n </button>\n );\n}\n","import * as React from \"react\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\nimport { cn } from \"@/lib/utils\";\n\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium cursor-pointer transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 disabled:cursor-not-allowed [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0\",\n {\n variants: {\n variant: {\n default: \"bg-primary text-primary-foreground shadow hover:bg-primary/90\",\n destructive: \"bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90\",\n outline:\n \"border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground\",\n secondary: \"bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80\",\n ghost: \"hover:bg-accent hover:text-accent-foreground\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default: \"h-9 px-4 py-2\",\n sm: \"h-8 rounded-md px-3 text-xs\",\n lg: \"h-10 rounded-md px-8\",\n icon: \"h-9 w-9\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n },\n);\n\nexport interface ButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof buttonVariants> {\n asChild?: boolean;\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant, size, asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : \"button\";\n return (\n <Comp className={cn(buttonVariants({ variant, size, className }))} ref={ref} {...props} />\n );\n },\n);\nButton.displayName = \"Button\";\n\nexport { Button, buttonVariants };\n","import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","\"use client\";\n\nimport React from \"react\";\nimport CinemaBackground, { type CinemaBackgroundProps } from \"../CinemaBackground\";\n\nexport type WithCinema3DOptions = Omit<CinemaBackgroundProps, \"children\">;\n\n/**\n * Higher-Order Component (HOC) that wraps any React component with the 3D WebGL Cinema background.\n *\n * @example\n * const HeroWith3D = withCinema3D(MyHeroComponent, {\n * text: \"UNITED OF WEB\",\n * theme: \"emerald\",\n * interactiveSparks: true,\n * interactiveShockwave: true,\n * });\n */\nexport function withCinema3D<P extends object>(\n WrappedComponent: React.ComponentType<P>,\n hocOptions: WithCinema3DOptions = {}\n) {\n const ComponentWithCinema3D = (props: P) => {\n return (\n <CinemaBackground {...hocOptions}>\n <WrappedComponent {...props} />\n </CinemaBackground>\n );\n };\n\n ComponentWithCinema3D.displayName = `WithCinema3D(${\n WrappedComponent.displayName || WrappedComponent.name || \"Component\"\n })`;\n\n return ComponentWithCinema3D;\n}\n\nexport default withCinema3D;\n","\"use client\";\n\nimport { Suspense, useMemo, useState } from \"react\";\nimport { Canvas } from \"@react-three/fiber\";\nimport { Environment, Center } from \"@react-three/drei\";\nimport { EffectComposer, Bloom, Vignette, Noise } from \"@react-three/postprocessing\";\nimport AnimatedLetter, { type MaterialTheme } from \"./3d/AnimatedLetter\";\nimport SceneParticles from \"./3d/SceneParticles\";\nimport CameraRig from \"./3d/CameraRig\";\nimport ClickFireSparks from \"./3d/ClickFireSparks\";\nimport ClickShockwave from \"./3d/ClickShockwave\";\nimport ElectricPlasma from \"./3d/ElectricPlasma\";\n\nexport interface CinemaBackgroundProps {\n /** 3D Text rendered in world space */\n text?: string;\n /** Active material & lighting theme */\n theme?: MaterialTheme;\n /** Custom CSS gradient or solid color */\n customBackground?: string;\n /** Enable/disable 3D fire sparks on click */\n interactiveSparks?: boolean;\n /** Enable/disable 3D shockwave rings on click */\n interactiveShockwave?: boolean;\n /** Enable/disable electric plasma arcs */\n interactivePlasma?: boolean;\n /** Enable/disable ambient floating particle embers */\n showParticles?: boolean;\n /** Enable bloom glow effect */\n enableBloom?: boolean;\n /** Optional container CSS class name */\n className?: string;\n /** Optional inline container styles */\n style?: React.CSSProperties;\n /** Children React nodes rendered on top of the 3D canvas */\n children?: React.ReactNode;\n}\n\nconst THEME_BACKGROUNDS: Record<MaterialTheme, string> = {\n gold: \"radial-gradient(circle at center, #1c1503 0%, #080601 60%, #020201 100%)\",\n neon: \"radial-gradient(circle at center, #021a1e 0%, #030d14 60%, #010408 100%)\",\n emerald: \"radial-gradient(circle at center, #032117 0%, #02120d 60%, #010705 100%)\",\n crimson: \"radial-gradient(circle at center, #240409 0%, #120205 60%, #060102 100%)\",\n obsidian: \"radial-gradient(circle at center, #120d24 0%, #080512 60%, #030206 100%)\",\n glass: \"radial-gradient(circle at center, #0f172a 0%, #070b14 60%, #020205 100%)\",\n};\n\nconst FONT_URL = \"/fonts/cinema_display.typeface.json\";\n\nfunction computeLetterPositions(text: string): [number, number, number][] {\n const letterWidth = 0.65;\n const totalWidth = text.length * letterWidth;\n const startX = -totalWidth / 2;\n\n return text.split(\"\").map((_, i) => [startX + i * letterWidth, 0, 0]);\n}\n\n/**\n * Highly customizable 3D Cinema WebGL Background Component.\n * Fits dynamically into any HTML parent container (div, header, section, card).\n */\nexport default function CinemaBackground({\n text = \"CINEMA\",\n theme = \"emerald\",\n customBackground,\n interactiveSparks = true,\n interactiveShockwave = true,\n interactivePlasma = true,\n showParticles = true,\n enableBloom = true,\n className = \"\",\n style,\n children,\n}: CinemaBackgroundProps) {\n const [currentText, setCurrentText] = useState(text);\n const [currentTheme, setCurrentTheme] = useState(theme);\n\n // Sync if controlled props change\n const activeText = (currentText || text || \"CINEMA\").toUpperCase();\n const letters = activeText.split(\"\");\n const positions = useMemo(() => computeLetterPositions(activeText), [activeText]);\n\n const activeTheme = currentTheme || theme || \"emerald\";\n const currentBg = customBackground || THEME_BACKGROUNDS[activeTheme] || THEME_BACKGROUNDS.emerald;\n\n return (\n <div\n className={`relative w-full h-full min-h-[350px] overflow-hidden select-none ${className}`}\n style={{ background: currentBg, ...style }}\n >\n {/* 3D Canvas Layer */}\n <div className=\"absolute inset-0 z-0 pointer-events-auto\">\n <Canvas\n camera={{ position: [0, 0, 14], fov: 45, near: 0.1, far: 50 }}\n dpr={[1, 2]}\n gl={{\n antialias: true,\n toneMapping: 4,\n toneMappingExposure: 1.2,\n }}\n >\n <Suspense fallback={null}>\n <Environment preset=\"studio\" />\n <ambientLight intensity={0.3} />\n <directionalLight position={[5, 8, 5]} intensity={1.5} color=\"#ffffff\" />\n <pointLight\n position={[-5, -3, -5]}\n intensity={0.6}\n color={\n activeTheme === \"emerald\"\n ? \"#10b981\"\n : activeTheme === \"crimson\"\n ? \"#ff1744\"\n : activeTheme === \"neon\"\n ? \"#00ffff\"\n : \"#FFD700\"\n }\n />\n\n <CameraRig phase=\"idle\" />\n\n {/* Interactive 3D Effects */}\n <ClickFireSparks enabled={interactiveSparks} theme={activeTheme} />\n <ClickShockwave enabled={interactiveShockwave} theme={activeTheme} />\n <ElectricPlasma enabled={interactivePlasma} theme={activeTheme} />\n\n {/* 3D Typography */}\n <Center disableY disableZ>\n <group>\n {letters.map((char, i) => (\n <AnimatedLetter\n key={`${char}-${i}`}\n char={char}\n index={i}\n totalLetters={letters.length}\n position={positions[i]}\n phase=\"idle\"\n theme={activeTheme}\n fontUrl={FONT_URL}\n />\n ))}\n </group>\n </Center>\n\n {/* Floating Ambient Particles */}\n {showParticles && <SceneParticles theme={activeTheme} visible={true} />}\n\n {/* Post-Processing */}\n <EffectComposer>\n <Bloom\n luminanceThreshold={0.7}\n luminanceSmoothing={0.9}\n intensity={enableBloom ? 0.9 : 0}\n mipmapBlur\n />\n <Vignette offset={0.3} darkness={0.85} />\n <Noise opacity={0.025} />\n </EffectComposer>\n </Suspense>\n </Canvas>\n </div>\n\n {/* Children overlay */}\n {children && (\n <div className=\"relative z-10 w-full h-full pointer-events-none flex flex-col items-center justify-center\">\n {children}\n </div>\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport { Suspense, useState, useEffect, useCallback, useMemo } from \"react\";\nimport { Canvas } from \"@react-three/fiber\";\nimport { Environment, Center } from \"@react-three/drei\";\nimport {\n EffectComposer,\n Bloom,\n Vignette,\n Noise,\n} from \"@react-three/postprocessing\";\nimport AnimatedLetter, { type MaterialTheme } from \"./AnimatedLetter\";\nimport SceneParticles from \"./SceneParticles\";\nimport CameraRig from \"./CameraRig\";\nimport LoaderOverlay, { type EffectState } from \"./LoaderOverlay\";\nimport ClickFireSparks from \"./ClickFireSparks\";\nimport ClickShockwave from \"./ClickShockwave\";\nimport ElectricPlasma from \"./ElectricPlasma\";\n\ninterface CinemaLoaderProps {\n cinemaName?: string;\n defaultTheme?: MaterialTheme;\n customBackground?: string;\n onEnterCinema?: () => void;\n}\n\ntype AnimationPhase = \"loading\" | \"entering\" | \"idle\" | \"exiting\";\n\nconst FONT_URL = \"/fonts/cinema_display.typeface.json\";\n\nconst THEME_BACKGROUNDS: Record<MaterialTheme, string> = {\n gold: \"radial-gradient(circle at center, #1c1503 0%, #080601 60%, #020201 100%)\",\n neon: \"radial-gradient(circle at center, #021a1e 0%, #030d14 60%, #010408 100%)\",\n emerald: \"radial-gradient(circle at center, #032117 0%, #02120d 60%, #010705 100%)\",\n crimson: \"radial-gradient(circle at center, #240409 0%, #120205 60%, #060102 100%)\",\n obsidian: \"radial-gradient(circle at center, #120d24 0%, #080512 60%, #030206 100%)\",\n glass: \"radial-gradient(circle at center, #0f172a 0%, #070b14 60%, #020205 100%)\",\n};\n\n/**\n * Calculate letter positions to center the word horizontally\n */\nfunction computeLetterPositions(text: string): [number, number, number][] {\n const letterWidth = 0.65;\n const totalWidth = text.length * letterWidth;\n const startX = -totalWidth / 2;\n\n return text.split(\"\").map((_, i) => [\n startX + i * letterWidth,\n 0,\n 0,\n ]);\n}\n\nexport default function CinemaLoader({\n cinemaName = \"CINEMULTIPLEX\",\n defaultTheme = \"emerald\",\n customBackground,\n onEnterCinema,\n}: CinemaLoaderProps) {\n const [phase, setPhase] = useState<AnimationPhase>(\"loading\");\n const [theme, setTheme] = useState<MaterialTheme>(defaultTheme);\n const [titleText, setTitleText] = useState<string>(cinemaName);\n const [effects, setEffects] = useState<EffectState>({\n sparks: true,\n shockwave: true,\n plasma: true,\n embers: true,\n });\n\n const displayName = (titleText || \"CINEMA\").toUpperCase();\n const letters = displayName.split(\"\");\n const positions = useMemo(\n () => computeLetterPositions(displayName),\n [displayName]\n );\n\n // Animation timeline\n useEffect(() => {\n const t1 = setTimeout(() => setPhase(\"entering\"), 800);\n const totalLetterTime = letters.length * 120 + 1500;\n const t2 = setTimeout(() => setPhase(\"idle\"), 800 + totalLetterTime);\n\n return () => {\n clearTimeout(t1);\n clearTimeout(t2);\n };\n }, [letters.length]);\n\n const handleEnter = useCallback(() => {\n setPhase(\"exiting\");\n setTimeout(() => {\n if (onEnterCinema) onEnterCinema();\n }, 1800);\n }, [onEnterCinema]);\n\n const toggleEffect = useCallback((effectName: keyof EffectState) => {\n setEffects((prev) => ({\n ...prev,\n [effectName]: !prev[effectName],\n }));\n }, []);\n\n const currentBg = customBackground || THEME_BACKGROUNDS[theme] || THEME_BACKGROUNDS.emerald;\n\n return (\n <div\n className=\"fixed inset-0 w-screen h-screen transition-all duration-1000 select-none overflow-hidden\"\n style={{ background: currentBg }}\n >\n {/* 3D Canvas */}\n <Canvas\n camera={{ position: [0, 0, 14], fov: 45, near: 0.1, far: 50 }}\n dpr={[1, 2]}\n gl={{\n antialias: true,\n toneMapping: 4, // ACESFilmicToneMapping\n toneMappingExposure: 1.2,\n }}\n >\n <Suspense fallback={null}>\n {/* HDRI Environment for metallic reflections */}\n <Environment preset=\"studio\" />\n\n {/* Lighting */}\n <ambientLight intensity={0.3} />\n <directionalLight\n position={[5, 8, 5]}\n intensity={1.5}\n color=\"#ffffff\"\n />\n <pointLight\n position={[-5, -3, -5]}\n intensity={0.6}\n color={\n theme === \"emerald\"\n ? \"#10b981\"\n : theme === \"crimson\"\n ? \"#ff1744\"\n : theme === \"neon\"\n ? \"#00ffff\"\n : \"#FFD700\"\n }\n />\n <spotLight\n position={[0, 10, 0]}\n angle={0.4}\n penumbra={0.8}\n intensity={0.9}\n color=\"#ffffff\"\n />\n <pointLight position={[0, 0, -5]} intensity={0.4} color=\"#ffffff\" />\n\n {/* Camera animation */}\n <CameraRig phase={phase} />\n\n {/* 3D Visual Effects */}\n {effects.sparks && <ClickFireSparks theme={theme} />}\n <ClickShockwave theme={theme} enabled={effects.shockwave} />\n <ElectricPlasma theme={theme} enabled={effects.plasma} />\n\n {/* Animated 3D Letters */}\n <Center disableY disableZ>\n <group>\n {letters.map((char, i) => (\n <AnimatedLetter\n key={`${char}-${i}`}\n char={char}\n index={i}\n totalLetters={letters.length}\n position={positions[i]}\n phase={phase}\n theme={theme}\n fontUrl={FONT_URL}\n />\n ))}\n </group>\n </Center>\n\n {/* Floating particle embers */}\n <SceneParticles\n theme={theme}\n visible={phase !== \"loading\" && effects.embers}\n />\n\n {/* Post-processing pipeline */}\n <EffectComposer>\n <Bloom\n luminanceThreshold={0.7}\n luminanceSmoothing={0.9}\n intensity={theme === \"neon\" || theme === \"emerald\" || theme === \"crimson\" ? 1.4 : 0.7}\n mipmapBlur\n />\n <Vignette offset={0.3} darkness={0.85} />\n <Noise opacity={0.025} />\n </EffectComposer>\n </Suspense>\n </Canvas>\n\n {/* HTML overlay controls */}\n <LoaderOverlay\n phase={phase}\n cinemaName={titleText}\n theme={theme}\n effects={effects}\n onTitleChange={setTitleText}\n onThemeChange={setTheme}\n onToggleEffect={toggleEffect}\n />\n </div>\n );\n}\n","\"use client\";\n\nimport type { MaterialTheme } from \"./AnimatedLetter\";\n\nexport interface EffectState {\n sparks: boolean;\n shockwave: boolean;\n plasma: boolean;\n embers: boolean;\n}\n\ninterface LoaderOverlayProps {\n phase: \"loading\" | \"entering\" | \"idle\" | \"exiting\";\n cinemaName: string;\n theme: MaterialTheme;\n effects: EffectState;\n onTitleChange: (newTitle: string) => void;\n onThemeChange: (theme: MaterialTheme) => void;\n onToggleEffect: (effectName: keyof EffectState) => void;\n}\n\nconst THEME_OPTIONS: { key: MaterialTheme; label: string; color: string }[] = [\n { key: \"gold\", label: \"Gold\", color: \"#FFD700\" },\n { key: \"neon\", label: \"Neon\", color: \"#00ffff\" },\n { key: \"emerald\", label: \"Emerald\", color: \"#10b981\" },\n { key: \"crimson\", label: \"Crimson\", color: \"#ff1744\" },\n { key: \"obsidian\", label: \"Obsidian\", color: \"#a855f7\" },\n { key: \"glass\", label: \"Glass\", color: \"#ffffff\" },\n];\n\nexport default function LoaderOverlay({\n phase,\n cinemaName,\n theme,\n effects,\n onTitleChange,\n onThemeChange,\n onToggleEffect,\n}: LoaderOverlayProps) {\n const showLoading = phase === \"loading\";\n const isExiting = phase === \"exiting\";\n\n return (\n <div\n className=\"absolute inset-0 pointer-events-none z-10 flex flex-col items-center justify-between p-6 md:p-10\"\n style={{ opacity: isExiting ? 0 : 1, transition: \"opacity 0.8s ease-out\" }}\n >\n {/* Top Bar: Title Input */}\n <div\n className=\"w-full max-w-xl flex flex-col items-center gap-2 pointer-events-auto\"\n style={{\n opacity: phase === \"idle\" || phase === \"entering\" ? 1 : 0,\n transform:\n phase === \"idle\" || phase === \"entering\"\n ? \"translateY(0)\"\n : \"translateY(-20px)\",\n transition: \"all 1s ease-out 0.3s\",\n }}\n >\n <label className=\"text-[10px] tracking-[0.3em] uppercase text-white/50 font-bold\">\n Live 3D Title Control\n </label>\n <div className=\"relative w-full\">\n <input\n type=\"text\"\n value={cinemaName}\n onChange={(e) => onTitleChange(e.target.value)}\n maxLength={18}\n placeholder=\"Type any title...\"\n className=\"w-full px-6 py-3 rounded-full text-center text-sm md:text-base font-bold tracking-widest uppercase outline-none transition-all duration-300\"\n style={{\n background: \"rgba(255, 255, 255, 0.08)\",\n backdropFilter: \"blur(16px)\",\n border: \"1px solid rgba(255, 255, 255, 0.2)\",\n color: \"#ffffff\",\n boxShadow: \"0 8px 32px rgba(0, 0, 0, 0.37)\",\n }}\n />\n </div>\n </div>\n\n {/* Center loading spinner */}\n {showLoading && (\n <div className=\"absolute inset-0 flex items-center justify-center\">\n <div\n className=\"w-16 h-16 rounded-full border-2 animate-spin\"\n style={{\n borderColor: \"transparent\",\n borderTopColor: \"rgba(255, 215, 0, 0.8)\",\n borderRightColor: \"rgba(255, 215, 0, 0.3)\",\n }}\n />\n </div>\n )}\n\n {/* Bottom Section: FX Toggles + Theme Selector */}\n <div className=\"w-full max-w-3xl flex flex-col items-center gap-5\">\n {/* FX Toggles Bar */}\n <div\n className=\"flex flex-wrap items-center justify-center gap-2 pointer-events-auto\"\n style={{\n opacity: phase === \"idle\" || phase === \"entering\" ? 1 : 0,\n transition: \"opacity 1s ease-out 0.8s\",\n }}\n >\n <span className=\"text-[9px] uppercase tracking-[0.25em] text-white/40 mr-2 font-bold\">\n Effects\n </span>\n\n {/* Sparks Toggle */}\n <button\n onClick={() => onToggleEffect(\"sparks\")}\n className={`px-4 py-1.5 rounded-full text-[11px] font-bold tracking-wider uppercase transition-all duration-300 cursor-pointer ${\n effects.sparks\n ? \"bg-amber-500/30 text-amber-200 border-amber-400/60 shadow-[0_0_15px_rgba(245,158,11,0.4)]\"\n : \"bg-white/5 text-white/40 border-white/10 hover:text-white/70\"\n } border`}\n >\n 🔥 Sparks\n </button>\n\n {/* Shockwave Toggle */}\n <button\n onClick={() => onToggleEffect(\"shockwave\")}\n className={`px-4 py-1.5 rounded-full text-[11px] font-bold tracking-wider uppercase transition-all duration-300 cursor-pointer ${\n effects.shockwave\n ? \"bg-cyan-500/30 text-cyan-200 border-cyan-400/60 shadow-[0_0_15px_rgba(6,182,212,0.4)]\"\n : \"bg-white/5 text-white/40 border-white/10 hover:text-white/70\"\n } border`}\n >\n 🌊 Wave\n </button>\n\n {/* Plasma Toggle */}\n <button\n onClick={() => onToggleEffect(\"plasma\")}\n className={`px-4 py-1.5 rounded-full text-[11px] font-bold tracking-wider uppercase transition-all duration-300 cursor-pointer ${\n effects.plasma\n ? \"bg-purple-500/30 text-purple-200 border-purple-400/60 shadow-[0_0_15px_rgba(168,85,247,0.4)]\"\n : \"bg-white/5 text-white/40 border-white/10 hover:text-white/70\"\n } border`}\n >\n ⚡ Plasma\n </button>\n\n {/* Embers Toggle */}\n <button\n onClick={() => onToggleEffect(\"embers\")}\n className={`px-4 py-1.5 rounded-full text-[11px] font-bold tracking-wider uppercase transition-all duration-300 cursor-pointer ${\n effects.embers\n ? \"bg-emerald-500/30 text-emerald-200 border-emerald-400/60 shadow-[0_0_15px_rgba(16,185,129,0.4)]\"\n : \"bg-white/5 text-white/40 border-white/10 hover:text-white/70\"\n } border`}\n >\n ✨ Embers\n </button>\n </div>\n\n {/* Theme selector */}\n <div\n className=\"flex items-center gap-3 pointer-events-auto\"\n style={{\n opacity: phase === \"idle\" || phase === \"entering\" ? 1 : 0,\n transition: \"opacity 1s ease-out 1.2s\",\n }}\n >\n <span className=\"text-[10px] uppercase tracking-[0.3em] text-white/40 mr-2 font-bold\">\n Theme\n </span>\n <div className=\"flex items-center gap-2 md:gap-3\">\n {THEME_OPTIONS.map((opt) => {\n const isActive = theme === opt.key;\n return (\n <button\n key={opt.key}\n onClick={() => onThemeChange(opt.key)}\n className=\"group relative flex flex-col items-center gap-1.5 cursor-pointer outline-none\"\n aria-label={`Switch to ${opt.label} theme`}\n >\n <div\n className=\"relative w-11 h-7 md:w-14 md:h-9 rounded-md overflow-hidden transition-all duration-300\"\n style={{\n border: isActive\n ? `2px solid ${opt.color}`\n : \"1px solid rgba(255, 255, 255, 0.15)\",\n transform: isActive ? \"scale(1.1) translateY(-2px)\" : \"scale(1) translateY(0)\",\n boxShadow: isActive ? `0 4px 20px ${opt.color}60` : \"0 2px 10px rgba(0,0,0,0.5)\",\n }}\n >\n <div className=\"absolute inset-0 opacity-80\" style={{ backgroundColor: opt.color }} />\n </div>\n <span\n className=\"text-[9px] uppercase tracking-widest font-semibold transition-colors duration-300\"\n style={{\n color: isActive ? \"#ffffff\" : \"rgba(255, 255, 255, 0.4)\",\n }}\n >\n {opt.label}\n </span>\n </button>\n );\n })}\n </div>\n </div>\n </div>\n </div>\n );\n}\n"],"mappings":"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","names":["index_exports","__export","AnimatedBackground","AnimatedLetter","CameraRig","CinemaBackground","CinemaHome","CinemaLoader","ClickFireSparks","ClickShockwave","ElectricPlasma","FireFlames","LoaderOverlay","PlasmaBlobs","SceneParticles","withCinema3D","__toCommonJS","import_react","import_fiber","import_drei","import_postprocessing","import_react","import_fiber","import_drei","THREE","THEME_CONFIGS","AnimatedLetter","char","index","totalLetters","position","phase","theme","fontUrl","meshRef","startTimeRef","entryOffset","angle","themeConfig","state","time","elapsed","staggerDelay","t","progress","bounce","breathe","sway","eased","import_react","import_fiber","import_drei","THREE","THEME_PARTICLE_COLORS","SPANISH_COLOR_HEX","DustMotes","color","speedMultiplier","count","meshRef","dummy","speeds","offsets","i","state","time","speed","ox","oy","oz","SceneParticles","theme","effectColor","effectSpeed","visible","activeColor","lower","import_react","import_fiber","THREE","CameraRig","phase","effectSpeed","camera","pointer","startTimeRef","phaseRef","state","time","elapsed","t","eased","z","y","aspect","targetZ","driftX","driftY","mouseX","mouseY","import_react","import_fiber","THREE","THEME_SPARK_COLORS","SPANISH_COLOR_HEX","ClickFireSparks","theme","effectColor","effectSpeed","enabled","camera","raycaster","bursts","setBursts","nextId","activePalette","lower","primaryHex","handlePointerDown","event","clientX","clientY","ndc","plane","intersectionPoint","sparkCount","newSparks","i","angle","speed","elevation","velocity","hexColor","newBurst","prev","_","delta","prevBursts","burst","updatedTime","updatedLight","updatedSparks","spark","newLife","newPos","__spreadProps","__spreadValues","import_react","import_fiber","THREE","THEME_WAVE_COLORS","SPANISH_COLOR_HEX","ClickShockwave","theme","effectColor","effectSpeed","enabled","camera","raycaster","waves","setWaves","nextId","activeColorHex","lower","handlePointerDown","event","clientX","clientY","ndc","plane","intersectionPoint","newWave","prev","_","delta","wave","newLife","newRadius","__spreadProps","__spreadValues","import_react","import_fiber","THREE","PLASMA_COLORS","SPANISH_COLOR_HEX","ElectricPlasma","theme","effectColor","effectSpeed","enabled","pointer","lineRef","activeColor","lower","segmentCount","geometry","geom","positions","state","time","posAttr","targetX","targetY","i","idx","angle","radius","x1","y1","z1","x2","y2","z2","import_react","import_fiber","THREE","FLAME_PALETTES","SPANISH_COLOR_HEX","createLiquidEnergyTexture","canvas","ctx","gradient","texture","FireFlames","theme","effectColor","effectSpeed","effectDensity","mode","enabled","pointer","fluidMeshRef","crystalMeshRef","lightRef","dummy","isPointerDown","dragBursts","clampedDensity","flameCount","activeColor","lower","particles","data","sizeFactor","i","handlePointerDown","handlePointerUp","state","delta","time","targetX","targetY","b","p","progress","currentY","currentX","currentZ","scaleEnvelope","idx","targetIdx","import_react","import_fiber","THREE","SPANISH_COLOR_HEX","createBlobTexture","canvas","ctx","gradient","texture","PlasmaBlobs","theme","effectColor","effectSpeed","effectDensity","enabled","pointer","meshRef","lightRef","dummy","isPointerDown","dragBlobs","clampedDensity","blobCount","activeColor","lower","particles","data","sizeFactor","i","handlePointerDown","handlePointerUp","state","delta","time","targetX","targetY","b","p","currentX","currentY","currentZ","scalePulse","idx","targetIdx","scaleEnvelope","import_react","import_next_intl","import_routing","import_navigation","routing","Link","redirect","usePathname","useRouter","import_next_intl","import_lucide_react","LocaleSwitcher","locale","router","useRouter","pathname","usePathname","nextLocale","React","import_react_slot","import_class_variance_authority","import_clsx","import_tailwind_merge","cn","inputs","buttonVariants","Button","_a","ref","_b","className","variant","size","asChild","props","__objRest","__spreadValues","cn","CinemaHome","cinemaName","webTheme","t","mobileMenuOpen","setMobileMenuOpen","themeOverlay","Link","LocaleSwitcher","Button","FONT_PRESETS","SPANISH_COLOR_MAP","THEME_BACKGROUNDS","computeLetterPositions","text","spacing","startX","_","i","parseActiveEffects","effectInput","list","e","s","isAll","enableFluidFlames","enableCrystalFlames","enableBlobs","enableSparks","enableShockwave","enablePlasma","enableEmbers","AnimatedBackground","containerToDisplay","containerSelector","effect","title","backgroundColor","effectColor","effectSpeed","effectDensity","autoFitText","loaderDuration","redirectUrl","onComplete","fontFamily","fontUrl","theme","letterSpacing","className","style","children","activeTitle","letters","positions","isLoaderActive","loaderProgress","setLoaderProgress","totalMs","intervalMs","elapsedMs","timer","currentPct","activeFontUrl","key","windowWidth","setWindowWidth","handleResize","calculatedScale","len","baseScale","activeBg","lower","activeEffects","flameMode","enableAnyFlames","targetSelector","renderContainerContent","React","CinemaHome","__spreadValues","CameraRig","FireFlames","PlasmaBlobs","ClickFireSparks","ClickShockwave","ElectricPlasma","char","AnimatedLetter","SceneParticles","import_react","import_react","import_fiber","import_drei","import_postprocessing","THEME_BACKGROUNDS","FONT_URL","computeLetterPositions","text","startX","_","i","CinemaBackground","theme","customBackground","interactiveSparks","interactiveShockwave","interactivePlasma","showParticles","enableBloom","className","style","children","currentText","setCurrentText","currentTheme","setCurrentTheme","activeText","letters","positions","activeTheme","currentBg","__spreadValues","CameraRig","ClickFireSparks","ClickShockwave","ElectricPlasma","char","AnimatedLetter","SceneParticles","withCinema3D","WrappedComponent","hocOptions","ComponentWithCinema3D","props","React","CinemaBackground","__spreadValues","import_react","import_fiber","import_drei","import_postprocessing","THEME_OPTIONS","LoaderOverlay","phase","cinemaName","theme","effects","onTitleChange","onThemeChange","onToggleEffect","e","opt","isActive","FONT_URL","THEME_BACKGROUNDS","computeLetterPositions","text","startX","_","i","CinemaLoader","cinemaName","defaultTheme","customBackground","onEnterCinema","phase","setPhase","theme","setTheme","titleText","setTitleText","effects","setEffects","displayName","letters","positions","t1","totalLetterTime","t2","handleEnter","toggleEffect","effectName","prev","__spreadProps","__spreadValues","currentBg","CameraRig","ClickFireSparks","ClickShockwave","ElectricPlasma","char","AnimatedLetter","SceneParticles","LoaderOverlay"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/components/AnimatedBackground.tsx","../src/components/3d/AnimatedLetter.tsx","../src/components/3d/SceneParticles.tsx","../src/components/3d/CameraRig.tsx","../src/components/3d/ClickFireSparks.tsx","../src/components/3d/ClickShockwave.tsx","../src/components/3d/ElectricPlasma.tsx","../src/components/3d/FireFlames.tsx","../src/components/3d/PlasmaBlobs.tsx","../src/components/CinemaHome.tsx","../src/lib/i18n-safe.ts","../src/components/LocaleSwitcher.tsx","../src/components/ui/button.tsx","../src/lib/utils.ts","../src/components/CinemaBackground.tsx","../src/components/hoc/withCinema3D.tsx","../src/components/3d/CinemaLoader.tsx","../src/components/3d/LoaderOverlay.tsx"],"sourcesContent":["// Main Component Export\nexport { default as AnimatedBackground, type AnimatedBackgroundProps, type EffectType } from \"./components/AnimatedBackground\";\nexport { default } from \"./components/AnimatedBackground\";\n\n// Core HOC & Background Components\nexport { withCinema3D, type WithCinema3DOptions } from \"./components/hoc/withCinema3D\";\nexport { default as CinemaBackground, type CinemaBackgroundProps } from \"./components/CinemaBackground\";\nexport { default as CinemaLoader } from \"./components/3d/CinemaLoader\";\n\n// 3D Effect Modules\nexport { default as FireFlames } from \"./components/3d/FireFlames\";\nexport { default as PlasmaBlobs } from \"./components/3d/PlasmaBlobs\";\nexport { default as ClickFireSparks } from \"./components/3d/ClickFireSparks\";\nexport { default as ClickShockwave } from \"./components/3d/ClickShockwave\";\nexport { default as ElectricPlasma } from \"./components/3d/ElectricPlasma\";\nexport { default as SceneParticles } from \"./components/3d/SceneParticles\";\nexport { default as AnimatedLetter, type MaterialTheme } from \"./components/3d/AnimatedLetter\";\nexport { default as CameraRig } from \"./components/3d/CameraRig\";\nexport { default as LoaderOverlay, type EffectState } from \"./components/3d/LoaderOverlay\";\n\n// Templates & Views\nexport { default as CinemaHome } from \"./components/CinemaHome\";\n","\"use client\";\n\nimport React, { Suspense, useMemo, useState, useEffect } from \"react\";\nimport { Canvas } from \"@react-three/fiber\";\nimport { Environment, Center } from \"@react-three/drei\";\nimport { EffectComposer, Bloom, Vignette, Noise } from \"@react-three/postprocessing\";\nimport AnimatedLetter, { type MaterialTheme } from \"./3d/AnimatedLetter\";\nimport SceneParticles from \"./3d/SceneParticles\";\nimport CameraRig from \"./3d/CameraRig\";\nimport ClickFireSparks from \"./3d/ClickFireSparks\";\nimport ClickShockwave from \"./3d/ClickShockwave\";\nimport ElectricPlasma from \"./3d/ElectricPlasma\";\nimport FireFlames from \"./3d/FireFlames\";\nimport PlasmaBlobs from \"./3d/PlasmaBlobs\";\nimport CinemaHome from \"./CinemaHome\";\n\nexport type SingleEffectType =\n | \"fire\"\n | \"flames\"\n | \"crystal-flames\"\n | \"fluid-flames\"\n | \"blobs\"\n | \"energy-blobs\"\n | \"plasma-blobs\"\n | \"inferno\"\n | \"sparks\"\n | \"shockwave\"\n | \"wave\"\n | \"plasma\"\n | \"electric\"\n | \"embers\"\n | \"supernova\"\n | \"all\";\n\nexport type EffectType = SingleEffectType | SingleEffectType[] | string;\n\nexport interface AnimatedBackgroundProps {\n /** View template or component to display (\"lhome\", \"home\", or custom React component) */\n containerToDisplay?: string | React.ReactNode;\n /** DOM element ID/class or container target to attach as background (e.g. \"home\", \"#main-hero\", \"lhome\") */\n containerSelector?: string;\n /** 3D Effect type or multiple effects (e.g. \"blobs,onda\" or [\"flames\", \"shockwave\"]) */\n effect?: EffectType;\n /** 3D Title rendered in world space (omit or pass \"\" for blank pure background effects) */\n title?: string;\n /** Background color or gradient (supports Spanish names like \"rojo\", \"azul\", \"verde\", \"dorado\" or #HEX / CSS colors) */\n backgroundColor?: string;\n /** Custom color for ALL 3D WebGL effects (e.g. \"azul\", \"verde\", \"magenta\", \"#00e5ff\", \"#ff0055\") */\n effectColor?: string;\n /** Speed multiplier for 3D motion & animation (default 0.5 for smooth relaxing motion) */\n effectSpeed?: number;\n /** Density / quantity of flame & WebGL particles (range 0.1 to 1.0, default 0.3 for clean elegant flames) */\n effectDensity?: number;\n /** Automatically scale 3D text to fit parent container perfectly (default true) */\n autoFitText?: boolean;\n /** Optional duration in seconds when used as a Loader / Splash screen animation */\n loaderDuration?: number;\n /** Optional URL to redirect to automatically when loaderDuration timer reaches 0 */\n redirectUrl?: string;\n /** Optional callback triggered when loaderDuration timer finishes */\n onComplete?: () => void;\n /** 3D Font Family (\"cinema\", \"helvetiker\", \"gentilis\", \"optimer\" or custom font URL) */\n fontFamily?: \"cinema\" | \"helvetiker\" | \"gentilis\" | \"optimer\" | string;\n /** Custom 3D Typeface JSON URL */\n fontUrl?: string;\n /** 3D Material theme */\n theme?: MaterialTheme;\n /** Letter spacing multiplier (default 0.85 to prevent text overlaps) */\n letterSpacing?: number;\n /** Container CSS class name */\n className?: string;\n /** Inline CSS styles */\n style?: React.CSSProperties;\n /** Custom children overlay */\n children?: React.ReactNode;\n}\n\nconst HELVETIKER_CDN = \"https://threejs.org/examples/fonts/helvetiker_bold.typeface.json\";\n\nconst FONT_PRESETS: Record<string, string> = {\n cinema: HELVETIKER_CDN,\n helvetiker: HELVETIKER_CDN,\n gentilis: \"https://threejs.org/examples/fonts/gentilis_bold.typeface.json\",\n optimer: \"https://threejs.org/examples/fonts/optimer_bold.typeface.json\",\n};\n\nconst SPANISH_COLOR_MAP: Record<string, string> = {\n rojo: \"#3b0712\",\n azul: \"#021a38\",\n verde: \"#032117\",\n esmeralda: \"#032117\",\n dorado: \"#1c1503\",\n negro: \"#07080c\",\n purpura: \"#21032a\",\n};\n\nconst THEME_BACKGROUNDS: Record<MaterialTheme, string> = {\n gold: \"radial-gradient(circle at center, #1c1503 0%, #080601 60%, #020201 100%)\",\n neon: \"radial-gradient(circle at center, #021a1e 0%, #030d14 60%, #010408 100%)\",\n emerald: \"radial-gradient(circle at center, #032117 0%, #02120d 60%, #010705 100%)\",\n crimson: \"radial-gradient(circle at center, #240409 0%, #120205 60%, #060102 100%)\",\n obsidian: \"radial-gradient(circle at center, #120d24 0%, #080512 60%, #030206 100%)\",\n glass: \"radial-gradient(circle at center, #0f172a 0%, #070b14 60%, #020205 100%)\",\n};\n\nfunction computeLetterPositions(\n text: string,\n spacing: number = 0.85\n): [number, number, number][] {\n const totalWidth = text.length * spacing;\n const startX = -totalWidth / 2 + spacing / 2;\n\n return text.split(\"\").map((_, i) => [startX + i * spacing, 0, 0]);\n}\n\n/**\n * Parses single, array, or comma-separated effect props into boolean active flags\n */\nfunction parseActiveEffects(effectInput?: EffectType): {\n enableFluidFlames: boolean;\n enableCrystalFlames: boolean;\n enableBlobs: boolean;\n enableSparks: boolean;\n enableShockwave: boolean;\n enablePlasma: boolean;\n enableEmbers: boolean;\n} {\n let list: string[] = [];\n if (!effectInput) {\n list = [\"flames\"];\n } else if (Array.isArray(effectInput)) {\n list = effectInput.map((e) => String(e).toLowerCase().trim());\n } else if (typeof effectInput === \"string\") {\n list = effectInput.toLowerCase().split(\",\").map((s) => s.trim());\n }\n\n const isAll = list.includes(\"all\") || list.includes(\"todos\") || list.includes(\"supernova\") || list.includes(\"inferno\");\n\n const enableFluidFlames =\n isAll ||\n list.includes(\"flames\") ||\n list.includes(\"fluid-flames\") ||\n list.includes(\"llamas\") ||\n list.includes(\"llamas-organicas\");\n\n const enableCrystalFlames =\n isAll ||\n list.includes(\"fire\") ||\n list.includes(\"crystal-flames\") ||\n list.includes(\"cristales\") ||\n list.includes(\"fuego\");\n\n const enableBlobs =\n isAll ||\n list.includes(\"blobs\") ||\n list.includes(\"energy-blobs\") ||\n list.includes(\"plasma-blobs\") ||\n list.includes(\"nubes\");\n\n const enableSparks =\n isAll ||\n list.includes(\"sparks\") ||\n list.includes(\"chispas\");\n\n const enableShockwave =\n isAll ||\n list.includes(\"shockwave\") ||\n list.includes(\"wave\") ||\n list.includes(\"onda\") ||\n list.includes(\"onda-3d\");\n\n const enablePlasma =\n isAll ||\n list.includes(\"plasma\") ||\n list.includes(\"electric\");\n\n const enableEmbers =\n isAll ||\n list.includes(\"embers\") ||\n list.includes(\"ascuas\") ||\n enableFluidFlames ||\n enableCrystalFlames ||\n enableBlobs;\n\n return {\n enableFluidFlames,\n enableCrystalFlames,\n enableBlobs,\n enableSparks,\n enableShockwave,\n enablePlasma,\n enableEmbers,\n };\n}\n\n/**\n * Main Animated Background Component for 3d-effect-cinema.\n * Supports permanent 3D background mode OR cinematic Splash Screen / Loader mode (with loaderDuration & redirectUrl).\n * Can be targeted to a DOM container via `containerSelector` (e.g. containerSelector=\"home\").\n */\nexport default function AnimatedBackground({\n containerToDisplay,\n containerSelector,\n effect = \"flames\",\n title,\n backgroundColor,\n effectColor,\n effectSpeed = 0.5,\n effectDensity = 0.3,\n autoFitText = true,\n loaderDuration,\n redirectUrl,\n onComplete,\n fontFamily = \"cinema\",\n fontUrl,\n theme = \"crimson\",\n letterSpacing = 0.85,\n className = \"\",\n style,\n children,\n}: AnimatedBackgroundProps) {\n const activeTitle = title !== undefined && title !== null ? title.trim().toUpperCase() : \"\";\n const letters = activeTitle ? activeTitle.split(\"\") : [];\n const positions = useMemo(\n () => computeLetterPositions(activeTitle, letterSpacing),\n [activeTitle, letterSpacing]\n );\n\n // SSR & Client Hydration Guard\n const [isMounted, setIsMounted] = useState(false);\n useEffect(() => {\n setIsMounted(true);\n }, []);\n\n // Loader Countdown State\n const isLoaderActive = Boolean(loaderDuration && loaderDuration > 0 && (redirectUrl || onComplete));\n const [loaderProgress, setLoaderProgress] = useState(0);\n\n useEffect(() => {\n if (!isLoaderActive || !loaderDuration) return;\n\n const totalMs = loaderDuration * 1000;\n const intervalMs = 50;\n let elapsedMs = 0;\n\n const timer = setInterval(() => {\n elapsedMs += intervalMs;\n const currentPct = Math.min(100, (elapsedMs / totalMs) * 100);\n setLoaderProgress(currentPct);\n\n if (elapsedMs >= totalMs) {\n clearInterval(timer);\n onComplete?.();\n if (redirectUrl) {\n window.location.href = redirectUrl;\n }\n }\n }, intervalMs);\n\n return () => clearInterval(timer);\n }, [isLoaderActive, loaderDuration, redirectUrl, onComplete]);\n\n // Active 3D Typeface JSON URL\n const activeFontUrl = useMemo(() => {\n if (fontUrl) return fontUrl;\n const key = String(fontFamily).toLowerCase().trim();\n return FONT_PRESETS[key] || FONT_PRESETS.cinema;\n }, [fontFamily, fontUrl]);\n\n // Window width tracking for mobile viewport 3D text auto-fitting\n const [windowWidth, setWindowWidth] = useState<number>(\n typeof window !== \"undefined\" ? window.innerWidth : 1200\n );\n\n useEffect(() => {\n const handleResize = () => setWindowWidth(window.innerWidth);\n window.addEventListener(\"resize\", handleResize);\n return () => window.removeEventListener(\"resize\", handleResize);\n }, []);\n\n // Dynamic text auto-scaling to prevent overflowing container on mobile and desktop\n const calculatedScale = useMemo(() => {\n if (!autoFitText || !letters.length) return 1.0;\n const len = letters.length;\n let baseScale = 1.0;\n if (len <= 4) baseScale = 1.0;\n else if (len <= 7) baseScale = 0.85;\n else if (len <= 10) baseScale = 0.7;\n else if (len <= 14) baseScale = 0.55;\n else baseScale = 0.45;\n\n // Apply viewport scale multiplier for mobile screen width\n if (windowWidth < 480) {\n return baseScale * 0.55;\n } else if (windowWidth < 768) {\n return baseScale * 0.75;\n }\n return baseScale;\n }, [autoFitText, letters.length, windowWidth]);\n\n // Determine active background color / gradient\n const activeBg = useMemo(() => {\n if (!backgroundColor) return THEME_BACKGROUNDS[theme] || THEME_BACKGROUNDS.gold;\n const lower = backgroundColor.toLowerCase().trim();\n if (SPANISH_COLOR_MAP[lower]) return SPANISH_COLOR_MAP[lower];\n if (backgroundColor.startsWith(\"#\") || backgroundColor.startsWith(\"rgb\") || backgroundColor.includes(\"gradient\")) {\n return backgroundColor;\n }\n return backgroundColor;\n }, [backgroundColor, theme]);\n\n // Parse active 3D effects\n const activeEffects = useMemo(() => parseActiveEffects(effect), [effect]);\n\n const flameMode: \"fluid\" | \"crystal\" | \"all\" =\n activeEffects.enableFluidFlames && activeEffects.enableCrystalFlames\n ? \"all\"\n : activeEffects.enableCrystalFlames\n ? \"crystal\"\n : \"fluid\";\n\n const enableAnyFlames = activeEffects.enableFluidFlames || activeEffects.enableCrystalFlames;\n\n const targetSelector = containerSelector || (typeof containerToDisplay === \"string\" ? containerToDisplay : undefined);\n\n const renderContainerContent = () => {\n if (targetSelector === \"lhome\" || targetSelector === \"home\" || containerToDisplay === \"lhome\" || containerToDisplay === \"home\") {\n return <CinemaHome cinemaName={activeTitle || \"NOVA\"} webTheme={theme} />;\n }\n if (typeof containerToDisplay === \"string\" && containerToDisplay !== \"lhome\" && containerToDisplay !== \"home\") {\n return (\n <div className=\"text-center text-white p-8 bg-black/40 backdrop-blur-md rounded-2xl border border-white/10\">\n <h2 className=\"text-3xl font-bold tracking-widest uppercase mb-2\">\n {containerToDisplay}\n </h2>\n <p className=\"text-sm text-white/60\">3D Interactive WebGL Background</p>\n </div>\n );\n }\n if (containerToDisplay && typeof containerToDisplay !== \"string\") {\n return containerToDisplay;\n }\n return children;\n };\n\n if (!isMounted) {\n return (\n <div\n id={containerSelector}\n data-container-selector={containerSelector}\n className={`relative w-full h-full overflow-hidden select-none bg-black ${className}`}\n style={{ background: activeBg, ...style }}\n >\n {renderContainerContent() && (\n <div className=\"relative z-10 w-full h-full pointer-events-none flex flex-col items-center justify-center\">\n <div className=\"pointer-events-auto w-full h-full\">\n {renderContainerContent()}\n </div>\n </div>\n )}\n </div>\n );\n }\n\n return (\n <div\n id={containerSelector}\n data-container-selector={containerSelector}\n className={`relative w-full h-full overflow-hidden select-none ${className}`}\n style={{ background: activeBg, ...style }}\n >\n {/* Sleek Progress Bar overlay when used in Loader / Splash screen mode */}\n {isLoaderActive && (\n <div className=\"absolute top-0 left-0 right-0 z-30 h-1 bg-white/10 pointer-events-none\">\n <div\n className=\"h-full bg-gradient-to-r from-amber-400 via-rose-500 to-cyan-400 transition-all duration-75\"\n style={{ width: `${loaderProgress}%` }}\n />\n </div>\n )}\n\n {/* 3D WebGL Canvas Layer */}\n <div className=\"absolute inset-0 z-0 pointer-events-auto\">\n <Canvas\n camera={{ position: [0, 0, 14], fov: 45, near: 0.1, far: 50 }}\n dpr={[1, 2]}\n gl={{\n antialias: true,\n toneMapping: 4,\n toneMappingExposure: 1.2,\n }}\n >\n <Suspense fallback={null}>\n <Environment preset=\"studio\" />\n <ambientLight intensity={0.3} />\n <directionalLight position={[5, 8, 5]} intensity={1.5} color=\"#ffffff\" />\n <pointLight\n position={[-5, -3, -5]}\n intensity={0.6}\n color={\n theme === \"emerald\"\n ? \"#10b981\"\n : theme === \"crimson\"\n ? \"#ff1744\"\n : theme === \"neon\"\n ? \"#00ffff\"\n : \"#FFD700\"\n }\n />\n\n <CameraRig phase={isLoaderActive ? \"entering\" : \"idle\"} effectSpeed={effectSpeed} />\n\n {/* Mind-Blowing Dual-Mode Fire Flames (Fluid & Crystal modes) */}\n <FireFlames\n enabled={enableAnyFlames}\n theme={theme}\n effectColor={effectColor}\n effectSpeed={effectSpeed}\n effectDensity={effectDensity}\n mode={flameMode}\n />\n\n {/* Bioluminescent Liquid Energy Blobs Effect (Exact User Screenshot Effect) */}\n <PlasmaBlobs\n enabled={activeEffects.enableBlobs}\n theme={theme}\n effectColor={effectColor}\n effectSpeed={effectSpeed}\n effectDensity={effectDensity}\n />\n\n {/* Interactive 3D Effects */}\n <ClickFireSparks enabled={activeEffects.enableSparks} theme={theme} effectColor={effectColor} effectSpeed={effectSpeed} />\n <ClickShockwave enabled={activeEffects.enableShockwave} theme={theme} effectColor={effectColor} effectSpeed={effectSpeed} />\n <ElectricPlasma enabled={activeEffects.enablePlasma} theme={theme} effectColor={effectColor} effectSpeed={effectSpeed} />\n\n {/* 3D Typography with autoFitText scaling */}\n {letters.length > 0 && (\n <Center disableY disableZ>\n <group scale={calculatedScale}>\n {letters.map((char, i) => (\n <AnimatedLetter\n key={`${char}-${i}`}\n char={char}\n index={i}\n totalLetters={letters.length}\n position={positions[i]}\n phase={isLoaderActive ? \"entering\" : \"idle\"}\n theme={theme}\n fontUrl={activeFontUrl}\n />\n ))}\n </group>\n </Center>\n )}\n\n {/* Floating particles */}\n <SceneParticles theme={theme} effectColor={effectColor} effectSpeed={effectSpeed} visible={activeEffects.enableEmbers} />\n\n {/* Post-Processing */}\n <EffectComposer>\n <Bloom\n luminanceThreshold={0.7}\n luminanceSmoothing={0.9}\n intensity={theme === \"neon\" || theme === \"crimson\" ? 1.4 : 0.9}\n mipmapBlur\n />\n <Vignette offset={0.3} darkness={0.85} />\n <Noise opacity={0.025} />\n </EffectComposer>\n </Suspense>\n </Canvas>\n </div>\n\n {/* Overlaid UI / Container Content */}\n {renderContainerContent() && (\n <div className=\"relative z-10 w-full h-full pointer-events-none flex flex-col items-center justify-center\">\n <div className=\"pointer-events-auto w-full h-full\">\n {renderContainerContent()}\n </div>\n </div>\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport { useRef, useMemo } from \"react\";\nimport { useFrame } from \"@react-three/fiber\";\nimport { Text3D } from \"@react-three/drei\";\nimport * as THREE from \"three\";\n\nexport type MaterialTheme = \"gold\" | \"neon\" | \"emerald\" | \"crimson\" | \"obsidian\" | \"glass\";\n\ninterface AnimatedLetterProps {\n char: string;\n index: number;\n totalLetters: number;\n position: [number, number, number];\n phase: \"loading\" | \"entering\" | \"idle\" | \"exiting\";\n theme: MaterialTheme;\n fontUrl: string;\n}\n\nconst THEME_CONFIGS: Record<\n MaterialTheme,\n {\n color: string;\n metalness: number;\n roughness: number;\n clearcoat: number;\n emissive: string;\n emissiveIntensity: number;\n envMapIntensity: number;\n transmission?: number;\n ior?: number;\n thickness?: number;\n transparent?: boolean;\n }\n> = {\n gold: {\n color: \"#FFD700\",\n metalness: 1.0,\n roughness: 0.15,\n clearcoat: 1.0,\n emissive: \"#1a0f00\",\n emissiveIntensity: 0.3,\n envMapIntensity: 2.0,\n },\n neon: {\n color: \"#00ffff\",\n metalness: 0.0,\n roughness: 1.0,\n clearcoat: 0.0,\n emissive: \"#00ffff\",\n emissiveIntensity: 2.5,\n envMapIntensity: 0.5,\n },\n emerald: {\n color: \"#10b981\",\n metalness: 0.9,\n roughness: 0.1,\n clearcoat: 1.0,\n emissive: \"#065f46\",\n emissiveIntensity: 1.2,\n envMapIntensity: 2.5,\n },\n crimson: {\n color: \"#ff1744\",\n metalness: 0.8,\n roughness: 0.15,\n clearcoat: 1.0,\n emissive: \"#880e4f\",\n emissiveIntensity: 1.8,\n envMapIntensity: 2.0,\n },\n obsidian: {\n color: \"#1a1a2e\",\n metalness: 1.0,\n roughness: 0.05,\n clearcoat: 1.0,\n emissive: \"#0a0a1a\",\n emissiveIntensity: 0.1,\n envMapIntensity: 3.0,\n },\n glass: {\n color: \"#ffffff\",\n metalness: 0.0,\n roughness: 0.0,\n clearcoat: 0.0,\n emissive: \"#000000\",\n emissiveIntensity: 0.0,\n envMapIntensity: 1.5,\n transmission: 0.95,\n ior: 1.5,\n thickness: 0.5,\n transparent: true,\n },\n};\n\nexport default function AnimatedLetter({\n char,\n index,\n totalLetters,\n position,\n phase,\n theme,\n fontUrl,\n}: AnimatedLetterProps) {\n const meshRef = useRef<THREE.Group>(null);\n const startTimeRef = useRef<number | null>(null);\n\n // Randomized starting offsets for the entrance animation\n const entryOffset = useMemo(() => {\n const angle = (index / totalLetters) * Math.PI * 2;\n return {\n x: Math.cos(angle) * 4 + (Math.random() - 0.5) * 2,\n y: -3 + Math.random() * -3,\n z: -5 + Math.random() * -3,\n rotX: (Math.random() - 0.5) * Math.PI * 2,\n rotY: (Math.random() - 0.5) * Math.PI * 2,\n };\n }, [index, totalLetters]);\n\n const themeConfig = THEME_CONFIGS[theme];\n\n useFrame((state) => {\n if (!meshRef.current) return;\n const time = state.clock.getElapsedTime();\n\n if (startTimeRef.current === null) {\n startTimeRef.current = time;\n }\n\n const elapsed = time - startTimeRef.current;\n const staggerDelay = index * 0.12;\n\n if (phase === \"loading\") {\n meshRef.current.position.set(\n position[0] + entryOffset.x,\n position[1] + entryOffset.y,\n position[2] + entryOffset.z\n );\n meshRef.current.rotation.set(entryOffset.rotX, entryOffset.rotY, 0);\n meshRef.current.scale.setScalar(0);\n return;\n }\n\n if (phase === \"entering\") {\n const t = Math.max(0, elapsed - staggerDelay);\n // Smooth spring-like easing\n const progress = 1 - Math.exp(-t * 3);\n // Overshoot for bounciness\n const bounce = 1 + Math.sin(t * 8) * Math.max(0, 0.15 - t * 0.1);\n\n meshRef.current.position.set(\n THREE.MathUtils.lerp(\n position[0] + entryOffset.x,\n position[0],\n progress\n ),\n THREE.MathUtils.lerp(\n position[1] + entryOffset.y,\n position[1],\n progress\n ),\n THREE.MathUtils.lerp(\n position[2] + entryOffset.z,\n position[2],\n progress\n )\n );\n\n meshRef.current.rotation.set(\n THREE.MathUtils.lerp(entryOffset.rotX, 0, progress),\n THREE.MathUtils.lerp(entryOffset.rotY, 0, progress),\n 0\n );\n\n meshRef.current.scale.setScalar(\n Math.min(progress * bounce, 1.05)\n );\n return;\n }\n\n if (phase === \"idle\") {\n // Gentle breathing oscillation\n const breathe =\n Math.sin(time * 1.2 + index * 0.5) * 0.015;\n const sway =\n Math.sin(time * 0.8 + index * 0.3) * 0.008;\n\n meshRef.current.position.set(\n position[0] + sway,\n position[1] + breathe,\n position[2]\n );\n meshRef.current.rotation.set(\n Math.sin(time * 0.5 + index) * 0.01,\n Math.sin(time * 0.3 + index * 0.7) * 0.01,\n 0\n );\n meshRef.current.scale.setScalar(1);\n return;\n }\n\n if (phase === \"exiting\") {\n const t = Math.max(0, elapsed - staggerDelay * 0.5);\n const progress = Math.min(t * 2, 1);\n const eased = progress * progress;\n\n meshRef.current.position.set(\n position[0] + entryOffset.x * eased * 0.5,\n position[1],\n position[2] - eased * 8\n );\n meshRef.current.scale.setScalar(Math.max(1 - eased, 0));\n meshRef.current.rotation.y += 0.05;\n }\n });\n\n // Skip spaces\n if (char === \" \") return null;\n\n return (\n <group ref={meshRef} position={position}>\n <Text3D\n font={fontUrl}\n size={0.8}\n height={0.35}\n bevelEnabled\n bevelSize={0.02}\n bevelThickness={0.01}\n bevelSegments={3}\n curveSegments={12}\n >\n {char}\n <meshPhysicalMaterial\n color={themeConfig.color}\n metalness={themeConfig.metalness}\n roughness={themeConfig.roughness}\n clearcoat={themeConfig.clearcoat}\n emissive={themeConfig.emissive}\n emissiveIntensity={themeConfig.emissiveIntensity}\n envMapIntensity={themeConfig.envMapIntensity}\n transmission={themeConfig.transmission}\n ior={themeConfig.ior}\n thickness={themeConfig.thickness}\n transparent={themeConfig.transparent}\n toneMapped={theme !== \"neon\"}\n />\n </Text3D>\n </group>\n );\n}\n","\"use client\";\n\nimport { useRef, useMemo } from \"react\";\nimport { useFrame } from \"@react-three/fiber\";\nimport { Sparkles } from \"@react-three/drei\";\nimport * as THREE from \"three\";\nimport type { MaterialTheme } from \"./AnimatedLetter\";\n\ninterface SceneParticlesProps {\n theme: MaterialTheme;\n effectColor?: string;\n effectSpeed?: number;\n visible: boolean;\n}\n\nconst THEME_PARTICLE_COLORS: Record<MaterialTheme, string> = {\n gold: \"#FFD700\",\n neon: \"#00ffff\",\n emerald: \"#10b981\",\n crimson: \"#ff1744\",\n obsidian: \"#a855f7\",\n glass: \"#ffffff\",\n};\n\nconst SPANISH_COLOR_HEX: Record<string, string> = {\n azul: \"#00e5ff\",\n verde: \"#00e676\",\n rojo: \"#ff3d00\",\n dorado: \"#ffb300\",\n purpura: \"#d500f9\",\n magenta: \"#ff007f\",\n esmeralda: \"#10b981\",\n};\n\n/**\n * Custom slow-orbit dust motes for depth parallax\n */\nfunction DustMotes({ color, speedMultiplier = 0.5, count = 60 }: { color: string; speedMultiplier?: number; count?: number }) {\n const meshRef = useRef<THREE.InstancedMesh>(null);\n const dummy = useRef(new THREE.Object3D());\n const speeds = useRef<Float32Array | null>(null);\n const offsets = useRef<Float32Array | null>(null);\n\n if (!speeds.current) {\n speeds.current = new Float32Array(count);\n offsets.current = new Float32Array(count * 3);\n for (let i = 0; i < count; i++) {\n speeds.current[i] = 0.1 + Math.random() * 0.3;\n offsets.current[i * 3] = (Math.random() - 0.5) * 16;\n offsets.current[i * 3 + 1] = (Math.random() - 0.5) * 10;\n offsets.current[i * 3 + 2] = (Math.random() - 0.5) * 12;\n }\n }\n\n useFrame((state) => {\n if (!meshRef.current || !speeds.current || !offsets.current) return;\n const time = state.clock.getElapsedTime() * speedMultiplier;\n\n for (let i = 0; i < count; i++) {\n const speed = speeds.current[i];\n const ox = offsets.current[i * 3];\n const oy = offsets.current[i * 3 + 1];\n const oz = offsets.current[i * 3 + 2];\n\n dummy.current.position.set(\n ox + Math.sin(time * speed + i) * 2,\n oy + Math.cos(time * speed * 0.7 + i * 0.5) * 1.5,\n oz + Math.sin(time * speed * 0.5 + i * 0.3) * 2\n );\n dummy.current.scale.setScalar(0.015 + Math.sin(time + i) * 0.005);\n dummy.current.updateMatrix();\n meshRef.current.setMatrixAt(i, dummy.current.matrix);\n }\n meshRef.current.instanceMatrix.needsUpdate = true;\n });\n\n return (\n <instancedMesh ref={meshRef} args={[undefined, undefined, count]}>\n <sphereGeometry args={[1, 6, 6]} />\n <meshBasicMaterial\n color={color}\n transparent\n opacity={0.3}\n toneMapped={false}\n />\n </instancedMesh>\n );\n}\n\nexport default function SceneParticles({ theme, effectColor, effectSpeed = 0.5, visible }: SceneParticlesProps) {\n const activeColor = useMemo(() => {\n if (!effectColor) return THEME_PARTICLE_COLORS[theme] || THEME_PARTICLE_COLORS.gold;\n const lower = effectColor.toLowerCase().trim();\n if (SPANISH_COLOR_HEX[lower]) return SPANISH_COLOR_HEX[lower];\n return effectColor;\n }, [effectColor, theme]);\n\n if (!visible) return null;\n\n return (\n <group>\n {/* Primary sparkles — bright, close */}\n <Sparkles\n count={150}\n scale={10}\n size={4}\n speed={0.3 * effectSpeed}\n opacity={0.8}\n color={activeColor}\n noise={0.6}\n />\n\n {/* Secondary sparkles — dim, distant, slower */}\n <Sparkles\n count={80}\n scale={16}\n size={2}\n speed={0.15 * effectSpeed}\n opacity={0.4}\n color=\"#ffffff\"\n noise={0.8}\n />\n\n {/* Custom dust motes for depth parallax */}\n <DustMotes color={activeColor} speedMultiplier={effectSpeed} count={50} />\n </group>\n );\n}\n","\"use client\";\n\nimport { useRef } from \"react\";\nimport { useFrame, useThree } from \"@react-three/fiber\";\nimport * as THREE from \"three\";\n\ninterface CameraRigProps {\n phase: \"loading\" | \"entering\" | \"idle\" | \"exiting\";\n effectSpeed?: number;\n}\n\nexport default function CameraRig({ phase, effectSpeed = 0.5 }: CameraRigProps) {\n const { camera, pointer } = useThree();\n const startTimeRef = useRef<number | null>(null);\n const phaseRef = useRef(phase);\n\n if (phaseRef.current !== phase) {\n phaseRef.current = phase;\n startTimeRef.current = null;\n }\n\n useFrame((state) => {\n const time = state.clock.getElapsedTime() * effectSpeed;\n\n if (startTimeRef.current === null) {\n startTimeRef.current = time;\n }\n\n const elapsed = time - startTimeRef.current;\n\n if (phase === \"loading\") {\n camera.position.set(0, 0, 14);\n camera.lookAt(0, 0, 0);\n return;\n }\n\n if (phase === \"entering\") {\n const t = Math.min(elapsed / 3, 1);\n const eased = 1 - Math.pow(1 - t, 3);\n const z = THREE.MathUtils.lerp(14, 6, eased);\n const y = THREE.MathUtils.lerp(1, 0.2, eased);\n\n camera.position.set(0, y, z);\n camera.lookAt(0, 0, 0);\n return;\n }\n\n // Calculate target Z distance dynamically based on viewport aspect ratio\n const aspect = state.viewport.width / (state.viewport.height || 1);\n const targetZ = aspect < 1 ? Math.max(6, 6 / Math.max(0.45, aspect * 0.85)) : 6;\n\n if (phase === \"idle\") {\n // Very gentle slow circular drift + subtle mouse parallax\n const driftX = Math.sin(time * 0.1) * 0.2;\n const driftY = Math.cos(time * 0.08) * 0.1 + 0.2;\n\n const mouseX = pointer.x * 0.2;\n const mouseY = pointer.y * 0.1;\n\n camera.position.x = THREE.MathUtils.damp(\n camera.position.x,\n driftX + mouseX,\n 3,\n 0.016\n );\n camera.position.y = THREE.MathUtils.damp(\n camera.position.y,\n driftY + mouseY,\n 3,\n 0.016\n );\n camera.position.z = THREE.MathUtils.damp(\n camera.position.z,\n targetZ,\n 3,\n 0.016\n );\n camera.lookAt(0, 0, 0);\n return;\n }\n\n if (phase === \"exiting\") {\n const t = Math.min(elapsed / 1.5, 1);\n const eased = t * t * t;\n const z = THREE.MathUtils.lerp(6, -8, eased);\n\n camera.position.set(0, 0, z);\n camera.lookAt(0, 0, 0);\n }\n });\n\n return null;\n}\n","\"use client\";\n\nimport { useState, useRef, useCallback, useEffect, useMemo } from \"react\";\nimport { useFrame, useThree } from \"@react-three/fiber\";\nimport * as THREE from \"three\";\nimport type { MaterialTheme } from \"./AnimatedLetter\";\n\ninterface Spark {\n id: number;\n position: THREE.Vector3;\n velocity: THREE.Vector3;\n color: THREE.Color;\n size: number;\n life: number; // 0 to 1\n maxLife: number;\n}\n\ninterface SparkBurst {\n id: number;\n origin: THREE.Vector3;\n sparks: Spark[];\n color: string;\n lightIntensity: number;\n time: number;\n}\n\nconst THEME_SPARK_COLORS: Record<MaterialTheme, string[]> = {\n gold: [\"#FFD700\", \"#FF8C00\", \"#FF4500\", \"#FFF8DC\"],\n neon: [\"#00ffff\", \"#0088ff\", \"#ff00ff\", \"#ffffff\"],\n emerald: [\"#00ff88\", \"#10b981\", \"#059669\", \"#a7f3d0\"],\n crimson: [\"#ff1744\", \"#d50000\", \"#ff5252\", \"#ffb74d\"],\n obsidian: [\"#a855f7\", \"#6366f1\", \"#3b82f6\", \"#ffffff\"],\n glass: [\"#ffffff\", \"#e0e7ff\", \"#93c5fd\", \"#60a5fa\"],\n};\n\nconst SPANISH_COLOR_HEX: Record<string, string> = {\n azul: \"#00e5ff\",\n verde: \"#00e676\",\n rojo: \"#ff3d00\",\n dorado: \"#ffb300\",\n purpura: \"#d500f9\",\n magenta: \"#ff007f\",\n esmeralda: \"#10b981\",\n};\n\nexport default function ClickFireSparks({\n theme = \"gold\",\n effectColor,\n effectSpeed = 0.5,\n enabled = true,\n}: {\n theme?: MaterialTheme;\n effectColor?: string;\n effectSpeed?: number;\n enabled?: boolean;\n}) {\n const { camera, raycaster } = useThree();\n const [bursts, setBursts] = useState<SparkBurst[]>([]);\n const nextId = useRef(0);\n\n const activePalette = useMemo(() => {\n if (!effectColor) return THEME_SPARK_COLORS[theme] || THEME_SPARK_COLORS.gold;\n const lower = effectColor.toLowerCase().trim();\n const primaryHex = SPANISH_COLOR_HEX[lower] || effectColor;\n return [primaryHex, \"#ffffff\", primaryHex];\n }, [effectColor, theme]);\n\n const handlePointerDown = useCallback(\n (event: MouseEvent | TouchEvent) => {\n if (!enabled) return;\n let clientX = 0;\n let clientY = 0;\n\n if (\"touches\" in event && event.touches.length > 0) {\n clientX = event.touches[0].clientX;\n clientY = event.touches[0].clientY;\n } else if (\"clientX\" in event) {\n clientX = (event as MouseEvent).clientX;\n clientY = (event as MouseEvent).clientY;\n } else {\n return;\n }\n\n const ndc = new THREE.Vector2(\n (clientX / window.innerWidth) * 2 - 1,\n -(clientY / window.innerHeight) * 2 + 1\n );\n\n raycaster.setFromCamera(ndc, camera);\n\n const plane = new THREE.Plane(new THREE.Vector3(0, 0, 1), 0);\n const intersectionPoint = new THREE.Vector3();\n raycaster.ray.intersectPlane(plane, intersectionPoint);\n\n if (!intersectionPoint) return;\n\n const sparkCount = 35;\n const newSparks: Spark[] = [];\n\n for (let i = 0; i < sparkCount; i++) {\n const angle = Math.random() * Math.PI * 2;\n const speed = (1.5 + Math.random() * 4.5) * effectSpeed;\n const elevation = (Math.random() - 0.3) * 3 * effectSpeed;\n\n const velocity = new THREE.Vector3(\n Math.cos(angle) * speed,\n Math.sin(angle) * speed + elevation,\n (Math.random() - 0.5) * speed * 0.8\n );\n\n const hexColor = activePalette[Math.floor(Math.random() * activePalette.length)];\n\n newSparks.push({\n id: i,\n position: intersectionPoint.clone(),\n velocity,\n color: new THREE.Color(hexColor),\n size: 0.08 + Math.random() * 0.12,\n life: 1.0,\n maxLife: (0.6 + Math.random() * 0.8) / Math.max(0.2, effectSpeed),\n });\n }\n\n const newBurst: SparkBurst = {\n id: nextId.current++,\n origin: intersectionPoint.clone(),\n sparks: newSparks,\n color: activePalette[0],\n lightIntensity: 4.0,\n time: 0,\n };\n\n setBursts((prev) => [...prev.slice(-4), newBurst]);\n },\n [camera, raycaster, activePalette, effectSpeed, enabled]\n );\n\n useEffect(() => {\n window.addEventListener(\"pointerdown\", handlePointerDown);\n return () => {\n window.removeEventListener(\"pointerdown\", handlePointerDown);\n };\n }, [handlePointerDown]);\n\n // Physics animation frame loop\n useFrame((_, delta) => {\n if (bursts.length === 0) return;\n\n setBursts((prevBursts) =>\n prevBursts\n .map((burst) => {\n const updatedTime = burst.time + delta * effectSpeed;\n const updatedLight = Math.max(0, burst.lightIntensity - delta * 8.0 * effectSpeed);\n\n const updatedSparks = burst.sparks\n .map((spark) => {\n const newLife = spark.life - (delta * effectSpeed) / spark.maxLife;\n if (newLife <= 0) return null;\n\n const newPos = spark.position\n .clone()\n .addScaledVector(spark.velocity, delta * effectSpeed);\n spark.velocity.y -= delta * 3.5 * effectSpeed; // Gravity\n spark.velocity.multiplyScalar(0.96); // Drag\n\n return {\n ...spark,\n position: newPos,\n life: newLife,\n };\n })\n .filter(Boolean) as Spark[];\n\n if (updatedSparks.length === 0 && updatedLight <= 0) return null;\n\n return {\n ...burst,\n time: updatedTime,\n lightIntensity: updatedLight,\n sparks: updatedSparks,\n };\n })\n .filter(Boolean) as SparkBurst[]\n );\n });\n\n return (\n <group>\n {bursts.map((burst) => (\n <group key={burst.id}>\n {burst.lightIntensity > 0.05 && (\n <pointLight\n position={burst.origin}\n intensity={burst.lightIntensity * 3}\n distance={6}\n color={burst.color}\n />\n )}\n\n {burst.sparks.map((spark) => (\n <mesh key={spark.id} position={spark.position}>\n <sphereGeometry args={[spark.size * spark.life, 6, 6]} />\n <meshBasicMaterial\n color={spark.color}\n transparent\n opacity={spark.life}\n toneMapped={false}\n />\n </mesh>\n ))}\n </group>\n ))}\n </group>\n );\n}\n","\"use client\";\n\nimport { useState, useRef, useCallback, useEffect, useMemo } from \"react\";\nimport { useFrame, useThree } from \"@react-three/fiber\";\nimport * as THREE from \"three\";\nimport type { MaterialTheme } from \"./AnimatedLetter\";\n\ninterface RingWave {\n id: number;\n origin: THREE.Vector3;\n radius: number;\n maxRadius: number;\n life: number; // 1 to 0\n color: THREE.Color;\n}\n\nconst THEME_WAVE_COLORS: Record<MaterialTheme, string> = {\n gold: \"#FFD700\",\n neon: \"#00ffff\",\n emerald: \"#10b981\",\n crimson: \"#ff1744\",\n obsidian: \"#a855f7\",\n glass: \"#ffffff\",\n};\n\nconst SPANISH_COLOR_HEX: Record<string, string> = {\n azul: \"#00e5ff\",\n verde: \"#00e676\",\n rojo: \"#ff3d00\",\n dorado: \"#ffb300\",\n purpura: \"#d500f9\",\n magenta: \"#ff007f\",\n esmeralda: \"#10b981\",\n};\n\nexport default function ClickShockwave({\n theme = \"gold\",\n effectColor,\n effectSpeed = 0.5,\n enabled = true,\n}: {\n theme?: MaterialTheme;\n effectColor?: string;\n effectSpeed?: number;\n enabled?: boolean;\n}) {\n const { camera, raycaster } = useThree();\n const [waves, setWaves] = useState<RingWave[]>([]);\n const nextId = useRef(0);\n\n const activeColorHex = useMemo(() => {\n if (!effectColor) return THEME_WAVE_COLORS[theme] || THEME_WAVE_COLORS.gold;\n const lower = effectColor.toLowerCase().trim();\n if (SPANISH_COLOR_HEX[lower]) return SPANISH_COLOR_HEX[lower];\n return effectColor;\n }, [effectColor, theme]);\n\n const handlePointerDown = useCallback(\n (event: MouseEvent | TouchEvent) => {\n if (!enabled) return;\n\n let clientX = 0;\n let clientY = 0;\n\n if (\"touches\" in event && event.touches.length > 0) {\n clientX = event.touches[0].clientX;\n clientY = event.touches[0].clientY;\n } else if (\"clientX\" in event) {\n clientX = (event as MouseEvent).clientX;\n clientY = (event as MouseEvent).clientY;\n } else {\n return;\n }\n\n const ndc = new THREE.Vector2(\n (clientX / window.innerWidth) * 2 - 1,\n -(clientY / window.innerHeight) * 2 + 1\n );\n\n raycaster.setFromCamera(ndc, camera);\n\n const plane = new THREE.Plane(new THREE.Vector3(0, 0, 1), 0);\n const intersectionPoint = new THREE.Vector3();\n raycaster.ray.intersectPlane(plane, intersectionPoint);\n\n if (!intersectionPoint) return;\n\n const newWave: RingWave = {\n id: nextId.current++,\n origin: intersectionPoint.clone(),\n radius: 0.1,\n maxRadius: 3.5,\n life: 1.0,\n color: new THREE.Color(activeColorHex),\n };\n\n setWaves((prev) => [...prev.slice(-4), newWave]);\n },\n [camera, raycaster, activeColorHex, enabled]\n );\n\n useEffect(() => {\n window.addEventListener(\"pointerdown\", handlePointerDown);\n return () => {\n window.removeEventListener(\"pointerdown\", handlePointerDown);\n };\n }, [handlePointerDown]);\n\n useFrame((_, delta) => {\n if (waves.length === 0) return;\n\n setWaves((prev) =>\n prev\n .map((wave) => {\n const newLife = wave.life - delta * 1.8 * effectSpeed;\n if (newLife <= 0) return null;\n\n const newRadius = wave.radius + delta * 5.0 * effectSpeed;\n\n return {\n ...wave,\n life: newLife,\n radius: newRadius,\n };\n })\n .filter(Boolean) as RingWave[]\n );\n });\n\n if (!enabled) return null;\n\n return (\n <group>\n {waves.map((wave) => (\n <mesh key={wave.id} position={wave.origin} rotation={[0, 0, 0]}>\n <ringGeometry args={[wave.radius * 0.9, wave.radius, 48]} />\n <meshBasicMaterial\n color={wave.color}\n transparent\n opacity={wave.life * 0.75}\n side={THREE.DoubleSide}\n toneMapped={false}\n />\n </mesh>\n ))}\n </group>\n );\n}\n","\"use client\";\n\nimport { useRef, useMemo } from \"react\";\nimport { useFrame, useThree } from \"@react-three/fiber\";\nimport * as THREE from \"three\";\nimport type { MaterialTheme } from \"./AnimatedLetter\";\n\ninterface ElectricPlasmaProps {\n theme?: MaterialTheme;\n effectColor?: string;\n effectSpeed?: number;\n enabled?: boolean;\n}\n\nconst PLASMA_COLORS: Record<MaterialTheme, string> = {\n gold: \"#ffaa00\",\n neon: \"#00ffff\",\n emerald: \"#00ffaa\",\n crimson: \"#ff0055\",\n obsidian: \"#9900ff\",\n glass: \"#88ccff\",\n};\n\nconst SPANISH_COLOR_HEX: Record<string, string> = {\n azul: \"#00e5ff\",\n verde: \"#00e676\",\n rojo: \"#ff3d00\",\n dorado: \"#ffb300\",\n purpura: \"#d500f9\",\n magenta: \"#ff007f\",\n esmeralda: \"#10b981\",\n};\n\nexport default function ElectricPlasma({\n theme = \"neon\",\n effectColor,\n effectSpeed = 0.5,\n enabled = true,\n}: ElectricPlasmaProps) {\n const { pointer } = useThree();\n const lineRef = useRef<THREE.LineSegments>(null);\n\n const activeColor = useMemo(() => {\n if (!effectColor) return PLASMA_COLORS[theme] || PLASMA_COLORS.neon;\n const lower = effectColor.toLowerCase().trim();\n if (SPANISH_COLOR_HEX[lower]) return SPANISH_COLOR_HEX[lower];\n return effectColor;\n }, [effectColor, theme]);\n\n const segmentCount = 30;\n const geometry = useMemo(() => {\n const geom = new THREE.BufferGeometry();\n const positions = new Float32Array(segmentCount * 2 * 3);\n geom.setAttribute(\"position\", new THREE.BufferAttribute(positions, 3));\n return geom;\n }, [segmentCount]);\n\n useFrame((state) => {\n if (!lineRef.current || !enabled) return;\n const time = state.clock.getElapsedTime() * effectSpeed;\n const posAttr = lineRef.current.geometry.attributes.position as THREE.BufferAttribute;\n const positions = posAttr.array as Float32Array;\n\n const targetX = pointer.x * 6;\n const targetY = pointer.y * 3;\n\n for (let i = 0; i < segmentCount; i++) {\n const idx = i * 6;\n const angle = (i / segmentCount) * Math.PI * 2 + time * 1.5;\n const radius = 2.5 + Math.sin(time * 3 + i) * 0.5;\n\n const x1 = Math.cos(angle) * radius;\n const y1 = Math.sin(angle) * radius;\n const z1 = (Math.random() - 0.5) * 1.5;\n\n // Jitter electric arc towards pointer target\n const x2 = x1 + (targetX - x1) * 0.3 + (Math.random() - 0.5) * 0.8;\n const y2 = y1 + (targetY - y1) * 0.3 + (Math.random() - 0.5) * 0.8;\n const z2 = z1 + (Math.random() - 0.5) * 0.8;\n\n positions[idx] = x1;\n positions[idx + 1] = y1;\n positions[idx + 2] = z1;\n\n positions[idx + 3] = x2;\n positions[idx + 4] = y2;\n positions[idx + 5] = z2;\n }\n\n posAttr.needsUpdate = true;\n });\n\n if (!enabled) return null;\n\n return (\n <lineSegments ref={lineRef} geometry={geometry}>\n <lineBasicMaterial\n color={activeColor}\n transparent\n opacity={0.75}\n linewidth={2}\n toneMapped={false}\n />\n </lineSegments>\n );\n}\n","\"use client\";\n\nimport { useRef, useMemo, useEffect, useCallback } from \"react\";\nimport { useFrame, useThree } from \"@react-three/fiber\";\nimport * as THREE from \"three\";\nimport type { MaterialTheme } from \"./AnimatedLetter\";\n\ninterface FireFlamesProps {\n theme?: MaterialTheme;\n effectColor?: string;\n effectSpeed?: number;\n effectDensity?: number;\n mode?: \"fluid\" | \"crystal\" | \"all\";\n enabled?: boolean;\n}\n\nconst FLAME_PALETTES: Record<MaterialTheme, { color1: string; color2: string; light: string }> = {\n crimson: { color1: \"#ff3d00\", color2: \"#ff9100\", light: \"#ff1744\" },\n gold: { color1: \"#ffb300\", color2: \"#ffe082\", light: \"#FFD700\" },\n emerald: { color1: \"#00e676\", color2: \"#a7f3d0\", light: \"#10b981\" },\n neon: { color1: \"#00e5ff\", color2: \"#80d8ff\", light: \"#00ffff\" },\n obsidian: { color1: \"#d500f9\", color2: \"#ea80fc\", light: \"#a855f7\" },\n glass: { color1: \"#80d8ff\", color2: \"#ffffff\", light: \"#60a5fa\" },\n};\n\nconst SPANISH_COLOR_HEX: Record<string, string> = {\n azul: \"#00e5ff\",\n verde: \"#00e676\",\n rojo: \"#ff3d00\",\n dorado: \"#ffb300\",\n purpura: \"#d500f9\",\n magenta: \"#ff007f\",\n esmeralda: \"#10b981\",\n};\n\n/**\n * Creates an ultra-soft liquid energy flame sprite texture\n */\nfunction createLiquidEnergyTexture(): THREE.CanvasTexture {\n const canvas = document.createElement(\"canvas\");\n canvas.width = 128;\n canvas.height = 128;\n const ctx = canvas.getContext(\"2d\");\n\n if (ctx) {\n const gradient = ctx.createRadialGradient(64, 64, 0, 64, 64, 64);\n gradient.addColorStop(0, \"rgba(255, 255, 255, 1)\");\n gradient.addColorStop(0.3, \"rgba(255, 255, 255, 0.9)\");\n gradient.addColorStop(0.65, \"rgba(255, 255, 255, 0.35)\");\n gradient.addColorStop(1, \"rgba(0, 0, 0, 0)\");\n\n ctx.fillStyle = gradient;\n ctx.fillRect(0, 0, 128, 128);\n }\n\n const texture = new THREE.CanvasTexture(canvas);\n texture.needsUpdate = true;\n return texture;\n}\n\ninterface DragBurst {\n x: number;\n y: number;\n z: number;\n life: number;\n size: number;\n}\n\n/**\n * Dual-Engine Fire Flames Component:\n * Offers both Organic Liquid Energy Flame Clouds (mode=\"fluid\") and 3D Crystal Flame Geometries (mode=\"crystal\" or mode=\"all\")\n */\nexport default function FireFlames({\n theme = \"crimson\",\n effectColor,\n effectSpeed = 0.5,\n effectDensity = 0.3,\n mode = \"fluid\",\n enabled = true,\n}: FireFlamesProps) {\n const { pointer } = useThree();\n const fluidMeshRef = useRef<THREE.InstancedMesh>(null);\n const crystalMeshRef = useRef<THREE.InstancedMesh>(null);\n const lightRef = useRef<THREE.PointLight>(null);\n const dummy = useRef(new THREE.Object3D());\n const isPointerDown = useRef(false);\n const dragBursts = useRef<DragBurst[]>([]);\n\n const clampedDensity = Math.max(0.1, Math.min(1.0, effectDensity));\n const flameCount = Math.round(110 * clampedDensity);\n\n const texture = useMemo(() => createLiquidEnergyTexture(), []);\n\n // Determine active color\n const activeColor = useMemo(() => {\n if (!effectColor) {\n const p = FLAME_PALETTES[theme] || FLAME_PALETTES.crimson;\n return p.color1;\n }\n const lower = effectColor.toLowerCase().trim();\n if (SPANISH_COLOR_HEX[lower]) return SPANISH_COLOR_HEX[lower];\n return effectColor;\n }, [effectColor, theme]);\n\n // Particle data with organic convection physics\n const particles = useMemo(() => {\n const data = [];\n const sizeFactor = 0.4 + Math.sqrt(clampedDensity) * 0.55;\n for (let i = 0; i < flameCount; i++) {\n data.push({\n x: (Math.random() - 0.5) * 10,\n y: -2.0 + Math.random() * 0.4,\n z: (Math.random() - 0.5) * 2 - 0.5,\n speedY: 0.8 + Math.random() * 1.8,\n speedX: (Math.random() - 0.5) * 0.5,\n size: (0.4 + Math.random() * 0.6) * sizeFactor,\n phase: Math.random() * Math.PI * 2,\n life: Math.random(),\n });\n }\n return data;\n }, [flameCount, clampedDensity]);\n\n // Pointer drag event handlers\n const handlePointerDown = useCallback(() => {\n isPointerDown.current = true;\n }, []);\n\n const handlePointerUp = useCallback(() => {\n isPointerDown.current = false;\n }, []);\n\n useEffect(() => {\n window.addEventListener(\"pointerdown\", handlePointerDown);\n window.addEventListener(\"pointerup\", handlePointerUp);\n return () => {\n window.removeEventListener(\"pointerdown\", handlePointerDown);\n window.removeEventListener(\"pointerup\", handlePointerUp);\n };\n }, [handlePointerDown, handlePointerUp]);\n\n useFrame((state, delta) => {\n if (!enabled) return;\n const time = state.clock.getElapsedTime() * effectSpeed;\n\n // Pointer click/drag flame spawning\n if (isPointerDown.current) {\n const targetX = pointer.x * 7;\n const targetY = pointer.y * 4;\n if (dragBursts.current.length < 25) {\n dragBursts.current.push({\n x: targetX + (Math.random() - 0.5) * 0.8,\n y: targetY + (Math.random() - 0.5) * 0.8,\n z: (Math.random() - 0.5) * 1.5,\n life: 1.0,\n size: (0.5 + Math.random() * 0.6) * Math.sqrt(clampedDensity),\n });\n }\n }\n\n // Update drag bursts life\n dragBursts.current = dragBursts.current\n .map((b) => {\n b.life -= delta * 1.8 * effectSpeed;\n b.y += delta * 1.2 * effectSpeed;\n return b;\n })\n .filter((b) => b.life > 0);\n\n // Flickering dancing fire light\n if (lightRef.current) {\n lightRef.current.intensity = 2.2 + Math.sin(time * 10) * 0.6 + Math.cos(time * 15) * 0.3;\n lightRef.current.position.y = -1.0 + Math.sin(time * 3) * 0.2;\n }\n\n // 1. Render Organic Liquid Energy Flame Clouds (if mode is \"fluid\" or \"all\")\n if ((mode === \"fluid\" || mode === \"all\") && fluidMeshRef.current) {\n particles.forEach((p, i) => {\n p.life += delta * p.speedY * 0.35 * effectSpeed;\n if (p.life > 1) {\n p.life = 0;\n p.x = (Math.random() - 0.5) * 10;\n p.y = -2.0 + Math.random() * 0.4;\n }\n\n const progress = p.life;\n const currentY = p.y + progress * 3.8;\n const currentX = p.x + Math.sin(time * 2.5 + p.phase) * 0.5 + p.speedX * progress;\n const currentZ = p.z + Math.cos(time * 1.8 + p.phase) * 0.2;\n\n const scaleEnvelope = Math.sin(progress * Math.PI) * p.size * (1.2 - progress * 0.3);\n\n dummy.current.position.set(currentX, currentY, currentZ);\n dummy.current.rotation.set(0, 0, Math.sin(time * 1.5 + i) * 0.2);\n dummy.current.scale.set(scaleEnvelope, scaleEnvelope * 1.3, scaleEnvelope);\n dummy.current.updateMatrix();\n\n fluidMeshRef.current!.setMatrixAt(i, dummy.current.matrix);\n });\n\n // Drag bursts at top indices\n dragBursts.current.forEach((b, idx) => {\n const targetIdx = (flameCount - 1 - idx + flameCount) % flameCount;\n const scaleEnvelope = Math.sin(b.life * Math.PI) * b.size;\n\n dummy.current.position.set(b.x, b.y, b.z);\n dummy.current.rotation.set(0, 0, Math.sin(time * 3 + idx) * 0.3);\n dummy.current.scale.set(scaleEnvelope, scaleEnvelope * 1.4, scaleEnvelope);\n dummy.current.updateMatrix();\n\n fluidMeshRef.current!.setMatrixAt(targetIdx, dummy.current.matrix);\n });\n\n fluidMeshRef.current.instanceMatrix.needsUpdate = true;\n }\n\n // 2. Render 3D Crystal Flame Geometries (if mode is \"crystal\" or \"all\")\n if ((mode === \"crystal\" || mode === \"all\") && crystalMeshRef.current) {\n particles.forEach((p, i) => {\n const progress = p.life;\n const currentY = p.y + progress * 3.8;\n const currentX = p.x + Math.sin(time * 2.8 + p.phase) * 0.5 + p.speedX * progress;\n const currentZ = p.z + Math.cos(time * 2.0 + p.phase) * 0.3;\n\n const scaleEnvelope = Math.sin(progress * Math.PI) * p.size * 0.6;\n\n dummy.current.position.set(currentX, currentY, currentZ);\n dummy.current.rotation.set(time * 1.5 + i, time * 2, i);\n dummy.current.scale.set(scaleEnvelope, scaleEnvelope * 2.0, scaleEnvelope);\n dummy.current.updateMatrix();\n\n crystalMeshRef.current!.setMatrixAt(i, dummy.current.matrix);\n });\n\n crystalMeshRef.current.instanceMatrix.needsUpdate = true;\n }\n });\n\n if (!enabled) return null;\n\n return (\n <group>\n {/* Dancing Fire Point Light */}\n <pointLight\n ref={lightRef}\n position={[0, -1.0, 1.5]}\n color={activeColor}\n intensity={2.5}\n distance={10}\n />\n\n {/* 1. Organic Liquid Energy Flame Clouds (Additive Blending) */}\n {(mode === \"fluid\" || mode === \"all\") && (\n <instancedMesh ref={fluidMeshRef} args={[undefined, undefined, flameCount]}>\n <planeGeometry args={[1.2, 1.2]} />\n <meshBasicMaterial\n map={texture}\n color={activeColor}\n transparent\n blending={THREE.AdditiveBlending}\n depthWrite={false}\n side={THREE.DoubleSide}\n />\n </instancedMesh>\n )}\n\n {/* 2. 3D Crystal / Cone Flame Geometries */}\n {(mode === \"crystal\" || mode === \"all\") && (\n <instancedMesh ref={crystalMeshRef} args={[undefined, undefined, flameCount]}>\n <coneGeometry args={[0.3, 1.2, 5]} />\n <meshBasicMaterial\n color={activeColor}\n transparent\n opacity={0.65}\n blending={THREE.AdditiveBlending}\n depthWrite={false}\n />\n </instancedMesh>\n )}\n </group>\n );\n}\n","\"use client\";\n\nimport { useRef, useMemo, useEffect, useCallback } from \"react\";\nimport { useFrame, useThree } from \"@react-three/fiber\";\nimport * as THREE from \"three\";\nimport type { MaterialTheme } from \"./AnimatedLetter\";\n\ninterface PlasmaBlobsProps {\n theme?: MaterialTheme;\n effectColor?: string;\n effectSpeed?: number;\n effectDensity?: number;\n enabled?: boolean;\n}\n\nconst SPANISH_COLOR_HEX: Record<string, string> = {\n azul: \"#00e5ff\",\n verde: \"#00e676\",\n rojo: \"#ff3d00\",\n dorado: \"#ffb300\",\n purpura: \"#d500f9\",\n magenta: \"#ff007f\",\n esmeralda: \"#10b981\",\n};\n\n/**\n * Creates a soft bioluminescent energy blob texture\n */\nfunction createBlobTexture(): THREE.CanvasTexture {\n const canvas = document.createElement(\"canvas\");\n canvas.width = 256;\n canvas.height = 256;\n const ctx = canvas.getContext(\"2d\");\n\n if (ctx) {\n const gradient = ctx.createRadialGradient(128, 128, 0, 128, 128, 128);\n gradient.addColorStop(0, \"rgba(255, 255, 255, 1)\");\n gradient.addColorStop(0.2, \"rgba(0, 240, 200, 0.95)\");\n gradient.addColorStop(0.5, \"rgba(0, 200, 140, 0.6)\");\n gradient.addColorStop(0.8, \"rgba(0, 150, 100, 0.2)\");\n gradient.addColorStop(1, \"rgba(0, 0, 0, 0)\");\n\n ctx.fillStyle = gradient;\n ctx.fillRect(0, 0, 256, 256);\n }\n\n const texture = new THREE.CanvasTexture(canvas);\n texture.needsUpdate = true;\n return texture;\n}\n\ninterface DragBlob {\n x: number;\n y: number;\n z: number;\n life: number;\n size: number;\n}\n\n/**\n * Exact Bioluminescent Liquid Energy Blobs Effect (matching user screenshot)\n */\nexport default function PlasmaBlobs({\n theme = \"emerald\",\n effectColor = \"#00e676\",\n effectSpeed = 0.5,\n effectDensity = 0.5,\n enabled = true,\n}: PlasmaBlobsProps) {\n const { pointer } = useThree();\n const meshRef = useRef<THREE.InstancedMesh>(null);\n const lightRef = useRef<THREE.PointLight>(null);\n const dummy = useRef(new THREE.Object3D());\n const isPointerDown = useRef(false);\n const dragBlobs = useRef<DragBlob[]>([]);\n\n const clampedDensity = Math.max(0.1, Math.min(1.0, effectDensity));\n const blobCount = Math.round(60 * clampedDensity);\n\n const texture = useMemo(() => createBlobTexture(), []);\n\n const activeColor = useMemo(() => {\n if (!effectColor) return \"#00e676\";\n const lower = effectColor.toLowerCase().trim();\n if (SPANISH_COLOR_HEX[lower]) return SPANISH_COLOR_HEX[lower];\n return effectColor;\n }, [effectColor]);\n\n // Particle data for fluid energy blob clusters\n const particles = useMemo(() => {\n const data = [];\n const sizeFactor = 1.0 + Math.sqrt(clampedDensity) * 0.8;\n for (let i = 0; i < blobCount; i++) {\n data.push({\n x: (Math.random() - 0.5) * 12,\n y: (Math.random() - 0.5) * 6,\n z: (Math.random() - 0.5) * 3,\n speedY: (Math.random() - 0.5) * 0.8,\n speedX: (Math.random() - 0.5) * 0.8,\n size: (0.8 + Math.random() * 1.2) * sizeFactor,\n phase: Math.random() * Math.PI * 2,\n life: Math.random(),\n });\n }\n return data;\n }, [blobCount, clampedDensity]);\n\n const handlePointerDown = useCallback(() => {\n isPointerDown.current = true;\n }, []);\n\n const handlePointerUp = useCallback(() => {\n isPointerDown.current = false;\n }, []);\n\n useEffect(() => {\n window.addEventListener(\"pointerdown\", handlePointerDown);\n window.addEventListener(\"pointerup\", handlePointerUp);\n return () => {\n window.removeEventListener(\"pointerdown\", handlePointerDown);\n window.removeEventListener(\"pointerup\", handlePointerUp);\n };\n }, [handlePointerDown, handlePointerUp]);\n\n useFrame((state, delta) => {\n if (!meshRef.current || !enabled) return;\n const time = state.clock.getElapsedTime() * effectSpeed;\n\n if (isPointerDown.current) {\n const targetX = pointer.x * 7;\n const targetY = pointer.y * 4;\n if (dragBlobs.current.length < 15) {\n dragBlobs.current.push({\n x: targetX + (Math.random() - 0.5) * 0.5,\n y: targetY + (Math.random() - 0.5) * 0.5,\n z: (Math.random() - 0.5) * 1.0,\n life: 1.0,\n size: (1.2 + Math.random() * 0.8) * Math.sqrt(clampedDensity),\n });\n }\n }\n\n dragBlobs.current = dragBlobs.current\n .map((b) => {\n b.life -= delta * 1.2 * effectSpeed;\n return b;\n })\n .filter((b) => b.life > 0);\n\n if (lightRef.current) {\n lightRef.current.intensity = 2.5 + Math.sin(time * 6) * 0.5;\n }\n\n particles.forEach((p, i) => {\n const currentX = p.x + Math.sin(time * 1.2 + p.phase) * 1.5;\n const currentY = p.y + Math.cos(time * 0.9 + p.phase * 1.3) * 1.2;\n const currentZ = p.z + Math.sin(time * 0.7 + p.phase * 0.8) * 0.8;\n\n const scalePulse = p.size * (1.0 + Math.sin(time * 2.0 + i) * 0.25);\n\n dummy.current.position.set(currentX, currentY, currentZ);\n dummy.current.scale.set(scalePulse, scalePulse, scalePulse);\n dummy.current.updateMatrix();\n\n meshRef.current!.setMatrixAt(i, dummy.current.matrix);\n });\n\n dragBlobs.current.forEach((b, idx) => {\n const targetIdx = (blobCount - 1 - idx + blobCount) % blobCount;\n const scaleEnvelope = Math.sin(b.life * Math.PI) * b.size;\n\n dummy.current.position.set(b.x, b.y, b.z);\n dummy.current.scale.set(scaleEnvelope, scaleEnvelope, scaleEnvelope);\n dummy.current.updateMatrix();\n\n meshRef.current!.setMatrixAt(targetIdx, dummy.current.matrix);\n });\n\n meshRef.current.instanceMatrix.needsUpdate = true;\n });\n\n if (!enabled) return null;\n\n return (\n <group>\n <pointLight\n ref={lightRef}\n position={[0, 0, 2]}\n color={activeColor}\n intensity={3}\n distance={12}\n />\n\n <instancedMesh ref={meshRef} args={[undefined, undefined, blobCount]}>\n <planeGeometry args={[1.8, 1.8]} />\n <meshBasicMaterial\n map={texture}\n color={activeColor}\n transparent\n opacity={0.85}\n blending={THREE.NormalBlending}\n depthWrite={false}\n side={THREE.DoubleSide}\n />\n </instancedMesh>\n </group>\n );\n}\n","\"use client\";\n\nimport { useState } from \"react\";\nimport { useSafeTranslations } from \"@/lib/i18n-safe\";\nimport LocaleSwitcher from \"./LocaleSwitcher\";\nimport { Button } from \"./ui/button\";\n\nexport default function CinemaHome({ \n cinemaName = \"NOVA\",\n webTheme = \"neon\" \n}: { \n cinemaName?: string, \n webTheme?: string \n}) {\n const t = useSafeTranslations();\n const [mobileMenuOpen, setMobileMenuOpen] = useState(false);\n\n // Define overlay gradients based on theme\n const themeOverlay = \n webTheme === \"noir\" ? \"bg-slate-900/40 mix-blend-color\" :\n webTheme === \"crimson\" ? \"bg-red-900/30 mix-blend-color\" :\n \"bg-blue-900/20 mix-blend-color\"; // default neon\n\n return (\n <div className={`min-h-screen bg-black text-white selection:bg-white/30 font-sans transition-colors duration-1000 group theme-${webTheme}`}>\n {/* Navbar */}\n <nav className=\"absolute top-0 left-0 right-0 z-50 flex items-center justify-between px-4 sm:px-8 py-4 sm:py-6 bg-black/40 sm:bg-transparent backdrop-blur-md sm:backdrop-blur-none border-b border-white/10 sm:border-none\">\n <div className=\"flex items-center gap-6 lg:gap-12\">\n <a href=\"#\" className=\"text-2xl sm:text-3xl font-bold tracking-tighter uppercase font-display text-white\">\n {cinemaName}.\n </a>\n <div className=\"hidden md:flex items-center gap-6 lg:gap-8 text-sm font-semibold tracking-widest text-white/70\">\n <a href=\"#schedule\" className=\"hover:text-white transition-colors\">{t(\"nav.schedule\")}</a>\n <a href=\"#experiences\" className=\"hover:text-white transition-colors\">{t(\"nav.experiences\")}</a>\n <a href=\"#membership\" className=\"hover:text-white transition-colors\">{t(\"nav.membership\")}</a>\n </div>\n </div>\n\n <div className=\"flex items-center gap-3 sm:gap-6\">\n <LocaleSwitcher />\n <div className=\"hidden sm:flex items-center gap-4\">\n <a href=\"#login\" className=\"text-sm font-semibold tracking-widest text-white/70 hover:text-white transition-colors\">\n {t(\"nav.login\")}\n </a>\n <Button variant=\"outline\" className=\"rounded-none border-white/40 text-white bg-transparent hover:bg-white hover:text-black transition-colors font-semibold tracking-widest text-xs px-6 py-5 uppercase\">\n {t(\"nav.bookTickets\")}\n </Button>\n </div>\n\n {/* Mobile Hamburger Menu Toggle Button */}\n <button\n onClick={() => setMobileMenuOpen(!mobileMenuOpen)}\n className=\"md:hidden p-2 rounded-lg bg-white/10 hover:bg-white/20 text-white text-lg focus:outline-none transition-colors cursor-pointer\"\n aria-label=\"Toggle Navigation Menu\"\n >\n {mobileMenuOpen ? \"✕\" : \"☰\"}\n </button>\n </div>\n </nav>\n\n {/* Mobile Drawer Overlay */}\n {mobileMenuOpen && (\n <div className=\"fixed inset-0 z-40 bg-black/95 backdrop-blur-2xl md:hidden flex flex-col justify-between p-8 pt-24 animate-fade-in\">\n <div className=\"flex flex-col gap-6 text-xl font-bold tracking-wider uppercase font-display\">\n <a\n href=\"#schedule\"\n onClick={() => setMobileMenuOpen(false)}\n className=\"py-2 border-b border-white/10 hover:text-amber-400 transition-colors\"\n >\n {t(\"nav.schedule\")}\n </a>\n <a\n href=\"#experiences\"\n onClick={() => setMobileMenuOpen(false)}\n className=\"py-2 border-b border-white/10 hover:text-amber-400 transition-colors\"\n >\n {t(\"nav.experiences\")}\n </a>\n <a\n href=\"#membership\"\n onClick={() => setMobileMenuOpen(false)}\n className=\"py-2 border-b border-white/10 hover:text-amber-400 transition-colors\"\n >\n {t(\"nav.membership\")}\n </a>\n <a\n href=\"#login\"\n onClick={() => setMobileMenuOpen(false)}\n className=\"py-2 border-b border-white/10 text-white/70 hover:text-white transition-colors\"\n >\n {t(\"nav.login\")}\n </a>\n </div>\n\n <div className=\"flex flex-col gap-3 pt-6 border-t border-white/10\">\n <Button\n onClick={() => setMobileMenuOpen(false)}\n className=\"w-full rounded-none bg-amber-400 text-black hover:bg-amber-300 font-extrabold tracking-widest text-sm py-4 uppercase\"\n >\n {t(\"nav.bookTickets\")}\n </Button>\n </div>\n </div>\n )}\n\n {/* Hero Section */}\n <div className=\"relative h-screen w-full flex flex-col justify-end pb-28 sm:pb-24 px-4 sm:px-8 md:px-16 overflow-hidden\">\n {/* Background Video/Image simulation */}\n <div className=\"absolute inset-0 z-0\">\n <div className=\"absolute inset-0 bg-[url('https://images.unsplash.com/photo-1605810230434-7631ac76ec81?q=80&w=2560&auto=format&fit=crop')] bg-cover bg-center\" />\n {/* Dual-Tone Overlay via CSS variables */}\n <div className=\"absolute inset-0 bg-gradient-to-t from-black via-black/50 to-transparent z-10\" />\n <div className={`absolute inset-0 ${themeOverlay} z-10`} />\n </div>\n\n <div className=\"relative z-20 max-w-5xl\">\n <div className=\"flex items-center gap-2 sm:gap-3 mb-4 sm:mb-6 flex-wrap\">\n <span className=\"bg-blue-600 text-white text-[9px] sm:text-[10px] font-bold px-2.5 sm:px-3 py-1 tracking-widest\">\n {t(\"hero.genreImax\")}\n </span>\n <span className=\"border border-white/20 text-white/80 text-[9px] sm:text-[10px] font-bold px-2.5 sm:px-3 py-1 tracking-widest\">\n {t(\"hero.genreAction\")}\n </span>\n </div>\n \n <h1 className=\"text-4xl sm:text-6xl md:text-7xl lg:text-[8rem] leading-[0.9] sm:leading-[0.85] font-display font-black tracking-tighter mb-4 sm:mb-6 uppercase drop-shadow-2xl\">\n {t(\"hero.title\")}\n </h1>\n \n <p className=\"max-w-2xl text-sm sm:text-lg md:text-xl text-white/70 font-medium mb-6 sm:mb-10 leading-relaxed drop-shadow-md line-clamp-3 sm:line-clamp-none\">\n {t(\"hero.synopsis\")}\n </p>\n\n <div className=\"flex flex-col sm:flex-row items-stretch sm:items-center gap-3 sm:gap-4 w-full sm:w-auto\">\n <Button className=\"rounded-none bg-white text-black hover:bg-white/90 font-bold tracking-widest text-xs px-6 sm:px-8 py-5 sm:py-6 uppercase transition-transform hover:scale-105 active:scale-95 w-full sm:w-auto\">\n {t(\"hero.getTickets\")}\n </Button>\n <Button variant=\"outline\" className=\"rounded-none border-white/30 text-white bg-black/20 backdrop-blur-md hover:bg-white/10 transition-colors font-bold tracking-widest text-xs px-6 sm:px-8 py-5 sm:py-6 uppercase w-full sm:w-auto\">\n {t(\"hero.watchTrailer\")}\n </Button>\n </div>\n </div>\n </div>\n </div>\n );\n}\n\n","import { useTranslations } from \"next-intl\";\n\nconst DEFAULT_MESSAGES: Record<string, string> = {\n \"nav.schedule\": \"Schedule\",\n \"nav.experiences\": \"Experiences\",\n \"nav.membership\": \"Membership\",\n \"nav.login\": \"Log In\",\n \"nav.bookTickets\": \"Book Tickets\",\n \"hero.genreImax\": \"IMAX 3D\",\n \"hero.genreAction\": \"ACTION / SCI-FI\",\n \"hero.title\": \"AVATAR: THE WAY OF WATER\",\n \"hero.synopsis\":\n \"Set more than a decade after the events of the first film, learn the story of the Sully family, the trouble that follows them, the lengths they go to keep each other safe, the battles they fight to stay alive, and the tragedies they endure.\",\n \"hero.getTickets\": \"GET TICKETS\",\n \"hero.watchTrailer\": \"WATCH TRAILER\",\n};\n\n/**\n * Safe translation hook that gracefully handles missing next-intl context\n * without throwing errors in standard Next.js / React applications.\n */\nexport function useSafeTranslations() {\n try {\n const t = useTranslations();\n return (key: string): string => {\n try {\n const val = t(key);\n return val || DEFAULT_MESSAGES[key] || key;\n } catch {\n return DEFAULT_MESSAGES[key] || key;\n }\n };\n } catch {\n return (key: string): string => DEFAULT_MESSAGES[key] || key;\n }\n}\n","\"use client\";\n\nimport { useState } from \"react\";\nimport { useLocale } from \"next-intl\";\nimport { Globe } from \"lucide-react\";\n\nexport default function LocaleSwitcher() {\n let activeLocale = \"en\";\n try {\n // eslint-disable-next-line react-hooks/rules-of-hooks\n const locale = useLocale();\n if (locale) activeLocale = locale;\n } catch {\n // Fallback when outside next-intl context\n }\n\n const [currentLocale, setCurrentLocale] = useState(activeLocale);\n\n const toggleLocale = () => {\n const nextLocale = currentLocale === \"en\" ? \"es\" : \"en\";\n setCurrentLocale(nextLocale);\n };\n\n return (\n <button\n onClick={toggleLocale}\n className=\"flex items-center gap-2 text-sm font-medium text-white/70 hover:text-white transition-colors uppercase tracking-wider cursor-pointer\"\n >\n <Globe className=\"w-4 h-4\" />\n {currentLocale === \"en\" ? \"ES\" : \"EN\"}\n </button>\n );\n}\n\n","import * as React from \"react\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\nimport { cn } from \"@/lib/utils\";\n\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium cursor-pointer transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 disabled:cursor-not-allowed [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0\",\n {\n variants: {\n variant: {\n default: \"bg-primary text-primary-foreground shadow hover:bg-primary/90\",\n destructive: \"bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90\",\n outline:\n \"border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground\",\n secondary: \"bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80\",\n ghost: \"hover:bg-accent hover:text-accent-foreground\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default: \"h-9 px-4 py-2\",\n sm: \"h-8 rounded-md px-3 text-xs\",\n lg: \"h-10 rounded-md px-8\",\n icon: \"h-9 w-9\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n },\n);\n\nexport interface ButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof buttonVariants> {\n asChild?: boolean;\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant, size, asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : \"button\";\n return (\n <Comp className={cn(buttonVariants({ variant, size, className }))} ref={ref} {...props} />\n );\n },\n);\nButton.displayName = \"Button\";\n\nexport { Button, buttonVariants };\n","import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","\"use client\";\n\nimport { Suspense, useMemo, useState, useEffect } from \"react\";\nimport { Canvas } from \"@react-three/fiber\";\nimport { Environment, Center } from \"@react-three/drei\";\nimport { EffectComposer, Bloom, Vignette, Noise } from \"@react-three/postprocessing\";\nimport AnimatedLetter, { type MaterialTheme } from \"./3d/AnimatedLetter\";\nimport SceneParticles from \"./3d/SceneParticles\";\nimport CameraRig from \"./3d/CameraRig\";\nimport ClickFireSparks from \"./3d/ClickFireSparks\";\nimport ClickShockwave from \"./3d/ClickShockwave\";\nimport ElectricPlasma from \"./3d/ElectricPlasma\";\n\nexport interface CinemaBackgroundProps {\n /** 3D Text rendered in world space */\n text?: string;\n /** Active material & lighting theme */\n theme?: MaterialTheme;\n /** Custom CSS gradient or solid color */\n customBackground?: string;\n /** Enable/disable 3D fire sparks on click */\n interactiveSparks?: boolean;\n /** Enable/disable 3D shockwave rings on click */\n interactiveShockwave?: boolean;\n /** Enable/disable electric plasma arcs */\n interactivePlasma?: boolean;\n /** Enable/disable ambient floating particle embers */\n showParticles?: boolean;\n /** Enable bloom glow effect */\n enableBloom?: boolean;\n /** Optional container CSS class name */\n className?: string;\n /** Optional inline container styles */\n style?: React.CSSProperties;\n /** Children React nodes rendered on top of the 3D canvas */\n children?: React.ReactNode;\n}\n\nconst THEME_BACKGROUNDS: Record<MaterialTheme, string> = {\n gold: \"radial-gradient(circle at center, #1c1503 0%, #080601 60%, #020201 100%)\",\n neon: \"radial-gradient(circle at center, #021a1e 0%, #030d14 60%, #010408 100%)\",\n emerald: \"radial-gradient(circle at center, #032117 0%, #02120d 60%, #010705 100%)\",\n crimson: \"radial-gradient(circle at center, #240409 0%, #120205 60%, #060102 100%)\",\n obsidian: \"radial-gradient(circle at center, #120d24 0%, #080512 60%, #030206 100%)\",\n glass: \"radial-gradient(circle at center, #0f172a 0%, #070b14 60%, #020205 100%)\",\n};\n\nconst FONT_URL = \"https://threejs.org/examples/fonts/helvetiker_bold.typeface.json\";\n\nfunction computeLetterPositions(text: string): [number, number, number][] {\n const letterWidth = 0.65;\n const totalWidth = text.length * letterWidth;\n const startX = -totalWidth / 2;\n\n return text.split(\"\").map((_, i) => [startX + i * letterWidth, 0, 0]);\n}\n\n/**\n * Highly customizable 3D Cinema WebGL Background Component.\n * Fits dynamically into any HTML parent container (div, header, section, card).\n */\nexport default function CinemaBackground({\n text = \"CINEMA\",\n theme = \"emerald\",\n customBackground,\n interactiveSparks = true,\n interactiveShockwave = true,\n interactivePlasma = true,\n showParticles = true,\n enableBloom = true,\n className = \"\",\n style,\n children,\n}: CinemaBackgroundProps) {\n const [isMounted, setIsMounted] = useState(false);\n const [currentText] = useState(text);\n const [currentTheme] = useState(theme);\n\n useEffect(() => {\n setIsMounted(true);\n }, []);\n\n // Sync if controlled props change\n const activeText = (currentText || text || \"CINEMA\").toUpperCase();\n const letters = activeText.split(\"\");\n const positions = useMemo(() => computeLetterPositions(activeText), [activeText]);\n\n const activeTheme = currentTheme || theme || \"emerald\";\n const currentBg = customBackground || THEME_BACKGROUNDS[activeTheme] || THEME_BACKGROUNDS.emerald;\n\n if (!isMounted) {\n return (\n <div\n className={`relative w-full h-full min-h-[350px] overflow-hidden select-none bg-black ${className}`}\n style={{ background: currentBg, ...style }}\n >\n {children && (\n <div className=\"relative z-10 w-full h-full pointer-events-none flex flex-col items-center justify-center\">\n {children}\n </div>\n )}\n </div>\n );\n }\n\n return (\n <div\n className={`relative w-full h-full min-h-[350px] overflow-hidden select-none ${className}`}\n style={{ background: currentBg, ...style }}\n >\n {/* 3D Canvas Layer */}\n <div className=\"absolute inset-0 z-0 pointer-events-auto\">\n <Canvas\n camera={{ position: [0, 0, 14], fov: 45, near: 0.1, far: 50 }}\n dpr={[1, 2]}\n gl={{\n antialias: true,\n toneMapping: 4,\n toneMappingExposure: 1.2,\n }}\n >\n <Suspense fallback={null}>\n <Environment preset=\"studio\" />\n <ambientLight intensity={0.3} />\n <directionalLight position={[5, 8, 5]} intensity={1.5} color=\"#ffffff\" />\n <pointLight\n position={[-5, -3, -5]}\n intensity={0.6}\n color={\n activeTheme === \"emerald\"\n ? \"#10b981\"\n : activeTheme === \"crimson\"\n ? \"#ff1744\"\n : activeTheme === \"neon\"\n ? \"#00ffff\"\n : \"#FFD700\"\n }\n />\n\n <CameraRig phase=\"idle\" />\n\n {/* Interactive 3D Effects */}\n <ClickFireSparks enabled={interactiveSparks} theme={activeTheme} />\n <ClickShockwave enabled={interactiveShockwave} theme={activeTheme} />\n <ElectricPlasma enabled={interactivePlasma} theme={activeTheme} />\n\n {/* 3D Typography */}\n <Center disableY disableZ>\n <group>\n {letters.map((char, i) => (\n <AnimatedLetter\n key={`${char}-${i}`}\n char={char}\n index={i}\n totalLetters={letters.length}\n position={positions[i]}\n phase=\"idle\"\n theme={activeTheme}\n fontUrl={FONT_URL}\n />\n ))}\n </group>\n </Center>\n\n {/* Floating Ambient Particles */}\n {showParticles && <SceneParticles theme={activeTheme} visible={true} />}\n\n {/* Post-Processing */}\n <EffectComposer>\n <Bloom\n luminanceThreshold={0.7}\n luminanceSmoothing={0.9}\n intensity={enableBloom ? 0.9 : 0}\n mipmapBlur\n />\n <Vignette offset={0.3} darkness={0.85} />\n <Noise opacity={0.025} />\n </EffectComposer>\n </Suspense>\n </Canvas>\n </div>\n\n {/* Children overlay */}\n {children && (\n <div className=\"relative z-10 w-full h-full pointer-events-none flex flex-col items-center justify-center\">\n {children}\n </div>\n )}\n </div>\n );\n}\n\n","\"use client\";\n\nimport React from \"react\";\nimport CinemaBackground, { type CinemaBackgroundProps } from \"../CinemaBackground\";\n\nexport type WithCinema3DOptions = Omit<CinemaBackgroundProps, \"children\">;\n\n/**\n * Higher-Order Component (HOC) that wraps any React component with the 3D WebGL Cinema background.\n *\n * @example\n * const HeroWith3D = withCinema3D(MyHeroComponent, {\n * text: \"UNITED OF WEB\",\n * theme: \"emerald\",\n * interactiveSparks: true,\n * interactiveShockwave: true,\n * });\n */\nexport function withCinema3D<P extends object>(\n WrappedComponent: React.ComponentType<P>,\n hocOptions: WithCinema3DOptions = {}\n) {\n const ComponentWithCinema3D = (props: P) => {\n return (\n <CinemaBackground {...hocOptions}>\n <WrappedComponent {...props} />\n </CinemaBackground>\n );\n };\n\n ComponentWithCinema3D.displayName = `WithCinema3D(${\n WrappedComponent.displayName || WrappedComponent.name || \"Component\"\n })`;\n\n return ComponentWithCinema3D;\n}\n\nexport default withCinema3D;\n","\"use client\";\n\nimport { Suspense, useState, useEffect, useCallback, useMemo } from \"react\";\nimport { Canvas } from \"@react-three/fiber\";\nimport { Environment, Center } from \"@react-three/drei\";\nimport {\n EffectComposer,\n Bloom,\n Vignette,\n Noise,\n} from \"@react-three/postprocessing\";\nimport AnimatedLetter, { type MaterialTheme } from \"./AnimatedLetter\";\nimport SceneParticles from \"./SceneParticles\";\nimport CameraRig from \"./CameraRig\";\nimport LoaderOverlay, { type EffectState } from \"./LoaderOverlay\";\nimport ClickFireSparks from \"./ClickFireSparks\";\nimport ClickShockwave from \"./ClickShockwave\";\nimport ElectricPlasma from \"./ElectricPlasma\";\n\ninterface CinemaLoaderProps {\n cinemaName?: string;\n defaultTheme?: MaterialTheme;\n customBackground?: string;\n onEnterCinema?: () => void;\n}\n\ntype AnimationPhase = \"loading\" | \"entering\" | \"idle\" | \"exiting\";\n\nconst FONT_URL = \"https://threejs.org/examples/fonts/helvetiker_bold.typeface.json\";\n\nconst THEME_BACKGROUNDS: Record<MaterialTheme, string> = {\n gold: \"radial-gradient(circle at center, #1c1503 0%, #080601 60%, #020201 100%)\",\n neon: \"radial-gradient(circle at center, #021a1e 0%, #030d14 60%, #010408 100%)\",\n emerald: \"radial-gradient(circle at center, #032117 0%, #02120d 60%, #010705 100%)\",\n crimson: \"radial-gradient(circle at center, #240409 0%, #120205 60%, #060102 100%)\",\n obsidian: \"radial-gradient(circle at center, #120d24 0%, #080512 60%, #030206 100%)\",\n glass: \"radial-gradient(circle at center, #0f172a 0%, #070b14 60%, #020205 100%)\",\n};\n\n/**\n * Calculate letter positions to center the word horizontally\n */\nfunction computeLetterPositions(text: string): [number, number, number][] {\n const letterWidth = 0.65;\n const totalWidth = text.length * letterWidth;\n const startX = -totalWidth / 2;\n\n return text.split(\"\").map((_, i) => [\n startX + i * letterWidth,\n 0,\n 0,\n ]);\n}\n\nexport default function CinemaLoader({\n cinemaName = \"CINEMULTIPLEX\",\n defaultTheme = \"emerald\",\n customBackground,\n onEnterCinema,\n}: CinemaLoaderProps) {\n const [isMounted, setIsMounted] = useState(false);\n const [phase, setPhase] = useState<AnimationPhase>(\"loading\");\n const [theme, setTheme] = useState<MaterialTheme>(defaultTheme);\n const [titleText, setTitleText] = useState<string>(cinemaName);\n const [effects, setEffects] = useState<EffectState>({\n sparks: true,\n shockwave: true,\n plasma: true,\n embers: true,\n });\n\n useEffect(() => {\n setIsMounted(true);\n }, []);\n\n const displayName = (titleText || \"CINEMA\").toUpperCase();\n const letters = displayName.split(\"\");\n const positions = useMemo(\n () => computeLetterPositions(displayName),\n [displayName]\n );\n\n // Animation timeline\n useEffect(() => {\n const t1 = setTimeout(() => setPhase(\"entering\"), 800);\n const totalLetterTime = letters.length * 120 + 1500;\n const t2 = setTimeout(() => setPhase(\"idle\"), 800 + totalLetterTime);\n\n return () => {\n clearTimeout(t1);\n clearTimeout(t2);\n };\n }, [letters.length]);\n\n const toggleEffect = useCallback((effectName: keyof EffectState) => {\n setEffects((prev) => ({\n ...prev,\n [effectName]: !prev[effectName],\n }));\n }, []);\n\n const currentBg = customBackground || THEME_BACKGROUNDS[theme] || THEME_BACKGROUNDS.emerald;\n\n if (!isMounted) {\n return (\n <div\n className=\"fixed inset-0 w-screen h-screen transition-all duration-1000 select-none overflow-hidden bg-black flex items-center justify-center\"\n style={{ background: currentBg }}\n >\n <div className=\"w-16 h-16 rounded-full border-2 animate-spin border-t-amber-400 border-r-amber-400/30 border-b-transparent border-l-transparent\" />\n </div>\n );\n }\n\n return (\n <div\n className=\"fixed inset-0 w-screen h-screen transition-all duration-1000 select-none overflow-hidden\"\n style={{ background: currentBg }}\n >\n {/* 3D Canvas */}\n <Canvas\n camera={{ position: [0, 0, 14], fov: 45, near: 0.1, far: 50 }}\n dpr={[1, 2]}\n gl={{\n antialias: true,\n toneMapping: 4, // ACESFilmicToneMapping\n toneMappingExposure: 1.2,\n }}\n >\n <Suspense fallback={null}>\n {/* HDRI Environment for metallic reflections */}\n <Environment preset=\"studio\" />\n\n {/* Lighting */}\n <ambientLight intensity={0.3} />\n <directionalLight\n position={[5, 8, 5]}\n intensity={1.5}\n color=\"#ffffff\"\n />\n <pointLight\n position={[-5, -3, -5]}\n intensity={0.6}\n color={\n theme === \"emerald\"\n ? \"#10b981\"\n : theme === \"crimson\"\n ? \"#ff1744\"\n : theme === \"neon\"\n ? \"#00ffff\"\n : \"#FFD700\"\n }\n />\n <spotLight\n position={[0, 10, 0]}\n angle={0.4}\n penumbra={0.8}\n intensity={0.9}\n color=\"#ffffff\"\n />\n <pointLight position={[0, 0, -5]} intensity={0.4} color=\"#ffffff\" />\n\n {/* Camera animation */}\n <CameraRig phase={phase} />\n\n {/* 3D Visual Effects */}\n {effects.sparks && <ClickFireSparks theme={theme} />}\n <ClickShockwave theme={theme} enabled={effects.shockwave} />\n <ElectricPlasma theme={theme} enabled={effects.plasma} />\n\n {/* Animated 3D Letters */}\n <Center disableY disableZ>\n <group>\n {letters.map((char, i) => (\n <AnimatedLetter\n key={`${char}-${i}`}\n char={char}\n index={i}\n totalLetters={letters.length}\n position={positions[i]}\n phase={phase}\n theme={theme}\n fontUrl={FONT_URL}\n />\n ))}\n </group>\n </Center>\n\n {/* Floating particle embers */}\n <SceneParticles\n theme={theme}\n visible={phase !== \"loading\" && effects.embers}\n />\n\n {/* Post-processing pipeline */}\n <EffectComposer>\n <Bloom\n luminanceThreshold={0.7}\n luminanceSmoothing={0.9}\n intensity={theme === \"neon\" || theme === \"emerald\" || theme === \"crimson\" ? 1.4 : 0.7}\n mipmapBlur\n />\n <Vignette offset={0.3} darkness={0.85} />\n <Noise opacity={0.025} />\n </EffectComposer>\n </Suspense>\n </Canvas>\n\n {/* HTML overlay controls */}\n <LoaderOverlay\n phase={phase}\n cinemaName={titleText}\n theme={theme}\n effects={effects}\n onTitleChange={setTitleText}\n onThemeChange={setTheme}\n onToggleEffect={toggleEffect}\n />\n </div>\n );\n}\n\n","\"use client\";\n\nimport type { MaterialTheme } from \"./AnimatedLetter\";\n\nexport interface EffectState {\n sparks: boolean;\n shockwave: boolean;\n plasma: boolean;\n embers: boolean;\n}\n\ninterface LoaderOverlayProps {\n phase: \"loading\" | \"entering\" | \"idle\" | \"exiting\";\n cinemaName: string;\n theme: MaterialTheme;\n effects: EffectState;\n onTitleChange: (newTitle: string) => void;\n onThemeChange: (theme: MaterialTheme) => void;\n onToggleEffect: (effectName: keyof EffectState) => void;\n}\n\nconst THEME_OPTIONS: { key: MaterialTheme; label: string; color: string }[] = [\n { key: \"gold\", label: \"Gold\", color: \"#FFD700\" },\n { key: \"neon\", label: \"Neon\", color: \"#00ffff\" },\n { key: \"emerald\", label: \"Emerald\", color: \"#10b981\" },\n { key: \"crimson\", label: \"Crimson\", color: \"#ff1744\" },\n { key: \"obsidian\", label: \"Obsidian\", color: \"#a855f7\" },\n { key: \"glass\", label: \"Glass\", color: \"#ffffff\" },\n];\n\nexport default function LoaderOverlay({\n phase,\n cinemaName,\n theme,\n effects,\n onTitleChange,\n onThemeChange,\n onToggleEffect,\n}: LoaderOverlayProps) {\n const showLoading = phase === \"loading\";\n const isExiting = phase === \"exiting\";\n\n return (\n <div\n className=\"absolute inset-0 pointer-events-none z-10 flex flex-col items-center justify-between p-6 md:p-10\"\n style={{ opacity: isExiting ? 0 : 1, transition: \"opacity 0.8s ease-out\" }}\n >\n {/* Top Bar: Title Input */}\n <div\n className=\"w-full max-w-xl flex flex-col items-center gap-2 pointer-events-auto\"\n style={{\n opacity: phase === \"idle\" || phase === \"entering\" ? 1 : 0,\n transform:\n phase === \"idle\" || phase === \"entering\"\n ? \"translateY(0)\"\n : \"translateY(-20px)\",\n transition: \"all 1s ease-out 0.3s\",\n }}\n >\n <label className=\"text-[10px] tracking-[0.3em] uppercase text-white/50 font-bold\">\n Live 3D Title Control\n </label>\n <div className=\"relative w-full\">\n <input\n type=\"text\"\n value={cinemaName}\n onChange={(e) => onTitleChange(e.target.value)}\n maxLength={18}\n placeholder=\"Type any title...\"\n className=\"w-full px-6 py-3 rounded-full text-center text-sm md:text-base font-bold tracking-widest uppercase outline-none transition-all duration-300\"\n style={{\n background: \"rgba(255, 255, 255, 0.08)\",\n backdropFilter: \"blur(16px)\",\n border: \"1px solid rgba(255, 255, 255, 0.2)\",\n color: \"#ffffff\",\n boxShadow: \"0 8px 32px rgba(0, 0, 0, 0.37)\",\n }}\n />\n </div>\n </div>\n\n {/* Center loading spinner */}\n {showLoading && (\n <div className=\"absolute inset-0 flex items-center justify-center\">\n <div\n className=\"w-16 h-16 rounded-full border-2 animate-spin\"\n style={{\n borderColor: \"transparent\",\n borderTopColor: \"rgba(255, 215, 0, 0.8)\",\n borderRightColor: \"rgba(255, 215, 0, 0.3)\",\n }}\n />\n </div>\n )}\n\n {/* Bottom Section: FX Toggles + Theme Selector */}\n <div className=\"w-full max-w-3xl flex flex-col items-center gap-5\">\n {/* FX Toggles Bar */}\n <div\n className=\"flex flex-wrap items-center justify-center gap-2 pointer-events-auto\"\n style={{\n opacity: phase === \"idle\" || phase === \"entering\" ? 1 : 0,\n transition: \"opacity 1s ease-out 0.8s\",\n }}\n >\n <span className=\"text-[9px] uppercase tracking-[0.25em] text-white/40 mr-2 font-bold\">\n Effects\n </span>\n\n {/* Sparks Toggle */}\n <button\n onClick={() => onToggleEffect(\"sparks\")}\n className={`px-4 py-1.5 rounded-full text-[11px] font-bold tracking-wider uppercase transition-all duration-300 cursor-pointer ${\n effects.sparks\n ? \"bg-amber-500/30 text-amber-200 border-amber-400/60 shadow-[0_0_15px_rgba(245,158,11,0.4)]\"\n : \"bg-white/5 text-white/40 border-white/10 hover:text-white/70\"\n } border`}\n >\n 🔥 Sparks\n </button>\n\n {/* Shockwave Toggle */}\n <button\n onClick={() => onToggleEffect(\"shockwave\")}\n className={`px-4 py-1.5 rounded-full text-[11px] font-bold tracking-wider uppercase transition-all duration-300 cursor-pointer ${\n effects.shockwave\n ? \"bg-cyan-500/30 text-cyan-200 border-cyan-400/60 shadow-[0_0_15px_rgba(6,182,212,0.4)]\"\n : \"bg-white/5 text-white/40 border-white/10 hover:text-white/70\"\n } border`}\n >\n 🌊 Wave\n </button>\n\n {/* Plasma Toggle */}\n <button\n onClick={() => onToggleEffect(\"plasma\")}\n className={`px-4 py-1.5 rounded-full text-[11px] font-bold tracking-wider uppercase transition-all duration-300 cursor-pointer ${\n effects.plasma\n ? \"bg-purple-500/30 text-purple-200 border-purple-400/60 shadow-[0_0_15px_rgba(168,85,247,0.4)]\"\n : \"bg-white/5 text-white/40 border-white/10 hover:text-white/70\"\n } border`}\n >\n ⚡ Plasma\n </button>\n\n {/* Embers Toggle */}\n <button\n onClick={() => onToggleEffect(\"embers\")}\n className={`px-4 py-1.5 rounded-full text-[11px] font-bold tracking-wider uppercase transition-all duration-300 cursor-pointer ${\n effects.embers\n ? \"bg-emerald-500/30 text-emerald-200 border-emerald-400/60 shadow-[0_0_15px_rgba(16,185,129,0.4)]\"\n : \"bg-white/5 text-white/40 border-white/10 hover:text-white/70\"\n } border`}\n >\n ✨ Embers\n </button>\n </div>\n\n {/* Theme selector */}\n <div\n className=\"flex items-center gap-3 pointer-events-auto\"\n style={{\n opacity: phase === \"idle\" || phase === \"entering\" ? 1 : 0,\n transition: \"opacity 1s ease-out 1.2s\",\n }}\n >\n <span className=\"text-[10px] uppercase tracking-[0.3em] text-white/40 mr-2 font-bold\">\n Theme\n </span>\n <div className=\"flex items-center gap-2 md:gap-3\">\n {THEME_OPTIONS.map((opt) => {\n const isActive = theme === opt.key;\n return (\n <button\n key={opt.key}\n onClick={() => onThemeChange(opt.key)}\n className=\"group relative flex flex-col items-center gap-1.5 cursor-pointer outline-none\"\n aria-label={`Switch to ${opt.label} theme`}\n >\n <div\n className=\"relative w-11 h-7 md:w-14 md:h-9 rounded-md overflow-hidden transition-all duration-300\"\n style={{\n border: isActive\n ? `2px solid ${opt.color}`\n : \"1px solid rgba(255, 255, 255, 0.15)\",\n transform: isActive ? \"scale(1.1) translateY(-2px)\" : \"scale(1) translateY(0)\",\n boxShadow: isActive ? `0 4px 20px ${opt.color}60` : \"0 2px 10px rgba(0,0,0,0.5)\",\n }}\n >\n <div className=\"absolute inset-0 opacity-80\" style={{ backgroundColor: opt.color }} />\n </div>\n <span\n className=\"text-[9px] uppercase tracking-widest font-semibold transition-colors duration-300\"\n style={{\n color: isActive ? \"#ffffff\" : \"rgba(255, 255, 255, 0.4)\",\n }}\n >\n {opt.label}\n </span>\n </button>\n );\n })}\n </div>\n </div>\n </div>\n </div>\n );\n}\n"],"mappings":"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","names":["index_exports","__export","AnimatedBackground","AnimatedLetter","CameraRig","CinemaBackground","CinemaHome","CinemaLoader","ClickFireSparks","ClickShockwave","ElectricPlasma","FireFlames","LoaderOverlay","PlasmaBlobs","SceneParticles","withCinema3D","__toCommonJS","import_react","import_fiber","import_drei","import_postprocessing","import_react","import_fiber","import_drei","THREE","import_jsx_runtime","THEME_CONFIGS","AnimatedLetter","char","index","totalLetters","position","phase","theme","fontUrl","meshRef","startTimeRef","entryOffset","angle","themeConfig","state","time","elapsed","staggerDelay","t","progress","bounce","breathe","sway","eased","import_react","import_fiber","import_drei","THREE","import_jsx_runtime","THEME_PARTICLE_COLORS","SPANISH_COLOR_HEX","DustMotes","color","speedMultiplier","count","meshRef","dummy","speeds","offsets","i","state","time","speed","ox","oy","oz","SceneParticles","theme","effectColor","effectSpeed","visible","activeColor","lower","import_react","import_fiber","THREE","CameraRig","phase","effectSpeed","camera","pointer","startTimeRef","phaseRef","state","time","elapsed","t","eased","z","y","aspect","targetZ","driftX","driftY","mouseX","mouseY","import_react","import_fiber","THREE","import_jsx_runtime","THEME_SPARK_COLORS","SPANISH_COLOR_HEX","ClickFireSparks","theme","effectColor","effectSpeed","enabled","camera","raycaster","bursts","setBursts","nextId","activePalette","lower","primaryHex","handlePointerDown","event","clientX","clientY","ndc","plane","intersectionPoint","sparkCount","newSparks","i","angle","speed","elevation","velocity","hexColor","newBurst","prev","_","delta","prevBursts","burst","updatedTime","updatedLight","updatedSparks","spark","newLife","newPos","__spreadProps","__spreadValues","import_react","import_fiber","THREE","import_jsx_runtime","THEME_WAVE_COLORS","SPANISH_COLOR_HEX","ClickShockwave","theme","effectColor","effectSpeed","enabled","camera","raycaster","waves","setWaves","nextId","activeColorHex","lower","handlePointerDown","event","clientX","clientY","ndc","plane","intersectionPoint","newWave","prev","_","delta","wave","newLife","newRadius","__spreadProps","__spreadValues","import_react","import_fiber","THREE","import_jsx_runtime","PLASMA_COLORS","SPANISH_COLOR_HEX","ElectricPlasma","theme","effectColor","effectSpeed","enabled","pointer","lineRef","activeColor","lower","segmentCount","geometry","geom","positions","state","time","posAttr","targetX","targetY","i","idx","angle","radius","x1","y1","z1","x2","y2","z2","import_react","import_fiber","THREE","import_jsx_runtime","FLAME_PALETTES","SPANISH_COLOR_HEX","createLiquidEnergyTexture","canvas","ctx","gradient","texture","FireFlames","theme","effectColor","effectSpeed","effectDensity","mode","enabled","pointer","fluidMeshRef","crystalMeshRef","lightRef","dummy","isPointerDown","dragBursts","clampedDensity","flameCount","activeColor","lower","particles","data","sizeFactor","i","handlePointerDown","handlePointerUp","state","delta","time","targetX","targetY","b","p","progress","currentY","currentX","currentZ","scaleEnvelope","idx","targetIdx","import_react","import_fiber","THREE","import_jsx_runtime","SPANISH_COLOR_HEX","createBlobTexture","canvas","ctx","gradient","texture","PlasmaBlobs","theme","effectColor","effectSpeed","effectDensity","enabled","pointer","meshRef","lightRef","dummy","isPointerDown","dragBlobs","clampedDensity","blobCount","activeColor","lower","particles","data","sizeFactor","i","handlePointerDown","handlePointerUp","state","delta","time","targetX","targetY","b","p","currentX","currentY","currentZ","scalePulse","idx","targetIdx","scaleEnvelope","import_react","import_next_intl","DEFAULT_MESSAGES","useSafeTranslations","key","e","import_react","import_next_intl","import_lucide_react","import_jsx_runtime","LocaleSwitcher","activeLocale","locale","e","currentLocale","setCurrentLocale","React","import_react_slot","import_class_variance_authority","import_clsx","import_tailwind_merge","cn","inputs","import_jsx_runtime","buttonVariants","Button","_a","ref","_b","className","variant","size","asChild","props","__objRest","__spreadValues","cn","import_jsx_runtime","CinemaHome","cinemaName","webTheme","t","useSafeTranslations","mobileMenuOpen","setMobileMenuOpen","themeOverlay","LocaleSwitcher","Button","import_jsx_runtime","HELVETIKER_CDN","FONT_PRESETS","SPANISH_COLOR_MAP","THEME_BACKGROUNDS","computeLetterPositions","text","spacing","startX","_","i","parseActiveEffects","effectInput","list","e","isAll","enableFluidFlames","enableCrystalFlames","enableBlobs","enableSparks","enableShockwave","enablePlasma","enableEmbers","AnimatedBackground","containerToDisplay","containerSelector","effect","title","backgroundColor","effectColor","effectSpeed","effectDensity","autoFitText","loaderDuration","redirectUrl","onComplete","fontFamily","fontUrl","theme","letterSpacing","className","style","children","activeTitle","letters","positions","isMounted","setIsMounted","isLoaderActive","loaderProgress","setLoaderProgress","totalMs","intervalMs","elapsedMs","timer","currentPct","activeFontUrl","key","windowWidth","setWindowWidth","handleResize","calculatedScale","len","baseScale","activeBg","lower","activeEffects","flameMode","enableAnyFlames","targetSelector","renderContainerContent","CinemaHome","__spreadValues","CameraRig","FireFlames","PlasmaBlobs","ClickFireSparks","ClickShockwave","ElectricPlasma","char","AnimatedLetter","SceneParticles","import_react","import_fiber","import_drei","import_postprocessing","import_jsx_runtime","THEME_BACKGROUNDS","FONT_URL","computeLetterPositions","text","startX","_","i","CinemaBackground","theme","customBackground","interactiveSparks","interactiveShockwave","interactivePlasma","showParticles","enableBloom","className","style","children","isMounted","setIsMounted","currentText","currentTheme","activeText","letters","positions","activeTheme","currentBg","__spreadValues","CameraRig","ClickFireSparks","ClickShockwave","ElectricPlasma","char","AnimatedLetter","SceneParticles","import_jsx_runtime","withCinema3D","WrappedComponent","hocOptions","ComponentWithCinema3D","props","CinemaBackground","__spreadProps","__spreadValues","import_react","import_fiber","import_drei","import_postprocessing","import_jsx_runtime","THEME_OPTIONS","LoaderOverlay","phase","cinemaName","theme","effects","onTitleChange","onThemeChange","onToggleEffect","e","opt","isActive","import_jsx_runtime","FONT_URL","THEME_BACKGROUNDS","computeLetterPositions","text","startX","_","i","CinemaLoader","cinemaName","defaultTheme","customBackground","onEnterCinema","isMounted","setIsMounted","phase","setPhase","theme","setTheme","titleText","setTitleText","effects","setEffects","displayName","letters","positions","t1","totalLetterTime","t2","toggleEffect","effectName","prev","__spreadProps","__spreadValues","currentBg","CameraRig","ClickFireSparks","ClickShockwave","ElectricPlasma","char","AnimatedLetter","SceneParticles","LoaderOverlay"]}