1import { r as reactExports, j as jsxRuntimeExports } from "./vendor-react-Bay9Y7Lb.js"; 2import { C as Canvas, a as OrbitControls } from "./vendor-react-three-BCww3P1x.js"; 3import { g as getInstrumentModelDefaults, S as StageEnvironment, M as Musician3D } from "./Musician3D-2CqS9Wxf.js"; 4import { dX as Film, cM as RefreshCw, cd as Save, bi as Sparkles, b_ as Pause, bV as Play } from "./vendor-D0P4XgNj.js"; 5import "./vendor-i18n-BC7ZMXWQ.js"; 6const GM_CATEGORIES = [ 7 { name: "Piano", start: 0, end: 7 }, 8 { name: "Chromatic Percussion", start: 8, end: 15 }, 9 { name: "Organ", start: 16, end: 23 }, 10 { name: "Guitar", start: 24, end: 31 }, 11 { name: "Bass", start: 32, end: 39 }, 12 { name: "Strings", start: 40, end: 47 }, 13 { name: "Ensemble", start: 48, end: 55 }, 14 { name: "Brass", start: 56, end: 63 }, 15 { name: "Reed (Woodwind)", start: 64, end: 71 }, 16 { name: "Pipe (Woodwind)", start: 72, end: 79 }, 17 { name: "Synth Lead", start: 80, end: 87 }, 18 { name: "Synth Pad", start: 88, end: 95 }, 19 { name: "Synth Effects", start: 96, end: 103 }, 20 { name: "Ethnic", start: 104, end: 111 }, 21 { name: "Percussive", start: 112, end: 119 }, 22 { name: "Sound Effects", start: 120, end: 127 } 23]; 24function CinematicStudio() { 25 const [selectedProgram, setSelectedProgram] = reactExports.useState(0); 26 const [isPercussion, setIsPercussion] = reactExports.useState(false); 27 const [hairStyle, setHairStyle] = reactExports.useState("piano"); 28 const [hairColor, setHairColor] = reactExports.useState("#b7791f"); 29 const [skinColor, setSkinColor] = reactExports.useState("#ffdbac"); 30 const [outfit, setOutfit] = reactExports.useState("tuxedo"); 31 const [accessory, setAccessory] = reactExports.useState("bowtie"); 32 const [action, setAction] = reactExports.useState("none"); 33 const [isPlaying, setIsPlaying] = reactExports.useState(true); 34 const [instrumentColor, setInstrumentColor] = reactExports.useState("#a27b5c"); 35 const [sceneTheme, setSceneTheme] = reactExports.useState("concert_hall"); 36 const [spotlights, setSpotlights] = reactExports.useState({ 37 center: "#ffddaa", 38 left: "#88ccff", 39 right: "#ff99bb" 40 }); 41 const [toastMessage, setToastMessage] = reactExports.useState(null); 42 reactExports.useEffect(() => { 43 var _a; 44 const defaults = getInstrumentModelDefaults(selectedProgram, isPercussion); 45 setHairStyle(defaults.shapeType); 46 setInstrumentColor(defaults.color); 47 try { 48 const savedStr = localStorage.getItem("cinematic_studio_save_data"); 49 if (savedStr) { 50 const config = JSON.parse(savedStr); 51 const programKey = String(selectedProgram); 52 if ((_a = config.instruments) == null ? void 0 : _a[programKey]) { 53 const custom = config.instruments[programKey]; 54 if (custom.hairStyle) setHairStyle(custom.hairStyle); 55 if (custom.hairColor) setHairColor(custom.hairColor); 56 if (custom.skinColor) setSkinColor(custom.skinColor); 57 if (custom.outfit) setOutfit(custom.outfit); 58 if (custom.accessory) setAccessory(custom.accessory); 59 if (custom.instrumentColor) setInstrumentColor(custom.instrumentColor); 60 } 61 if (config.sceneTheme) setSceneTheme(config.sceneTheme); 62 if (config.spotlights) setSpotlights(config.spotlights); 63 } 64 } catch (e) { 65 console.error("Failed to parse saved config:", e); 66 } 67 }, [selectedProgram, isPercussion]); 68 const handleSave = () => { 69 try { 70 const savedStr = localStorage.getItem("cinematic_studio_save_data"); 71 const config = savedStr ? JSON.parse(savedStr) : { instruments: {}, spotlights: {}, sceneTheme: "concert_hall" }; 72 const programKey = String(selectedProgram); 73 config.instruments[programKey] = { 74 hairStyle, 75 hairColor, 76 skinColor, 77 outfit, 78 accessory, 79 instrumentColor 80 }; 81 config.sceneTheme = sceneTheme; 82 config.spotlights = spotlights; 83 localStorage.setItem("cinematic_studio_save_data", JSON.stringify(config)); 84 setToastMessage("Configurations saved successfully!"); 85 setTimeout(() => setToastMessage(null), 3e3); 86 } catch (e) { 87 setToastMessage("Failed to save configurations."); 88 setTimeout(() => setToastMessage(null), 3e3); 89 } 90 }; 91 const handleReset = () => { 92 const defaults = getInstrumentModelDefaults(selectedProgram, isPercussion); 93 setHairStyle(defaults.shapeType); 94 setInstrumentColor(defaults.color); 95 setHairColor("#b7791f"); 96 setSkinColor("#ffdbac"); 97 setOutfit("tuxedo"); 98 setAccessory("bowtie"); 99 setAction("none"); 100 }; 101 const currentCategory = GM_CATEGORIES.find((cat) => selectedProgram >= cat.start && selectedProgram <= cat.end); 102 return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col gap-6 p-6 min-h-screen bg-zinc-950 text-white font-sans", children: [
103 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col md:flex-row md:items-center justify-between gap-4 p-5 bg-gradient-to-r from-zinc-900 to-zinc-800 rounded-xl border border-zinc-800 shadow-lg", children: [ 104 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-3", children: [ 105 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "p-3 bg-amber-500/10 border border-amber-500/30 text-amber-500 rounded-lg", children: /* @__PURE__ */ jsxRuntimeExports.jsx(Film, { size: 26 }) }), 106 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [ 107 /* @__PURE__ */ jsxRuntimeExports.jsx("h1", { className: "text-2xl font-bold tracking-tight", children: "Cinematic Visualizer Studio" }), 108 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm text-zinc-400 mt-0.5", children: "Oversee, configure, and sandbox 3D low-poly musician puppets & stage effects" }) 109 ] }) 110 ] }), 111 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2", children: [
112 /* @__PURE__ */ jsxRuntimeExports.jsxs( 113 "button", 114 { 115 onClick: handleReset, 116 className: "flex items-center gap-2 px-4 py-2 bg-zinc-850 hover:bg-zinc-850 border border-zinc-700 hover:border-zinc-500 rounded-lg text-sm text-zinc-300 hover:text-white transition-all", 117 children: [ 118 /* @__PURE__ */ jsxRuntimeExports.jsx(RefreshCw, { size: 16 }), 119 "Reset Program Defaults" 120 ] 121 } 122 ), 123 /* @__PURE__ */ jsxRuntimeExports.jsxs( 124 "button", 125 { 126 onClick: handleSave, 127 className: "flex items-center gap-2 px-5 py-2 bg-amber-600 hover:bg-amber-500 active:bg-amber-700 rounded-lg text-sm font-semibold tracking-wide transition-all shadow-md", 128 children: [ 129 /* @__PURE__ */ jsxRuntimeExports.jsx(Save, { size: 16 }), 130 "Save Configuration" 131 ] 132 } 133 ) 134 ] }) 135 ] }), 136 toastMessage && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "fixed bottom-6 right-6 z-[110] px-5 py-3 bg-zinc-900 border border-amber-500 text-amber-400 rounded-lg shadow-xl text-sm font-semibold flex items-center gap-2 animate-in fade-in slide-in-from-bottom-4 duration-300", children: [
137 /* @__PURE__ */ jsxRuntimeExports.jsx(Sparkles, { size: 16 }), 138 toastMessage 139 ] }), 140 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "grid grid-cols-1 xl:grid-cols-12 gap-6", children: [ 141 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "xl:col-span-4 flex flex-col gap-6", children: [ 142 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "p-5 bg-zinc-900 rounded-xl border border-zinc-850 flex flex-col gap-4", children: [ 143 /* @__PURE__ */ jsxRuntimeExports.jsx("h2", { className: "text-base font-bold text-zinc-200 border-b border-zinc-800 pb-2", children: "Instrument Selection" }), 144 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col gap-3", children: [ 145 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [ 146 /* @__PURE__ */ jsxRuntimeExports.jsx("label", { className: "block text-xs font-semibold text-zinc-400 mb-1", children: "Midi Channel Type" }), 147 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex gap-2", children: [
148 /* @__PURE__ */ jsxRuntimeExports.jsx( 149 "button", 150 { 151 onClick: () => { 152 setIsPercussion(false); 153 setSelectedProgram(0); 154 }, 155 className: `flex-1 py-1.5 rounded-lg text-sm border font-medium transition-all ${!isPercussion ? "bg-amber-600/10 border-amber-600 text-amber-500" : "bg-zinc-950 border-zinc-800 hover:border-zinc-700 text-zinc-400"}`, 156 children: "Melodic Track" 157 } 158 ), 159 /* @__PURE__ */ jsxRuntimeExports.jsx( 160 "button", 161 { 162 onClick: () => { 163 setIsPercussion(true); 164 setSelectedProgram(0); 165 }, 166 className: `flex-1 py-1.5 rounded-lg text-sm border font-medium transition-all ${isPercussion ? "bg-amber-600/10 border-amber-600 text-amber-500" : "bg-zinc-950 border-zinc-800 hover:border-zinc-700 text-zinc-400"}`, 167 children: "Percussion Track" 168 } 169 ) 170 ] }) 171 ] }),
172 !isPercussion && /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [ 173 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [ 174 /* @__PURE__ */ jsxRuntimeExports.jsx("label", { className: "block text-xs font-semibold text-zinc-400 mb-1", children: "Category Group" }), 175 /* @__PURE__ */ jsxRuntimeExports.jsx( 176 "select", 177 { 178 onChange: (e) => { 179 const cat = GM_CATEGORIES.find((c) => c.name === e.target.value); 180 if (cat) setSelectedProgram(cat.start); 181 }, 182 value: (currentCategory == null ? void 0 : currentCategory.name) || "Piano", 183 className: "w-full px-3 py-2 bg-zinc-950 border border-zinc-850 hover:border-zinc-700 rounded-lg text-sm text-zinc-300 outline-none", 184 children: GM_CATEGORIES.map((cat) => /* @__PURE__ */ jsxRuntimeExports.jsx("option", { value: cat.name, children: cat.name }, cat.name)) 185 } 186 ) 187 ] }),
188 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [ 189 /* @__PURE__ */ jsxRuntimeExports.jsx("label", { className: "block text-xs font-semibold text-zinc-400 mb-1", children: "Instrument Program" }), 190 /* @__PURE__ */ jsxRuntimeExports.jsx( 191 "select", 192 { 193 onChange: (e) => setSelectedProgram(Number(e.target.value)), 194 value: selectedProgram, 195 className: "w-full px-3 py-2 bg-zinc-950 border border-zinc-850 hover:border-zinc-700 rounded-lg text-sm text-zinc-300 outline-none", 196 children: currentCategory && Array.from({ length: currentCategory.end - currentCategory.start + 1 }, (_, i) => { 197 const prog = currentCategory.start + i; 198 return /* @__PURE__ */ jsxRuntimeExports.jsxs("option", { value: prog, children: [ 199 "Program ", 200 prog, 201 " (Category ", 202 currentCategory.name, 203 ")" 204 ] }, prog); 205 }) 206 } 207 ) 208 ] }) 209 ] }),
210 isPercussion && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [ 211 /* @__PURE__ */ jsxRuntimeExports.jsx("label", { className: "block text-xs font-semibold text-zinc-400 mb-1", children: "Percussion Program Mapping" }), 212 /* @__PURE__ */ jsxRuntimeExports.jsx( 213 "select", 214 { 215 onChange: (e) => setSelectedProgram(Number(e.target.value)), 216 value: selectedProgram, 217 className: "w-full px-3 py-2 bg-zinc-950 border border-zinc-850 hover:border-zinc-700 rounded-lg text-sm text-zinc-300 outline-none", 218 children: /* @__PURE__ */ jsxRuntimeExports.jsx("option", { value: 0, children: "General Percussion Channel 9 (Drums/Snare/Tom)" }) 219 } 220 ) 221 ] }) 222 ] }) 223 ] }), 224 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "p-5 bg-zinc-900 rounded-xl border border-zinc-850 flex flex-col gap-4", children: [ 225 /* @__PURE__ */ jsxRuntimeExports.jsx("h2", { className: "text-base font-bold text-zinc-200 border-b border-zinc-800 pb-2", children: "Humanoid Customizer" }),
226 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col gap-3", children: [ 227 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [ 228 /* @__PURE__ */ jsxRuntimeExports.jsx("label", { className: "block text-xs font-semibold text-zinc-400 mb-1", children: "Hairstyle Preset" }), 229 /* @__PURE__ */ jsxRuntimeExports.jsxs( 230 "select", 231 { 232 onChange: (e) => setHairStyle(e.target.value), 233 value: hairStyle, 234 className: "w-full px-3 py-2 bg-zinc-950 border border-zinc-850 hover:border-zinc-700 rounded-lg text-sm text-zinc-300 outline-none", 235 children: [ 236 /* @__PURE__ */ jsxRuntimeExports.jsx("option", { value: "piano", children: "Classical Buns (Piano/Violin style)" }), 237 /* @__PURE__ */ jsxRuntimeExports.jsx("option", { value: "guitar", children: "Punk Spikes (Guitar/Bass/Synth style)" }), 238 /* @__PURE__ */ jsxRuntimeExports.jsx("option", { value: "drums", children: "Baseball Cap (Drummer style)" }) 239 ] 240 } 241 ) 242 ] }),
243 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [ 244 /* @__PURE__ */ jsxRuntimeExports.jsx("label", { className: "block text-xs font-semibold text-zinc-400 mb-1", children: "Outfit Costume" }), 245 /* @__PURE__ */ jsxRuntimeExports.jsxs( 246 "select", 247 { 248 onChange: (e) => setOutfit(e.target.value), 249 value: outfit, 250 className: "w-full px-3 py-2 bg-zinc-950 border border-zinc-850 hover:border-zinc-700 rounded-lg text-sm text-zinc-300 outline-none", 251 children: [ 252 /* @__PURE__ */ jsxRuntimeExports.jsx("option", { value: "tuxedo", children: "Classical Tuxedo Suit" }), 253 /* @__PURE__ */ jsxRuntimeExports.jsx("option", { value: "tshirt", children: "Casual Rocker T-Shirt" }), 254 /* @__PURE__ */ jsxRuntimeExports.jsx("option", { value: "robe", children: "Electronic Synth Wizard Robe" }) 255 ] 256 } 257 ) 258 ] }),
259 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [ 260 /* @__PURE__ */ jsxRuntimeExports.jsx("label", { className: "block text-xs font-semibold text-zinc-400 mb-1", children: "Outfit Accessories" }), 261 /* @__PURE__ */ jsxRuntimeExports.jsxs( 262 "select", 263 { 264 onChange: (e) => setAccessory(e.target.value), 265 value: accessory, 266 className: "w-full px-3 py-2 bg-zinc-950 border border-zinc-850 hover:border-zinc-700 rounded-lg text-sm text-zinc-300 outline-none", 267 children: [ 268 /* @__PURE__ */ jsxRuntimeExports.jsx("option", { value: "none", children: "None" }), 269 /* @__PURE__ */ jsxRuntimeExports.jsx("option", { value: "sunglasses", children: "Rocker Sunglasses" }), 270 /* @__PURE__ */ jsxRuntimeExports.jsx("option", { value: "bowtie", children: "Tuxedo Bowtie" }), 271 /* @__PURE__ */ jsxRuntimeExports.jsx("option", { value: "both", children: "Both Sunglasses & Bowtie" }) 272 ] 273 } 274 ) 275 ] }),
276 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "grid grid-cols-2 gap-2", children: [ 277 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [ 278 /* @__PURE__ */ jsxRuntimeExports.jsx("label", { className: "block text-xs font-semibold text-zinc-400 mb-1", children: "Hair Tone" }), 279 /* @__PURE__ */ jsxRuntimeExports.jsx( 280 "input", 281 { 282 type: "color", 283 value: hairColor, 284 onChange: (e) => setHairColor(e.target.value), 285 className: "w-full h-8 bg-transparent cursor-pointer rounded outline-none border border-zinc-800" 286 } 287 ) 288 ] }), 289 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [ 290 /* @__PURE__ */ jsxRuntimeExports.jsx("label", { className: "block text-xs font-semibold text-zinc-400 mb-1", children: "Skin Tone" }), 291 /* @__PURE__ */ jsxRuntimeExports.jsx( 292 "input", 293 { 294 type: "color", 295 value: skinColor, 296 onChange: (e) => setSkinColor(e.target.value), 297 className: "w-full h-8 bg-transparent cursor-pointer rounded outline-none border border-zinc-800" 298 } 299 ) 300 ] }) 301 ] }),
302 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [ 303 /* @__PURE__ */ jsxRuntimeExports.jsx("label", { className: "block text-xs font-semibold text-zinc-400 mb-1", children: "Instrument Body Color" }), 304 /* @__PURE__ */ jsxRuntimeExports.jsx( 305 "input", 306 { 307 type: "color", 308 value: instrumentColor, 309 onChange: (e) => setInstrumentColor(e.target.value), 310 className: "w-full h-8 bg-transparent cursor-pointer rounded outline-none border border-zinc-800" 311 } 312 ) 313 ] }) 314 ] }) 315 ] }), 316 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "p-5 bg-zinc-900 rounded-xl border border-zinc-850 flex flex-col gap-4", children: [ 317 /* @__PURE__ */ jsxRuntimeExports.jsx("h2", { className: "text-base font-bold text-zinc-200 border-b border-zinc-800 pb-2", children: "Stage & Backing Scene" }), 318 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col gap-3", children: [
319 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [ 320 /* @__PURE__ */ jsxRuntimeExports.jsx("label", { className: "block text-xs font-semibold text-zinc-400 mb-1", children: "Acoustic Backdrop Style" }), 321 /* @__PURE__ */ jsxRuntimeExports.jsxs( 322 "select", 323 { 324 onChange: (e) => setSceneTheme(e.target.value), 325 value: sceneTheme, 326 className: "w-full px-3 py-2 bg-zinc-950 border border-zinc-850 hover:border-zinc-700 rounded-lg text-sm text-zinc-300 outline-none", 327 children: [ 328 /* @__PURE__ */ jsxRuntimeExports.jsx("option", { value: "concert_hall", children: "Mahogany Sound Diffuser slats (Classic)" }), 329 /* @__PURE__ */ jsxRuntimeExports.jsx("option", { value: "neon_club", children: "Glowing grid vertical neon bars (Cyberpunk)" }), 330 /* @__PURE__ */ jsxRuntimeExports.jsx("option", { value: "space_abyss", children: "Floating space diamond crystals (Abyss)" }) 331 ] 332 } 333 ) 334 ] }),
335 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [ 336 /* @__PURE__ */ jsxRuntimeExports.jsx("label", { className: "block text-xs font-semibold text-zinc-400 mb-1", children: "Spotlight Color Channels" }), 337 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "grid grid-cols-3 gap-2", children: [ 338 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [ 339 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "block text-[10px] text-zinc-500 font-semibold mb-0.5", children: "Center" }), 340 /* @__PURE__ */ jsxRuntimeExports.jsx( 341 "input", 342 { 343 type: "color", 344 value: spotlights.center, 345 onChange: (e) => setSpotlights((prev) => ({ ...prev, center: e.target.value })), 346 className: "w-full h-8 bg-transparent cursor-pointer rounded border border-zinc-800" 347 } 348 ) 349 ] }),
350 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [ 351 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "block text-[10px] text-zinc-500 font-semibold mb-0.5", children: "Left" }), 352 /* @__PURE__ */ jsxRuntimeExports.jsx( 353 "input", 354 { 355 type: "color", 356 value: spotlights.left, 357 onChange: (e) => setSpotlights((prev) => ({ ...prev, left: e.target.value })), 358 className: "w-full h-8 bg-transparent cursor-pointer rounded border border-zinc-800" 359 } 360 ) 361 ] }), 362 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [ 363 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "block text-[10px] text-zinc-500 font-semibold mb-0.5", children: "Right" }), 364 /* @__PURE__ */ jsxRuntimeExports.jsx( 365 "input", 366 { 367 type: "color", 368 value: spotlights.right, 369 onChange: (e) => setSpotlights((prev) => ({ ...prev, right: e.target.value })), 370 className: "w-full h-8 bg-transparent cursor-pointer rounded border border-zinc-800" 371 } 372 ) 373 ] }) 374 ] }) 375 ] }) 376 ] }) 377 ] }) 378 ] }),
379 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "xl:col-span-8 flex flex-col gap-6", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "relative w-full aspect-[16/10] min-h-[480px] bg-zinc-950 border border-zinc-850 rounded-xl overflow-hidden shadow-2xl flex flex-col justify-between", children: [ 380 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "absolute inset-0 z-0", children: /* @__PURE__ */ jsxRuntimeExports.jsxs( 381 Canvas, 382 { 383 camera: { position: [0, 2.5, 5], fov: 40 }, 384 shadows: true, 385 gl: { antialias: true, alpha: false }, 386 children: [ 387 /* @__PURE__ */ jsxRuntimeExports.jsx("color", { attach: "background", args: [sceneTheme === "space_abyss" ? "#030307" : "#0a0a0f"] }), 388 /* @__PURE__ */ jsxRuntimeExports.jsx("ambientLight", { intensity: sceneTheme === "space_abyss" ? 0.3 : 0.6 }), 389 /* @__PURE__ */ jsxRuntimeExports.jsx( 390 "directionalLight", 391 { 392 position: [5, 10, 5], 393 intensity: 1.2, 394 castShadow: true, 395 "shadow-mapSize": [1024, 1024] 396 } 397 ),
398 /* @__PURE__ */ jsxRuntimeExports.jsx( 399 StageEnvironment, 400 { 401 musicianPositions: [], 402 activeTrackIndices: /* @__PURE__ */ new Set(), 403 showGrid: true, 404 density: isPlaying ? 12 : 0 405 } 406 ), 407 /* @__PURE__ */ jsxRuntimeExports.jsx( 408 Musician3D, 409 { 410 index: 0, 411 instrument: { 412 program: selectedProgram, 413 midiChannel: isPercussion ? 9 : 0 414 }, 415 position: { 416 x: 0, 417 y: 0, 418 z: 0, 419 rotationY: 0 420 }, 421 activeNotes: isPlaying ? [{ i: 0, v: 0.8 }] : [], 422 soloedIndex: null, 423 previewOverride: { 424 hairStyle, 425 hairColor, 426 skinColor, 427 outfit, 428 accessory, 429 action 430 } 431 } 432 ),
433 /* @__PURE__ */ jsxRuntimeExports.jsx( 434 OrbitControls, 435 { 436 enablePan: true, 437 enableZoom: true, 438 maxPolarAngle: Math.PI / 2 - 0.05, 439 minDistance: 2, 440 maxDistance: 15 441 } 442 ) 443 ] 444 } 445 ) }), 446 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "relative z-10 p-4 bg-gradient-to-b from-black/80 to-transparent flex items-center justify-between gap-4 pointer-events-none", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2 px-3 py-1 bg-black/60 border border-zinc-800 rounded-full text-xs font-semibold text-zinc-300", children: [ 447 /* @__PURE__ */ jsxRuntimeExports.jsx(Sparkles, { size: 12, className: "text-amber-500" }), 448 "Interactive 3D Sandbox (Left-click & drag to orbit, scroll to zoom)" 449 ] }) }), 450 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "relative z-10 p-5 bg-gradient-to-t from-black/90 to-transparent flex flex-wrap items-center justify-between gap-4", children: [
451 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex items-center gap-2 bg-zinc-900/90 border border-zinc-850 p-1.5 rounded-lg", children: /* @__PURE__ */ jsxRuntimeExports.jsxs( 452 "button", 453 { 454 onClick: () => setIsPlaying(!isPlaying), 455 className: `p-2 rounded-md flex items-center justify-center gap-2 text-xs font-bold transition-all ${isPlaying ? "bg-amber-600 text-white" : "bg-zinc-800 text-zinc-300 hover:text-white"}`, 456 children: [ 457 isPlaying ? /* @__PURE__ */ jsxRuntimeExports.jsx(Pause, { size: 14 }) : /* @__PURE__ */ jsxRuntimeExports.jsx(Play, { size: 14 }), 458 isPlaying ? "Simulate Notes Playing" : "Idle resting pose" 459 ] 460 } 461 ) }), 462 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-1.5 bg-zinc-900/90 border border-zinc-850 p-1.5 rounded-lg", children: [ 463 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-[10px] font-bold text-zinc-400 uppercase tracking-wider px-2", children: "Gestures:" }),
464 /* @__PURE__ */ jsxRuntimeExports.jsx( 465 "button", 466 { 467 onClick: () => setAction(action === "waving" ? "none" : "waving"), 468 className: `px-3 py-1.5 rounded-md text-xs font-semibold transition-all ${action === "waving" ? "bg-amber-600 text-white" : "bg-zinc-800 text-zinc-400 hover:text-white"}`, 469 children: "Wave Arm" 470 } 471 ), 472 /* @__PURE__ */ jsxRuntimeExports.jsx( 473 "button", 474 { 475 onClick: () => setAction(action === "winking" ? "none" : "winking"), 476 className: `px-3 py-1.5 rounded-md text-xs font-semibold transition-all ${action === "winking" ? "bg-amber-600 text-white" : "bg-zinc-800 text-zinc-400 hover:text-white"}`, 477 children: "Wink Eye" 478 } 479 ), 480 /* @__PURE__ */ jsxRuntimeExports.jsx( 481 "button", 482 { 483 onClick: () => setAction(action === "air_guitar" ? "none" : "air_guitar"), 484 className: `px-3 py-1.5 rounded-md text-xs font-semibold transition-all ${action === "air_guitar" ? "bg-amber-600 text-white" : "bg-zinc-800 text-zinc-400 hover:text-white"}`, 485 children: "Air Guitar Stance" 486 } 487 ) 488 ] }) 489 ] }) 490 ] }) }) 491 ] }) 492 ] }); 493} 494export { 495 CinematicStudio as default 496};
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.