3d-effect-cinema 0.2.0 → 0.3.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/README.md +74 -80
- package/dist/index.d.mts +80 -27
- package/dist/index.d.ts +80 -27
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
'use client';
|
|
2
|
-
"use strict";var Le=Object.create;var F=Object.defineProperty,Se=Object.defineProperties,Pe=Object.getOwnPropertyDescriptor,Fe=Object.getOwnPropertyDescriptors,He=Object.getOwnPropertyNames,U=Object.getOwnPropertySymbols,Be=Object.getPrototypeOf,W=Object.prototype.hasOwnProperty,ne=Object.prototype.propertyIsEnumerable;var te=(t,e,r)=>e in t?F(t,e,{enumerable:!0,configurable:!0,writable:!0,value:r}):t[e]=r,k=(t,e)=>{for(var r in e||(e={}))W.call(e,r)&&te(t,r,e[r]);if(U)for(var r of U(e))ne.call(e,r)&&te(t,r,e[r]);return t},j=(t,e)=>Se(t,Fe(e));var re=(t,e)=>{var r={};for(var o in t)W.call(t,o)&&e.indexOf(o)<0&&(r[o]=t[o]);if(t!=null&&U)for(var o of U(t))e.indexOf(o)<0&&ne.call(t,o)&&(r[o]=t[o]);return r};var Ie=(t,e)=>{for(var r in e)F(t,r,{get:e[r],enumerable:!0})},oe=(t,e,r,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let a of He(e))!W.call(t,a)&&a!==r&&F(t,a,{get:()=>e[a],enumerable:!(o=Pe(e,a))||o.enumerable});return t};var H=(t,e,r)=>(r=t!=null?Le(Be(t)):{},oe(e||!t||!t.__esModule?F(r,"default",{value:t,enumerable:!0}):r,t)),Ae=t=>oe(F({},"__esModule",{value:!0}),t);var je={};Ie(je,{AnimatedLetter:()=>E,CameraRig:()=>T,CinemaBackground:()=>q,CinemaHome:()=>Q,CinemaLoader:()=>Z,ClickFireSparks:()=>N,LoaderOverlay:()=>A,SceneParticles:()=>C});module.exports=Ae(je);var B=require("react"),ie=require("@react-three/fiber"),ae=require("@react-three/drei"),R=H(require("three")),ze={gold:{color:"#FFD700",metalness:1,roughness:.15,clearcoat:1,emissive:"#1a0f00",emissiveIntensity:.3,envMapIntensity:2},neon:{color:"#00ffff",metalness:0,roughness:1,clearcoat:0,emissive:"#00ffff",emissiveIntensity:2.5,envMapIntensity:.5},emerald:{color:"#10b981",metalness:.9,roughness:.1,clearcoat:1,emissive:"#065f46",emissiveIntensity:1.2,envMapIntensity:2.5},crimson:{color:"#ff1744",metalness:.8,roughness:.15,clearcoat:1,emissive:"#880e4f",emissiveIntensity:1.8,envMapIntensity:2},obsidian:{color:"#1a1a2e",metalness:1,roughness:.05,clearcoat:1,emissive:"#0a0a1a",emissiveIntensity:.1,envMapIntensity:3},glass:{color:"#ffffff",metalness:0,roughness:0,clearcoat:0,emissive:"#000000",emissiveIntensity:0,envMapIntensity:1.5,transmission:.95,ior:1.5,thickness:.5,transparent:!0}};function E({char:t,index:e,totalLetters:r,position:o,phase:a,theme:c,fontUrl:l}){let s=(0,B.useRef)(null),n=(0,B.useRef)(null),i=(0,B.useMemo)(()=>{let d=e/r*Math.PI*2;return{x:Math.cos(d)*4+(Math.random()-.5)*2,y:-3+Math.random()*-3,z:-5+Math.random()*-3,rotX:(Math.random()-.5)*Math.PI*2,rotY:(Math.random()-.5)*Math.PI*2}},[e,r]),m=ze[c];return(0,ie.useFrame)(d=>{if(!s.current)return;let p=d.clock.getElapsedTime();n.current===null&&(n.current=p);let f=p-n.current,h=e*.12;if(a==="loading"){s.current.position.set(o[0]+i.x,o[1]+i.y,o[2]+i.z),s.current.rotation.set(i.rotX,i.rotY,0),s.current.scale.setScalar(0);return}if(a==="entering"){let u=Math.max(0,f-h),g=1-Math.exp(-u*3),y=1+Math.sin(u*8)*Math.max(0,.15-u*.1);s.current.position.set(R.MathUtils.lerp(o[0]+i.x,o[0],g),R.MathUtils.lerp(o[1]+i.y,o[1],g),R.MathUtils.lerp(o[2]+i.z,o[2],g)),s.current.rotation.set(R.MathUtils.lerp(i.rotX,0,g),R.MathUtils.lerp(i.rotY,0,g),0),s.current.scale.setScalar(Math.min(g*y,1.05));return}if(a==="idle"){let u=Math.sin(p*1.2+e*.5)*.015,g=Math.sin(p*.8+e*.3)*.008;s.current.position.set(o[0]+g,o[1]+u,o[2]),s.current.rotation.set(Math.sin(p*.5+e)*.01,Math.sin(p*.3+e*.7)*.01,0),s.current.scale.setScalar(1);return}if(a==="exiting"){let u=Math.max(0,f-h*.5),g=Math.min(u*2,1),y=g*g;s.current.position.set(o[0]+i.x*y*.5,o[1],o[2]-y*8),s.current.scale.setScalar(Math.max(1-y,0)),s.current.rotation.y+=.05}}),t===" "?null:React.createElement("group",{ref:s,position:o},React.createElement(ae.Text3D,{font:l,size:.8,height:.35,bevelEnabled:!0,bevelSize:.02,bevelThickness:.01,bevelSegments:3,curveSegments:12},t,React.createElement("meshPhysicalMaterial",{color:m.color,metalness:m.metalness,roughness:m.roughness,clearcoat:m.clearcoat,emissive:m.emissive,emissiveIntensity:m.emissiveIntensity,envMapIntensity:m.envMapIntensity,transmission:m.transmission,ior:m.ior,thickness:m.thickness,transparent:m.transparent,toneMapped:c!=="neon"})))}var G=require("react"),O=require("@react-three/fiber"),w=H(require("three"));function T({phase:t}){let{camera:e,pointer:r}=(0,O.useThree)(),o=(0,G.useRef)(null),a=(0,G.useRef)(t);return a.current!==t&&(a.current=t,o.current=null),(0,O.useFrame)(c=>{let l=c.clock.getElapsedTime();o.current===null&&(o.current=l);let s=l-o.current;if(t==="loading"){e.position.set(0,0,14),e.lookAt(0,0,0);return}if(t==="entering"){let n=Math.min(s/3,1),i=1-Math.pow(1-n,3),m=w.MathUtils.lerp(14,6,i),d=w.MathUtils.lerp(1,.2,i);e.position.set(0,d,m),e.lookAt(0,0,0);return}if(t==="idle"){let n=Math.sin(l*.15)*.3,i=Math.cos(l*.1)*.15+.2,m=r.x*.3,d=r.y*.15;e.position.x=w.MathUtils.damp(e.position.x,n+m,3,.016),e.position.y=w.MathUtils.damp(e.position.y,i+d,3,.016),e.position.z=w.MathUtils.damp(e.position.z,6,3,.016),e.lookAt(0,0,0);return}if(t==="exiting"){let n=Math.min(s/1.5,1),i=n*n*n,m=w.MathUtils.lerp(6,-8,i);e.position.set(0,0,m),e.lookAt(0,0,0)}}),null}var b=require("react"),de=require("@react-three/fiber"),_=require("@react-three/drei"),M=require("@react-three/postprocessing");var I=require("react"),se=require("@react-three/fiber"),K=require("@react-three/drei"),le=H(require("three")),Ue={gold:"#FFD700",neon:"#00ffff",emerald:"#10b981",crimson:"#ff1744",obsidian:"#a855f7",glass:"#ffffff"};function Oe({color:t,count:e=60}){let r=(0,I.useRef)(null),o=(0,I.useRef)(new le.Object3D),a=(0,I.useRef)(null),c=(0,I.useRef)(null);if(!a.current){a.current=new Float32Array(e),c.current=new Float32Array(e*3);for(let l=0;l<e;l++)a.current[l]=.1+Math.random()*.3,c.current[l*3]=(Math.random()-.5)*16,c.current[l*3+1]=(Math.random()-.5)*10,c.current[l*3+2]=(Math.random()-.5)*12}return(0,se.useFrame)(l=>{if(!r.current||!a.current||!c.current)return;let s=l.clock.getElapsedTime();for(let n=0;n<e;n++){let i=a.current[n],m=c.current[n*3],d=c.current[n*3+1],p=c.current[n*3+2];o.current.position.set(m+Math.sin(s*i+n)*2,d+Math.cos(s*i*.7+n*.5)*1.5,p+Math.sin(s*i*.5+n*.3)*2),o.current.scale.setScalar(.015+Math.sin(s+n)*.005),o.current.updateMatrix(),r.current.setMatrixAt(n,o.current.matrix)}r.current.instanceMatrix.needsUpdate=!0}),React.createElement("instancedMesh",{ref:r,args:[void 0,void 0,e]},React.createElement("sphereGeometry",{args:[1,6,6]}),React.createElement("meshBasicMaterial",{color:t,transparent:!0,opacity:.3,toneMapped:!1}))}function C({theme:t,visible:e}){let r=Ue[t];return e?React.createElement("group",null,React.createElement(K.Sparkles,{count:150,scale:10,size:4,speed:.3,opacity:.8,color:r,noise:.6}),React.createElement(K.Sparkles,{count:80,scale:16,size:2,speed:.15,opacity:.4,color:"#ffffff",noise:.8}),React.createElement(Oe,{color:r,count:50})):null}var Ve=[{key:"gold",label:"Gold",color:"#FFD700"},{key:"neon",label:"Neon",color:"#00ffff"},{key:"emerald",label:"Emerald",color:"#10b981"},{key:"crimson",label:"Crimson",color:"#ff1744"},{key:"obsidian",label:"Obsidian",color:"#a855f7"},{key:"glass",label:"Glass",color:"#ffffff"}];function A({phase:t,cinemaName:e,theme:r,onEnter:o,onThemeChange:a}){let c=t==="idle";return React.createElement("div",{className:"absolute inset-0 pointer-events-none z-10 flex flex-col items-center justify-between",style:{opacity:t==="exiting"?0:1,transition:"opacity 0.8s ease-out"}},React.createElement("div",{className:"pt-12 text-center flex flex-col items-center gap-1",style:{opacity:t==="idle"||t==="entering"?1:0,transform:t==="idle"||t==="entering"?"translateY(0)":"translateY(-20px)",transition:"all 1s ease-out 0.5s"}},React.createElement("p",{className:"text-xs tracking-[0.4em] uppercase font-bold",style:{color:"rgba(255, 255, 255, 0.6)",fontFamily:"var(--font-syne), sans-serif",textShadow:"0 2px 10px rgba(0,0,0,0.8)"}},"Premium Cinema Experience"),React.createElement("p",{className:"text-[10px] tracking-[0.25em] uppercase",style:{color:"rgba(255, 255, 255, 0.4)",fontFamily:"sans-serif"}},"\u2726 Click anywhere for fire sparks \u2726")),t==="loading"&&React.createElement("div",{className:"absolute inset-0 flex items-center justify-center"},React.createElement("div",{className:"w-16 h-16 rounded-full border-2 animate-spin-slow",style:{borderColor:"transparent",borderTopColor:"rgba(255, 215, 0, 0.6)",borderRightColor:"rgba(255, 215, 0, 0.2)"}})),React.createElement("div",{className:"pb-12 flex flex-col items-center gap-6"},React.createElement("button",{onClick:o,className:"pointer-events-auto px-10 py-3.5 rounded-full text-sm font-semibold tracking-widest uppercase transition-all duration-500 cursor-pointer",style:{opacity:c?1:0,transform:c?"translateY(0) scale(1)":"translateY(20px) scale(0.95)",transition:"all 0.8s cubic-bezier(0.16, 1, 0.3, 1)",fontFamily:"var(--font-syne), sans-serif",background:"rgba(255, 255, 255, 0.06)",backdropFilter:"blur(20px)",border:"1px solid rgba(255, 255, 255, 0.1)",color:"#f0f0f0",boxShadow:"0 0 30px rgba(255, 215, 0, 0.15)",pointerEvents:c?"auto":"none"},id:"enter-cinema-button","aria-label":`Enter ${e}`},"Enter ",e),React.createElement("div",{className:"flex items-center gap-3 pointer-events-auto",style:{opacity:t==="idle"||t==="entering"?1:0,transition:"opacity 1s ease-out 1.5s"}},React.createElement("span",{className:"text-[10px] uppercase tracking-[0.3em] mr-4",style:{color:"rgba(255, 255, 255, 0.4)",fontFamily:"var(--font-syne), sans-serif"}},"Theme"),React.createElement("div",{className:"flex items-center gap-3"},Ve.map(n=>{let i=r===n.key;return React.createElement("button",{key:n.key,onClick:()=>a(n.key),className:"group relative flex flex-col items-center gap-2 cursor-pointer outline-none",id:`theme-selector-${n.key}`,"aria-label":`Switch to ${n.label} theme`},React.createElement("div",{className:"relative w-14 h-9 rounded-md overflow-hidden transition-all duration-500",style:{border:i?`2px solid ${n.color}`:"1px solid rgba(255, 255, 255, 0.15)",transform:i?"scale(1.1) translateY(-2px)":"scale(1) translateY(0)",boxShadow:i?`0 4px 20px ${n.color}40`:"0 2px 10px rgba(0,0,0,0.5)"}},React.createElement("div",{className:"absolute inset-0 opacity-80",style:{backgroundColor:n.color}}),React.createElement("div",{className:"absolute inset-0 opacity-0 group-hover:opacity-100 transition-opacity duration-300",style:{background:n.key==="gold"?"conic-gradient(from 0deg, transparent, rgba(255,255,255,0.5), transparent)":n.key==="neon"?"radial-gradient(circle at center, rgba(255,255,255,0.8) 0%, transparent 70%)":n.key==="obsidian"?"linear-gradient(45deg, transparent 40%, rgba(255,255,255,0.3) 50%, transparent 60%)":"linear-gradient(to right, rgba(255,255,255,0.1), rgba(255,255,255,0.5), rgba(255,255,255,0.1))",animation:n.key==="gold"?"spin-slow 3s linear infinite":n.key==="neon"?"pulse-glow 2s ease-in-out infinite":n.key==="obsidian"?"shimmer 2s linear infinite":"shimmer 3s linear infinite",backgroundSize:n.key==="obsidian"||n.key==="glass"?"200% 100%":"auto"}})),React.createElement("span",{className:"text-[9px] uppercase tracking-widest transition-colors duration-300",style:{color:i?"#ffffff":"rgba(255, 255, 255, 0.4)",fontFamily:"var(--font-inter), sans-serif"}},n.label))})))))}var v=require("react"),V=require("@react-three/fiber"),x=H(require("three"));var ce={gold:["#FFD700","#FF8C00","#FF4500","#FFF8DC"],neon:["#00ffff","#0088ff","#ff00ff","#ffffff"],emerald:["#00ff88","#10b981","#059669","#a7f3d0"],crimson:["#ff1744","#d50000","#ff5252","#ffb74d"],obsidian:["#a855f7","#6366f1","#3b82f6","#ffffff"],glass:["#ffffff","#e0e7ff","#93c5fd","#60a5fa"]};function N({theme:t="gold"}){let{camera:e,raycaster:r,pointer:o}=(0,V.useThree)(),[a,c]=(0,v.useState)([]),l=(0,v.useRef)(0),s=(0,v.useCallback)(n=>{let i=0,m=0;if("touches"in n&&n.touches.length>0)i=n.touches[0].clientX,m=n.touches[0].clientY;else if("clientX"in n)i=n.clientX,m=n.clientY;else return;let d=new x.Vector2(i/window.innerWidth*2-1,-(m/window.innerHeight)*2+1);r.setFromCamera(d,e);let p=new x.Plane(new x.Vector3(0,0,1),0),f=new x.Vector3;if(r.ray.intersectPlane(p,f),!f)return;let h=ce[t]||ce.gold,u=35,g=[];for(let P=0;P<u;P++){let ee=Math.random()*Math.PI*2,$=1.5+Math.random()*4.5,Ce=(Math.random()-.3)*3,Ne=new x.Vector3(Math.cos(ee)*$,Math.sin(ee)*$+Ce,(Math.random()-.5)*$*.8),Re=h[Math.floor(Math.random()*h.length)];g.push({id:P,position:f.clone(),velocity:Ne,color:new x.Color(Re),size:.08+Math.random()*.12,life:1,maxLife:.6+Math.random()*.8})}let y={id:l.current++,origin:f.clone(),sparks:g,color:h[0],lightIntensity:4,time:0};c(P=>[...P.slice(-4),y])},[e,r,t]);return(0,v.useEffect)(()=>(window.addEventListener("pointerdown",s),()=>{window.removeEventListener("pointerdown",s)}),[s]),(0,V.useFrame)((n,i)=>{a.length!==0&&c(m=>m.map(d=>{let p=d.time+i,f=Math.max(0,d.lightIntensity-i*8),h=d.sparks.map(u=>{let g=u.life-i/u.maxLife;if(g<=0)return null;let y=u.position.clone().addScaledVector(u.velocity,i);return u.velocity.y-=i*3.5,u.velocity.multiplyScalar(.96),j(k({},u),{position:y,life:g})}).filter(Boolean);return h.length===0&&f<=0?null:j(k({},d),{time:p,lightIntensity:f,sparks:h})}).filter(Boolean))}),React.createElement("group",null,a.map(n=>React.createElement("group",{key:n.id},n.lightIntensity>.05&&React.createElement("pointLight",{position:n.origin,intensity:n.lightIntensity*3,distance:6,color:n.color}),n.sparks.map(i=>React.createElement("mesh",{key:i.id,position:i.position},React.createElement("sphereGeometry",{args:[i.size*i.life,6,6]}),React.createElement("meshBasicMaterial",{color:i.color,transparent:!0,opacity:i.life,toneMapped:!1}))))))}var _e="/fonts/cinema_display.typeface.json",me={gold:"radial-gradient(circle at center, #1c1503 0%, #080601 60%, #020201 100%)",neon:"radial-gradient(circle at center, #021a1e 0%, #030d14 60%, #010408 100%)",emerald:"radial-gradient(circle at center, #032117 0%, #02120d 60%, #010705 100%)",crimson:"radial-gradient(circle at center, #240409 0%, #120205 60%, #060102 100%)",obsidian:"radial-gradient(circle at center, #120d24 0%, #080512 60%, #030206 100%)",glass:"radial-gradient(circle at center, #0f172a 0%, #070b14 60%, #020408 100%)"};function Ye(t){let o=-(t.length*.65)/2;return t.split("").map((a,c)=>[o+c*.65,0,0])}function Z({cinemaName:t="CINEMULTIPLEX",defaultTheme:e="gold",customBackground:r,onEnterCinema:o}){let[a,c]=(0,b.useState)("loading"),[l,s]=(0,b.useState)(e),n=t.toUpperCase(),i=n.split(""),m=(0,b.useMemo)(()=>Ye(n),[n]);(0,b.useEffect)(()=>{let f=setTimeout(()=>c("entering"),800),h=i.length*120+1500,u=setTimeout(()=>c("idle"),800+h);return()=>{clearTimeout(f),clearTimeout(u)}},[i.length]);let d=(0,b.useCallback)(()=>{c("exiting"),setTimeout(()=>{o()},1800)},[o]),p=r||me[l]||me.gold;return React.createElement("div",{className:"fixed inset-0 w-screen h-screen transition-all duration-1000 select-none overflow-hidden",style:{background:p}},React.createElement(de.Canvas,{camera:{position:[0,0,14],fov:45,near:.1,far:50},dpr:[1,2],gl:{antialias:!0,toneMapping:4,toneMappingExposure:1.2}},React.createElement(b.Suspense,{fallback:null},React.createElement(_.Environment,{preset:"studio"}),React.createElement("ambientLight",{intensity:.2}),React.createElement("directionalLight",{position:[5,8,5],intensity:1.5,color:"#ffffff"}),React.createElement("pointLight",{position:[-5,-3,-5],intensity:.6,color:l==="emerald"?"#10b981":l==="crimson"?"#ff1744":l==="neon"?"#00ffff":l==="obsidian"?"#a855f7":"#FFD700"}),React.createElement("spotLight",{position:[0,10,0],angle:.4,penumbra:.8,intensity:.9,color:"#ffffff"}),React.createElement("pointLight",{position:[0,0,-5],intensity:.4,color:"#ffffff"}),React.createElement(T,{phase:a}),React.createElement(N,{theme:l}),React.createElement(_.Center,{disableY:!0,disableZ:!0},React.createElement("group",null,i.map((f,h)=>React.createElement(E,{key:`${f}-${h}`,char:f,index:h,totalLetters:i.length,position:m[h],phase:a,theme:l,fontUrl:_e})))),React.createElement(C,{theme:l,visible:a!=="loading"}),React.createElement(M.EffectComposer,null,React.createElement(M.Bloom,{luminanceThreshold:.7,luminanceSmoothing:.9,intensity:l==="neon"||l==="emerald"||l==="crimson"?1.4:.7,mipmapBlur:!0}),React.createElement(M.Vignette,{offset:.3,darkness:.85}),React.createElement(M.Noise,{opacity:.025})))),React.createElement(A,{phase:a,cinemaName:t,theme:l,onEnter:d,onThemeChange:s}))}var Y=require("react"),ue=require("@react-three/fiber"),D=require("@react-three/drei"),L=require("@react-three/postprocessing");var fe={gold:"radial-gradient(circle at center, #1c1503 0%, #080601 60%, #020201 100%)",neon:"radial-gradient(circle at center, #021a1e 0%, #030d14 60%, #010408 100%)",emerald:"radial-gradient(circle at center, #032117 0%, #02120d 60%, #010705 100%)",crimson:"radial-gradient(circle at center, #240409 0%, #120205 60%, #060102 100%)",obsidian:"radial-gradient(circle at center, #120d24 0%, #080512 60%, #030206 100%)",glass:"radial-gradient(circle at center, #0f172a 0%, #070b14 60%, #020408 100%)"},De="/fonts/cinema_display.typeface.json";function Xe(t){let o=-(t.length*.65)/2;return t.split("").map((a,c)=>[o+c*.65,0,0])}function q({text:t="CINEMA",theme:e="emerald",customBackground:r,interactiveSparks:o=!0,showParticles:a=!0,className:c="",style:l,children:s}){let n=t.toUpperCase(),i=n.split(""),m=(0,Y.useMemo)(()=>Xe(n),[n]),d=r||fe[e]||fe.emerald;return React.createElement("div",{className:`relative w-full h-full min-h-[350px] overflow-hidden select-none ${c}`,style:k({background:d},l)},React.createElement("div",{className:"absolute inset-0 z-0 pointer-events-auto"},React.createElement(ue.Canvas,{camera:{position:[0,0,14],fov:45,near:.1,far:50},dpr:[1,2],gl:{antialias:!0,toneMapping:4,toneMappingExposure:1.2}},React.createElement(Y.Suspense,{fallback:null},React.createElement(D.Environment,{preset:"studio"}),React.createElement("ambientLight",{intensity:.3}),React.createElement("directionalLight",{position:[5,8,5],intensity:1.5,color:"#ffffff"}),React.createElement("pointLight",{position:[-5,-3,-5],intensity:.6,color:e==="emerald"?"#10b981":e==="crimson"?"#ff1744":e==="neon"?"#00ffff":"#FFD700"}),React.createElement(T,{phase:"idle"}),o&&React.createElement(N,{theme:e}),React.createElement(D.Center,{disableY:!0,disableZ:!0},React.createElement("group",null,i.map((p,f)=>React.createElement(E,{key:`${p}-${f}`,char:p,index:f,totalLetters:i.length,position:m[f],phase:"idle",theme:e,fontUrl:De})))),a&&React.createElement(C,{theme:e,visible:!0}),React.createElement(L.EffectComposer,null,React.createElement(L.Bloom,{luminanceThreshold:.7,luminanceSmoothing:.9,intensity:.8,mipmapBlur:!0}),React.createElement(L.Vignette,{offset:.3,darkness:.85}))))),s&&React.createElement("div",{className:"relative z-10 w-full h-full pointer-events-none flex flex-col items-center justify-center"},s))}var Te=require("next-intl");var pe=require("next-intl/routing"),ge=require("next-intl/navigation"),$e=(0,pe.defineRouting)({locales:["en","es"],defaultLocale:"en"}),{Link:S,redirect:ut,usePathname:he,useRouter:be}=(0,ge.createNavigation)($e);var xe=require("next-intl");var ye=require("lucide-react");function J(){let t=(0,xe.useLocale)(),e=be(),r=he();return React.createElement("button",{onClick:()=>{let a=t==="en"?"es":"en";e.replace(r,{locale:a})},className:"flex items-center gap-2 text-sm font-medium text-muted-foreground hover:text-white transition-colors uppercase tracking-wider"},React.createElement(ye.Globe,{className:"w-4 h-4"}),t==="en"?"ES":"EN")}var X=H(require("react")),Ee=require("@radix-ui/react-slot"),we=require("class-variance-authority");var ve=require("clsx"),Me=require("tailwind-merge");function ke(...t){return(0,Me.twMerge)((0,ve.clsx)(t))}var We=(0,we.cva)("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",{variants:{variant:{default:"bg-primary text-primary-foreground shadow hover:bg-primary/90",destructive:"bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90",outline:"border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground",secondary:"bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80",ghost:"hover:bg-accent hover:text-accent-foreground",link:"text-primary underline-offset-4 hover:underline"},size:{default:"h-9 px-4 py-2",sm:"h-8 rounded-md px-3 text-xs",lg:"h-10 rounded-md px-8",icon:"h-9 w-9"}},defaultVariants:{variant:"default",size:"default"}}),z=X.forwardRef((l,c)=>{var s=l,{className:t,variant:e,size:r,asChild:o=!1}=s,a=re(s,["className","variant","size","asChild"]);return X.createElement(o?Ee.Slot:"button",k({className:ke(We({variant:e,size:r,className:t})),ref:c},a))});z.displayName="Button";function Q({cinemaName:t="NOVA",webTheme:e="neon"}){let r=(0,Te.useTranslations)(),o=e==="noir"?"bg-slate-900/40 mix-blend-color":e==="crimson"?"bg-red-900/30 mix-blend-color":"bg-blue-900/20 mix-blend-color";return React.createElement("div",{className:`min-h-screen bg-black text-white selection:bg-white/30 font-sans transition-colors duration-1000 group theme-${e}`},React.createElement("nav",{className:"absolute top-0 left-0 right-0 z-50 flex items-center justify-between px-8 py-6 mix-blend-difference"},React.createElement("div",{className:"flex items-center gap-12"},React.createElement(S,{href:"/",className:"text-3xl font-bold tracking-tighter uppercase font-display"},t,"."),React.createElement("div",{className:"hidden md:flex items-center gap-8 text-sm font-semibold tracking-widest text-white/70"},React.createElement(S,{href:"/schedule",className:"hover:text-white transition-colors"},r("nav.schedule")),React.createElement(S,{href:"/experiences",className:"hover:text-white transition-colors"},r("nav.experiences")),React.createElement(S,{href:"/membership",className:"hover:text-white transition-colors"},r("nav.membership")))),React.createElement("div",{className:"flex items-center gap-6"},React.createElement(J,null),React.createElement("div",{className:"hidden sm:flex items-center gap-4"},React.createElement(S,{href:"/login",className:"text-sm font-semibold tracking-widest text-white/70 hover:text-white transition-colors"},r("nav.login")),React.createElement(z,{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"},r("nav.bookTickets"))))),React.createElement("div",{className:"relative h-screen w-full flex flex-col justify-end pb-24 px-8 md:px-16 overflow-hidden"},React.createElement("div",{className:"absolute inset-0 z-0"},React.createElement("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"}),React.createElement("div",{className:"absolute inset-0 bg-gradient-to-t from-black via-black/50 to-transparent z-10"}),React.createElement("div",{className:`absolute inset-0 ${o} z-10`})),React.createElement("div",{className:"relative z-20 max-w-5xl"},React.createElement("div",{className:"flex items-center gap-3 mb-6"},React.createElement("span",{className:"bg-blue-600 text-white text-[10px] font-bold px-3 py-1 tracking-widest"},r("hero.genreImax")),React.createElement("span",{className:"border border-white/20 text-white/80 text-[10px] font-bold px-3 py-1 tracking-widest"},r("hero.genreAction"))),React.createElement("h1",{className:"text-6xl md:text-[8rem] leading-[0.85] font-display font-black tracking-tighter mb-6 uppercase drop-shadow-2xl"},r("hero.title")),React.createElement("p",{className:"max-w-2xl text-lg md:text-xl text-white/70 font-medium mb-10 leading-relaxed drop-shadow-md"},r("hero.synopsis")),React.createElement("div",{className:"flex flex-col sm:flex-row items-start sm:items-center gap-4"},React.createElement(z,{className:"rounded-none bg-white text-black hover:bg-white/90 font-bold tracking-widest text-xs px-8 py-6 uppercase transition-transform hover:scale-105 active:scale-95"},r("hero.getTickets")),React.createElement(z,{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-8 py-6 uppercase"},r("hero.watchTrailer"))))))}0&&(module.exports={AnimatedLetter,CameraRig,CinemaBackground,CinemaHome,CinemaLoader,ClickFireSparks,LoaderOverlay,SceneParticles});
|
|
2
|
+
"use strict";var Ue=Object.create;var V=Object.defineProperty,Ve=Object.defineProperties,We=Object.getOwnPropertyDescriptor,Ye=Object.getOwnPropertyDescriptors,Xe=Object.getOwnPropertyNames,G=Object.getOwnPropertySymbols,$e=Object.getPrototypeOf,ae=Object.prototype.hasOwnProperty,ue=Object.prototype.propertyIsEnumerable;var fe=(e,t,r)=>t in e?V(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,y=(e,t)=>{for(var r in t||(t={}))ae.call(t,r)&&fe(e,r,t[r]);if(G)for(var r of G(t))ue.call(t,r)&&fe(e,r,t[r]);return e},P=(e,t)=>Ve(e,Ye(t));var pe=(e,t)=>{var r={};for(var n in e)ae.call(e,n)&&t.indexOf(n)<0&&(r[n]=e[n]);if(e!=null&&G)for(var n of G(e))t.indexOf(n)<0&&ue.call(e,n)&&(r[n]=e[n]);return r};var je=(e,t)=>{for(var r in t)V(e,r,{get:t[r],enumerable:!0})},he=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let c of Xe(t))!ae.call(e,c)&&c!==r&&V(e,c,{get:()=>t[c],enumerable:!(n=We(t,c))||n.enumerable});return e};var T=(e,t,r)=>(r=e!=null?Ue($e(e)):{},he(t||!e||!e.__esModule?V(r,"default",{value:e,enumerable:!0}):r,e)),Ge=e=>he(V({},"__esModule",{value:!0}),e);var at={};je(at,{AnimatedLetter:()=>H,CameraRig:()=>A,CinemaBackground:()=>X,CinemaHome:()=>de,CinemaLoader:()=>ce,ClickFireSparks:()=>I,ClickShockwave:()=>_,ElectricPlasma:()=>O,LoaderOverlay:()=>$,SceneParticles:()=>B,withCinema3D:()=>Te});module.exports=Ge(at);var le=T(require("react"));var z=require("react"),ke=require("@react-three/fiber"),te=require("@react-three/drei"),N=require("@react-three/postprocessing");var W=require("react"),ge=require("@react-three/fiber"),be=require("@react-three/drei"),D=T(require("three")),Ke={gold:{color:"#FFD700",metalness:1,roughness:.15,clearcoat:1,emissive:"#1a0f00",emissiveIntensity:.3,envMapIntensity:2},neon:{color:"#00ffff",metalness:0,roughness:1,clearcoat:0,emissive:"#00ffff",emissiveIntensity:2.5,envMapIntensity:.5},emerald:{color:"#10b981",metalness:.9,roughness:.1,clearcoat:1,emissive:"#065f46",emissiveIntensity:1.2,envMapIntensity:2.5},crimson:{color:"#ff1744",metalness:.8,roughness:.15,clearcoat:1,emissive:"#880e4f",emissiveIntensity:1.8,envMapIntensity:2},obsidian:{color:"#1a1a2e",metalness:1,roughness:.05,clearcoat:1,emissive:"#0a0a1a",emissiveIntensity:.1,envMapIntensity:3},glass:{color:"#ffffff",metalness:0,roughness:0,clearcoat:0,emissive:"#000000",emissiveIntensity:0,envMapIntensity:1.5,transmission:.95,ior:1.5,thickness:.5,transparent:!0}};function H({char:e,index:t,totalLetters:r,position:n,phase:c,theme:m,fontUrl:s}){let l=(0,W.useRef)(null),o=(0,W.useRef)(null),a=(0,W.useMemo)(()=>{let f=t/r*Math.PI*2;return{x:Math.cos(f)*4+(Math.random()-.5)*2,y:-3+Math.random()*-3,z:-5+Math.random()*-3,rotX:(Math.random()-.5)*Math.PI*2,rotY:(Math.random()-.5)*Math.PI*2}},[t,r]),i=Ke[m];return(0,ge.useFrame)(f=>{if(!l.current)return;let g=f.clock.getElapsedTime();o.current===null&&(o.current=g);let d=g-o.current,b=t*.12;if(c==="loading"){l.current.position.set(n[0]+a.x,n[1]+a.y,n[2]+a.z),l.current.rotation.set(a.rotX,a.rotY,0),l.current.scale.setScalar(0);return}if(c==="entering"){let u=Math.max(0,d-b),p=1-Math.exp(-u*3),x=1+Math.sin(u*8)*Math.max(0,.15-u*.1);l.current.position.set(D.MathUtils.lerp(n[0]+a.x,n[0],p),D.MathUtils.lerp(n[1]+a.y,n[1],p),D.MathUtils.lerp(n[2]+a.z,n[2],p)),l.current.rotation.set(D.MathUtils.lerp(a.rotX,0,p),D.MathUtils.lerp(a.rotY,0,p),0),l.current.scale.setScalar(Math.min(p*x,1.05));return}if(c==="idle"){let u=Math.sin(g*1.2+t*.5)*.015,p=Math.sin(g*.8+t*.3)*.008;l.current.position.set(n[0]+p,n[1]+u,n[2]),l.current.rotation.set(Math.sin(g*.5+t)*.01,Math.sin(g*.3+t*.7)*.01,0),l.current.scale.setScalar(1);return}if(c==="exiting"){let u=Math.max(0,d-b*.5),p=Math.min(u*2,1),x=p*p;l.current.position.set(n[0]+a.x*x*.5,n[1],n[2]-x*8),l.current.scale.setScalar(Math.max(1-x,0)),l.current.rotation.y+=.05}}),e===" "?null:React.createElement("group",{ref:l,position:n},React.createElement(be.Text3D,{font:s,size:.8,height:.35,bevelEnabled:!0,bevelSize:.02,bevelThickness:.01,bevelSegments:3,curveSegments:12},e,React.createElement("meshPhysicalMaterial",{color:i.color,metalness:i.metalness,roughness:i.roughness,clearcoat:i.clearcoat,emissive:i.emissive,emissiveIntensity:i.emissiveIntensity,envMapIntensity:i.envMapIntensity,transmission:i.transmission,ior:i.ior,thickness:i.thickness,transparent:i.transparent,toneMapped:m!=="neon"})))}var Y=require("react"),xe=require("@react-three/fiber"),ie=require("@react-three/drei"),ve=T(require("three")),Ze={gold:"#FFD700",neon:"#00ffff",emerald:"#10b981",crimson:"#ff1744",obsidian:"#a855f7",glass:"#ffffff"};function qe({color:e,count:t=60}){let r=(0,Y.useRef)(null),n=(0,Y.useRef)(new ve.Object3D),c=(0,Y.useRef)(null),m=(0,Y.useRef)(null);if(!c.current){c.current=new Float32Array(t),m.current=new Float32Array(t*3);for(let s=0;s<t;s++)c.current[s]=.1+Math.random()*.3,m.current[s*3]=(Math.random()-.5)*16,m.current[s*3+1]=(Math.random()-.5)*10,m.current[s*3+2]=(Math.random()-.5)*12}return(0,xe.useFrame)(s=>{if(!r.current||!c.current||!m.current)return;let l=s.clock.getElapsedTime();for(let o=0;o<t;o++){let a=c.current[o],i=m.current[o*3],f=m.current[o*3+1],g=m.current[o*3+2];n.current.position.set(i+Math.sin(l*a+o)*2,f+Math.cos(l*a*.7+o*.5)*1.5,g+Math.sin(l*a*.5+o*.3)*2),n.current.scale.setScalar(.015+Math.sin(l+o)*.005),n.current.updateMatrix(),r.current.setMatrixAt(o,n.current.matrix)}r.current.instanceMatrix.needsUpdate=!0}),React.createElement("instancedMesh",{ref:r,args:[void 0,void 0,t]},React.createElement("sphereGeometry",{args:[1,6,6]}),React.createElement("meshBasicMaterial",{color:e,transparent:!0,opacity:.3,toneMapped:!1}))}function B({theme:e,visible:t}){let r=Ze[e];return t?React.createElement("group",null,React.createElement(ie.Sparkles,{count:150,scale:10,size:4,speed:.3,opacity:.8,color:r,noise:.6}),React.createElement(ie.Sparkles,{count:80,scale:16,size:2,speed:.15,opacity:.4,color:"#ffffff",noise:.8}),React.createElement(qe,{color:r,count:50})):null}var se=require("react"),K=require("@react-three/fiber"),F=T(require("three"));function A({phase:e}){let{camera:t,pointer:r}=(0,K.useThree)(),n=(0,se.useRef)(null),c=(0,se.useRef)(e);return c.current!==e&&(c.current=e,n.current=null),(0,K.useFrame)(m=>{let s=m.clock.getElapsedTime();n.current===null&&(n.current=s);let l=s-n.current;if(e==="loading"){t.position.set(0,0,14),t.lookAt(0,0,0);return}if(e==="entering"){let o=Math.min(l/3,1),a=1-Math.pow(1-o,3),i=F.MathUtils.lerp(14,6,a),f=F.MathUtils.lerp(1,.2,a);t.position.set(0,f,i),t.lookAt(0,0,0);return}if(e==="idle"){let o=Math.sin(s*.15)*.3,a=Math.cos(s*.1)*.15+.2,i=r.x*.3,f=r.y*.15;t.position.x=F.MathUtils.damp(t.position.x,o+i,3,.016),t.position.y=F.MathUtils.damp(t.position.y,a+f,3,.016),t.position.z=F.MathUtils.damp(t.position.z,6,3,.016),t.lookAt(0,0,0);return}if(e==="exiting"){let o=Math.min(l/1.5,1),a=o*o*o,i=F.MathUtils.lerp(6,-8,a);t.position.set(0,0,i),t.lookAt(0,0,0)}}),null}var C=require("react"),Z=require("@react-three/fiber"),k=T(require("three"));var ye={gold:["#FFD700","#FF8C00","#FF4500","#FFF8DC"],neon:["#00ffff","#0088ff","#ff00ff","#ffffff"],emerald:["#00ff88","#10b981","#059669","#a7f3d0"],crimson:["#ff1744","#d50000","#ff5252","#ffb74d"],obsidian:["#a855f7","#6366f1","#3b82f6","#ffffff"],glass:["#ffffff","#e0e7ff","#93c5fd","#60a5fa"]};function I({theme:e="gold",enabled:t=!0}){let{camera:r,raycaster:n}=(0,Z.useThree)(),[c,m]=(0,C.useState)([]),s=(0,C.useRef)(0),l=(0,C.useCallback)(o=>{if(!t)return;let a=0,i=0;if("touches"in o&&o.touches.length>0)a=o.touches[0].clientX,i=o.touches[0].clientY;else if("clientX"in o)a=o.clientX,i=o.clientY;else return;let f=new k.Vector2(a/window.innerWidth*2-1,-(i/window.innerHeight)*2+1);n.setFromCamera(f,r);let g=new k.Plane(new k.Vector3(0,0,1),0),d=new k.Vector3;if(n.ray.intersectPlane(g,d),!d)return;let b=ye[e]||ye.gold,u=35,p=[];for(let h=0;h<u;h++){let v=Math.random()*Math.PI*2,M=1.5+Math.random()*4.5,L=(Math.random()-.3)*3,oe=new k.Vector3(Math.cos(v)*M,Math.sin(v)*M+L,(Math.random()-.5)*M*.8),De=b[Math.floor(Math.random()*b.length)];p.push({id:h,position:d.clone(),velocity:oe,color:new k.Color(De),size:.08+Math.random()*.12,life:1,maxLife:.6+Math.random()*.8})}let x={id:s.current++,origin:d.clone(),sparks:p,color:b[0],lightIntensity:4,time:0};m(h=>[...h.slice(-4),x])},[r,n,e]);return(0,C.useEffect)(()=>(window.addEventListener("pointerdown",l),()=>{window.removeEventListener("pointerdown",l)}),[l]),(0,Z.useFrame)((o,a)=>{c.length!==0&&m(i=>i.map(f=>{let g=f.time+a,d=Math.max(0,f.lightIntensity-a*8),b=f.sparks.map(u=>{let p=u.life-a/u.maxLife;if(p<=0)return null;let x=u.position.clone().addScaledVector(u.velocity,a);return u.velocity.y-=a*3.5,u.velocity.multiplyScalar(.96),P(y({},u),{position:x,life:p})}).filter(Boolean);return b.length===0&&d<=0?null:P(y({},f),{time:g,lightIntensity:d,sparks:b})}).filter(Boolean))}),React.createElement("group",null,c.map(o=>React.createElement("group",{key:o.id},o.lightIntensity>.05&&React.createElement("pointLight",{position:o.origin,intensity:o.lightIntensity*3,distance:6,color:o.color}),o.sparks.map(a=>React.createElement("mesh",{key:a.id,position:a.position},React.createElement("sphereGeometry",{args:[a.size*a.life,6,6]}),React.createElement("meshBasicMaterial",{color:a.color,transparent:!0,opacity:a.life,toneMapped:!1}))))))}var R=require("react"),q=require("@react-three/fiber"),E=T(require("three"));var we={gold:"#FFD700",neon:"#00ffff",emerald:"#10b981",crimson:"#ff1744",obsidian:"#a855f7",glass:"#ffffff"};function _({theme:e="gold",enabled:t=!0}){let{camera:r,raycaster:n}=(0,q.useThree)(),[c,m]=(0,R.useState)([]),s=(0,R.useRef)(0),l=(0,R.useCallback)(o=>{if(!t)return;let a=0,i=0;if("touches"in o&&o.touches.length>0)a=o.touches[0].clientX,i=o.touches[0].clientY;else if("clientX"in o)a=o.clientX,i=o.clientY;else return;let f=new E.Vector2(a/window.innerWidth*2-1,-(i/window.innerHeight)*2+1);n.setFromCamera(f,r);let g=new E.Plane(new E.Vector3(0,0,1),0),d=new E.Vector3;if(n.ray.intersectPlane(g,d),!d)return;let b=we[e]||we.gold,u={id:s.current++,origin:d.clone(),radius:.1,maxRadius:3.5,life:1,color:new E.Color(b)};m(p=>[...p.slice(-4),u])},[r,n,e,t]);return(0,R.useEffect)(()=>(window.addEventListener("pointerdown",l),()=>{window.removeEventListener("pointerdown",l)}),[l]),(0,q.useFrame)((o,a)=>{c.length!==0&&m(i=>i.map(f=>{let g=f.life-a*1.8;if(g<=0)return null;let d=f.radius+a*5;return P(y({},f),{life:g,radius:d})}).filter(Boolean))}),t?React.createElement("group",null,c.map(o=>React.createElement("mesh",{key:o.id,position:o.origin,rotation:[0,0,0]},React.createElement("ringGeometry",{args:[o.radius*.9,o.radius,48]}),React.createElement("meshBasicMaterial",{color:o.color,transparent:!0,opacity:o.life*.75,side:E.DoubleSide,toneMapped:!1})))):null}var J=require("react"),Q=require("@react-three/fiber"),ee=T(require("three")),Ee={gold:"#ffaa00",neon:"#00ffff",emerald:"#00ffaa",crimson:"#ff0055",obsidian:"#9900ff",glass:"#88ccff"};function O({theme:e="neon",enabled:t=!0}){let{pointer:r}=(0,Q.useThree)(),n=(0,J.useRef)(null),c=Ee[e]||Ee.neon,m=30,s=(0,J.useMemo)(()=>{let l=new ee.BufferGeometry,o=new Float32Array(m*2*3);return l.setAttribute("position",new ee.BufferAttribute(o,3)),l},[m]);return(0,Q.useFrame)(l=>{if(!n.current||!t)return;let o=l.clock.getElapsedTime(),a=n.current.geometry.attributes.position,i=a.array,f=r.x*6,g=r.y*3;for(let d=0;d<m;d++){let b=d*6,u=d/m*Math.PI*2+o*2,p=2.5+Math.sin(o*4+d)*.5,x=Math.cos(u)*p,h=Math.sin(u)*p,v=(Math.random()-.5)*1.5,M=x+(f-x)*.3+(Math.random()-.5)*.8,L=h+(g-h)*.3+(Math.random()-.5)*.8,oe=v+(Math.random()-.5)*.8;i[b]=x,i[b+1]=h,i[b+2]=v,i[b+3]=M,i[b+4]=L,i[b+5]=oe}a.needsUpdate=!0}),t?React.createElement("lineSegments",{ref:n,geometry:s},React.createElement("lineBasicMaterial",{color:c,transparent:!0,opacity:.6,linewidth:2,toneMapped:!1})):null}var Me={gold:"radial-gradient(circle at center, #1c1503 0%, #080601 60%, #020201 100%)",neon:"radial-gradient(circle at center, #021a1e 0%, #030d14 60%, #010408 100%)",emerald:"radial-gradient(circle at center, #032117 0%, #02120d 60%, #010705 100%)",crimson:"radial-gradient(circle at center, #240409 0%, #120205 60%, #060102 100%)",obsidian:"radial-gradient(circle at center, #120d24 0%, #080512 60%, #030206 100%)",glass:"radial-gradient(circle at center, #0f172a 0%, #070b14 60%, #020205 100%)"},Je="/fonts/cinema_display.typeface.json";function Qe(e){let n=-(e.length*.65)/2;return e.split("").map((c,m)=>[n+m*.65,0,0])}function X({text:e="CINEMA",theme:t="emerald",customBackground:r,interactiveSparks:n=!0,interactiveShockwave:c=!0,interactivePlasma:m=!0,showParticles:s=!0,enableBloom:l=!0,className:o="",style:a,children:i}){let[f,g]=(0,z.useState)(e),[d,b]=(0,z.useState)(t),u=(f||e||"CINEMA").toUpperCase(),p=u.split(""),x=(0,z.useMemo)(()=>Qe(u),[u]),h=d||t||"emerald",v=r||Me[h]||Me.emerald;return React.createElement("div",{className:`relative w-full h-full min-h-[350px] overflow-hidden select-none ${o}`,style:y({background:v},a)},React.createElement("div",{className:"absolute inset-0 z-0 pointer-events-auto"},React.createElement(ke.Canvas,{camera:{position:[0,0,14],fov:45,near:.1,far:50},dpr:[1,2],gl:{antialias:!0,toneMapping:4,toneMappingExposure:1.2}},React.createElement(z.Suspense,{fallback:null},React.createElement(te.Environment,{preset:"studio"}),React.createElement("ambientLight",{intensity:.3}),React.createElement("directionalLight",{position:[5,8,5],intensity:1.5,color:"#ffffff"}),React.createElement("pointLight",{position:[-5,-3,-5],intensity:.6,color:h==="emerald"?"#10b981":h==="crimson"?"#ff1744":h==="neon"?"#00ffff":"#FFD700"}),React.createElement(A,{phase:"idle"}),React.createElement(I,{enabled:n,theme:h}),React.createElement(_,{enabled:c,theme:h}),React.createElement(O,{enabled:m,theme:h}),React.createElement(te.Center,{disableY:!0,disableZ:!0},React.createElement("group",null,p.map((M,L)=>React.createElement(H,{key:`${M}-${L}`,char:M,index:L,totalLetters:p.length,position:x[L],phase:"idle",theme:h,fontUrl:Je})))),s&&React.createElement(B,{theme:h,visible:!0}),React.createElement(N.EffectComposer,null,React.createElement(N.Bloom,{luminanceThreshold:.7,luminanceSmoothing:.9,intensity:l?.9:0,mipmapBlur:!0}),React.createElement(N.Vignette,{offset:.3,darkness:.85}),React.createElement(N.Noise,{opacity:.025}))))),i&&React.createElement("div",{className:"relative z-10 w-full h-full pointer-events-none flex flex-col items-center justify-center"},i))}function Te(e,t={}){let r=n=>le.default.createElement(X,y({},t),le.default.createElement(e,y({},n)));return r.displayName=`WithCinema3D(${e.displayName||e.name||"Component"})`,r}var w=require("react"),Re=require("@react-three/fiber"),re=require("@react-three/drei"),S=require("@react-three/postprocessing");var et=[{key:"gold",label:"Gold",color:"#FFD700"},{key:"neon",label:"Neon",color:"#00ffff"},{key:"emerald",label:"Emerald",color:"#10b981"},{key:"crimson",label:"Crimson",color:"#ff1744"},{key:"obsidian",label:"Obsidian",color:"#a855f7"},{key:"glass",label:"Glass",color:"#ffffff"}];function $({phase:e,cinemaName:t,theme:r,effects:n,onTitleChange:c,onThemeChange:m,onToggleEffect:s}){return React.createElement("div",{className:"absolute inset-0 pointer-events-none z-10 flex flex-col items-center justify-between p-6 md:p-10",style:{opacity:e==="exiting"?0:1,transition:"opacity 0.8s ease-out"}},React.createElement("div",{className:"w-full max-w-xl flex flex-col items-center gap-2 pointer-events-auto",style:{opacity:e==="idle"||e==="entering"?1:0,transform:e==="idle"||e==="entering"?"translateY(0)":"translateY(-20px)",transition:"all 1s ease-out 0.3s"}},React.createElement("label",{className:"text-[10px] tracking-[0.3em] uppercase text-white/50 font-bold"},"Live 3D Title Control"),React.createElement("div",{className:"relative w-full"},React.createElement("input",{type:"text",value:t,onChange:a=>c(a.target.value),maxLength:18,placeholder:"Type any title...",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",style:{background:"rgba(255, 255, 255, 0.08)",backdropFilter:"blur(16px)",border:"1px solid rgba(255, 255, 255, 0.2)",color:"#ffffff",boxShadow:"0 8px 32px rgba(0, 0, 0, 0.37)"}}))),e==="loading"&&React.createElement("div",{className:"absolute inset-0 flex items-center justify-center"},React.createElement("div",{className:"w-16 h-16 rounded-full border-2 animate-spin",style:{borderColor:"transparent",borderTopColor:"rgba(255, 215, 0, 0.8)",borderRightColor:"rgba(255, 215, 0, 0.3)"}})),React.createElement("div",{className:"w-full max-w-3xl flex flex-col items-center gap-5"},React.createElement("div",{className:"flex flex-wrap items-center justify-center gap-2 pointer-events-auto",style:{opacity:e==="idle"||e==="entering"?1:0,transition:"opacity 1s ease-out 0.8s"}},React.createElement("span",{className:"text-[9px] uppercase tracking-[0.25em] text-white/40 mr-2 font-bold"},"Effects"),React.createElement("button",{onClick:()=>s("sparks"),className:`px-4 py-1.5 rounded-full text-[11px] font-bold tracking-wider uppercase transition-all duration-300 cursor-pointer ${n.sparks?"bg-amber-500/30 text-amber-200 border-amber-400/60 shadow-[0_0_15px_rgba(245,158,11,0.4)]":"bg-white/5 text-white/40 border-white/10 hover:text-white/70"} border`},"\u{1F525} Sparks"),React.createElement("button",{onClick:()=>s("shockwave"),className:`px-4 py-1.5 rounded-full text-[11px] font-bold tracking-wider uppercase transition-all duration-300 cursor-pointer ${n.shockwave?"bg-cyan-500/30 text-cyan-200 border-cyan-400/60 shadow-[0_0_15px_rgba(6,182,212,0.4)]":"bg-white/5 text-white/40 border-white/10 hover:text-white/70"} border`},"\u{1F30A} Wave"),React.createElement("button",{onClick:()=>s("plasma"),className:`px-4 py-1.5 rounded-full text-[11px] font-bold tracking-wider uppercase transition-all duration-300 cursor-pointer ${n.plasma?"bg-purple-500/30 text-purple-200 border-purple-400/60 shadow-[0_0_15px_rgba(168,85,247,0.4)]":"bg-white/5 text-white/40 border-white/10 hover:text-white/70"} border`},"\u26A1 Plasma"),React.createElement("button",{onClick:()=>s("embers"),className:`px-4 py-1.5 rounded-full text-[11px] font-bold tracking-wider uppercase transition-all duration-300 cursor-pointer ${n.embers?"bg-emerald-500/30 text-emerald-200 border-emerald-400/60 shadow-[0_0_15px_rgba(16,185,129,0.4)]":"bg-white/5 text-white/40 border-white/10 hover:text-white/70"} border`},"\u2728 Embers")),React.createElement("div",{className:"flex items-center gap-3 pointer-events-auto",style:{opacity:e==="idle"||e==="entering"?1:0,transition:"opacity 1s ease-out 1.2s"}},React.createElement("span",{className:"text-[10px] uppercase tracking-[0.3em] text-white/40 mr-2 font-bold"},"Theme"),React.createElement("div",{className:"flex items-center gap-2 md:gap-3"},et.map(a=>{let i=r===a.key;return React.createElement("button",{key:a.key,onClick:()=>m(a.key),className:"group relative flex flex-col items-center gap-1.5 cursor-pointer outline-none","aria-label":`Switch to ${a.label} theme`},React.createElement("div",{className:"relative w-11 h-7 md:w-14 md:h-9 rounded-md overflow-hidden transition-all duration-300",style:{border:i?`2px solid ${a.color}`:"1px solid rgba(255, 255, 255, 0.15)",transform:i?"scale(1.1) translateY(-2px)":"scale(1) translateY(0)",boxShadow:i?`0 4px 20px ${a.color}60`:"0 2px 10px rgba(0,0,0,0.5)"}},React.createElement("div",{className:"absolute inset-0 opacity-80",style:{backgroundColor:a.color}})),React.createElement("span",{className:"text-[9px] uppercase tracking-widest font-semibold transition-colors duration-300",style:{color:i?"#ffffff":"rgba(255, 255, 255, 0.4)"}},a.label))})))))}var tt="/fonts/cinema_display.typeface.json",Ce={gold:"radial-gradient(circle at center, #1c1503 0%, #080601 60%, #020201 100%)",neon:"radial-gradient(circle at center, #021a1e 0%, #030d14 60%, #010408 100%)",emerald:"radial-gradient(circle at center, #032117 0%, #02120d 60%, #010705 100%)",crimson:"radial-gradient(circle at center, #240409 0%, #120205 60%, #060102 100%)",obsidian:"radial-gradient(circle at center, #120d24 0%, #080512 60%, #030206 100%)",glass:"radial-gradient(circle at center, #0f172a 0%, #070b14 60%, #020205 100%)"};function rt(e){let n=-(e.length*.65)/2;return e.split("").map((c,m)=>[n+m*.65,0,0])}function ce({cinemaName:e="CINEMULTIPLEX",defaultTheme:t="emerald",customBackground:r,onEnterCinema:n}){let[c,m]=(0,w.useState)("loading"),[s,l]=(0,w.useState)(t),[o,a]=(0,w.useState)(e),[i,f]=(0,w.useState)({sparks:!0,shockwave:!0,plasma:!0,embers:!0}),g=(o||"CINEMA").toUpperCase(),d=g.split(""),b=(0,w.useMemo)(()=>rt(g),[g]);(0,w.useEffect)(()=>{let h=setTimeout(()=>m("entering"),800),v=d.length*120+1500,M=setTimeout(()=>m("idle"),800+v);return()=>{clearTimeout(h),clearTimeout(M)}},[d.length]);let u=(0,w.useCallback)(()=>{m("exiting"),setTimeout(()=>{n&&n()},1800)},[n]),p=(0,w.useCallback)(h=>{f(v=>P(y({},v),{[h]:!v[h]}))},[]),x=r||Ce[s]||Ce.emerald;return React.createElement("div",{className:"fixed inset-0 w-screen h-screen transition-all duration-1000 select-none overflow-hidden",style:{background:x}},React.createElement(Re.Canvas,{camera:{position:[0,0,14],fov:45,near:.1,far:50},dpr:[1,2],gl:{antialias:!0,toneMapping:4,toneMappingExposure:1.2}},React.createElement(w.Suspense,{fallback:null},React.createElement(re.Environment,{preset:"studio"}),React.createElement("ambientLight",{intensity:.3}),React.createElement("directionalLight",{position:[5,8,5],intensity:1.5,color:"#ffffff"}),React.createElement("pointLight",{position:[-5,-3,-5],intensity:.6,color:s==="emerald"?"#10b981":s==="crimson"?"#ff1744":s==="neon"?"#00ffff":"#FFD700"}),React.createElement("spotLight",{position:[0,10,0],angle:.4,penumbra:.8,intensity:.9,color:"#ffffff"}),React.createElement("pointLight",{position:[0,0,-5],intensity:.4,color:"#ffffff"}),React.createElement(A,{phase:c}),i.sparks&&React.createElement(I,{theme:s}),React.createElement(_,{theme:s,enabled:i.shockwave}),React.createElement(O,{theme:s,enabled:i.plasma}),React.createElement(re.Center,{disableY:!0,disableZ:!0},React.createElement("group",null,d.map((h,v)=>React.createElement(H,{key:`${h}-${v}`,char:h,index:v,totalLetters:d.length,position:b[v],phase:c,theme:s,fontUrl:tt})))),React.createElement(B,{theme:s,visible:c!=="loading"&&i.embers}),React.createElement(S.EffectComposer,null,React.createElement(S.Bloom,{luminanceThreshold:.7,luminanceSmoothing:.9,intensity:s==="neon"||s==="emerald"||s==="crimson"?1.4:.7,mipmapBlur:!0}),React.createElement(S.Vignette,{offset:.3,darkness:.85}),React.createElement(S.Noise,{opacity:.025})))),React.createElement($,{phase:c,cinemaName:o,theme:s,effects:i,onTitleChange:a,onThemeChange:l,onToggleEffect:p}))}var ze=require("next-intl");var Ne=require("next-intl/routing"),Se=require("next-intl/navigation"),nt=(0,Ne.defineRouting)({locales:["en","es"],defaultLocale:"en"}),{Link:U,redirect:It,usePathname:Le,useRouter:Pe}=(0,Se.createNavigation)(nt);var He=require("next-intl");var Be=require("lucide-react");function me(){let e=(0,He.useLocale)(),t=Pe(),r=Le();return React.createElement("button",{onClick:()=>{let c=e==="en"?"es":"en";t.replace(r,{locale:c})},className:"flex items-center gap-2 text-sm font-medium text-muted-foreground hover:text-white transition-colors uppercase tracking-wider"},React.createElement(Be.Globe,{className:"w-4 h-4"}),e==="en"?"ES":"EN")}var ne=T(require("react")),_e=require("@radix-ui/react-slot"),Oe=require("class-variance-authority");var Fe=require("clsx"),Ae=require("tailwind-merge");function Ie(...e){return(0,Ae.twMerge)((0,Fe.clsx)(e))}var ot=(0,Oe.cva)("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",{variants:{variant:{default:"bg-primary text-primary-foreground shadow hover:bg-primary/90",destructive:"bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90",outline:"border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground",secondary:"bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80",ghost:"hover:bg-accent hover:text-accent-foreground",link:"text-primary underline-offset-4 hover:underline"},size:{default:"h-9 px-4 py-2",sm:"h-8 rounded-md px-3 text-xs",lg:"h-10 rounded-md px-8",icon:"h-9 w-9"}},defaultVariants:{variant:"default",size:"default"}}),j=ne.forwardRef((s,m)=>{var l=s,{className:e,variant:t,size:r,asChild:n=!1}=l,c=pe(l,["className","variant","size","asChild"]);return ne.createElement(n?_e.Slot:"button",y({className:Ie(ot({variant:t,size:r,className:e})),ref:m},c))});j.displayName="Button";function de({cinemaName:e="NOVA",webTheme:t="neon"}){let r=(0,ze.useTranslations)(),n=t==="noir"?"bg-slate-900/40 mix-blend-color":t==="crimson"?"bg-red-900/30 mix-blend-color":"bg-blue-900/20 mix-blend-color";return React.createElement("div",{className:`min-h-screen bg-black text-white selection:bg-white/30 font-sans transition-colors duration-1000 group theme-${t}`},React.createElement("nav",{className:"absolute top-0 left-0 right-0 z-50 flex items-center justify-between px-8 py-6 mix-blend-difference"},React.createElement("div",{className:"flex items-center gap-12"},React.createElement(U,{href:"/",className:"text-3xl font-bold tracking-tighter uppercase font-display"},e,"."),React.createElement("div",{className:"hidden md:flex items-center gap-8 text-sm font-semibold tracking-widest text-white/70"},React.createElement(U,{href:"/schedule",className:"hover:text-white transition-colors"},r("nav.schedule")),React.createElement(U,{href:"/experiences",className:"hover:text-white transition-colors"},r("nav.experiences")),React.createElement(U,{href:"/membership",className:"hover:text-white transition-colors"},r("nav.membership")))),React.createElement("div",{className:"flex items-center gap-6"},React.createElement(me,null),React.createElement("div",{className:"hidden sm:flex items-center gap-4"},React.createElement(U,{href:"/login",className:"text-sm font-semibold tracking-widest text-white/70 hover:text-white transition-colors"},r("nav.login")),React.createElement(j,{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"},r("nav.bookTickets"))))),React.createElement("div",{className:"relative h-screen w-full flex flex-col justify-end pb-24 px-8 md:px-16 overflow-hidden"},React.createElement("div",{className:"absolute inset-0 z-0"},React.createElement("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"}),React.createElement("div",{className:"absolute inset-0 bg-gradient-to-t from-black via-black/50 to-transparent z-10"}),React.createElement("div",{className:`absolute inset-0 ${n} z-10`})),React.createElement("div",{className:"relative z-20 max-w-5xl"},React.createElement("div",{className:"flex items-center gap-3 mb-6"},React.createElement("span",{className:"bg-blue-600 text-white text-[10px] font-bold px-3 py-1 tracking-widest"},r("hero.genreImax")),React.createElement("span",{className:"border border-white/20 text-white/80 text-[10px] font-bold px-3 py-1 tracking-widest"},r("hero.genreAction"))),React.createElement("h1",{className:"text-6xl md:text-[8rem] leading-[0.85] font-display font-black tracking-tighter mb-6 uppercase drop-shadow-2xl"},r("hero.title")),React.createElement("p",{className:"max-w-2xl text-lg md:text-xl text-white/70 font-medium mb-10 leading-relaxed drop-shadow-md"},r("hero.synopsis")),React.createElement("div",{className:"flex flex-col sm:flex-row items-start sm:items-center gap-4"},React.createElement(j,{className:"rounded-none bg-white text-black hover:bg-white/90 font-bold tracking-widest text-xs px-8 py-6 uppercase transition-transform hover:scale-105 active:scale-95"},r("hero.getTickets")),React.createElement(j,{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-8 py-6 uppercase"},r("hero.watchTrailer"))))))}0&&(module.exports={AnimatedLetter,CameraRig,CinemaBackground,CinemaHome,CinemaLoader,ClickFireSparks,ClickShockwave,ElectricPlasma,LoaderOverlay,SceneParticles,withCinema3D});
|
|
3
3
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/components/3d/AnimatedLetter.tsx","../src/components/3d/CameraRig.tsx","../src/components/3d/CinemaLoader.tsx","../src/components/3d/SceneParticles.tsx","../src/components/3d/LoaderOverlay.tsx","../src/components/3d/ClickFireSparks.tsx","../src/components/CinemaBackground.tsx","../src/components/CinemaHome.tsx","../src/i18n/routing.ts","../src/components/LocaleSwitcher.tsx","../src/components/ui/button.tsx","../src/lib/utils.ts"],"sourcesContent":["export { default as AnimatedLetter, type MaterialTheme } from \"./components/3d/AnimatedLetter\";\nexport { default as CameraRig } from \"./components/3d/CameraRig\";\nexport { default as CinemaLoader } from \"./components/3d/CinemaLoader\";\nexport { default as ClickFireSparks } from \"./components/3d/ClickFireSparks\";\nexport { default as LoaderOverlay } from \"./components/3d/LoaderOverlay\";\nexport { default as SceneParticles } from \"./components/3d/SceneParticles\";\nexport { default as CinemaBackground, type CinemaBackgroundProps } from \"./components/CinemaBackground\";\nexport { default as CinemaHome } from \"./components/CinemaHome\";\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 } from \"react\";\nimport { useFrame, useThree } from \"@react-three/fiber\";\nimport * as THREE from \"three\";\n\ninterface CameraRigProps {\n phase: \"loading\" | \"entering\" | \"idle\" | \"exiting\";\n}\n\nexport default function CameraRig({ phase }: CameraRigProps) {\n const { camera, pointer } = useThree();\n const startTimeRef = useRef<number | null>(null);\n const phaseRef = useRef(phase);\n\n // Reset timer when phase changes\n if (phaseRef.current !== phase) {\n phaseRef.current = phase;\n startTimeRef.current = null;\n }\n\n useFrame((state) => {\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\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 // Cinematic dolly-in from z:14 → z:6\n const t = Math.min(elapsed / 3, 1);\n const eased = 1 - Math.pow(1 - t, 3); // cubic ease-out\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 if (phase === \"idle\") {\n // Gentle circular drift + mouse parallax\n const driftX = Math.sin(time * 0.15) * 0.3;\n const driftY = Math.cos(time * 0.1) * 0.15 + 0.2;\n\n // Mouse parallax (subtle)\n const mouseX = pointer.x * 0.3;\n const mouseY = pointer.y * 0.15;\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 6,\n 3,\n 0.016\n );\n camera.lookAt(0, 0, 0);\n return;\n }\n\n if (phase === \"exiting\") {\n // Rapid zoom-through\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 { 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 from \"./LoaderOverlay\";\nimport ClickFireSparks from \"./ClickFireSparks\";\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%, #020408 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 = \"gold\",\n customBackground,\n onEnterCinema,\n}: CinemaLoaderProps) {\n const [phase, setPhase] = useState<AnimationPhase>(\"loading\");\n const [theme, setTheme] = useState<MaterialTheme>(defaultTheme);\n\n const displayName = cinemaName.toUpperCase();\n const letters = displayName.split(\"\");\n const positions = useMemo(\n () => computeLetterPositions(displayName),\n [displayName]\n );\n\n // Animation timeline\n useEffect(() => {\n // Phase 1: loading → entering after 800ms (give scene time to mount)\n const t1 = setTimeout(() => setPhase(\"entering\"), 800);\n\n // Phase 2: entering → idle after letters finish animating\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 // Wait for exit animation to finish\n setTimeout(() => {\n onEnterCinema();\n }, 1800);\n }, [onEnterCinema]);\n\n const currentBg = customBackground || THEME_BACKGROUNDS[theme] || THEME_BACKGROUNDS.gold;\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 {/* Dynamic lighting based on theme */}\n <ambientLight intensity={0.2} />\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\" ? \"#10b981\"\n : theme === \"crimson\" ? \"#ff1744\"\n : theme === \"neon\" ? \"#00ffff\"\n : theme === \"obsidian\" ? \"#a855f7\"\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 {/* Interactive Fire Sparks on Click */}\n <ClickFireSparks theme={theme} />\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 particles */}\n <SceneParticles\n theme={theme}\n visible={phase !== \"loading\"}\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 */}\n <LoaderOverlay\n phase={phase}\n cinemaName={cinemaName}\n theme={theme}\n onEnter={handleEnter}\n onThemeChange={setTheme}\n />\n </div>\n );\n}\n","\"use client\";\n\nimport { useRef } 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 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\n/**\n * Custom slow-orbit dust motes for depth parallax\n */\nfunction DustMotes({ color, count = 60 }: { color: string; 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();\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, visible }: SceneParticlesProps) {\n const color = THEME_PARTICLE_COLORS[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}\n opacity={0.8}\n color={color}\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}\n opacity={0.4}\n color=\"#ffffff\"\n noise={0.8}\n />\n\n {/* Custom dust motes for depth parallax */}\n <DustMotes color={color} count={50} />\n </group>\n );\n}\n","\"use client\";\n\nimport type { MaterialTheme } from \"./AnimatedLetter\";\n\ninterface LoaderOverlayProps {\n phase: \"loading\" | \"entering\" | \"idle\" | \"exiting\";\n cinemaName: string;\n theme: MaterialTheme;\n onEnter: () => void;\n onThemeChange: (theme: MaterialTheme) => 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 onEnter,\n onThemeChange,\n}: LoaderOverlayProps) {\n const showEnterButton = phase === \"idle\";\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\"\n style={{ opacity: isExiting ? 0 : 1, transition: \"opacity 0.8s ease-out\" }}\n >\n {/* Top tagline */}\n <div\n className=\"pt-12 text-center flex flex-col items-center gap-1\"\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.5s\",\n }}\n >\n <p\n className=\"text-xs tracking-[0.4em] uppercase font-bold\"\n style={{\n color: \"rgba(255, 255, 255, 0.6)\",\n fontFamily: \"var(--font-syne), sans-serif\",\n textShadow: \"0 2px 10px rgba(0,0,0,0.8)\",\n }}\n >\n Premium Cinema Experience\n </p>\n <p\n className=\"text-[10px] tracking-[0.25em] uppercase\"\n style={{\n color: \"rgba(255, 255, 255, 0.4)\",\n fontFamily: \"sans-serif\",\n }}\n >\n ✦ Click anywhere for fire sparks ✦\n </p>\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-slow\"\n style={{\n borderColor: \"transparent\",\n borderTopColor: \"rgba(255, 215, 0, 0.6)\",\n borderRightColor: \"rgba(255, 215, 0, 0.2)\",\n }}\n />\n </div>\n )}\n\n {/* Bottom section: Enter button + Theme selector */}\n <div className=\"pb-12 flex flex-col items-center gap-6\">\n {/* Enter Cinema button */}\n <button\n onClick={onEnter}\n className=\"pointer-events-auto px-10 py-3.5 rounded-full text-sm font-semibold tracking-widest uppercase transition-all duration-500 cursor-pointer\"\n style={{\n opacity: showEnterButton ? 1 : 0,\n transform: showEnterButton\n ? \"translateY(0) scale(1)\"\n : \"translateY(20px) scale(0.95)\",\n transition: \"all 0.8s cubic-bezier(0.16, 1, 0.3, 1)\",\n fontFamily: \"var(--font-syne), sans-serif\",\n background: \"rgba(255, 255, 255, 0.06)\",\n backdropFilter: \"blur(20px)\",\n border: \"1px solid rgba(255, 255, 255, 0.1)\",\n color: \"#f0f0f0\",\n boxShadow: \"0 0 30px rgba(255, 215, 0, 0.15)\",\n pointerEvents: showEnterButton ? \"auto\" : \"none\",\n }}\n id=\"enter-cinema-button\"\n aria-label={`Enter ${cinemaName}`}\n >\n Enter {cinemaName}\n </button>\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.5s\",\n }}\n >\n <span\n className=\"text-[10px] uppercase tracking-[0.3em] mr-4\"\n style={{ color: \"rgba(255, 255, 255, 0.4)\", fontFamily: \"var(--font-syne), sans-serif\" }}\n >\n Theme\n </span>\n <div className=\"flex items-center 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-2 cursor-pointer outline-none\"\n id={`theme-selector-${opt.key}`}\n aria-label={`Switch to ${opt.label} theme`}\n >\n {/* The animated card */}\n <div\n className=\"relative w-14 h-9 rounded-md overflow-hidden transition-all duration-500\"\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}40` : \"0 2px 10px rgba(0,0,0,0.5)\",\n }}\n >\n {/* Background matching the theme's core color */}\n <div className=\"absolute inset-0 opacity-80\" style={{ backgroundColor: opt.color }} />\n \n {/* Theme-specific animations via CSS */}\n <div\n className=\"absolute inset-0 opacity-0 group-hover:opacity-100 transition-opacity duration-300\"\n style={{\n background:\n opt.key === \"gold\"\n ? \"conic-gradient(from 0deg, transparent, rgba(255,255,255,0.5), transparent)\"\n : opt.key === \"neon\"\n ? \"radial-gradient(circle at center, rgba(255,255,255,0.8) 0%, transparent 70%)\"\n : opt.key === \"obsidian\"\n ? \"linear-gradient(45deg, transparent 40%, rgba(255,255,255,0.3) 50%, transparent 60%)\"\n : \"linear-gradient(to right, rgba(255,255,255,0.1), rgba(255,255,255,0.5), rgba(255,255,255,0.1))\",\n animation:\n opt.key === \"gold\" ? \"spin-slow 3s linear infinite\"\n : opt.key === \"neon\" ? \"pulse-glow 2s ease-in-out infinite\"\n : opt.key === \"obsidian\" ? \"shimmer 2s linear infinite\"\n : \"shimmer 3s linear infinite\",\n backgroundSize: opt.key === \"obsidian\" || opt.key === \"glass\" ? \"200% 100%\" : \"auto\",\n }}\n />\n </div>\n \n {/* Label below the card */}\n <span\n className=\"text-[9px] uppercase tracking-widest transition-colors duration-300\"\n style={{\n color: isActive ? \"#ffffff\" : \"rgba(255, 255, 255, 0.4)\",\n fontFamily: \"var(--font-inter), sans-serif\",\n }}\n >\n {opt.label}\n </span>\n </button>\n );\n })}\n </div>\n </div>\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport { useState, useRef, useCallback, useEffect } 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\nexport default function ClickFireSparks({ theme = \"gold\" }: { theme?: MaterialTheme }) {\n const { camera, raycaster, pointer } = useThree();\n const [bursts, setBursts] = useState<SparkBurst[]>([]);\n const nextId = useRef(0);\n\n const handlePointerDown = useCallback(\n (event: MouseEvent | TouchEvent) => {\n // Get click coordinates in normalized device coordinates (-1 to +1)\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 // Project onto a plane at z = 0\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 palette = THEME_SPARK_COLORS[theme] || THEME_SPARK_COLORS.gold;\n const sparkCount = 35;\n const newSparks: Spark[] = [];\n\n for (let i = 0; i < sparkCount; i++) {\n // Random direction burst\n const angle = Math.random() * Math.PI * 2;\n const speed = 1.5 + Math.random() * 4.5;\n const elevation = (Math.random() - 0.3) * 3;\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 = palette[Math.floor(Math.random() * palette.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,\n });\n }\n\n const newBurst: SparkBurst = {\n id: nextId.current++,\n origin: intersectionPoint.clone(),\n sparks: newSparks,\n color: palette[0],\n lightIntensity: 4.0,\n time: 0,\n };\n\n setBursts((prev) => [...prev.slice(-4), newBurst]); // Keep max 5 active bursts\n },\n [camera, raycaster, theme]\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;\n const updatedLight = Math.max(0, burst.lightIntensity - delta * 8.0);\n\n const updatedSparks = burst.sparks\n .map((spark) => {\n const newLife = spark.life - delta / spark.maxLife;\n if (newLife <= 0) return null;\n\n // Apply velocity + light gravity\n const newPos = spark.position\n .clone()\n .addScaledVector(spark.velocity, delta);\n spark.velocity.y -= delta * 3.5; // 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 {/* Temporary point light burst at click site */}\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 {/* Render individual sparks as small glowing spheres */}\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 { Suspense, useMemo } from \"react\";\nimport { Canvas } from \"@react-three/fiber\";\nimport { Environment, Center } from \"@react-three/drei\";\nimport { EffectComposer, Bloom, Vignette } 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\";\n\nexport interface CinemaBackgroundProps {\n text?: string;\n theme?: MaterialTheme;\n customBackground?: string;\n interactiveSparks?: boolean;\n showParticles?: boolean;\n className?: string;\n style?: React.CSSProperties;\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%, #020408 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 * Reusable 3D Cinema Background Component.\n * Fits dynamically inside any parent container (div, header, section).\n */\nexport default function CinemaBackground({\n text = \"CINEMA\",\n theme = \"emerald\",\n customBackground,\n interactiveSparks = true,\n showParticles = true,\n className = \"\",\n style,\n children,\n}: CinemaBackgroundProps) {\n const displayName = text.toUpperCase();\n const letters = displayName.split(\"\");\n const positions = useMemo(() => computeLetterPositions(displayName), [displayName]);\n const currentBg = customBackground || THEME_BACKGROUNDS[theme] || 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 theme === \"emerald\"\n ? \"#10b981\"\n : theme === \"crimson\"\n ? \"#ff1744\"\n : theme === \"neon\"\n ? \"#00ffff\"\n : \"#FFD700\"\n }\n />\n\n <CameraRig phase=\"idle\" />\n {interactiveSparks && <ClickFireSparks theme={theme} />}\n\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={theme}\n fontUrl={FONT_URL}\n />\n ))}\n </group>\n </Center>\n\n {showParticles && <SceneParticles theme={theme} visible={true} />}\n\n <EffectComposer>\n <Bloom luminanceThreshold={0.7} luminanceSmoothing={0.9} intensity={0.8} mipmapBlur />\n <Vignette offset={0.3} darkness={0.85} />\n </EffectComposer>\n </Suspense>\n </Canvas>\n </div>\n\n {/* Children overlay on top of 3D Canvas (e.g. text content, forms, CTA buttons) */}\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 { 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\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-8 py-6 mix-blend-difference\">\n <div className=\"flex items-center gap-12\">\n <Link href=\"/\" className=\"text-3xl font-bold tracking-tighter uppercase font-display\">\n {cinemaName}.\n </Link>\n <div className=\"hidden md:flex items-center 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 <div className=\"flex items-center 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 </div>\n </nav>\n\n {/* Hero Section */}\n <div className=\"relative h-screen w-full flex flex-col justify-end pb-24 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-3 mb-6\">\n <span className=\"bg-blue-600 text-white text-[10px] font-bold px-3 py-1 tracking-widest\">\n {t(\"hero.genreImax\")}\n </span>\n <span className=\"border border-white/20 text-white/80 text-[10px] font-bold px-3 py-1 tracking-widest\">\n {t(\"hero.genreAction\")}\n </span>\n </div>\n \n <h1 className=\"text-6xl md:text-[8rem] leading-[0.85] font-display font-black tracking-tighter mb-6 uppercase drop-shadow-2xl\">\n {t(\"hero.title\")}\n </h1>\n \n <p className=\"max-w-2xl text-lg md:text-xl text-white/70 font-medium mb-10 leading-relaxed drop-shadow-md\">\n {t(\"hero.synopsis\")}\n </p>\n\n <div className=\"flex flex-col sm:flex-row items-start sm:items-center gap-4\">\n <Button className=\"rounded-none bg-white text-black hover:bg-white/90 font-bold tracking-widest text-xs px-8 py-6 uppercase transition-transform hover:scale-105 active:scale-95\">\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-8 py-6 uppercase\">\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"],"mappings":"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","names":["index_exports","__export","AnimatedLetter","CameraRig","CinemaBackground","CinemaHome","CinemaLoader","ClickFireSparks","LoaderOverlay","SceneParticles","__toCommonJS","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","THREE","CameraRig","phase","camera","pointer","startTimeRef","phaseRef","state","time","elapsed","t","eased","z","y","driftX","driftY","mouseX","mouseY","import_react","import_fiber","import_drei","import_postprocessing","import_react","import_fiber","import_drei","THREE","THEME_PARTICLE_COLORS","DustMotes","color","count","meshRef","dummy","speeds","offsets","i","state","time","speed","ox","oy","oz","SceneParticles","theme","visible","THEME_OPTIONS","LoaderOverlay","phase","cinemaName","theme","onEnter","onThemeChange","showEnterButton","opt","isActive","import_react","import_fiber","THREE","THEME_SPARK_COLORS","ClickFireSparks","theme","camera","raycaster","pointer","bursts","setBursts","nextId","handlePointerDown","event","clientX","clientY","ndc","plane","intersectionPoint","palette","sparkCount","newSparks","i","angle","speed","elevation","velocity","hexColor","newBurst","prev","_","delta","prevBursts","burst","updatedTime","updatedLight","updatedSparks","spark","newLife","newPos","__spreadProps","__spreadValues","FONT_URL","THEME_BACKGROUNDS","computeLetterPositions","text","startX","_","i","CinemaLoader","cinemaName","defaultTheme","customBackground","onEnterCinema","phase","setPhase","theme","setTheme","displayName","letters","positions","t1","totalLetterTime","t2","handleEnter","currentBg","CameraRig","ClickFireSparks","char","AnimatedLetter","SceneParticles","LoaderOverlay","import_react","import_fiber","import_drei","import_postprocessing","THEME_BACKGROUNDS","FONT_URL","computeLetterPositions","text","startX","_","i","CinemaBackground","theme","customBackground","interactiveSparks","showParticles","className","style","children","displayName","letters","positions","currentBg","__spreadValues","CameraRig","ClickFireSparks","char","AnimatedLetter","SceneParticles","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","themeOverlay","Link","LocaleSwitcher","Button"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/components/hoc/withCinema3D.tsx","../src/components/CinemaBackground.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/CinemaLoader.tsx","../src/components/3d/LoaderOverlay.tsx","../src/components/CinemaHome.tsx","../src/i18n/routing.ts","../src/components/LocaleSwitcher.tsx","../src/components/ui/button.tsx","../src/lib/utils.ts"],"sourcesContent":["// 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 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 from \"react\";\nimport CinemaBackground, { type CinemaBackgroundProps } from \"../CinemaBackground\";\n\nexport interface WithCinema3DOptions extends 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 { 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 } 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 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\n/**\n * Custom slow-orbit dust motes for depth parallax\n */\nfunction DustMotes({ color, count = 60 }: { color: string; 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();\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, visible }: SceneParticlesProps) {\n const color = THEME_PARTICLE_COLORS[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}\n opacity={0.8}\n color={color}\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}\n opacity={0.4}\n color=\"#ffffff\"\n noise={0.8}\n />\n\n {/* Custom dust motes for depth parallax */}\n <DustMotes color={color} 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}\n\nexport default function CameraRig({ phase }: CameraRigProps) {\n const { camera, pointer } = useThree();\n const startTimeRef = useRef<number | null>(null);\n const phaseRef = useRef(phase);\n\n // Reset timer when phase changes\n if (phaseRef.current !== phase) {\n phaseRef.current = phase;\n startTimeRef.current = null;\n }\n\n useFrame((state) => {\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\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 // Cinematic dolly-in from z:14 → z:6\n const t = Math.min(elapsed / 3, 1);\n const eased = 1 - Math.pow(1 - t, 3); // cubic ease-out\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 if (phase === \"idle\") {\n // Gentle circular drift + mouse parallax\n const driftX = Math.sin(time * 0.15) * 0.3;\n const driftY = Math.cos(time * 0.1) * 0.15 + 0.2;\n\n // Mouse parallax (subtle)\n const mouseX = pointer.x * 0.3;\n const mouseY = pointer.y * 0.15;\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 6,\n 3,\n 0.016\n );\n camera.lookAt(0, 0, 0);\n return;\n }\n\n if (phase === \"exiting\") {\n // Rapid zoom-through\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 } 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\nexport default function ClickFireSparks({\n theme = \"gold\",\n enabled = true,\n}: {\n theme?: MaterialTheme;\n enabled?: boolean;\n}) {\n const { camera, raycaster } = useThree();\n const [bursts, setBursts] = useState<SparkBurst[]>([]);\n const nextId = useRef(0);\n\n const handlePointerDown = useCallback(\n (event: MouseEvent | TouchEvent) => {\n if (!enabled) return;\n // Get click coordinates in normalized device coordinates (-1 to +1)\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 // Project onto a plane at z = 0\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 palette = THEME_SPARK_COLORS[theme] || THEME_SPARK_COLORS.gold;\n const sparkCount = 35;\n const newSparks: Spark[] = [];\n\n for (let i = 0; i < sparkCount; i++) {\n // Random direction burst\n const angle = Math.random() * Math.PI * 2;\n const speed = 1.5 + Math.random() * 4.5;\n const elevation = (Math.random() - 0.3) * 3;\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 = palette[Math.floor(Math.random() * palette.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,\n });\n }\n\n const newBurst: SparkBurst = {\n id: nextId.current++,\n origin: intersectionPoint.clone(),\n sparks: newSparks,\n color: palette[0],\n lightIntensity: 4.0,\n time: 0,\n };\n\n setBursts((prev) => [...prev.slice(-4), newBurst]); // Keep max 5 active bursts\n },\n [camera, raycaster, theme]\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;\n const updatedLight = Math.max(0, burst.lightIntensity - delta * 8.0);\n\n const updatedSparks = burst.sparks\n .map((spark) => {\n const newLife = spark.life - delta / spark.maxLife;\n if (newLife <= 0) return null;\n\n // Apply velocity + light gravity\n const newPos = spark.position\n .clone()\n .addScaledVector(spark.velocity, delta);\n spark.velocity.y -= delta * 3.5; // 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 {/* Temporary point light burst at click site */}\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 {/* Render individual sparks as small glowing spheres */}\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 } 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\nexport default function ClickShockwave({\n theme = \"gold\",\n enabled = true,\n}: {\n theme?: MaterialTheme;\n enabled?: boolean;\n}) {\n const { camera, raycaster } = useThree();\n const [waves, setWaves] = useState<RingWave[]>([]);\n const nextId = useRef(0);\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 hexColor = THEME_WAVE_COLORS[theme] || THEME_WAVE_COLORS.gold;\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(hexColor),\n };\n\n setWaves((prev) => [...prev.slice(-4), newWave]);\n },\n [camera, raycaster, theme, 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;\n if (newLife <= 0) return null;\n\n const newRadius = wave.radius + delta * 5.0;\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 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\nexport default function ElectricPlasma({\n theme = \"neon\",\n enabled = true,\n}: ElectricPlasmaProps) {\n const { pointer } = useThree();\n const lineRef = useRef<THREE.LineSegments>(null);\n const colorHex = PLASMA_COLORS[theme] || PLASMA_COLORS.neon;\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();\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 * 2;\n const radius = 2.5 + Math.sin(time * 4 + 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={colorHex}\n transparent\n opacity={0.6}\n linewidth={2}\n toneMapped={false}\n />\n </lineSegments>\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","\"use client\";\n\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\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-8 py-6 mix-blend-difference\">\n <div className=\"flex items-center gap-12\">\n <Link href=\"/\" className=\"text-3xl font-bold tracking-tighter uppercase font-display\">\n {cinemaName}.\n </Link>\n <div className=\"hidden md:flex items-center 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 <div className=\"flex items-center 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 </div>\n </nav>\n\n {/* Hero Section */}\n <div className=\"relative h-screen w-full flex flex-col justify-end pb-24 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-3 mb-6\">\n <span className=\"bg-blue-600 text-white text-[10px] font-bold px-3 py-1 tracking-widest\">\n {t(\"hero.genreImax\")}\n </span>\n <span className=\"border border-white/20 text-white/80 text-[10px] font-bold px-3 py-1 tracking-widest\">\n {t(\"hero.genreAction\")}\n </span>\n </div>\n \n <h1 className=\"text-6xl md:text-[8rem] leading-[0.85] font-display font-black tracking-tighter mb-6 uppercase drop-shadow-2xl\">\n {t(\"hero.title\")}\n </h1>\n \n <p className=\"max-w-2xl text-lg md:text-xl text-white/70 font-medium mb-10 leading-relaxed drop-shadow-md\">\n {t(\"hero.synopsis\")}\n </p>\n\n <div className=\"flex flex-col sm:flex-row items-start sm:items-center gap-4\">\n <Button className=\"rounded-none bg-white text-black hover:bg-white/90 font-bold tracking-widest text-xs px-8 py-6 uppercase transition-transform hover:scale-105 active:scale-95\">\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-8 py-6 uppercase\">\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"],"mappings":"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","names":["index_exports","__export","AnimatedLetter","CameraRig","CinemaBackground","CinemaHome","CinemaLoader","ClickFireSparks","ClickShockwave","ElectricPlasma","LoaderOverlay","SceneParticles","withCinema3D","__toCommonJS","import_react","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","DustMotes","color","count","meshRef","dummy","speeds","offsets","i","state","time","speed","ox","oy","oz","SceneParticles","theme","visible","import_react","import_fiber","THREE","CameraRig","phase","camera","pointer","startTimeRef","phaseRef","state","time","elapsed","t","eased","z","y","driftX","driftY","mouseX","mouseY","import_react","import_fiber","THREE","THEME_SPARK_COLORS","ClickFireSparks","theme","enabled","camera","raycaster","bursts","setBursts","nextId","handlePointerDown","event","clientX","clientY","ndc","plane","intersectionPoint","palette","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","ClickShockwave","theme","enabled","camera","raycaster","waves","setWaves","nextId","handlePointerDown","event","clientX","clientY","ndc","plane","intersectionPoint","hexColor","newWave","prev","_","delta","wave","newLife","newRadius","__spreadProps","__spreadValues","import_react","import_fiber","THREE","PLASMA_COLORS","ElectricPlasma","theme","enabled","pointer","lineRef","colorHex","segmentCount","geometry","geom","positions","state","time","posAttr","targetX","targetY","i","idx","angle","radius","x1","y1","z1","x2","y2","z2","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","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","themeOverlay","Link","LocaleSwitcher","Button"]}
|