3d-effect-cinema 0.1.0 → 0.2.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 +72 -43
- package/dist/index.d.mts +24 -3
- package/dist/index.d.ts +24 -3
- 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/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# 🎬 3D Effect Cinema
|
|
2
2
|
|
|
3
|
-
> High-performance, customizable 3D Cinema Loader & Interactive WebGL Experience for React and Next.js powered by `@react-three/fiber` & `three`.
|
|
3
|
+
> High-performance, customizable 3D Cinema Loader & Interactive WebGL Background Experience for React and Next.js powered by `@react-three/fiber` & `three`.
|
|
4
4
|
|
|
5
5
|
[](https://www.npmjs.com/package/3d-effect-cinema)
|
|
6
6
|
[](https://github.com/esteban284/3d-effect-cinema)
|
|
@@ -9,12 +9,26 @@
|
|
|
9
9
|
|
|
10
10
|
---
|
|
11
11
|
|
|
12
|
+
## 🚀 Live Demo & Preview
|
|
13
|
+
|
|
14
|
+
👉 **[Ver Demo en Vivo (Vercel)](https://cinema-animation-sample.vercel.app)**
|
|
15
|
+
|
|
16
|
+
```
|
|
17
|
+
+-------------------------------------------------------------------------------+
|
|
18
|
+
| 🌟 CINEMULTIPLEX 3D - Fire Sparks & Dynamic WebGL Hero Background |
|
|
19
|
+
| [ Gold ] [ Neon ] [ Emerald ] [ Crimson ] [ Obsidian ] [ Glass ] |
|
|
20
|
+
+-------------------------------------------------------------------------------+
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
12
25
|
## ✨ Features
|
|
13
26
|
|
|
14
|
-
-
|
|
15
|
-
-
|
|
27
|
+
- 💥 **Interactive Fire Sparks**: Click or touch anywhere on screen to trigger explosive 3D fire embers and local light flashes.
|
|
28
|
+
- 🖼️ **Dynamic Hero Background (`<CinemaBackground />`)**: Embed the 3D WebGL background inside any container (div, hero section, card) with auto-resizing.
|
|
29
|
+
- 🌟 **Cinematic 3D Typography**: Animated 3D extruded text with spring physics.
|
|
30
|
+
- 🎨 **6 Material Themes**: `emerald` (Matrix Luxe), `crimson` (Ruby Fire), `gold`, `neon`, `obsidian`, `glass`.
|
|
16
31
|
- 🎥 **Cinematic Camera Rig**: Camera dolly zoom, subtle mouse parallax, and breathing float movement.
|
|
17
|
-
- ✨ **Volumetric Particles**: Theme-tailored particle system reacting to lighting.
|
|
18
32
|
- ⚡ **Next.js & React 19 Ready**: Pre-configured with `'use client'` directives for seamless App Router integration.
|
|
19
33
|
|
|
20
34
|
---
|
|
@@ -27,17 +41,45 @@ Install the package and its peer dependencies in your React / Next.js project:
|
|
|
27
41
|
npm install 3d-effect-cinema three @react-three/fiber @react-three/drei @react-three/postprocessing postprocessing
|
|
28
42
|
```
|
|
29
43
|
|
|
30
|
-
|
|
44
|
+
---
|
|
31
45
|
|
|
32
|
-
|
|
33
|
-
|
|
46
|
+
## 🚀 Usage Examples
|
|
47
|
+
|
|
48
|
+
### 1. Dynamic Hero Section Background (`<CinemaBackground />`)
|
|
49
|
+
|
|
50
|
+
Embed the interactive 3D WebGL experience inside any section of your website:
|
|
51
|
+
|
|
52
|
+
```tsx
|
|
53
|
+
"use client";
|
|
54
|
+
|
|
55
|
+
import { CinemaBackground } from "3d-effect-cinema";
|
|
56
|
+
|
|
57
|
+
export default function HeroSection() {
|
|
58
|
+
return (
|
|
59
|
+
<div className="relative w-full h-[600px]">
|
|
60
|
+
<CinemaBackground
|
|
61
|
+
text="UNITED OF WEB"
|
|
62
|
+
theme="emerald"
|
|
63
|
+
interactiveSparks={true}
|
|
64
|
+
>
|
|
65
|
+
{/* Your HTML/React overlays on top of the 3D scene */}
|
|
66
|
+
<div className="text-center text-white pointer-events-auto">
|
|
67
|
+
<h2 className="text-4xl font-bold tracking-widest uppercase">
|
|
68
|
+
Search Optimization Engine
|
|
69
|
+
</h2>
|
|
70
|
+
<button className="mt-6 px-8 py-3 bg-emerald-500 hover:bg-emerald-400 text-black font-bold uppercase rounded-md transition-all">
|
|
71
|
+
Explore Services
|
|
72
|
+
</button>
|
|
73
|
+
</div>
|
|
74
|
+
</CinemaBackground>
|
|
75
|
+
</div>
|
|
76
|
+
);
|
|
77
|
+
}
|
|
34
78
|
```
|
|
35
79
|
|
|
36
80
|
---
|
|
37
81
|
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
### 1. Full Screen Cinema Experience (`<CinemaLoader />`)
|
|
82
|
+
### 2. Full Screen Cinema Experience (`<CinemaLoader />`)
|
|
41
83
|
|
|
42
84
|
```tsx
|
|
43
85
|
"use client";
|
|
@@ -52,7 +94,7 @@ export default function App() {
|
|
|
52
94
|
return (
|
|
53
95
|
<CinemaLoader
|
|
54
96
|
cinemaName="NOVA CINEMA"
|
|
55
|
-
defaultTheme="
|
|
97
|
+
defaultTheme="emerald"
|
|
56
98
|
onEnterCinema={() => setLoaded(true)}
|
|
57
99
|
/>
|
|
58
100
|
);
|
|
@@ -68,50 +110,37 @@ export default function App() {
|
|
|
68
110
|
|
|
69
111
|
| Theme | Description | Visual Style |
|
|
70
112
|
| :--- | :--- | :--- |
|
|
71
|
-
| `
|
|
72
|
-
| `
|
|
73
|
-
| `
|
|
74
|
-
| `
|
|
113
|
+
| `emerald` | Deep Matrix green green metallic glow with emerald embers | 💚 Matrix Luxe |
|
|
114
|
+
| `crimson` | Fiery ruby red emissive metal with flame embers | ❤️ Ruby Fire |
|
|
115
|
+
| `gold` | High-metallic polished gold with warm ambient glow | 🌟 Luxe Gold |
|
|
116
|
+
| `neon` | Cyberpunk cyan with vibrant emissive bloom | ⚡ Cyberpunk Neon |
|
|
117
|
+
| `obsidian` | Deep glossy purple mineral with high environment reflection | 💜 Obsidian Dark |
|
|
118
|
+
| `glass` | Refractive glass material with chromatic dispersion | 💎 Refractive Glass |
|
|
75
119
|
|
|
76
120
|
---
|
|
77
121
|
|
|
78
122
|
## 🛠️ API Reference
|
|
79
123
|
|
|
80
|
-
### `<
|
|
81
|
-
|
|
82
|
-
The main full-screen interactive 3D loader canvas and overlay UI.
|
|
124
|
+
### `<CinemaBackground />`
|
|
83
125
|
|
|
84
126
|
| Prop | Type | Default | Description |
|
|
85
127
|
| :--- | :--- | :--- | :--- |
|
|
86
|
-
| `
|
|
87
|
-
| `
|
|
88
|
-
| `
|
|
128
|
+
| `text` | `string` | `"CINEMA"` | 3D Text rendered in space |
|
|
129
|
+
| `theme` | `'emerald' \| 'crimson' \| 'gold' \| 'neon' \| 'obsidian' \| 'glass'` | `'emerald'` | Material & light theme |
|
|
130
|
+
| `customBackground` | `string` | `undefined` | Custom CSS gradient or color (e.g., `"radial-gradient(...)"`) |
|
|
131
|
+
| `interactiveSparks` | `boolean` | `true` | Enables/disables fire sparks on mouse click |
|
|
132
|
+
| `showParticles` | `boolean` | `true` | Enables/disables ambient floating embers |
|
|
89
133
|
|
|
90
134
|
---
|
|
91
135
|
|
|
92
|
-
### `<
|
|
93
|
-
|
|
94
|
-
Low-level 3D letter component for custom Three.js canvas compositions.
|
|
95
|
-
|
|
96
|
-
| Prop | Type | Description |
|
|
97
|
-
| :--- | :--- | :--- |
|
|
98
|
-
| `char` | `string` | Single character string to render |
|
|
99
|
-
| `index` | `number` | Index position for delay stagger calculations |
|
|
100
|
-
| `totalLetters` | `number` | Total string length |
|
|
101
|
-
| `position` | `[number, number, number]` | 3D space coordinate `[x, y, z]` |
|
|
102
|
-
| `phase` | `'loading' \| 'entering' \| 'idle' \| 'exiting'` | Current animation state |
|
|
103
|
-
| `theme` | `MaterialTheme` | Chosen material theme |
|
|
104
|
-
| `fontUrl` | `string` | Path to Three.js JSON font file |
|
|
105
|
-
|
|
106
|
-
---
|
|
107
|
-
|
|
108
|
-
### `<CameraRig />`
|
|
109
|
-
|
|
110
|
-
Cinematic camera movement controller (must be rendered inside `@react-three/fiber` `<Canvas>`).
|
|
136
|
+
### `<CinemaLoader />`
|
|
111
137
|
|
|
112
|
-
| Prop | Type | Description |
|
|
113
|
-
| :--- | :--- | :--- |
|
|
114
|
-
| `
|
|
138
|
+
| Prop | Type | Default | Description |
|
|
139
|
+
| :--- | :--- | :--- | :--- |
|
|
140
|
+
| `cinemaName` | `string` | `"CINEMULTIPLEX"` | Brand text displayed in 3D typography and UI |
|
|
141
|
+
| `defaultTheme` | `MaterialTheme` | `'gold'` | Initial material theme |
|
|
142
|
+
| `customBackground` | `string` | `undefined` | Override CSS background gradient |
|
|
143
|
+
| `onEnterCinema` | `() => void` | **Required** | Callback triggered when user clicks Enter |
|
|
115
144
|
|
|
116
145
|
---
|
|
117
146
|
|
package/dist/index.d.mts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as react from 'react';
|
|
2
2
|
|
|
3
|
-
type MaterialTheme = "gold" | "neon" | "obsidian" | "glass";
|
|
3
|
+
type MaterialTheme = "gold" | "neon" | "emerald" | "crimson" | "obsidian" | "glass";
|
|
4
4
|
interface AnimatedLetterProps {
|
|
5
5
|
char: string;
|
|
6
6
|
index: number;
|
|
@@ -20,9 +20,14 @@ declare function CameraRig({ phase }: CameraRigProps): null;
|
|
|
20
20
|
interface CinemaLoaderProps {
|
|
21
21
|
cinemaName?: string;
|
|
22
22
|
defaultTheme?: MaterialTheme;
|
|
23
|
+
customBackground?: string;
|
|
23
24
|
onEnterCinema: () => void;
|
|
24
25
|
}
|
|
25
|
-
declare function CinemaLoader({ cinemaName, defaultTheme, onEnterCinema, }: CinemaLoaderProps): react.JSX.Element;
|
|
26
|
+
declare function CinemaLoader({ cinemaName, defaultTheme, customBackground, onEnterCinema, }: CinemaLoaderProps): react.JSX.Element;
|
|
27
|
+
|
|
28
|
+
declare function ClickFireSparks({ theme }: {
|
|
29
|
+
theme?: MaterialTheme;
|
|
30
|
+
}): react.JSX.Element;
|
|
26
31
|
|
|
27
32
|
interface LoaderOverlayProps {
|
|
28
33
|
phase: "loading" | "entering" | "idle" | "exiting";
|
|
@@ -39,9 +44,25 @@ interface SceneParticlesProps {
|
|
|
39
44
|
}
|
|
40
45
|
declare function SceneParticles({ theme, visible }: SceneParticlesProps): react.JSX.Element | null;
|
|
41
46
|
|
|
47
|
+
interface CinemaBackgroundProps {
|
|
48
|
+
text?: string;
|
|
49
|
+
theme?: MaterialTheme;
|
|
50
|
+
customBackground?: string;
|
|
51
|
+
interactiveSparks?: boolean;
|
|
52
|
+
showParticles?: boolean;
|
|
53
|
+
className?: string;
|
|
54
|
+
style?: React.CSSProperties;
|
|
55
|
+
children?: React.ReactNode;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Reusable 3D Cinema Background Component.
|
|
59
|
+
* Fits dynamically inside any parent container (div, header, section).
|
|
60
|
+
*/
|
|
61
|
+
declare function CinemaBackground({ text, theme, customBackground, interactiveSparks, showParticles, className, style, children, }: CinemaBackgroundProps): react.JSX.Element;
|
|
62
|
+
|
|
42
63
|
declare function CinemaHome({ cinemaName, webTheme }: {
|
|
43
64
|
cinemaName?: string;
|
|
44
65
|
webTheme?: string;
|
|
45
66
|
}): react.JSX.Element;
|
|
46
67
|
|
|
47
|
-
export { AnimatedLetter, CameraRig, CinemaHome, CinemaLoader, LoaderOverlay, type MaterialTheme, SceneParticles };
|
|
68
|
+
export { AnimatedLetter, CameraRig, CinemaBackground, type CinemaBackgroundProps, CinemaHome, CinemaLoader, ClickFireSparks, LoaderOverlay, type MaterialTheme, SceneParticles };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as react from 'react';
|
|
2
2
|
|
|
3
|
-
type MaterialTheme = "gold" | "neon" | "obsidian" | "glass";
|
|
3
|
+
type MaterialTheme = "gold" | "neon" | "emerald" | "crimson" | "obsidian" | "glass";
|
|
4
4
|
interface AnimatedLetterProps {
|
|
5
5
|
char: string;
|
|
6
6
|
index: number;
|
|
@@ -20,9 +20,14 @@ declare function CameraRig({ phase }: CameraRigProps): null;
|
|
|
20
20
|
interface CinemaLoaderProps {
|
|
21
21
|
cinemaName?: string;
|
|
22
22
|
defaultTheme?: MaterialTheme;
|
|
23
|
+
customBackground?: string;
|
|
23
24
|
onEnterCinema: () => void;
|
|
24
25
|
}
|
|
25
|
-
declare function CinemaLoader({ cinemaName, defaultTheme, onEnterCinema, }: CinemaLoaderProps): react.JSX.Element;
|
|
26
|
+
declare function CinemaLoader({ cinemaName, defaultTheme, customBackground, onEnterCinema, }: CinemaLoaderProps): react.JSX.Element;
|
|
27
|
+
|
|
28
|
+
declare function ClickFireSparks({ theme }: {
|
|
29
|
+
theme?: MaterialTheme;
|
|
30
|
+
}): react.JSX.Element;
|
|
26
31
|
|
|
27
32
|
interface LoaderOverlayProps {
|
|
28
33
|
phase: "loading" | "entering" | "idle" | "exiting";
|
|
@@ -39,9 +44,25 @@ interface SceneParticlesProps {
|
|
|
39
44
|
}
|
|
40
45
|
declare function SceneParticles({ theme, visible }: SceneParticlesProps): react.JSX.Element | null;
|
|
41
46
|
|
|
47
|
+
interface CinemaBackgroundProps {
|
|
48
|
+
text?: string;
|
|
49
|
+
theme?: MaterialTheme;
|
|
50
|
+
customBackground?: string;
|
|
51
|
+
interactiveSparks?: boolean;
|
|
52
|
+
showParticles?: boolean;
|
|
53
|
+
className?: string;
|
|
54
|
+
style?: React.CSSProperties;
|
|
55
|
+
children?: React.ReactNode;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Reusable 3D Cinema Background Component.
|
|
59
|
+
* Fits dynamically inside any parent container (div, header, section).
|
|
60
|
+
*/
|
|
61
|
+
declare function CinemaBackground({ text, theme, customBackground, interactiveSparks, showParticles, className, style, children, }: CinemaBackgroundProps): react.JSX.Element;
|
|
62
|
+
|
|
42
63
|
declare function CinemaHome({ cinemaName, webTheme }: {
|
|
43
64
|
cinemaName?: string;
|
|
44
65
|
webTheme?: string;
|
|
45
66
|
}): react.JSX.Element;
|
|
46
67
|
|
|
47
|
-
export { AnimatedLetter, CameraRig, CinemaHome, CinemaLoader, LoaderOverlay, type MaterialTheme, SceneParticles };
|
|
68
|
+
export { AnimatedLetter, CameraRig, CinemaBackground, type CinemaBackgroundProps, CinemaHome, CinemaLoader, ClickFireSparks, LoaderOverlay, type MaterialTheme, SceneParticles };
|
package/dist/index.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
'use client';
|
|
2
|
-
"use strict";var me=Object.create;var M=Object.defineProperty;var ue=Object.getOwnPropertyDescriptor;var de=Object.getOwnPropertyNames,P=Object.getOwnPropertySymbols,fe=Object.getPrototypeOf,A=Object.prototype.hasOwnProperty,V=Object.prototype.propertyIsEnumerable;var D=(e,t,r)=>t in e?M(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,$=(e,t)=>{for(var r in t||(t={}))A.call(t,r)&&D(e,r,t[r]);if(P)for(var r of P(t))V.call(t,r)&&D(e,r,t[r]);return e};var j=(e,t)=>{var r={};for(var n in e)A.call(e,n)&&t.indexOf(n)<0&&(r[n]=e[n]);if(e!=null&&P)for(var n of P(e))t.indexOf(n)<0&&V.call(e,n)&&(r[n]=e[n]);return r};var pe=(e,t)=>{for(var r in t)M(e,r,{get:t[r],enumerable:!0})},X=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of de(t))!A.call(e,s)&&s!==r&&M(e,s,{get:()=>t[s],enumerable:!(n=ue(t,s))||n.enumerable});return e};var S=(e,t,r)=>(r=e!=null?me(fe(e)):{},X(t||!e||!e.__esModule?M(r,"default",{value:e,enumerable:!0}):r,e)),ge=e=>X(M({},"__esModule",{value:!0}),e);var Ee={};pe(Ee,{AnimatedLetter:()=>w,CameraRig:()=>E,CinemaHome:()=>Y,CinemaLoader:()=>B,LoaderOverlay:()=>L,SceneParticles:()=>N});module.exports=ge(Ee);var k=require("react"),G=require("@react-three/fiber"),W=require("@react-three/drei"),x=S(require("three")),he={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},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 w({char:e,index:t,totalLetters:r,position:n,phase:s,theme:l,fontUrl:m}){let a=(0,k.useRef)(null),o=(0,k.useRef)(null),i=(0,k.useMemo)(()=>{let u=t/r*Math.PI*2;return{x:Math.cos(u)*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]),c=he[l];return(0,G.useFrame)(u=>{if(!a.current)return;let d=u.clock.getElapsedTime();o.current===null&&(o.current=d);let C=d-o.current,_=t*.12;if(s==="loading"){a.current.position.set(n[0]+i.x,n[1]+i.y,n[2]+i.z),a.current.rotation.set(i.rotX,i.rotY,0),a.current.scale.setScalar(0);return}if(s==="entering"){let h=Math.max(0,C-_),f=1-Math.exp(-h*3),y=1+Math.sin(h*8)*Math.max(0,.15-h*.1);a.current.position.set(x.MathUtils.lerp(n[0]+i.x,n[0],f),x.MathUtils.lerp(n[1]+i.y,n[1],f),x.MathUtils.lerp(n[2]+i.z,n[2],f)),a.current.rotation.set(x.MathUtils.lerp(i.rotX,0,f),x.MathUtils.lerp(i.rotY,0,f),0),a.current.scale.setScalar(Math.min(f*y,1.05));return}if(s==="idle"){let h=Math.sin(d*1.2+t*.5)*.015,f=Math.sin(d*.8+t*.3)*.008;a.current.position.set(n[0]+f,n[1]+h,n[2]),a.current.rotation.set(Math.sin(d*.5+t)*.01,Math.sin(d*.3+t*.7)*.01,0),a.current.scale.setScalar(1);return}if(s==="exiting"){let h=Math.max(0,C-_*.5),f=Math.min(h*2,1),y=f*f;a.current.position.set(n[0]+i.x*y*.5,n[1],n[2]-y*8),a.current.scale.setScalar(Math.max(1-y,0)),a.current.rotation.y+=.05}}),e===" "?null:React.createElement("group",{ref:a,position:n},React.createElement(W.Text3D,{font:m,size:.8,height:.35,bevelEnabled:!0,bevelSize:.02,bevelThickness:.01,bevelSegments:3,curveSegments:12},e,React.createElement("meshPhysicalMaterial",{color:c.color,metalness:c.metalness,roughness:c.roughness,clearcoat:c.clearcoat,emissive:c.emissive,emissiveIntensity:c.emissiveIntensity,envMapIntensity:c.envMapIntensity,transmission:c.transmission,ior:c.ior,thickness:c.thickness,transparent:c.transparent,toneMapped:l!=="neon"})))}var F=require("react"),H=require("@react-three/fiber"),b=S(require("three"));function E({phase:e}){let{camera:t,pointer:r}=(0,H.useThree)(),n=(0,F.useRef)(null),s=(0,F.useRef)(e);return s.current!==e&&(s.current=e,n.current=null),(0,H.useFrame)(l=>{let m=l.clock.getElapsedTime();n.current===null&&(n.current=m);let a=m-n.current;if(e==="loading"){t.position.set(0,0,14),t.lookAt(0,0,0);return}if(e==="entering"){let o=Math.min(a/3,1),i=1-Math.pow(1-o,3),c=b.MathUtils.lerp(14,6,i),u=b.MathUtils.lerp(1,.2,i);t.position.set(0,u,c),t.lookAt(0,0,0);return}if(e==="idle"){let o=Math.sin(m*.15)*.3,i=Math.cos(m*.1)*.15+.2,c=r.x*.3,u=r.y*.15;t.position.x=b.MathUtils.damp(t.position.x,o+c,3,.016),t.position.y=b.MathUtils.damp(t.position.y,i+u,3,.016),t.position.z=b.MathUtils.damp(t.position.z,6,3,.016),t.lookAt(0,0,0);return}if(e==="exiting"){let o=Math.min(a/1.5,1),i=o*o*o,c=b.MathUtils.lerp(6,-8,i);t.position.set(0,0,c),t.lookAt(0,0,0)}}),null}var p=require("react"),J=require("@react-three/fiber"),I=require("@react-three/drei"),g=require("@react-three/postprocessing");var T=require("react"),q=require("@react-three/fiber"),U=require("@react-three/drei"),Z=S(require("three")),be={gold:"#FFD700",neon:"#00ffff",obsidian:"#8888ff",glass:"#ffffff"};function xe({color:e,count:t=60}){let r=(0,T.useRef)(null),n=(0,T.useRef)(new Z.Object3D),s=(0,T.useRef)(null),l=(0,T.useRef)(null);if(!s.current){s.current=new Float32Array(t),l.current=new Float32Array(t*3);for(let m=0;m<t;m++)s.current[m]=.1+Math.random()*.3,l.current[m*3]=(Math.random()-.5)*16,l.current[m*3+1]=(Math.random()-.5)*10,l.current[m*3+2]=(Math.random()-.5)*12}return(0,q.useFrame)(m=>{if(!r.current||!s.current||!l.current)return;let a=m.clock.getElapsedTime();for(let o=0;o<t;o++){let i=s.current[o],c=l.current[o*3],u=l.current[o*3+1],d=l.current[o*3+2];n.current.position.set(c+Math.sin(a*i+o)*2,u+Math.cos(a*i*.7+o*.5)*1.5,d+Math.sin(a*i*.5+o*.3)*2),n.current.scale.setScalar(.015+Math.sin(a+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 N({theme:e,visible:t}){let r=be[e];return t?React.createElement("group",null,React.createElement(U.Sparkles,{count:150,scale:10,size:4,speed:.3,opacity:.8,color:r,noise:.6}),React.createElement(U.Sparkles,{count:80,scale:16,size:2,speed:.15,opacity:.4,color:"#ffffff",noise:.8}),React.createElement(xe,{color:r,count:50})):null}var ve=[{key:"gold",label:"Gold",color:"#FFD700"},{key:"neon",label:"Neon",color:"#00ffff"},{key:"obsidian",label:"Chrome",color:"#6366f1"},{key:"glass",label:"Glass",color:"#ffffff"}];function L({phase:e,cinemaName:t,theme:r,onEnter:n,onThemeChange:s}){let l=e==="idle";return React.createElement("div",{className:"absolute inset-0 pointer-events-none z-10 flex flex-col items-center justify-between",style:{opacity:e==="exiting"?0:1,transition:"opacity 0.8s ease-out"}},React.createElement("div",{className:"pt-12 text-center",style:{opacity:e==="idle"||e==="entering"?1:0,transform:e==="idle"||e==="entering"?"translateY(0)":"translateY(-20px)",transition:"all 1s ease-out 0.5s"}},React.createElement("p",{className:"text-xs tracking-[0.4em] uppercase",style:{color:"rgba(255, 255, 255, 0.4)",fontFamily:"var(--font-syne), sans-serif"}},"Premium Cinema Experience")),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-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: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",style:{opacity:l?1:0,transform:l?"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:l?"auto":"none"},id:"enter-cinema-button","aria-label":`Enter ${t}`},"Enter ",t),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.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(o=>{let i=r===o.key;return React.createElement("button",{key:o.key,onClick:()=>s(o.key),className:"group relative flex flex-col items-center gap-2 cursor-pointer outline-none",id:`theme-selector-${o.key}`,"aria-label":`Switch to ${o.label} theme`},React.createElement("div",{className:"relative w-14 h-9 rounded-md overflow-hidden transition-all duration-500",style:{border:i?`2px solid ${o.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 ${o.color}40`:"0 2px 10px rgba(0,0,0,0.5)"}},React.createElement("div",{className:"absolute inset-0 opacity-80",style:{backgroundColor:o.color}}),React.createElement("div",{className:"absolute inset-0 opacity-0 group-hover:opacity-100 transition-opacity duration-300",style:{background:o.key==="gold"?"conic-gradient(from 0deg, transparent, rgba(255,255,255,0.5), transparent)":o.key==="neon"?"radial-gradient(circle at center, rgba(255,255,255,0.8) 0%, transparent 70%)":o.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:o.key==="gold"?"spin-slow 3s linear infinite":o.key==="neon"?"pulse-glow 2s ease-in-out infinite":o.key==="obsidian"?"shimmer 2s linear infinite":"shimmer 3s linear infinite",backgroundSize:o.key==="obsidian"||o.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"}},o.label))})))))}var ye="/fonts/cinema_display.typeface.json";function Me(e){let n=-(e.length*.65)/2;return e.split("").map((s,l)=>[n+l*.65,0,0])}function B({cinemaName:e="CINEMULTIPLEX",defaultTheme:t="gold",onEnterCinema:r}){let[n,s]=(0,p.useState)("loading"),[l,m]=(0,p.useState)(t),a=e.toUpperCase(),o=a.split(""),i=(0,p.useMemo)(()=>Me(a),[a]);(0,p.useEffect)(()=>{let u=setTimeout(()=>s("entering"),800),d=o.length*120+1500,C=setTimeout(()=>s("idle"),800+d);return()=>{clearTimeout(u),clearTimeout(C)}},[o.length]);let c=(0,p.useCallback)(()=>{s("exiting"),setTimeout(()=>{r()},1800)},[r]);return React.createElement("div",{className:"fixed inset-0 w-screen h-screen",style:{background:"#030303"}},React.createElement(J.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(p.Suspense,{fallback:null},React.createElement(I.Environment,{preset:"studio"}),React.createElement("ambientLight",{intensity:.2}),React.createElement("directionalLight",{position:[5,8,5],intensity:1.5,castShadow:!0,color:"#ffffff"}),React.createElement("pointLight",{position:[-5,-3,-5],intensity:.4,color:"#FFD700"}),React.createElement("spotLight",{position:[0,10,0],angle:.4,penumbra:.8,intensity:.8,color:"#ffffff"}),React.createElement("pointLight",{position:[0,0,-5],intensity:.3,color:"#4444ff"}),React.createElement(E,{phase:n}),React.createElement(I.Center,{disableY:!0,disableZ:!0},React.createElement("group",null,o.map((u,d)=>React.createElement(w,{key:`${u}-${d}`,char:u,index:d,totalLetters:o.length,position:i[d],phase:n,theme:l,fontUrl:ye})))),React.createElement(N,{theme:l,visible:n!=="loading"}),React.createElement(g.EffectComposer,null,React.createElement(g.Bloom,{luminanceThreshold:.8,luminanceSmoothing:.9,intensity:l==="neon"?1.2:.5,mipmapBlur:!0}),React.createElement(g.Vignette,{offset:.3,darkness:.8}),React.createElement(g.Noise,{opacity:.03})))),React.createElement(L,{phase:n,cinemaName:e,theme:l,onEnter:c,onThemeChange:m}))}var ce=require("next-intl");var K=require("next-intl/routing"),Q=require("next-intl/navigation"),ke=(0,K.defineRouting)({locales:["en","es"],defaultLocale:"en"}),{Link:v,redirect:Ae,usePathname:ee,useRouter:te}=(0,Q.createNavigation)(ke);var re=require("next-intl");var ne=require("lucide-react");function O(){let e=(0,re.useLocale)(),t=te(),r=ee();return React.createElement("button",{onClick:()=>{let s=e==="en"?"es":"en";t.replace(r,{locale:s})},className:"flex items-center gap-2 text-sm font-medium text-muted-foreground hover:text-white transition-colors uppercase tracking-wider"},React.createElement(ne.Globe,{className:"w-4 h-4"}),e==="en"?"ES":"EN")}var z=S(require("react")),ie=require("@radix-ui/react-slot"),le=require("class-variance-authority");var oe=require("clsx"),se=require("tailwind-merge");function ae(...e){return(0,se.twMerge)((0,oe.clsx)(e))}var we=(0,le.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"}}),R=z.forwardRef((m,l)=>{var a=m,{className:e,variant:t,size:r,asChild:n=!1}=a,s=j(a,["className","variant","size","asChild"]);return z.createElement(n?ie.Slot:"button",$({className:ae(we({variant:t,size:r,className:e})),ref:l},s))});R.displayName="Button";function Y({cinemaName:e="NOVA",webTheme:t="neon"}){let r=(0,ce.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(v,{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(v,{href:"/schedule",className:"hover:text-white transition-colors"},r("nav.schedule")),React.createElement(v,{href:"/experiences",className:"hover:text-white transition-colors"},r("nav.experiences")),React.createElement(v,{href:"/membership",className:"hover:text-white transition-colors"},r("nav.membership")))),React.createElement("div",{className:"flex items-center gap-6"},React.createElement(O,null),React.createElement("div",{className:"hidden sm:flex items-center gap-4"},React.createElement(v,{href:"/login",className:"text-sm font-semibold tracking-widest text-white/70 hover:text-white transition-colors"},r("nav.login")),React.createElement(R,{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(R,{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(R,{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,CinemaHome,CinemaLoader,LoaderOverlay,SceneParticles});
|
|
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});
|
|
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/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 LoaderOverlay } from \"./components/3d/LoaderOverlay\";\nexport { default as SceneParticles } from \"./components/3d/SceneParticles\";\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\" | \"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 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\";\n\ninterface CinemaLoaderProps {\n cinemaName?: string;\n defaultTheme?: MaterialTheme;\n onEnterCinema: () => void;\n}\n\ntype AnimationPhase = \"loading\" | \"entering\" | \"idle\" | \"exiting\";\n\nconst FONT_URL = \"/fonts/cinema_display.typeface.json\";\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 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 return (\n <div className=\"fixed inset-0 w-screen h-screen\" style={{ background: \"#030303\" }}>\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.2} />\n <directionalLight\n position={[5, 8, 5]}\n intensity={1.5}\n castShadow\n color=\"#ffffff\"\n />\n <pointLight position={[-5, -3, -5]} intensity={0.4} color=\"#FFD700\" />\n <spotLight\n position={[0, 10, 0]}\n angle={0.4}\n penumbra={0.8}\n intensity={0.8}\n color=\"#ffffff\"\n />\n {/* Rim light for cinematic edge glow */}\n <pointLight position={[0, 0, -5]} intensity={0.3} color=\"#4444ff\" />\n\n {/* Camera animation */}\n <CameraRig phase={phase} />\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.8}\n luminanceSmoothing={0.9}\n intensity={theme === \"neon\" ? 1.2 : 0.5}\n mipmapBlur\n />\n <Vignette offset={0.3} darkness={0.8} />\n <Noise opacity={0.03} />\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 obsidian: \"#8888ff\",\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: \"obsidian\", label: \"Chrome\", color: \"#6366f1\" },\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\"\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\"\n style={{\n color: \"rgba(255, 255, 255, 0.4)\",\n fontFamily: \"var(--font-syne), sans-serif\",\n }}\n >\n Premium Cinema Experience\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 { 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","CinemaHome","CinemaLoader","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","FONT_URL","computeLetterPositions","text","startX","_","i","CinemaLoader","cinemaName","defaultTheme","onEnterCinema","phase","setPhase","theme","setTheme","displayName","letters","positions","t1","totalLetterTime","t2","handleEnter","CameraRig","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"]}
|
|
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"]}
|
package/dist/index.mjs
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
'use client';
|
|
2
|
-
var j=Object.defineProperty;var M=Object.getOwnPropertySymbols;var S=Object.prototype.hasOwnProperty,H=Object.prototype.propertyIsEnumerable;var P=(t,e,r)=>e in t?j(t,e,{enumerable:!0,configurable:!0,writable:!0,value:r}):t[e]=r,I=(t,e)=>{for(var r in e||(e={}))S.call(e,r)&&P(t,r,e[r]);if(M)for(var r of M(e))H.call(e,r)&&P(t,r,e[r]);return t};var z=(t,e)=>{var r={};for(var n in t)S.call(t,n)&&e.indexOf(n)<0&&(r[n]=t[n]);if(t!=null&&M)for(var n of M(t))e.indexOf(n)<0&&H.call(t,n)&&(r[n]=t[n]);return r};import{useRef as A,useMemo as X}from"react";import{useFrame as G}from"@react-three/fiber";import{Text3D as W}from"@react-three/drei";import*as h from"three";var q={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},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 k({char:t,index:e,totalLetters:r,position:n,phase:l,theme:i,fontUrl:m}){let s=A(null),o=A(null),a=X(()=>{let u=e/r*Math.PI*2;return{x:Math.cos(u)*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]),c=q[i];return G(u=>{if(!s.current)return;let d=u.clock.getElapsedTime();o.current===null&&(o.current=d);let y=d-o.current,C=e*.12;if(l==="loading"){s.current.position.set(n[0]+a.x,n[1]+a.y,n[2]+a.z),s.current.rotation.set(a.rotX,a.rotY,0),s.current.scale.setScalar(0);return}if(l==="entering"){let p=Math.max(0,y-C),f=1-Math.exp(-p*3),x=1+Math.sin(p*8)*Math.max(0,.15-p*.1);s.current.position.set(h.MathUtils.lerp(n[0]+a.x,n[0],f),h.MathUtils.lerp(n[1]+a.y,n[1],f),h.MathUtils.lerp(n[2]+a.z,n[2],f)),s.current.rotation.set(h.MathUtils.lerp(a.rotX,0,f),h.MathUtils.lerp(a.rotY,0,f),0),s.current.scale.setScalar(Math.min(f*x,1.05));return}if(l==="idle"){let p=Math.sin(d*1.2+e*.5)*.015,f=Math.sin(d*.8+e*.3)*.008;s.current.position.set(n[0]+f,n[1]+p,n[2]),s.current.rotation.set(Math.sin(d*.5+e)*.01,Math.sin(d*.3+e*.7)*.01,0),s.current.scale.setScalar(1);return}if(l==="exiting"){let p=Math.max(0,y-C*.5),f=Math.min(p*2,1),x=f*f;s.current.position.set(n[0]+a.x*x*.5,n[1],n[2]-x*8),s.current.scale.setScalar(Math.max(1-x,0)),s.current.rotation.y+=.05}}),t===" "?null:React.createElement("group",{ref:s,position:n},React.createElement(W,{font:m,size:.8,height:.35,bevelEnabled:!0,bevelSize:.02,bevelThickness:.01,bevelSegments:3,curveSegments:12},t,React.createElement("meshPhysicalMaterial",{color:c.color,metalness:c.metalness,roughness:c.roughness,clearcoat:c.clearcoat,emissive:c.emissive,emissiveIntensity:c.emissiveIntensity,envMapIntensity:c.envMapIntensity,transmission:c.transmission,ior:c.ior,thickness:c.thickness,transparent:c.transparent,toneMapped:i!=="neon"})))}import{useRef as F}from"react";import{useFrame as Z,useThree as J}from"@react-three/fiber";import*as g from"three";function w({phase:t}){let{camera:e,pointer:r}=J(),n=F(null),l=F(t);return l.current!==t&&(l.current=t,n.current=null),Z(i=>{let m=i.clock.getElapsedTime();n.current===null&&(n.current=m);let s=m-n.current;if(t==="loading"){e.position.set(0,0,14),e.lookAt(0,0,0);return}if(t==="entering"){let o=Math.min(s/3,1),a=1-Math.pow(1-o,3),c=g.MathUtils.lerp(14,6,a),u=g.MathUtils.lerp(1,.2,a);e.position.set(0,u,c),e.lookAt(0,0,0);return}if(t==="idle"){let o=Math.sin(m*.15)*.3,a=Math.cos(m*.1)*.15+.2,c=r.x*.3,u=r.y*.15;e.position.x=g.MathUtils.damp(e.position.x,o+c,3,.016),e.position.y=g.MathUtils.damp(e.position.y,a+u,3,.016),e.position.z=g.MathUtils.damp(e.position.z,6,3,.016),e.lookAt(0,0,0);return}if(t==="exiting"){let o=Math.min(s/1.5,1),a=o*o*o,c=g.MathUtils.lerp(6,-8,a);e.position.set(0,0,c),e.lookAt(0,0,0)}}),null}import{Suspense as re,useState as O,useEffect as ne,useCallback as oe,useMemo as se}from"react";import{Canvas as ae}from"@react-three/fiber";import{Environment as ie,Center as le}from"@react-three/drei";import{EffectComposer as ce,Bloom as me,Vignette as ue,Noise as de}from"@react-three/postprocessing";import{useRef as E}from"react";import{useFrame as K}from"@react-three/fiber";import{Sparkles as U}from"@react-three/drei";import*as B from"three";var Q={gold:"#FFD700",neon:"#00ffff",obsidian:"#8888ff",glass:"#ffffff"};function ee({color:t,count:e=60}){let r=E(null),n=E(new B.Object3D),l=E(null),i=E(null);if(!l.current){l.current=new Float32Array(e),i.current=new Float32Array(e*3);for(let m=0;m<e;m++)l.current[m]=.1+Math.random()*.3,i.current[m*3]=(Math.random()-.5)*16,i.current[m*3+1]=(Math.random()-.5)*10,i.current[m*3+2]=(Math.random()-.5)*12}return K(m=>{if(!r.current||!l.current||!i.current)return;let s=m.clock.getElapsedTime();for(let o=0;o<e;o++){let a=l.current[o],c=i.current[o*3],u=i.current[o*3+1],d=i.current[o*3+2];n.current.position.set(c+Math.sin(s*a+o)*2,u+Math.cos(s*a*.7+o*.5)*1.5,d+Math.sin(s*a*.5+o*.3)*2),n.current.scale.setScalar(.015+Math.sin(s+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,e]},React.createElement("sphereGeometry",{args:[1,6,6]}),React.createElement("meshBasicMaterial",{color:t,transparent:!0,opacity:.3,toneMapped:!1}))}function T({theme:t,visible:e}){let r=Q[t];return e?React.createElement("group",null,React.createElement(U,{count:150,scale:10,size:4,speed:.3,opacity:.8,color:r,noise:.6}),React.createElement(U,{count:80,scale:16,size:2,speed:.15,opacity:.4,color:"#ffffff",noise:.8}),React.createElement(ee,{color:r,count:50})):null}var te=[{key:"gold",label:"Gold",color:"#FFD700"},{key:"neon",label:"Neon",color:"#00ffff"},{key:"obsidian",label:"Chrome",color:"#6366f1"},{key:"glass",label:"Glass",color:"#ffffff"}];function N({phase:t,cinemaName:e,theme:r,onEnter:n,onThemeChange:l}){let i=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",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",style:{color:"rgba(255, 255, 255, 0.4)",fontFamily:"var(--font-syne), sans-serif"}},"Premium Cinema Experience")),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: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",style:{opacity:i?1:0,transform:i?"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:i?"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"},te.map(o=>{let a=r===o.key;return React.createElement("button",{key:o.key,onClick:()=>l(o.key),className:"group relative flex flex-col items-center gap-2 cursor-pointer outline-none",id:`theme-selector-${o.key}`,"aria-label":`Switch to ${o.label} theme`},React.createElement("div",{className:"relative w-14 h-9 rounded-md overflow-hidden transition-all duration-500",style:{border:a?`2px solid ${o.color}`:"1px solid rgba(255, 255, 255, 0.15)",transform:a?"scale(1.1) translateY(-2px)":"scale(1) translateY(0)",boxShadow:a?`0 4px 20px ${o.color}40`:"0 2px 10px rgba(0,0,0,0.5)"}},React.createElement("div",{className:"absolute inset-0 opacity-80",style:{backgroundColor:o.color}}),React.createElement("div",{className:"absolute inset-0 opacity-0 group-hover:opacity-100 transition-opacity duration-300",style:{background:o.key==="gold"?"conic-gradient(from 0deg, transparent, rgba(255,255,255,0.5), transparent)":o.key==="neon"?"radial-gradient(circle at center, rgba(255,255,255,0.8) 0%, transparent 70%)":o.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:o.key==="gold"?"spin-slow 3s linear infinite":o.key==="neon"?"pulse-glow 2s ease-in-out infinite":o.key==="obsidian"?"shimmer 2s linear infinite":"shimmer 3s linear infinite",backgroundSize:o.key==="obsidian"||o.key==="glass"?"200% 100%":"auto"}})),React.createElement("span",{className:"text-[9px] uppercase tracking-widest transition-colors duration-300",style:{color:a?"#ffffff":"rgba(255, 255, 255, 0.4)",fontFamily:"var(--font-inter), sans-serif"}},o.label))})))))}var fe="/fonts/cinema_display.typeface.json";function pe(t){let n=-(t.length*.65)/2;return t.split("").map((l,i)=>[n+i*.65,0,0])}function Y({cinemaName:t="CINEMULTIPLEX",defaultTheme:e="gold",onEnterCinema:r}){let[n,l]=O("loading"),[i,m]=O(e),s=t.toUpperCase(),o=s.split(""),a=se(()=>pe(s),[s]);ne(()=>{let u=setTimeout(()=>l("entering"),800),d=o.length*120+1500,y=setTimeout(()=>l("idle"),800+d);return()=>{clearTimeout(u),clearTimeout(y)}},[o.length]);let c=oe(()=>{l("exiting"),setTimeout(()=>{r()},1800)},[r]);return React.createElement("div",{className:"fixed inset-0 w-screen h-screen",style:{background:"#030303"}},React.createElement(ae,{camera:{position:[0,0,14],fov:45,near:.1,far:50},dpr:[1,2],gl:{antialias:!0,toneMapping:4,toneMappingExposure:1.2}},React.createElement(re,{fallback:null},React.createElement(ie,{preset:"studio"}),React.createElement("ambientLight",{intensity:.2}),React.createElement("directionalLight",{position:[5,8,5],intensity:1.5,castShadow:!0,color:"#ffffff"}),React.createElement("pointLight",{position:[-5,-3,-5],intensity:.4,color:"#FFD700"}),React.createElement("spotLight",{position:[0,10,0],angle:.4,penumbra:.8,intensity:.8,color:"#ffffff"}),React.createElement("pointLight",{position:[0,0,-5],intensity:.3,color:"#4444ff"}),React.createElement(w,{phase:n}),React.createElement(le,{disableY:!0,disableZ:!0},React.createElement("group",null,o.map((u,d)=>React.createElement(k,{key:`${u}-${d}`,char:u,index:d,totalLetters:o.length,position:a[d],phase:n,theme:i,fontUrl:fe})))),React.createElement(T,{theme:i,visible:n!=="loading"}),React.createElement(ce,null,React.createElement(me,{luminanceThreshold:.8,luminanceSmoothing:.9,intensity:i==="neon"?1.2:.5,mipmapBlur:!0}),React.createElement(ue,{offset:.3,darkness:.8}),React.createElement(de,{opacity:.03})))),React.createElement(N,{phase:n,cinemaName:t,theme:i,onEnter:c,onThemeChange:m}))}import{useTranslations as Te}from"next-intl";import{defineRouting as ge}from"next-intl/routing";import{createNavigation as he}from"next-intl/navigation";var be=ge({locales:["en","es"],defaultLocale:"en"}),{Link:b,redirect:Ze,usePathname:_,useRouter:D}=he(be);import{useLocale as xe}from"next-intl";import{Globe as ve}from"lucide-react";function R(){let t=xe(),e=D(),r=_();return React.createElement("button",{onClick:()=>{let l=t==="en"?"es":"en";e.replace(r,{locale:l})},className:"flex items-center gap-2 text-sm font-medium text-muted-foreground hover:text-white transition-colors uppercase tracking-wider"},React.createElement(ve,{className:"w-4 h-4"}),t==="en"?"ES":"EN")}import*as L from"react";import{Slot as ke}from"@radix-ui/react-slot";import{cva as we}from"class-variance-authority";import{clsx as ye}from"clsx";import{twMerge as Me}from"tailwind-merge";function V(...t){return Me(ye(t))}var Ee=we("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"}}),v=L.forwardRef((m,i)=>{var s=m,{className:t,variant:e,size:r,asChild:n=!1}=s,l=z(s,["className","variant","size","asChild"]);return L.createElement(n?ke:"button",I({className:V(Ee({variant:e,size:r,className:t})),ref:i},l))});v.displayName="Button";function $({cinemaName:t="NOVA",webTheme:e="neon"}){let r=Te(),n=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(b,{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(b,{href:"/schedule",className:"hover:text-white transition-colors"},r("nav.schedule")),React.createElement(b,{href:"/experiences",className:"hover:text-white transition-colors"},r("nav.experiences")),React.createElement(b,{href:"/membership",className:"hover:text-white transition-colors"},r("nav.membership")))),React.createElement("div",{className:"flex items-center gap-6"},React.createElement(R,null),React.createElement("div",{className:"hidden sm:flex items-center gap-4"},React.createElement(b,{href:"/login",className:"text-sm font-semibold tracking-widest text-white/70 hover:text-white transition-colors"},r("nav.login")),React.createElement(v,{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(v,{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(v,{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"))))))}export{k as AnimatedLetter,w as CameraRig,$ as CinemaHome,Y as CinemaLoader,N as LoaderOverlay,T as SceneParticles};
|
|
2
|
+
var oe=Object.defineProperty,ie=Object.defineProperties;var ae=Object.getOwnPropertyDescriptors;var L=Object.getOwnPropertySymbols;var U=Object.prototype.hasOwnProperty,O=Object.prototype.propertyIsEnumerable;var z=(n,e,r)=>e in n?oe(n,e,{enumerable:!0,configurable:!0,writable:!0,value:r}):n[e]=r,y=(n,e)=>{for(var r in e||(e={}))U.call(e,r)&&z(n,r,e[r]);if(L)for(var r of L(e))O.call(e,r)&&z(n,r,e[r]);return n},B=(n,e)=>ie(n,ae(e));var V=(n,e)=>{var r={};for(var o in n)U.call(n,o)&&e.indexOf(o)<0&&(r[o]=n[o]);if(n!=null&&L)for(var o of L(n))e.indexOf(o)<0&&O.call(n,o)&&(r[o]=n[o]);return r};import{useRef as _,useMemo as se}from"react";import{useFrame as le}from"@react-three/fiber";import{Text3D as ce}from"@react-three/drei";import*as M from"three";var me={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 k({char:n,index:e,totalLetters:r,position:o,phase:c,theme:l,fontUrl:s}){let a=_(null),t=_(null),i=se(()=>{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=me[l];return le(d=>{if(!a.current)return;let p=d.clock.getElapsedTime();t.current===null&&(t.current=p);let f=p-t.current,h=e*.12;if(c==="loading"){a.current.position.set(o[0]+i.x,o[1]+i.y,o[2]+i.z),a.current.rotation.set(i.rotX,i.rotY,0),a.current.scale.setScalar(0);return}if(c==="entering"){let u=Math.max(0,f-h),g=1-Math.exp(-u*3),x=1+Math.sin(u*8)*Math.max(0,.15-u*.1);a.current.position.set(M.MathUtils.lerp(o[0]+i.x,o[0],g),M.MathUtils.lerp(o[1]+i.y,o[1],g),M.MathUtils.lerp(o[2]+i.z,o[2],g)),a.current.rotation.set(M.MathUtils.lerp(i.rotX,0,g),M.MathUtils.lerp(i.rotY,0,g),0),a.current.scale.setScalar(Math.min(g*x,1.05));return}if(c==="idle"){let u=Math.sin(p*1.2+e*.5)*.015,g=Math.sin(p*.8+e*.3)*.008;a.current.position.set(o[0]+g,o[1]+u,o[2]),a.current.rotation.set(Math.sin(p*.5+e)*.01,Math.sin(p*.3+e*.7)*.01,0),a.current.scale.setScalar(1);return}if(c==="exiting"){let u=Math.max(0,f-h*.5),g=Math.min(u*2,1),x=g*g;a.current.position.set(o[0]+i.x*x*.5,o[1],o[2]-x*8),a.current.scale.setScalar(Math.max(1-x,0)),a.current.rotation.y+=.05}}),n===" "?null:React.createElement("group",{ref:a,position:o},React.createElement(ce,{font:s,size:.8,height:.35,bevelEnabled:!0,bevelSize:.02,bevelThickness:.01,bevelSegments:3,curveSegments:12},n,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:l!=="neon"})))}import{useRef as Y}from"react";import{useFrame as de,useThree as fe}from"@react-three/fiber";import*as v from"three";function E({phase:n}){let{camera:e,pointer:r}=fe(),o=Y(null),c=Y(n);return c.current!==n&&(c.current=n,o.current=null),de(l=>{let s=l.clock.getElapsedTime();o.current===null&&(o.current=s);let a=s-o.current;if(n==="loading"){e.position.set(0,0,14),e.lookAt(0,0,0);return}if(n==="entering"){let t=Math.min(a/3,1),i=1-Math.pow(1-t,3),m=v.MathUtils.lerp(14,6,i),d=v.MathUtils.lerp(1,.2,i);e.position.set(0,d,m),e.lookAt(0,0,0);return}if(n==="idle"){let t=Math.sin(s*.15)*.3,i=Math.cos(s*.1)*.15+.2,m=r.x*.3,d=r.y*.15;e.position.x=v.MathUtils.damp(e.position.x,t+m,3,.016),e.position.y=v.MathUtils.damp(e.position.y,i+d,3,.016),e.position.z=v.MathUtils.damp(e.position.z,6,3,.016),e.lookAt(0,0,0);return}if(n==="exiting"){let t=Math.min(a/1.5,1),i=t*t*t,m=v.MathUtils.lerp(6,-8,i);e.position.set(0,0,m),e.lookAt(0,0,0)}}),null}import{Suspense as Ee,useState as W,useEffect as we,useCallback as Te,useMemo as Ce}from"react";import{Canvas as Ne}from"@react-three/fiber";import{Environment as Re,Center as Le}from"@react-three/drei";import{EffectComposer as Se,Bloom as Pe,Vignette as Fe,Noise as He}from"@react-three/postprocessing";import{useRef as S}from"react";import{useFrame as ue}from"@react-three/fiber";import{Sparkles as D}from"@react-three/drei";import*as X from"three";var pe={gold:"#FFD700",neon:"#00ffff",emerald:"#10b981",crimson:"#ff1744",obsidian:"#a855f7",glass:"#ffffff"};function ge({color:n,count:e=60}){let r=S(null),o=S(new X.Object3D),c=S(null),l=S(null);if(!c.current){c.current=new Float32Array(e),l.current=new Float32Array(e*3);for(let s=0;s<e;s++)c.current[s]=.1+Math.random()*.3,l.current[s*3]=(Math.random()-.5)*16,l.current[s*3+1]=(Math.random()-.5)*10,l.current[s*3+2]=(Math.random()-.5)*12}return ue(s=>{if(!r.current||!c.current||!l.current)return;let a=s.clock.getElapsedTime();for(let t=0;t<e;t++){let i=c.current[t],m=l.current[t*3],d=l.current[t*3+1],p=l.current[t*3+2];o.current.position.set(m+Math.sin(a*i+t)*2,d+Math.cos(a*i*.7+t*.5)*1.5,p+Math.sin(a*i*.5+t*.3)*2),o.current.scale.setScalar(.015+Math.sin(a+t)*.005),o.current.updateMatrix(),r.current.setMatrixAt(t,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:n,transparent:!0,opacity:.3,toneMapped:!1}))}function w({theme:n,visible:e}){let r=pe[n];return e?React.createElement("group",null,React.createElement(D,{count:150,scale:10,size:4,speed:.3,opacity:.8,color:r,noise:.6}),React.createElement(D,{count:80,scale:16,size:2,speed:.15,opacity:.4,color:"#ffffff",noise:.8}),React.createElement(ge,{color:r,count:50})):null}var he=[{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 P({phase:n,cinemaName:e,theme:r,onEnter:o,onThemeChange:c}){let l=n==="idle";return React.createElement("div",{className:"absolute inset-0 pointer-events-none z-10 flex flex-col items-center justify-between",style:{opacity:n==="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:n==="idle"||n==="entering"?1:0,transform:n==="idle"||n==="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")),n==="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:l?1:0,transform:l?"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:l?"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:n==="idle"||n==="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"},he.map(t=>{let i=r===t.key;return React.createElement("button",{key:t.key,onClick:()=>c(t.key),className:"group relative flex flex-col items-center gap-2 cursor-pointer outline-none",id:`theme-selector-${t.key}`,"aria-label":`Switch to ${t.label} theme`},React.createElement("div",{className:"relative w-14 h-9 rounded-md overflow-hidden transition-all duration-500",style:{border:i?`2px solid ${t.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 ${t.color}40`:"0 2px 10px rgba(0,0,0,0.5)"}},React.createElement("div",{className:"absolute inset-0 opacity-80",style:{backgroundColor:t.color}}),React.createElement("div",{className:"absolute inset-0 opacity-0 group-hover:opacity-100 transition-opacity duration-300",style:{background:t.key==="gold"?"conic-gradient(from 0deg, transparent, rgba(255,255,255,0.5), transparent)":t.key==="neon"?"radial-gradient(circle at center, rgba(255,255,255,0.8) 0%, transparent 70%)":t.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:t.key==="gold"?"spin-slow 3s linear infinite":t.key==="neon"?"pulse-glow 2s ease-in-out infinite":t.key==="obsidian"?"shimmer 2s linear infinite":"shimmer 3s linear infinite",backgroundSize:t.key==="obsidian"||t.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"}},t.label))})))))}import{useState as be,useRef as xe,useCallback as ye,useEffect as ve}from"react";import{useFrame as Me,useThree as ke}from"@react-three/fiber";import*as b from"three";var $={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 T({theme:n="gold"}){let{camera:e,raycaster:r,pointer:o}=ke(),[c,l]=be([]),s=xe(0),a=ye(t=>{let i=0,m=0;if("touches"in t&&t.touches.length>0)i=t.touches[0].clientX,m=t.touches[0].clientY;else if("clientX"in t)i=t.clientX,m=t.clientY;else return;let d=new b.Vector2(i/window.innerWidth*2-1,-(m/window.innerHeight)*2+1);r.setFromCamera(d,e);let p=new b.Plane(new b.Vector3(0,0,1),0),f=new b.Vector3;if(r.ray.intersectPlane(p,f),!f)return;let h=$[n]||$.gold,u=35,g=[];for(let N=0;N<u;N++){let A=Math.random()*Math.PI*2,H=1.5+Math.random()*4.5,te=(Math.random()-.3)*3,ne=new b.Vector3(Math.cos(A)*H,Math.sin(A)*H+te,(Math.random()-.5)*H*.8),re=h[Math.floor(Math.random()*h.length)];g.push({id:N,position:f.clone(),velocity:ne,color:new b.Color(re),size:.08+Math.random()*.12,life:1,maxLife:.6+Math.random()*.8})}let x={id:s.current++,origin:f.clone(),sparks:g,color:h[0],lightIntensity:4,time:0};l(N=>[...N.slice(-4),x])},[e,r,n]);return ve(()=>(window.addEventListener("pointerdown",a),()=>{window.removeEventListener("pointerdown",a)}),[a]),Me((t,i)=>{c.length!==0&&l(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 x=u.position.clone().addScaledVector(u.velocity,i);return u.velocity.y-=i*3.5,u.velocity.multiplyScalar(.96),B(y({},u),{position:x,life:g})}).filter(Boolean);return h.length===0&&f<=0?null:B(y({},d),{time:p,lightIntensity:f,sparks:h})}).filter(Boolean))}),React.createElement("group",null,c.map(t=>React.createElement("group",{key:t.id},t.lightIntensity>.05&&React.createElement("pointLight",{position:t.origin,intensity:t.lightIntensity*3,distance:6,color:t.color}),t.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 Be="/fonts/cinema_display.typeface.json",j={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 Ie(n){let o=-(n.length*.65)/2;return n.split("").map((c,l)=>[o+l*.65,0,0])}function G({cinemaName:n="CINEMULTIPLEX",defaultTheme:e="gold",customBackground:r,onEnterCinema:o}){let[c,l]=W("loading"),[s,a]=W(e),t=n.toUpperCase(),i=t.split(""),m=Ce(()=>Ie(t),[t]);we(()=>{let f=setTimeout(()=>l("entering"),800),h=i.length*120+1500,u=setTimeout(()=>l("idle"),800+h);return()=>{clearTimeout(f),clearTimeout(u)}},[i.length]);let d=Te(()=>{l("exiting"),setTimeout(()=>{o()},1800)},[o]),p=r||j[s]||j.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(Ne,{camera:{position:[0,0,14],fov:45,near:.1,far:50},dpr:[1,2],gl:{antialias:!0,toneMapping:4,toneMappingExposure:1.2}},React.createElement(Ee,{fallback:null},React.createElement(Re,{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:s==="emerald"?"#10b981":s==="crimson"?"#ff1744":s==="neon"?"#00ffff":s==="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(E,{phase:c}),React.createElement(T,{theme:s}),React.createElement(Le,{disableY:!0,disableZ:!0},React.createElement("group",null,i.map((f,h)=>React.createElement(k,{key:`${f}-${h}`,char:f,index:h,totalLetters:i.length,position:m[h],phase:c,theme:s,fontUrl:Be})))),React.createElement(w,{theme:s,visible:c!=="loading"}),React.createElement(Se,null,React.createElement(Pe,{luminanceThreshold:.7,luminanceSmoothing:.9,intensity:s==="neon"||s==="emerald"||s==="crimson"?1.4:.7,mipmapBlur:!0}),React.createElement(Fe,{offset:.3,darkness:.85}),React.createElement(He,{opacity:.025})))),React.createElement(P,{phase:c,cinemaName:n,theme:s,onEnter:d,onThemeChange:a}))}import{Suspense as Ae,useMemo as ze}from"react";import{Canvas as Ue}from"@react-three/fiber";import{Environment as Oe,Center as Ve}from"@react-three/drei";import{EffectComposer as _e,Bloom as Ye,Vignette as De}from"@react-three/postprocessing";var K={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%)"},Xe="/fonts/cinema_display.typeface.json";function $e(n){let o=-(n.length*.65)/2;return n.split("").map((c,l)=>[o+l*.65,0,0])}function Z({text:n="CINEMA",theme:e="emerald",customBackground:r,interactiveSparks:o=!0,showParticles:c=!0,className:l="",style:s,children:a}){let t=n.toUpperCase(),i=t.split(""),m=ze(()=>$e(t),[t]),d=r||K[e]||K.emerald;return React.createElement("div",{className:`relative w-full h-full min-h-[350px] overflow-hidden select-none ${l}`,style:y({background:d},s)},React.createElement("div",{className:"absolute inset-0 z-0 pointer-events-auto"},React.createElement(Ue,{camera:{position:[0,0,14],fov:45,near:.1,far:50},dpr:[1,2],gl:{antialias:!0,toneMapping:4,toneMappingExposure:1.2}},React.createElement(Ae,{fallback:null},React.createElement(Oe,{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(E,{phase:"idle"}),o&&React.createElement(T,{theme:e}),React.createElement(Ve,{disableY:!0,disableZ:!0},React.createElement("group",null,i.map((p,f)=>React.createElement(k,{key:`${p}-${f}`,char:p,index:f,totalLetters:i.length,position:m[f],phase:"idle",theme:e,fontUrl:Xe})))),c&&React.createElement(w,{theme:e,visible:!0}),React.createElement(_e,null,React.createElement(Ye,{luminanceThreshold:.7,luminanceSmoothing:.9,intensity:.8,mipmapBlur:!0}),React.createElement(De,{offset:.3,darkness:.85}))))),a&&React.createElement("div",{className:"relative z-10 w-full h-full pointer-events-none flex flex-col items-center justify-center"},a))}import{useTranslations as nt}from"next-intl";import{defineRouting as We}from"next-intl/routing";import{createNavigation as je}from"next-intl/navigation";var Ge=We({locales:["en","es"],defaultLocale:"en"}),{Link:C,redirect:Yt,usePathname:q,useRouter:J}=je(Ge);import{useLocale as Ke}from"next-intl";import{Globe as Ze}from"lucide-react";function I(){let n=Ke(),e=J(),r=q();return React.createElement("button",{onClick:()=>{let c=n==="en"?"es":"en";e.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(Ze,{className:"w-4 h-4"}),n==="en"?"ES":"EN")}import*as F from"react";import{Slot as Qe}from"@radix-ui/react-slot";import{cva as et}from"class-variance-authority";import{clsx as qe}from"clsx";import{twMerge as Je}from"tailwind-merge";function Q(...n){return Je(qe(n))}var tt=et("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"}}),R=F.forwardRef((s,l)=>{var a=s,{className:n,variant:e,size:r,asChild:o=!1}=a,c=V(a,["className","variant","size","asChild"]);return F.createElement(o?Qe:"button",y({className:Q(tt({variant:e,size:r,className:n})),ref:l},c))});R.displayName="Button";function ee({cinemaName:n="NOVA",webTheme:e="neon"}){let r=nt(),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(C,{href:"/",className:"text-3xl font-bold tracking-tighter uppercase font-display"},n,"."),React.createElement("div",{className:"hidden md:flex items-center gap-8 text-sm font-semibold tracking-widest text-white/70"},React.createElement(C,{href:"/schedule",className:"hover:text-white transition-colors"},r("nav.schedule")),React.createElement(C,{href:"/experiences",className:"hover:text-white transition-colors"},r("nav.experiences")),React.createElement(C,{href:"/membership",className:"hover:text-white transition-colors"},r("nav.membership")))),React.createElement("div",{className:"flex items-center gap-6"},React.createElement(I,null),React.createElement("div",{className:"hidden sm:flex items-center gap-4"},React.createElement(C,{href:"/login",className:"text-sm font-semibold tracking-widest text-white/70 hover:text-white transition-colors"},r("nav.login")),React.createElement(R,{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(R,{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(R,{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"))))))}export{k as AnimatedLetter,E as CameraRig,Z as CinemaBackground,ee as CinemaHome,G as CinemaLoader,T as ClickFireSparks,P as LoaderOverlay,w as SceneParticles};
|
|
3
3
|
//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../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/CinemaHome.tsx","../src/i18n/routing.ts","../src/components/LocaleSwitcher.tsx","../src/components/ui/button.tsx","../src/lib/utils.ts"],"sourcesContent":["\"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\" | \"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 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\";\n\ninterface CinemaLoaderProps {\n cinemaName?: string;\n defaultTheme?: MaterialTheme;\n onEnterCinema: () => void;\n}\n\ntype AnimationPhase = \"loading\" | \"entering\" | \"idle\" | \"exiting\";\n\nconst FONT_URL = \"/fonts/cinema_display.typeface.json\";\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 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 return (\n <div className=\"fixed inset-0 w-screen h-screen\" style={{ background: \"#030303\" }}>\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.2} />\n <directionalLight\n position={[5, 8, 5]}\n intensity={1.5}\n castShadow\n color=\"#ffffff\"\n />\n <pointLight position={[-5, -3, -5]} intensity={0.4} color=\"#FFD700\" />\n <spotLight\n position={[0, 10, 0]}\n angle={0.4}\n penumbra={0.8}\n intensity={0.8}\n color=\"#ffffff\"\n />\n {/* Rim light for cinematic edge glow */}\n <pointLight position={[0, 0, -5]} intensity={0.3} color=\"#4444ff\" />\n\n {/* Camera animation */}\n <CameraRig phase={phase} />\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.8}\n luminanceSmoothing={0.9}\n intensity={theme === \"neon\" ? 1.2 : 0.5}\n mipmapBlur\n />\n <Vignette offset={0.3} darkness={0.8} />\n <Noise opacity={0.03} />\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 obsidian: \"#8888ff\",\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: \"obsidian\", label: \"Chrome\", color: \"#6366f1\" },\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\"\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\"\n style={{\n color: \"rgba(255, 255, 255, 0.4)\",\n fontFamily: \"var(--font-syne), sans-serif\",\n }}\n >\n Premium Cinema Experience\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 { 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":["useRef","useMemo","useFrame","Text3D","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","useRef","useFrame","useThree","THREE","CameraRig","phase","camera","pointer","startTimeRef","phaseRef","state","time","elapsed","t","eased","z","y","driftX","driftY","mouseX","mouseY","Suspense","useState","useEffect","useCallback","useMemo","Canvas","Environment","Center","EffectComposer","Bloom","Vignette","Noise","useRef","useFrame","Sparkles","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","FONT_URL","computeLetterPositions","text","startX","_","CinemaLoader","cinemaName","defaultTheme","onEnterCinema","phase","setPhase","useState","theme","setTheme","displayName","letters","positions","useMemo","useEffect","t1","totalLetterTime","t2","handleEnter","useCallback","Canvas","Suspense","Environment","CameraRig","Center","char","i","AnimatedLetter","SceneParticles","EffectComposer","Bloom","Vignette","Noise","LoaderOverlay","useTranslations","defineRouting","createNavigation","routing","Link","redirect","usePathname","useRouter","useLocale","Globe","LocaleSwitcher","locale","useLocale","router","useRouter","pathname","usePathname","nextLocale","React","Slot","cva","clsx","twMerge","cn","inputs","buttonVariants","cva","Button","_a","ref","_b","className","variant","size","asChild","props","__objRest","Slot","__spreadValues","cn","CinemaHome","cinemaName","webTheme","t","useTranslations","themeOverlay","Link","LocaleSwitcher","Button"]}
|
|
1
|
+
{"version":3,"sources":["../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":["\"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":["useRef","useMemo","useFrame","Text3D","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","useRef","useFrame","useThree","THREE","CameraRig","phase","camera","pointer","startTimeRef","phaseRef","state","time","elapsed","eased","z","y","driftX","driftY","mouseX","mouseY","Suspense","useState","useEffect","useCallback","useMemo","Canvas","Environment","Center","EffectComposer","Bloom","Vignette","Noise","useRef","useFrame","Sparkles","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","useState","useRef","useCallback","useEffect","useFrame","useThree","THREE","THEME_SPARK_COLORS","ClickFireSparks","theme","camera","raycaster","pointer","useThree","bursts","setBursts","useState","nextId","useRef","handlePointerDown","useCallback","event","clientX","clientY","ndc","plane","intersectionPoint","palette","sparkCount","newSparks","i","angle","speed","elevation","velocity","hexColor","newBurst","prev","useEffect","useFrame","_","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","useState","theme","setTheme","displayName","letters","positions","useMemo","useEffect","t1","totalLetterTime","t2","handleEnter","useCallback","currentBg","Canvas","Suspense","Environment","CameraRig","ClickFireSparks","Center","char","AnimatedLetter","SceneParticles","EffectComposer","Bloom","Vignette","Noise","LoaderOverlay","Suspense","useMemo","Canvas","Environment","Center","EffectComposer","Bloom","Vignette","THEME_BACKGROUNDS","FONT_URL","computeLetterPositions","text","startX","_","i","CinemaBackground","theme","customBackground","interactiveSparks","showParticles","className","style","children","displayName","letters","positions","useMemo","currentBg","__spreadValues","Canvas","Suspense","Environment","CameraRig","ClickFireSparks","Center","char","AnimatedLetter","SceneParticles","EffectComposer","Bloom","Vignette","useTranslations","defineRouting","createNavigation","routing","Link","redirect","usePathname","useRouter","useLocale","Globe","LocaleSwitcher","locale","useLocale","router","useRouter","pathname","usePathname","nextLocale","React","Slot","cva","clsx","twMerge","cn","inputs","buttonVariants","cva","Button","_a","ref","_b","className","variant","size","asChild","props","__objRest","Slot","__spreadValues","cn","CinemaHome","cinemaName","webTheme","t","useTranslations","themeOverlay","Link","LocaleSwitcher","Button"]}
|