cinematic-renderer2d 0.1.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.
@@ -0,0 +1 @@
1
+ {"inputs":{"src/animation/AnimationCompiler.ts":{"bytes":15675,"imports":[],"format":"esm"},"src/parsing/SpecParser.ts":{"bytes":18487,"imports":[{"path":"zod","kind":"import-statement","external":true},{"path":"src/animation/AnimationCompiler.ts","kind":"import-statement","original":"../animation/AnimationCompiler"}],"format":"esm"},"src/core/Scheduler.ts":{"bytes":7933,"imports":[],"format":"esm"},"src/performance/QualitySystem.ts":{"bytes":13363,"imports":[],"format":"esm"},"src/audio/AudioSystem.ts":{"bytes":18754,"imports":[],"format":"esm"},"src/debug/DebugOverlay.ts":{"bytes":13095,"imports":[],"format":"esm"},"src/core/layers/BuiltInLayers.ts":{"bytes":33929,"imports":[],"format":"esm"},"src/core/LayerRegistry.ts":{"bytes":4176,"imports":[{"path":"src/core/layers/BuiltInLayers.ts","kind":"import-statement","original":"./layers/BuiltInLayers"}],"format":"esm"},"src/rendering/RenderBackend.ts":{"bytes":547,"imports":[],"format":"esm"},"src/rendering/dom/DOMRenderer.ts":{"bytes":3347,"imports":[{"path":"src/rendering/RenderBackend.ts","kind":"import-statement","original":"../RenderBackend"}],"format":"esm"},"src/types/QualityTypes.ts":{"bytes":5178,"imports":[],"format":"esm"},"src/rendering/canvas2d/Canvas2DRenderer.ts":{"bytes":13710,"imports":[{"path":"src/rendering/RenderBackend.ts","kind":"import-statement","original":"../RenderBackend"},{"path":"src/types/QualityTypes.ts","kind":"import-statement","original":"../../types/QualityTypes"}],"format":"esm"},"src/core/CinematicRenderer2D.ts":{"bytes":27744,"imports":[{"path":"src/parsing/SpecParser.ts","kind":"import-statement","original":"../parsing/SpecParser"},{"path":"src/core/Scheduler.ts","kind":"import-statement","original":"./Scheduler"},{"path":"src/performance/QualitySystem.ts","kind":"import-statement","original":"../performance/QualitySystem"},{"path":"src/audio/AudioSystem.ts","kind":"import-statement","original":"../audio/AudioSystem"},{"path":"src/debug/DebugOverlay.ts","kind":"import-statement","original":"../debug/DebugOverlay"},{"path":"src/core/LayerRegistry.ts","kind":"import-statement","original":"./LayerRegistry"},{"path":"src/rendering/dom/DOMRenderer.ts","kind":"import-statement","original":"../rendering/dom/DOMRenderer"},{"path":"src/rendering/canvas2d/Canvas2DRenderer.ts","kind":"import-statement","original":"../rendering/canvas2d/Canvas2DRenderer"}],"format":"esm"},"src/assets/AssetManager.ts":{"bytes":18582,"imports":[],"format":"esm"},"src/index.ts":{"bytes":3344,"imports":[{"path":"src/core/CinematicRenderer2D.ts","kind":"import-statement","original":"./core/CinematicRenderer2D"},{"path":"src/core/LayerRegistry.ts","kind":"import-statement","original":"./core/LayerRegistry"},{"path":"src/core/layers/BuiltInLayers.ts","kind":"import-statement","original":"./core/layers/BuiltInLayers"},{"path":"src/animation/AnimationCompiler.ts","kind":"import-statement","original":"./animation/AnimationCompiler"},{"path":"src/rendering/dom/DOMRenderer.ts","kind":"import-statement","original":"./rendering/dom/DOMRenderer"},{"path":"src/rendering/canvas2d/Canvas2DRenderer.ts","kind":"import-statement","original":"./rendering/canvas2d/Canvas2DRenderer"},{"path":"src/rendering/RenderBackend.ts","kind":"import-statement","original":"./rendering/RenderBackend"},{"path":"src/assets/AssetManager.ts","kind":"import-statement","original":"./assets/AssetManager"},{"path":"src/audio/AudioSystem.ts","kind":"import-statement","original":"./audio/AudioSystem"},{"path":"src/types/QualityTypes.ts","kind":"import-statement","original":"./types/QualityTypes"},{"path":"src/performance/QualitySystem.ts","kind":"import-statement","original":"./performance/QualitySystem"},{"path":"src/parsing/SpecParser.ts","kind":"import-statement","original":"./parsing/SpecParser"},{"path":"src/core/Scheduler.ts","kind":"import-statement","original":"./core/Scheduler"},{"path":"src/debug/DebugOverlay.ts","kind":"import-statement","original":"./debug/DebugOverlay"}],"format":"esm"}},"outputs":{"dist/index.cjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":297698},"dist/index.cjs":{"imports":[{"path":"zod","kind":"import-statement","external":true}],"exports":["AnimationCompiler","AssetManager","AudioSystem","Canvas2DRenderer","CinematicRenderer2D","DOMRenderer","DebugOverlay","DustLayer","GlowOrbLayer","GradientLayer","ImageLayer","LayerRegistry","NebulaNoiseLayer","NoiseOverlayLayer","ParticlesLayer","QUALITY_PRESETS","QualitySystem","RenderBackend","Scheduler","SpecParser","StarfieldLayer","TextBlockLayer","VERSION","VignetteLayer"],"entryPoint":"src/index.ts","inputs":{"src/parsing/SpecParser.ts":{"bytesInOutput":7770},"src/animation/AnimationCompiler.ts":{"bytesInOutput":5250},"src/core/Scheduler.ts":{"bytesInOutput":3080},"src/performance/QualitySystem.ts":{"bytesInOutput":6279},"src/audio/AudioSystem.ts":{"bytesInOutput":7756},"src/debug/DebugOverlay.ts":{"bytesInOutput":7645},"src/core/layers/BuiltInLayers.ts":{"bytesInOutput":16520},"src/core/LayerRegistry.ts":{"bytesInOutput":1709},"src/rendering/RenderBackend.ts":{"bytesInOutput":46},"src/rendering/dom/DOMRenderer.ts":{"bytesInOutput":1591},"src/types/QualityTypes.ts":{"bytesInOutput":916},"src/rendering/canvas2d/Canvas2DRenderer.ts":{"bytesInOutput":5684},"src/core/CinematicRenderer2D.ts":{"bytesInOutput":11848},"src/index.ts":{"bytesInOutput":15},"src/assets/AssetManager.ts":{"bytesInOutput":7440}},"bytes":84028}}}
@@ -0,0 +1 @@
1
+ {"inputs":{"src/animation/AnimationCompiler.ts":{"bytes":15675,"imports":[],"format":"esm"},"src/parsing/SpecParser.ts":{"bytes":18487,"imports":[{"path":"zod","kind":"import-statement","external":true},{"path":"src/animation/AnimationCompiler.ts","kind":"import-statement","original":"../animation/AnimationCompiler"}],"format":"esm"},"src/core/Scheduler.ts":{"bytes":7933,"imports":[],"format":"esm"},"src/performance/QualitySystem.ts":{"bytes":13363,"imports":[],"format":"esm"},"src/audio/AudioSystem.ts":{"bytes":18754,"imports":[],"format":"esm"},"src/debug/DebugOverlay.ts":{"bytes":13095,"imports":[],"format":"esm"},"src/core/layers/BuiltInLayers.ts":{"bytes":33929,"imports":[],"format":"esm"},"src/core/LayerRegistry.ts":{"bytes":4176,"imports":[{"path":"src/core/layers/BuiltInLayers.ts","kind":"import-statement","original":"./layers/BuiltInLayers"}],"format":"esm"},"src/rendering/RenderBackend.ts":{"bytes":547,"imports":[],"format":"esm"},"src/rendering/dom/DOMRenderer.ts":{"bytes":3347,"imports":[{"path":"src/rendering/RenderBackend.ts","kind":"import-statement","original":"../RenderBackend"}],"format":"esm"},"src/types/QualityTypes.ts":{"bytes":5178,"imports":[],"format":"esm"},"src/rendering/canvas2d/Canvas2DRenderer.ts":{"bytes":13710,"imports":[{"path":"src/rendering/RenderBackend.ts","kind":"import-statement","original":"../RenderBackend"},{"path":"src/types/QualityTypes.ts","kind":"import-statement","original":"../../types/QualityTypes"}],"format":"esm"},"src/core/CinematicRenderer2D.ts":{"bytes":27744,"imports":[{"path":"src/parsing/SpecParser.ts","kind":"import-statement","original":"../parsing/SpecParser"},{"path":"src/core/Scheduler.ts","kind":"import-statement","original":"./Scheduler"},{"path":"src/performance/QualitySystem.ts","kind":"import-statement","original":"../performance/QualitySystem"},{"path":"src/audio/AudioSystem.ts","kind":"import-statement","original":"../audio/AudioSystem"},{"path":"src/debug/DebugOverlay.ts","kind":"import-statement","original":"../debug/DebugOverlay"},{"path":"src/core/LayerRegistry.ts","kind":"import-statement","original":"./LayerRegistry"},{"path":"src/rendering/dom/DOMRenderer.ts","kind":"import-statement","original":"../rendering/dom/DOMRenderer"},{"path":"src/rendering/canvas2d/Canvas2DRenderer.ts","kind":"import-statement","original":"../rendering/canvas2d/Canvas2DRenderer"}],"format":"esm"},"src/assets/AssetManager.ts":{"bytes":18582,"imports":[],"format":"esm"},"src/index.ts":{"bytes":3344,"imports":[{"path":"src/core/CinematicRenderer2D.ts","kind":"import-statement","original":"./core/CinematicRenderer2D"},{"path":"src/core/LayerRegistry.ts","kind":"import-statement","original":"./core/LayerRegistry"},{"path":"src/core/layers/BuiltInLayers.ts","kind":"import-statement","original":"./core/layers/BuiltInLayers"},{"path":"src/animation/AnimationCompiler.ts","kind":"import-statement","original":"./animation/AnimationCompiler"},{"path":"src/rendering/dom/DOMRenderer.ts","kind":"import-statement","original":"./rendering/dom/DOMRenderer"},{"path":"src/rendering/canvas2d/Canvas2DRenderer.ts","kind":"import-statement","original":"./rendering/canvas2d/Canvas2DRenderer"},{"path":"src/rendering/RenderBackend.ts","kind":"import-statement","original":"./rendering/RenderBackend"},{"path":"src/assets/AssetManager.ts","kind":"import-statement","original":"./assets/AssetManager"},{"path":"src/audio/AudioSystem.ts","kind":"import-statement","original":"./audio/AudioSystem"},{"path":"src/types/QualityTypes.ts","kind":"import-statement","original":"./types/QualityTypes"},{"path":"src/performance/QualitySystem.ts","kind":"import-statement","original":"./performance/QualitySystem"},{"path":"src/parsing/SpecParser.ts","kind":"import-statement","original":"./parsing/SpecParser"},{"path":"src/core/Scheduler.ts","kind":"import-statement","original":"./core/Scheduler"},{"path":"src/debug/DebugOverlay.ts","kind":"import-statement","original":"./debug/DebugOverlay"}],"format":"esm"}},"outputs":{"dist/index.js.map":{"imports":[],"exports":[],"inputs":{},"bytes":297698},"dist/index.js":{"imports":[{"path":"zod","kind":"import-statement","external":true}],"exports":["AnimationCompiler","AssetManager","AudioSystem","Canvas2DRenderer","CinematicRenderer2D","DOMRenderer","DebugOverlay","DustLayer","GlowOrbLayer","GradientLayer","ImageLayer","LayerRegistry","NebulaNoiseLayer","NoiseOverlayLayer","ParticlesLayer","QUALITY_PRESETS","QualitySystem","RenderBackend","Scheduler","SpecParser","StarfieldLayer","TextBlockLayer","VERSION","VignetteLayer"],"entryPoint":"src/index.ts","inputs":{"src/parsing/SpecParser.ts":{"bytesInOutput":7770},"src/animation/AnimationCompiler.ts":{"bytesInOutput":5250},"src/core/Scheduler.ts":{"bytesInOutput":3080},"src/performance/QualitySystem.ts":{"bytesInOutput":6279},"src/audio/AudioSystem.ts":{"bytesInOutput":7756},"src/debug/DebugOverlay.ts":{"bytesInOutput":7645},"src/core/layers/BuiltInLayers.ts":{"bytesInOutput":16520},"src/core/LayerRegistry.ts":{"bytesInOutput":1709},"src/rendering/RenderBackend.ts":{"bytesInOutput":46},"src/rendering/dom/DOMRenderer.ts":{"bytesInOutput":1591},"src/types/QualityTypes.ts":{"bytesInOutput":916},"src/rendering/canvas2d/Canvas2DRenderer.ts":{"bytesInOutput":5684},"src/core/CinematicRenderer2D.ts":{"bytesInOutput":11848},"src/index.ts":{"bytesInOutput":15},"src/assets/AssetManager.ts":{"bytesInOutput":7440}},"bytes":84028}}}
package/dist/react.cjs ADDED
@@ -0,0 +1,182 @@
1
+ 'use strict';var react=require('react'),zod=require('zod'),jsxRuntime=require('react/jsx-runtime');var k=class{static compileTrack(e){let t=this.compileEasing(e.easing||"ease"),i=this.compileInterpolation(e.from,e.to,t);return {property:e.property,startMs:e.startMs,endMs:e.endMs,interpolate:i,loop:e.loop||false,yoyo:e.yoyo||false,easingType:e.easing||"ease",currentLoop:0,isReverse:false}}static compileEasing(e){if(typeof e=="string"&&e.startsWith("cubic-bezier("))return this.compileCubicBezier(e);switch(e){case "linear":return t=>t;case "ease":return this.cubicBezier(.25,.1,.25,1);case "ease-in":return this.cubicBezier(.42,0,1,1);case "ease-out":return this.cubicBezier(0,0,.58,1);case "ease-in-out":return this.cubicBezier(.42,0,.58,1);case "ease-in-sine":return t=>1-Math.cos(t*Math.PI/2);case "ease-out-sine":return t=>Math.sin(t*Math.PI/2);case "ease-in-out-sine":return t=>-(Math.cos(Math.PI*t)-1)/2;case "ease-in-quad":return t=>t*t;case "ease-out-quad":return t=>1-(1-t)*(1-t);case "ease-in-out-quad":return t=>t<.5?2*t*t:1-Math.pow(-2*t+2,2)/2;case "ease-in-cubic":return t=>t*t*t;case "ease-out-cubic":return t=>1-Math.pow(1-t,3);case "ease-in-out-cubic":return t=>t<.5?4*t*t*t:1-Math.pow(-2*t+2,3)/2;case "ease-in-quart":return t=>t*t*t*t;case "ease-out-quart":return t=>1-Math.pow(1-t,4);case "ease-in-out-quart":return t=>t<.5?8*t*t*t*t:1-Math.pow(-2*t+2,4)/2;case "ease-in-quint":return t=>t*t*t*t*t;case "ease-out-quint":return t=>1-Math.pow(1-t,5);case "ease-in-out-quint":return t=>t<.5?16*t*t*t*t*t:1-Math.pow(-2*t+2,5)/2;case "ease-in-expo":return t=>t===0?0:Math.pow(2,10*(t-1));case "ease-out-expo":return t=>t===1?1:1-Math.pow(2,-10*t);case "ease-in-out-expo":return t=>t===0?0:t===1?1:t<.5?Math.pow(2,20*t-10)/2:(2-Math.pow(2,-20*t+10))/2;case "ease-in-circ":return t=>1-Math.sqrt(1-Math.pow(t,2));case "ease-out-circ":return t=>Math.sqrt(1-Math.pow(t-1,2));case "ease-in-out-circ":return t=>t<.5?(1-Math.sqrt(1-Math.pow(2*t,2)))/2:(Math.sqrt(1-Math.pow(-2*t+2,2))+1)/2;case "ease-in-back":return this.backEasing(1.70158,"in");case "ease-out-back":return this.backEasing(1.70158,"out");case "ease-in-out-back":return this.backEasing(1.70158,"in-out");case "ease-in-elastic":return this.elasticEasing(2*Math.PI/3,"in");case "ease-out-elastic":return this.elasticEasing(2*Math.PI/3,"out");case "ease-in-out-elastic":return this.elasticEasing(2*Math.PI/4.5,"in-out");case "ease-in-bounce":return t=>1-this.bounceOut(1-t);case "ease-out-bounce":return this.bounceOut;case "ease-in-out-bounce":return t=>t<.5?(1-this.bounceOut(1-2*t))/2:(1+this.bounceOut(2*t-1))/2;default:return this.cubicBezier(.25,.1,.25,1)}}static compileInterpolation(e,t,i){let r=this.getValueType(e),n=this.getValueType(t);if(r!==n)return s=>i(Math.max(0,Math.min(1,s)))<.5?e:t;switch(r){case "number":return this.compileNumberInterpolation(e,t,i);case "string":return this.compileStringInterpolation(e,t,i);case "boolean":return this.compileBooleanInterpolation(e,t,i);case "object":return this.compileObjectInterpolation(e,t,i);default:return s=>i(Math.max(0,Math.min(1,s)))<.5?e:t}}static cubicBezier(e,t,i,r){return n=>{let s=3*e,a=3*(i-e)-s,c=1-s-a,m=3*t,p=3*(r-t)-m,y=1-m-p,f=n;for(let b=0;b<8;b++){let d=((c*f+a)*f+s)*f,u=(3*c*f+2*a)*f+s;if(Math.abs(u)<1e-6)break;f=f-(d-n)/u;}return ((y*f+p)*f+m)*f}}static compileCubicBezier(e){let t=e.match(/cubic-bezier\(([^)]+)\)/);if(!t||!t[1])return this.cubicBezier(.25,.1,.25,1);let i=t[1].split(",").map(r=>parseFloat(r.trim()));return i.length!==4||i.some(r=>isNaN(r))?this.cubicBezier(.25,.1,.25,1):this.cubicBezier(i[0],i[1],i[2],i[3])}static backEasing(e,t){let i=e,r=i*1.525,n=i+1;switch(t){case "in":return s=>n*s*s*s-i*s*s;case "out":return s=>1+n*Math.pow(s-1,3)+i*Math.pow(s-1,2);case "in-out":return s=>s<.5?Math.pow(2*s,2)*((r+1)*2*s-r)/2:(Math.pow(2*s-2,2)*((r+1)*(s*2-2)+r)+2)/2;default:return s=>s}}static elasticEasing(e,t){switch(t){case "in":return i=>i===0?0:i===1?1:-Math.pow(2,10*i-10)*Math.sin((i*10-10.75)*e);case "out":return i=>i===0?0:i===1?1:Math.pow(2,-10*i)*Math.sin((i*10-.75)*e)+1;case "in-out":return i=>i===0?0:i===1?1:i<.5?-(Math.pow(2,20*i-10)*Math.sin((20*i-11.125)*e))/2:Math.pow(2,-20*i+10)*Math.sin((20*i-11.125)*e)/2+1;default:return i=>i}}static bounceOut(e){return e<1/2.75?7.5625*e*e:e<2/2.75?7.5625*(e-=1.5/2.75)*e+.75:e<2.5/2.75?7.5625*(e-=2.25/2.75)*e+.9375:7.5625*(e-=2.625/2.75)*e+.984375}static getValueType(e){return typeof e=="number"?"number":typeof e=="string"?"string":typeof e=="boolean"?"boolean":"object"}static compileNumberInterpolation(e,t,i){let r=t-e;return n=>{let s=i(Math.max(0,Math.min(1,n)));return e+r*s}}static compileStringInterpolation(e,t,i){let r=e.match(/^([+-]?\d*\.?\d+)(.*)$/),n=t.match(/^([+-]?\d*\.?\d+)(.*)$/);if(r&&n&&r[2]===n[2]){let s=parseFloat(r[1]),a=parseFloat(n[1]),c=r[2],m=a-s;return p=>{let y=i(Math.max(0,Math.min(1,p))),f=s+m*y;return `${Math.round(f*1e6)/1e6}${c}`}}return s=>i(Math.max(0,Math.min(1,s)))<.5?e:t}static compileBooleanInterpolation(e,t,i){return r=>i(Math.max(0,Math.min(1,r)))<.5?e:t}static compileObjectInterpolation(e,t,i){let r=new Map,n=new Set([...Object.keys(e),...Object.keys(t)]);for(let s of n){let a=e[s],c=t[s];a!==void 0&&c!==void 0?r.set(s,this.compileInterpolation(a,c,i)):a!==void 0?r.set(s,()=>a):r.set(s,m=>i(Math.max(0,Math.min(1,m)))<.5?void 0:c);}return s=>{let a={};for(let[c,m]of r){let p=m(s);p!==void 0&&(a[c]=p);}return a}}};var ne=["1.0.0","1.1.0"],he=zod.z.enum(["low","medium","high","ultra","auto"]),pe=zod.z.enum(["gradient","image","textBlock","vignette","glowOrb","noiseOverlay","particles","starfield","dust","nebulaNoise","webgl-custom"]),le=zod.z.enum(["linear","ease","ease-in","ease-out","ease-in-out","ease-in-sine","ease-out-sine","ease-in-out-sine","ease-in-quad","ease-out-quad","ease-in-out-quad","ease-in-cubic","ease-out-cubic","ease-in-out-cubic","ease-in-quart","ease-out-quart","ease-in-out-quart","ease-in-quint","ease-out-quint","ease-in-out-quint","ease-in-expo","ease-out-expo","ease-in-out-expo","ease-in-circ","ease-out-circ","ease-in-out-circ","ease-in-back","ease-out-back","ease-in-out-back","ease-in-elastic","ease-out-elastic","ease-in-out-elastic","ease-in-bounce","ease-out-bounce","ease-in-out-bounce"]).or(zod.z.string().regex(/^cubic-bezier\(\d*\.?\d+,\d*\.?\d+,\d*\.?\d+,\d*\.?\d+\)$/)),fe=zod.z.enum(["voiceover","ambience","transition","music","sfx"]),ye=zod.z.enum(["fade","slide","zoom","wipe","dissolve","blur"]),ve=zod.z.enum(["image","video","audio","font","json","binary"]),ge=zod.z.object({x:zod.z.union([zod.z.number(),zod.z.string()]).optional(),y:zod.z.union([zod.z.number(),zod.z.string()]).optional(),scale:zod.z.number().optional(),rotation:zod.z.number().optional(),origin:zod.z.string().optional()}).optional(),be=zod.z.object({opacity:zod.z.number().min(0).max(1).optional(),visible:zod.z.boolean().optional(),transform:ge}).catchall(zod.z.any()),ce=zod.z.union([zod.z.number(),zod.z.string(),zod.z.boolean(),zod.z.record(zod.z.union([zod.z.number(),zod.z.string(),zod.z.boolean()]))]),xe=zod.z.object({property:zod.z.string().min(1),from:ce,to:ce,startMs:zod.z.number().min(0),endMs:zod.z.number().min(0),easing:le.optional().default("ease"),loop:zod.z.boolean().optional().default(false),yoyo:zod.z.boolean().optional().default(false)}).refine(v=>v.endMs>v.startMs,{message:"endMs must be greater than startMs",path:["endMs"]}),Ce=zod.z.object({id:zod.z.string().min(1),type:fe,src:zod.z.string().min(1),startMs:zod.z.number().min(0),endMs:zod.z.number().min(0).optional(),volume:zod.z.number().min(0).max(1).optional().default(1),fadeIn:zod.z.number().min(0).optional().default(0),fadeOut:zod.z.number().min(0).optional().default(0),loop:zod.z.boolean().optional().default(false)}),Te=zod.z.object({direction:zod.z.enum(["up","down","left","right","in","out"]).optional(),blurAmount:zod.z.number().min(0).optional()}).catchall(zod.z.any()).optional(),we=zod.z.object({type:ye,duration:zod.z.number().min(0),easing:le.optional().default("ease"),config:Te}),_e=zod.z.object({size:zod.z.number().min(0).optional(),mimeType:zod.z.string().optional(),cacheDuration:zod.z.number().min(0).optional(),dimensions:zod.z.object({width:zod.z.number().min(1),height:zod.z.number().min(1)}).optional(),duration:zod.z.number().min(0).optional()}).optional(),Me=zod.z.object({id:zod.z.string().min(1),type:ve,src:zod.z.string().min(1),preload:zod.z.boolean().optional().default(true),fallback:zod.z.string().optional(),metadata:_e}),Se=zod.z.object({id:zod.z.string().min(1),type:pe,zIndex:zod.z.number(),config:be,animations:zod.z.array(xe).optional().default([])}),Ee=zod.z.object({id:zod.z.string().min(1),name:zod.z.string().min(1),duration:zod.z.number().min(0),layers:zod.z.array(Se).min(1),audio:zod.z.array(Ce).optional().default([])}),Le=zod.z.object({id:zod.z.string().min(1),name:zod.z.string().min(1),scenes:zod.z.array(zod.z.string().min(1)).min(1),transitions:zod.z.array(we).optional().default([])}),Pe=zod.z.object({targetFps:zod.z.number().min(1).max(240).optional().default(60),quality:he.optional().default("auto"),debug:zod.z.boolean().optional().default(false),autoplay:zod.z.boolean().optional().default(false)}),Ae=zod.z.object({schemaVersion:zod.z.string().min(1),engine:Pe,events:zod.z.array(Le).min(1),scenes:zod.z.array(Ee).min(1),assets:zod.z.array(Me).optional().default([])}).refine(v=>{let e=new Set(v.scenes.map(i=>i.id)),t=new Set(v.events.flatMap(i=>i.scenes));for(let i of t)if(!e.has(i))return false;return true},{message:"All scene IDs referenced in events must exist in the scenes array",path:["events"]}).refine(v=>{let e=v.events.map(r=>r.id),t=v.scenes.map(r=>r.id),i=v.assets?.map(r=>r.id)||[];return new Set(e).size===e.length&&new Set(t).size===t.length&&new Set(i).size===i.length},{message:"All IDs must be unique within their respective collections",path:["events","scenes","assets"]}),Q=class{static validate(e){try{if(typeof e!="object"||e===null)throw new Error("Specification must be a valid object");let i=e.schemaVersion;if(!i||typeof i!="string")throw new Error("Missing or invalid schemaVersion. Current supported versions: "+ne.join(", "));if(!ne.includes(i))throw new Error(`Unsupported schema version: ${i}. Supported versions: ${ne.join(", ")}`);return this.validateByVersion(e,i)}catch(t){throw t instanceof zod.z.ZodError?new Error(this.formatZodError(t)):t}}static parse(e){let t={schemaVersion:e.schemaVersion,assetPromises:new Map,layerTypes:new Set(e.scenes.flatMap(i=>i.layers.map(r=>r.type))),diagnostics:[],optimizations:{precompileAnimations:true,optimizeAssetLoading:true,enableObjectPooling:true,minimizeDOMUpdates:true,useWebWorkers:false}};try{let i=this.compileAssets(e.assets||[],t),r=this.compileScenes(e.scenes,t),n=this.compileEvents(e.events,r,t),s=Math.max(...Array.from(n.values()).map(c=>c.startTime+c.duration)),a={events:n,scenes:r,assets:i,globalConfig:e.engine,schemaVersion:e.schemaVersion,totalDuration:s,compiledAt:Date.now()};return t.diagnostics.length>0&&console.warn("Compilation completed with warnings:",t.diagnostics),a}catch(i){throw t.diagnostics.push({level:"error",message:i instanceof Error?i.message:"Unknown compilation error",code:"COMPILATION_ERROR"}),new Error(`Compilation failed: ${i instanceof Error?i.message:"Unknown error"}`)}}static validateByVersion(e,t){switch(t){case "1.0.0":case "1.1.0":return Ae.parse(e);default:throw new Error(`Unsupported schema version: ${t}`)}}static compileAssets(e,t){let i=new Map;for(let r of e){let n={id:r.id,type:r.type,src:r.src,data:null,loaded:false,error:null,fallback:r.fallback,metadata:{size:r.metadata?.size||0,mimeType:r.metadata?.mimeType||"",cacheDuration:r.metadata?.cacheDuration||36e5,dimensions:r.metadata?.dimensions,duration:r.metadata?.duration,quality:1,streamable:false,priority:"normal"},progress:0};i.set(r.id,n);}return i}static compileScenes(e,t){let i=new Map,r=0;for(let n of e){let s=this.compileLayers(n.layers,t),a=this.compileAudioTracks(n.audio||[],t),c={id:n.id,name:n.name,duration:n.duration,layers:s,audioTracks:a,startTime:r,endTime:r+n.duration};i.set(n.id,c),r+=n.duration;}return i}static compileLayers(e,t){return e.sort((i,r)=>i.zIndex-r.zIndex).map(i=>{let r=this.compileAnimationTracks(i.animations||[],t),n={id:i.id,type:i.type,zIndex:i.zIndex,mount:()=>{},update:()=>{},destroy:()=>{}};return {id:i.id,type:i.type,zIndex:i.zIndex,instance:n,animations:r,initialConfig:{...i.config},active:true}})}static compileAnimationTracks(e,t){return e.map(i=>k.compileTrack(i))}static compileAudioTracks(e,t){return e.map(i=>{let r={id:i.id,type:"audio",src:i.src,data:null,loaded:false,error:null,metadata:{size:0,mimeType:"audio/mpeg",cacheDuration:36e5,priority:"normal"},progress:0};return {id:i.id,type:i.type,asset:r,startMs:i.startMs,endMs:i.endMs||0,volume:i.volume||1,fadeIn:i.fadeIn||0,fadeOut:i.fadeOut||0,loop:i.loop||false}})}static compileEvents(e,t,i){let r=new Map,n=0;for(let s of e){let a=s.scenes.map(y=>{let f=t.get(y);if(!f)throw new Error(`Scene with ID "${y}" not found for event "${s.id}"`);return f}),c=this.compileTransitions(s.transitions||[],i),m=a.reduce((y,f)=>y+f.duration,0),p={id:s.id,name:s.name,scenes:a,transitions:c,duration:m,startTime:n};r.set(s.id,p),n+=m;}return r}static compileTransitions(e,t){return e.map(i=>{let r=k.compileEasing(i.easing||"ease"),n=(a,c,m)=>{};return {type:i.type,duration:i.duration,easingFunction:r,config:i.config||{},execute:n}})}static formatZodError(e){return `Specification validation failed:
2
+ ${e.errors.map(i=>`${i.path.length>0?`at ${i.path.join(".")}`:"at root"}: ${i.message}`).join(`
3
+ `)}`}};var H=class{constructor(e={}){this.isRunning=false;this.animationFrameId=null;this.lastFrameTime=0;this.frameCallbacks=[];this.frameNumber=0;this.frameTimes=[];this.currentFps=0;this.lastMonitoringTime=0;this.qualityChangeCallbacks=[];this.options={targetFps:e.targetFps||60,fpsWindowSize:e.fpsWindowSize||60,monitoringInterval:e.monitoringInterval||1e3,enableAdaptiveQuality:e.enableAdaptiveQuality!==false},this.performanceMetrics={fps:0,frameTime:0,activeParticles:0,activeLayers:0,domNodes:0,drawCalls:0};}start(){this.isRunning||(this.isRunning=true,this.frameNumber=0,this.frameTimes=[],this.lastFrameTime=performance.now(),this.lastMonitoringTime=this.lastFrameTime,this.scheduleFrame());}stop(){this.isRunning=false,this.animationFrameId!==null&&(cancelAnimationFrame(this.animationFrameId),this.animationFrameId=null),this.frameNumber=0,this.frameTimes=[],this.currentFps=0;}addFrameCallback(e){this.frameCallbacks.push(e);}removeFrameCallback(e){let t=this.frameCallbacks.indexOf(e);t>-1&&this.frameCallbacks.splice(t,1);}addQualityChangeCallback(e){this.qualityChangeCallbacks.push(e);}removeQualityChangeCallback(e){let t=this.qualityChangeCallbacks.indexOf(e);t>-1&&this.qualityChangeCallbacks.splice(t,1);}getCurrentFps(){return this.currentFps}getPerformanceMetrics(){return {...this.performanceMetrics}}updateMetrics(e){this.performanceMetrics={...this.performanceMetrics,...e};}scheduleFrame(){this.isRunning&&(this.animationFrameId=requestAnimationFrame(e=>{let t=e-this.lastFrameTime;this.lastFrameTime=e,this.frameNumber++,this.updateFpsTracking(t),this.performanceMetrics.fps=this.currentFps,this.performanceMetrics.frameTime=t;let i={deltaMs:t,currentTime:e,fps:this.currentFps,frameNumber:this.frameNumber,metrics:{...this.performanceMetrics}};this.frameCallbacks.forEach(r=>{try{r(i);}catch(n){console.error("Error in frame callback:",n);}}),this.options.enableAdaptiveQuality&&e-this.lastMonitoringTime>=this.options.monitoringInterval&&(this.performPerformanceCheck(),this.lastMonitoringTime=e),this.scheduleFrame();}));}updateFpsTracking(e){if(this.frameTimes.push(e),this.frameTimes.length>this.options.fpsWindowSize&&this.frameTimes.shift(),this.frameTimes.length>0){let t=this.frameTimes.reduce((i,r)=>i+r,0)/this.frameTimes.length;this.currentFps=t>0?1e3/t:0;}}performPerformanceCheck(){let e=this.options.targetFps;this.currentFps/e;this.qualityChangeCallbacks.forEach(s=>{try{s(this.performanceMetrics);}catch(a){console.error("Error in quality change callback:",a);}}),typeof process<"u"&&process.env;}getAverageFrameTime(){return this.frameTimes.length===0?0:this.frameTimes.reduce((e,t)=>e+t,0)/this.frameTimes.length}getFrameTimeVariance(){if(this.frameTimes.length<2)return 0;let e=this.getAverageFrameTime();return this.frameTimes.reduce((i,r)=>{let n=r-e;return i+n*n},0)/this.frameTimes.length}isPerformanceStable(){let e=this.getFrameTimeVariance(),t=this.getAverageFrameTime();return e<t*.1}getPerformanceGrade(){let e=this.currentFps/this.options.targetFps,t=this.isPerformanceStable();return e>=.95&&t?"A":e>=.85&&t?"B":e>=.7?"C":e>=.5?"D":"F"}};var N=class{constructor(e={}){this.currentQuality="auto";this.performanceHistory=[];this.badFrameCount=0;this.goodFrameCount=0;this.lastQualityChange=0;this.eventCallbacks=[];if(this.config={monitoringInterval:e.monitoringInterval||1e3,fpsThreshold:e.fpsThreshold||50,badFrameThreshold:e.badFrameThreshold||5,goodFrameThreshold:e.goodFrameThreshold||30,respectUserPreferences:e.respectUserPreferences!==false,useDeviceDetection:e.useDeviceDetection!==false,customLevels:e.customLevels||{}},this.deviceCapabilities=this.detectDeviceCapabilities(),this.currentQuality="auto",this.currentSettings=this.getQualitySettings("auto"),this.config.useDeviceDetection){let t=this.determineInitialQuality();t!=="auto"&&(this.currentQuality=t,this.currentSettings=this.getQualitySettings(t));}}setQuality(e){if(this.currentQuality===e)return;let t=this.currentQuality;this.currentQuality=e,this.currentSettings=this.getQualitySettings(e),this.lastQualityChange=performance.now(),this.badFrameCount=0,this.goodFrameCount=0,this.emitEvent({type:"quality-change",metrics:this.getLatestMetrics(),previousQuality:t,newQuality:e,timestamp:performance.now()});}getCurrentQuality(){return this.currentQuality}getCurrentSettings(){return {...this.currentSettings}}getDeviceCapabilities(){return {...this.deviceCapabilities}}updatePerformanceMetrics(e){this.performanceHistory.push({...e,timestamp:performance.now()});let t=performance.now()-6e4;this.performanceHistory=this.performanceHistory.filter(i=>i.timestamp>t),this.currentQuality==="auto"&&this.evaluatePerformanceAndAdjust(e),this.checkPerformanceWarnings(e);}addEventListener(e){this.eventCallbacks.push(e);}removeEventListener(e){let t=this.eventCallbacks.indexOf(e);t>-1&&this.eventCallbacks.splice(t,1);}getQualitySettings(e){if(this.config.customLevels[e])return {...this.config.customLevels[e]};let t=this.getQualityPresets();if(e==="auto"){let i=this.determineAutoQuality();return {...t[i]}}return {...t[e]}}getQualityPresets(){return {low:{particleCount:50,canvasResolution:.5,animationPrecision:30,enableBlur:false,enableShadows:false,targetFps:30,enableAdvancedEffects:false,textureQuality:.5,useHardwareAcceleration:false},medium:{particleCount:200,canvasResolution:.75,animationPrecision:60,enableBlur:true,enableShadows:false,targetFps:60,enableAdvancedEffects:false,textureQuality:.75,useHardwareAcceleration:true},high:{particleCount:500,canvasResolution:1,animationPrecision:60,enableBlur:true,enableShadows:true,targetFps:60,enableAdvancedEffects:true,textureQuality:1,useHardwareAcceleration:true},ultra:{particleCount:1e3,canvasResolution:1.5,animationPrecision:120,enableBlur:true,enableShadows:true,targetFps:120,enableAdvancedEffects:true,textureQuality:1.5,useHardwareAcceleration:true},auto:{particleCount:200,canvasResolution:1,animationPrecision:60,enableBlur:true,enableShadows:true,targetFps:60,enableAdvancedEffects:true,textureQuality:1,useHardwareAcceleration:true}}}detectDeviceCapabilities(){let e=navigator,t=()=>typeof window<"u"&&window.matchMedia?window.matchMedia("(prefers-reduced-motion: reduce)").matches:false,i=()=>typeof window<"u"&&window.devicePixelRatio?window.devicePixelRatio:1,r=()=>{if(typeof screen<"u"&&screen.refreshRate)return screen.refreshRate};return {memory:e.deviceMemory,cores:e.hardwareConcurrency,prefersReducedMotion:t(),devicePixelRatio:i(),supportsHardwareAcceleration:this.detectHardwareAcceleration(),isMobile:this.detectMobile(),connectionType:this.detectConnectionType(),refreshRate:r()}}detectHardwareAcceleration(){try{if(typeof document>"u")return !1;let e=document.createElement("canvas");return !!(e.getContext("webgl")||e.getContext("experimental-webgl"))}catch{return false}}detectMobile(){return typeof navigator>"u"?false:/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)}detectConnectionType(){if(typeof navigator>"u")return;let e=navigator,t=e.connection||e.mozConnection||e.webkitConnection;if(t)return t.effectiveType||t.type}determineInitialQuality(){let e=this.deviceCapabilities;return this.config.respectUserPreferences&&e.prefersReducedMotion?"low":e.isMobile?"medium":e.memory&&e.memory<4?"low":e.memory&&e.memory>=8&&e.cores&&e.cores>=8?"high":"medium"}determineAutoQuality(){let e=this.getRecentMetrics();if(e.length===0)return this.determineInitialQuality();let t=e.reduce((r,n)=>r+n.fps,0)/e.length,i=this.currentSettings.targetFps;if(t>=i*.95){if(this.currentQuality==="low")return "medium";if(this.currentQuality==="medium")return "high";if(this.currentQuality==="high"&&!this.deviceCapabilities.isMobile)return "ultra"}else if(t<i*.8){if(this.currentQuality==="ultra")return "high";if(this.currentQuality==="high")return "medium";if(this.currentQuality==="medium")return "low"}return this.currentQuality}evaluatePerformanceAndAdjust(e){let t=this.currentSettings.targetFps,i=e.fps;performance.now()-this.lastQualityChange<this.config.monitoringInterval*2||(i<t*.8?(this.badFrameCount++,this.goodFrameCount=0):i>=t*.95&&(this.goodFrameCount++,this.badFrameCount=0),this.badFrameCount>=this.config.badFrameThreshold?this.reduceQuality():this.goodFrameCount>=this.config.goodFrameThreshold&&this.increaseQuality());}reduceQuality(){let e=["ultra","high","medium","low"],t=e.indexOf(this.currentQuality);if(t<e.length-1){let i=e[t+1];i&&this.setQuality(i);}}increaseQuality(){let e=["low","medium","high","ultra"],t=e.indexOf(this.currentQuality),i=this.deviceCapabilities.isMobile?"high":"ultra",r=e.indexOf(i);if(t<r){let n=e[t+1];n&&this.setQuality(n);}}checkPerformanceWarnings(e){e.fps<this.config.fpsThreshold&&this.emitEvent({type:"fps-drop",metrics:e,timestamp:performance.now()}),e.memoryUsage&&e.memoryUsage>100&&this.emitEvent({type:"memory-warning",metrics:e,timestamp:performance.now()}),e.fps>=this.currentSettings.targetFps*.95&&this.emitEvent({type:"performance-good",metrics:e,timestamp:performance.now()});}getRecentMetrics(){let e=performance.now()-this.config.monitoringInterval;return this.performanceHistory.filter(t=>t.timestamp>e)}getLatestMetrics(){if(this.performanceHistory.length>0){let e=this.performanceHistory[this.performanceHistory.length-1];if(e)return e}return {fps:0,frameTime:0,activeParticles:0,activeLayers:0,domNodes:0,drawCalls:0}}emitEvent(e){this.eventCallbacks.forEach(t=>{try{t(e);}catch(i){console.error("Error in performance event callback:",i);}});}};var q=class{constructor(e={}){this._eventListeners=new Map;this._audioContext=null;this._masterGainNode=null;this._activeTracks=new Map;this._compiledTracks=new Map;this._isInitialized=false;this._currentTime=0;this._isPlaying=false;this._userInteracted=false;this._config={sampleRate:e.sampleRate||44100,masterVolume:e.masterVolume||1,preferWebAudio:e.preferWebAudio!==false,maxConcurrentTracks:e.maxConcurrentTracks||8,defaultFadeDuration:e.defaultFadeDuration||1e3},this._setupUserInteractionDetection();}async initialize(){if(!this._isInitialized)try{this._config.preferWebAudio&&typeof AudioContext<"u"&&await this._initializeWebAudio(),this._isInitialized=!0;}catch(e){console.warn("AudioSystem: WebAudio initialization failed, using HTMLAudio fallback:",e),this._isInitialized=true;}}async loadTracks(e){this._isInitialized||await this.initialize();for(let t of e)if(this._compiledTracks.set(t.id,t),this._audioContext&&t.asset.data instanceof ArrayBuffer)try{let i=await this._audioContext.decodeAudioData(t.asset.data.slice(0));t.audioNode=i;}catch(i){console.warn(`AudioSystem: Failed to decode audio for track ${t.id}:`,i),this._createHTMLAudioElement(t);}else t.asset.data instanceof HTMLAudioElement?t.audioElement=t.asset.data:this._createHTMLAudioElement(t);}play(){this._isPlaying=true,this._audioContext&&this._audioContext.state==="suspended"&&(this._userInteracted?this._audioContext.resume().catch(e=>{console.warn("AudioSystem: Failed to resume audio context:",e),this._emit("context-suspended");}):this._emit("autoplay-blocked","system"));}pause(){this._isPlaying=false;for(let e of this._activeTracks.values())e.isPlaying&&this._pauseTrack(e);}stop(){this._isPlaying=false,this._currentTime=0;for(let e of this._activeTracks.values())this._stopTrack(e);this._activeTracks.clear();}update(e){if(this._currentTime=e,!!this._isPlaying)for(let t of this._compiledTracks.values()){let i=e>=t.startMs&&(t.endMs===void 0||e<t.endMs),r=this._activeTracks.get(t.id);i&&!r?this._startTrack(t,e):!i&&r&&r.isPlaying?this._stopTrack(r):r&&r.isPlaying&&this._updateTrack(r,e);}}seek(e){this._currentTime=e;for(let t of this._activeTracks.values())t.isPlaying&&this._stopTrack(t);this._isPlaying&&this.update(e);}setMasterVolume(e){this._config.masterVolume=Math.max(0,Math.min(1,e)),this._masterGainNode&&this._masterGainNode.gain.setValueAtTime(this._config.masterVolume,this._audioContext.currentTime);for(let t of this._activeTracks.values())t.audioElement&&(t.audioElement.volume=this._config.masterVolume*t.volume);}getMasterVolume(){return this._config.masterVolume}isWebAudioAvailable(){return this._audioContext!==null&&this._audioContext.state!=="closed"}getAudioContextState(){return this._audioContext?.state||null}getActiveTrackCount(){return Array.from(this._activeTracks.values()).filter(e=>e.isPlaying).length}destroy(){this.stop(),this._audioContext&&(typeof this._audioContext.close=="function"&&this._audioContext.close(),this._audioContext=null,this._masterGainNode=null),this._compiledTracks.clear(),this._eventListeners.clear(),this._isInitialized=false;}on(e,t){this._eventListeners.has(e)||this._eventListeners.set(e,[]),this._eventListeners.get(e).push(t);}off(e,t){let i=this._eventListeners.get(e);if(i){let r=i.indexOf(t);r>-1&&i.splice(r,1);}}async _initializeWebAudio(){let e=window.AudioContext||window.webkitAudioContext;if(!e)throw new Error("WebAudio API not supported");this._audioContext=new e({sampleRate:this._config.sampleRate}),this._masterGainNode=this._audioContext.createGain(),this._masterGainNode.gain.setValueAtTime(this._config.masterVolume,this._audioContext.currentTime),this._masterGainNode.connect(this._audioContext.destination),this._audioContext.addEventListener("statechange",()=>{this._audioContext.state==="suspended"?this._emit("context-suspended"):this._audioContext.state==="running"&&this._emit("context-resumed");});}_createHTMLAudioElement(e){let t=new Audio;t.src=e.asset.src,t.preload="auto",t.loop=e.loop,t.onerror=()=>{this._emit("track-error",e.id,new Error(`Failed to load audio: ${e.asset.src}`));},e.audioElement=t;}_startTrack(e,t){if(this._activeTracks.size>=this._config.maxConcurrentTracks){console.warn(`AudioSystem: Maximum concurrent tracks (${this._config.maxConcurrentTracks}) reached`);return}let i={id:e.id,type:e.type,startTime:e.startMs,endTime:e.endMs,volume:e.volume,fadeIn:e.fadeIn,fadeOut:e.fadeOut,loop:e.loop,audioNode:e.audioNode,audioElement:e.audioElement,isPlaying:false,isPaused:false,currentTime:t-e.startMs};this._activeTracks.set(i.id,i);try{if(this._audioContext&&i.audioNode)this._startWebAudioTrack(i,e);else if(i.audioElement)this._startHTMLAudioTrack(i);else throw new Error("No audio source available");i.isPlaying=!0,this._emit("track-started",i.id);}catch(r){console.error(`AudioSystem: Failed to start track ${i.id}:`,r),this._emit("track-error",i.id,r),this._activeTracks.delete(i.id);}}_startWebAudioTrack(e,t){if(!this._audioContext||!this._masterGainNode)throw new Error("WebAudio context not available");let i=this._audioContext.createBufferSource();i.buffer=e.audioNode,i.loop=e.loop;let r=this._audioContext.createGain();e.gainNode=r,i.connect(r),r.connect(this._masterGainNode);let n=this._audioContext.currentTime;e.fadeIn>0?(r.gain.setValueAtTime(0,n),r.gain.linearRampToValueAtTime(e.volume,n+e.fadeIn/1e3)):r.gain.setValueAtTime(e.volume,n),i.onended=()=>{e.isPlaying&&(e.isPlaying=false,this._emit("track-ended",e.id),this._activeTracks.delete(e.id));};let s=Math.max(0,e.currentTime/1e3);i.start(0,s),e.source=i;}_startHTMLAudioTrack(e){if(!e.audioElement)throw new Error("HTMLAudio element not available");let t=e.audioElement;t.volume=this._config.masterVolume*e.volume,e.currentTime>0&&(t.currentTime=e.currentTime/1e3),e.fadeIn>0&&(t.volume=0,this._fadeHTMLAudio(t,this._config.masterVolume*e.volume,e.fadeIn)),t.onended=()=>{e.isPlaying&&(e.isPlaying=false,this._emit("track-ended",e.id),this._activeTracks.delete(e.id));},t.onerror=()=>{this._emit("track-error",e.id,new Error("HTMLAudio playback error"));};let i=t.play();i&&i.catch(r=>{r.name==="NotAllowedError"?this._emit("autoplay-blocked",e.id):this._emit("track-error",e.id,r);});}_pauseTrack(e){e.isPaused=true,e.source?(e.source.stop(),e.source=void 0):e.audioElement&&e.audioElement.pause();}_stopTrack(e){if(e.isPlaying=false,e.isPaused=false,e.fadeOut>0)if(e.gainNode&&this._audioContext){let t=this._audioContext.currentTime;e.gainNode.gain.linearRampToValueAtTime(0,t+e.fadeOut/1e3),setTimeout(()=>{this._forceStopTrack(e);},e.fadeOut);}else e.audioElement&&this._fadeHTMLAudio(e.audioElement,0,e.fadeOut).then(()=>{this._forceStopTrack(e);});else this._forceStopTrack(e);}_forceStopTrack(e){if(e.source){try{e.source.stop();}catch{}e.source=void 0;}e.audioElement&&(e.audioElement.pause(),e.audioElement.currentTime=0),this._activeTracks.delete(e.id);}_updateTrack(e,t){if(e.currentTime=t-e.startTime,e.endTime&&e.fadeOut>0){let i=e.endTime-t;if(i<=e.fadeOut&&i>0){let r=1-i/e.fadeOut,n=e.volume*(1-r);e.gainNode&&this._audioContext?e.gainNode.gain.setValueAtTime(n,this._audioContext.currentTime):e.audioElement&&(e.audioElement.volume=this._config.masterVolume*n);}}}async _fadeHTMLAudio(e,t,i){let r=e.volume,n=performance.now();return new Promise(s=>{let a=()=>{let c=performance.now()-n,m=Math.min(c/i,1);e.volume=r+(t-r)*m,m<1?requestAnimationFrame(a):s();};a();})}_setupUserInteractionDetection(){let e=["click","touchstart","keydown"],t=()=>{this._userInteracted=true,e.forEach(i=>{document.removeEventListener(i,t);}),this._audioContext&&this._audioContext.state==="suspended"&&this._audioContext.resume();};e.forEach(i=>{document.addEventListener(i,t,{once:true,passive:true});});}_emit(e,...t){let i=this._eventListeners.get(e);i&&i.forEach(r=>{try{r(...t);}catch(n){console.error(`Error in audio system event listener for "${e}":`,n);}});}};var V=class{constructor(e,t,i={}){this.overlayElement=null;this.updateTimer=null;this.isVisible=false;this.fpsHistory=[];this.frameTimeHistory=[];this.lastUpdateTime=0;this.renderer=e,this.container=t,this.options={position:i.position||"top-left",opacity:i.opacity||.9,fontSize:i.fontSize||12,updateInterval:i.updateInterval||100,showPerformanceGraph:i.showPerformanceGraph||true,maxGraphPoints:i.maxGraphPoints||60},this.createOverlay(),this.setupEventListeners();}show(){this.isVisible||(this.isVisible=true,this.overlayElement&&(this.overlayElement.style.display="block"),this.startUpdating());}hide(){this.isVisible&&(this.isVisible=false,this.overlayElement&&(this.overlayElement.style.display="none"),this.stopUpdating());}toggle(){this.isVisible?this.hide():this.show();}destroy(){this.stopUpdating(),this.overlayElement&&this.overlayElement.parentNode&&this.overlayElement.parentNode.removeChild(this.overlayElement),this.overlayElement=null;}createOverlay(){this.overlayElement=document.createElement("div"),this.overlayElement.className="cinematic-debug-overlay";let e=this.getOverlayStyles();Object.assign(this.overlayElement.style,e),this.overlayElement.style.display="none",this.container.appendChild(this.overlayElement);}getOverlayStyles(){let e={position:"fixed",zIndex:"10000",backgroundColor:"rgba(0, 0, 0, 0.8)",color:"#ffffff",fontFamily:'Monaco, Menlo, "Courier New", monospace',fontSize:`${this.options.fontSize}px`,lineHeight:"1.4",padding:"12px",borderRadius:"4px",opacity:this.options.opacity.toString(),pointerEvents:"none",userSelect:"none",minWidth:"200px",maxWidth:"300px",border:"1px solid rgba(255, 255, 255, 0.2)",backdropFilter:"blur(4px)"};switch(this.options.position){case "top-left":e.top="10px",e.left="10px";break;case "top-right":e.top="10px",e.right="10px";break;case "bottom-left":e.bottom="10px",e.left="10px";break;case "bottom-right":e.bottom="10px",e.right="10px";break}return e}setupEventListeners(){this.renderer.on("frame",e=>{this.updatePerformanceHistory(e.fps,e.deltaMs);}),document.addEventListener("keydown",e=>{(e.key==="d"||e.key==="D")&&(e.ctrlKey||e.metaKey)&&(e.preventDefault(),this.toggle());});}startUpdating(){if(this.updateTimer)return;let e=()=>{this.isVisible&&(this.updateDisplay(),this.updateTimer=window.setTimeout(e,this.options.updateInterval));};e();}stopUpdating(){this.updateTimer&&(clearTimeout(this.updateTimer),this.updateTimer=null);}updateDisplay(){if(!this.overlayElement)return;let e=this.gatherDebugInfo(),t=this.generateDebugHTML(e);this.overlayElement.innerHTML=t;}gatherDebugInfo(){let e=this.renderer.getCurrentTime(),t=this.renderer.getDuration(),i=this.renderer.getCurrentFps(),r=this.renderer.getPerformanceMetrics();return {fps:Math.round(i*10)/10,currentTime:e,duration:t,currentEvent:this.renderer.getCurrentEvent(),currentScene:this.renderer.getCurrentScene(),quality:this.renderer.getQuality(),activeLayers:r.activeLayers||0,activeParticles:r.activeParticles||0,domNodes:r.domNodes||0,drawCalls:r.drawCalls||0,memoryUsage:this.getMemoryUsage(),isPlaying:this.renderer.isPlaying(),isPaused:this.renderer.isPaused()}}generateDebugHTML(e){let t=a=>{let c=Math.floor(a/1e3),m=Math.floor(c/60),p=c%60,y=Math.floor(a%1e3);return m>0?`${m}:${p.toString().padStart(2,"0")}.${y.toString().padStart(3,"0")}`:`${p}.${y.toString().padStart(3,"0")}s`},i=(a,c)=>c===0?"0%":`${Math.round(a/c*100)}%`,r=e.isPlaying?"\u25B6\uFE0F":e.isPaused?"\u23F8\uFE0F":"\u23F9\uFE0F",n=this.getQualityColor(e.quality),s=`
4
+ <div style="margin-bottom: 8px; font-weight: bold; color: #00ff88;">
5
+ \u{1F3AC} cinematicRenderer2D Debug
6
+ </div>
7
+
8
+ <div style="margin-bottom: 6px;">
9
+ <span style="color: #888;">FPS:</span>
10
+ <span style="color: ${this.getFpsColor(e.fps)}; font-weight: bold;">
11
+ ${e.fps}
12
+ </span>
13
+ <span style="color: #888;"> / Target: ${this.getTargetFps()}</span>
14
+ </div>
15
+
16
+ <div style="margin-bottom: 6px;">
17
+ <span style="color: #888;">Quality:</span>
18
+ <span style="color: ${n}; font-weight: bold;">
19
+ ${e.quality.toUpperCase()}
20
+ </span>
21
+ </div>
22
+
23
+ <div style="margin-bottom: 8px;">
24
+ <span style="color: #888;">Timeline:</span> ${r}
25
+ <div style="margin-left: 10px; font-size: ${this.options.fontSize-1}px;">
26
+ ${t(e.currentTime)} / ${t(e.duration)}
27
+ <div style="color: #666;">
28
+ ${i(e.currentTime,e.duration)} complete
29
+ </div>
30
+ </div>
31
+ </div>
32
+
33
+ <div style="margin-bottom: 8px;">
34
+ <span style="color: #888;">Current:</span>
35
+ <div style="margin-left: 10px; font-size: ${this.options.fontSize-1}px;">
36
+ <div>Event: <span style="color: #88ccff;">${e.currentEvent||"None"}</span></div>
37
+ <div>Scene: <span style="color: #ffcc88;">${e.currentScene||"None"}</span></div>
38
+ </div>
39
+ </div>
40
+
41
+ <div style="margin-bottom: 8px;">
42
+ <span style="color: #888;">Rendering:</span>
43
+ <div style="margin-left: 10px; font-size: ${this.options.fontSize-1}px;">
44
+ <div>Layers: <span style="color: #88ff88;">${e.activeLayers}</span></div>
45
+ <div>Particles: <span style="color: #ff8888;">${e.activeParticles}</span></div>
46
+ <div>DOM Nodes: <span style="color: #8888ff;">${e.domNodes}</span></div>
47
+ <div>Draw Calls: <span style="color: #ffff88;">${e.drawCalls}</span></div>
48
+ </div>
49
+ </div>
50
+ `;return e.memoryUsage!==void 0&&(s+=`
51
+ <div style="margin-bottom: 8px;">
52
+ <span style="color: #888;">Memory:</span>
53
+ <span style="color: #ff88ff;">${(e.memoryUsage/1024/1024).toFixed(1)} MB</span>
54
+ </div>
55
+ `),this.options.showPerformanceGraph&&this.fpsHistory.length>1&&(s+=this.generatePerformanceGraph()),s+=`
56
+ <div style="margin-top: 8px; font-size: ${this.options.fontSize-2}px; color: #666; border-top: 1px solid #333; padding-top: 4px;">
57
+ Press Ctrl+D to toggle debug overlay
58
+ </div>
59
+ `,s}generatePerformanceGraph(){let i=Math.max(60,Math.max(...this.fpsHistory)),r=Math.min(0,Math.min(...this.fpsHistory)),n=i-r;if(n===0)return "";let s=this.fpsHistory.map((a,c)=>{let m=c/(this.fpsHistory.length-1)*180,p=40-(a-r)/n*40;return `${m},${p}`}).join(" ");return `
60
+ <div style="margin-top: 8px;">
61
+ <div style="color: #888; font-size: ${this.options.fontSize-2}px; margin-bottom: 2px;">
62
+ FPS Graph (${r.toFixed(1)} - ${i.toFixed(1)})
63
+ </div>
64
+ <svg width="180" height="40" style="background: rgba(255,255,255,0.1); border-radius: 2px;">
65
+ <polyline
66
+ points="${s}"
67
+ fill="none"
68
+ stroke="#00ff88"
69
+ stroke-width="1.5"
70
+ opacity="0.8"
71
+ />
72
+ <line
73
+ x1="0" y1="${40-(60-r)/n*40}"
74
+ x2="180" y2="${40-(60-r)/n*40}"
75
+ stroke="#ffff00"
76
+ stroke-width="1"
77
+ opacity="0.5"
78
+ stroke-dasharray="2,2"
79
+ />
80
+ </svg>
81
+ </div>
82
+ `}updatePerformanceHistory(e,t){let i=performance.now();i-this.lastUpdateTime<100||(this.lastUpdateTime=i,this.fpsHistory.push(e),this.frameTimeHistory.push(t),this.fpsHistory.length>this.options.maxGraphPoints&&(this.fpsHistory.shift(),this.frameTimeHistory.shift()));}getFpsColor(e){return e>=55?"#00ff88":e>=45?"#ffff00":e>=30?"#ff8800":"#ff4444"}getQualityColor(e){switch(e){case "ultra":return "#ff00ff";case "high":return "#00ff88";case "medium":return "#ffff00";case "low":return "#ff8800";case "auto":return "#88ccff";default:return "#ffffff"}}getTargetFps(){return 60}getMemoryUsage(){if("memory"in performance)return performance.memory.usedJSHeapSize}};function _(v,e){if(typeof v=="string"&&v.endsWith("%")){let t=parseFloat(v)/100;return e*t}return typeof v=="number"?v:parseFloat(v)||0}var E=class{constructor(e,t,i){this.mounted=false;this.id=e,this.type=t,this.zIndex=i.zIndex||0,this.config=i;}destroy(){this.mounted=false;}setVisible(e){this.mounted;}setOpacity(e){this.mounted;}resize(e,t){this.mounted;}},B=class extends E{constructor(e,t){super(e,"gradient",t);}mount(e){if(this.mounted)return;let t=e.renderer;if(t.createLayerElement){this.element=t.createLayerElement(this.id,this.zIndex);let{colors:i=["#000000","#ffffff"],direction:r="to bottom",opacity:n=1,width:s="100%",height:a="100%"}=this.config,c=i.join(", ");this.element&&(this.element.style.cssText+=`
83
+ background: linear-gradient(${r}, ${c});
84
+ opacity: ${n};
85
+ width: ${typeof s=="number"?s+"px":s};
86
+ height: ${typeof a=="number"?a+"px":a};
87
+ position: absolute;
88
+ `);}this.mounted=true;}update(e){if(!this.mounted||!this.element)return;let{x:t=0,y:i=0,scale:r=1,rotation:n=0,opacity:s=1}=this.config,a=_(t,e.viewport.width),c=_(i,e.viewport.height);this.element.style.transform=`translate3d(${a}px, ${c}px, 0) scale(${r}) rotate(${n}deg)`,this.element.style.opacity=s.toString();}destroy(){if(this.element){let e=this.element.parentElement?.parentElement;e&&e.removeLayerElement&&e.removeLayerElement(this.id);}super.destroy();}},j=class extends E{constructor(e,t){super(e,"image",t);}mount(e){if(this.mounted)return;let t=e.renderer;if(t.createLayerElement){this.element=t.createLayerElement(this.id,this.zIndex),this.img=document.createElement("img");let{src:i,alt:r="",objectFit:n="cover",opacity:s=1}=this.config;this.img&&this.element&&(this.img.src=i,this.img.alt=r,this.img.style.cssText=`
89
+ width: 100%;
90
+ height: 100%;
91
+ object-fit: ${n};
92
+ opacity: ${s};
93
+ display: block;
94
+ `,this.element.appendChild(this.img));}this.mounted=true;}update(e){if(!this.mounted||!this.element)return;let{x:t=0,y:i=0,scale:r=1,rotation:n=0,opacity:s=1}=this.config,a=_(t,e.viewport.width),c=_(i,e.viewport.height);this.element.style.transform=`translate3d(${a}px, ${c}px, 0) scale(${r}) rotate(${n}deg)`,this.element.style.opacity=s.toString();}destroy(){if(this.element){let e=this.element.parentElement?.parentElement;e&&e.removeLayerElement&&e.removeLayerElement(this.id);}super.destroy();}},U=class extends E{constructor(e,t){super(e,"textBlock",t);}mount(e){if(this.mounted)return;let t=e.renderer;if(t.createLayerElement){this.element=t.createLayerElement(this.id,this.zIndex);let{text:i="",fontSize:r="16px",fontFamily:n="Arial, sans-serif",color:s="#ffffff",textAlign:a="center",opacity:c=1,textShadow:m="none",fontWeight:p="normal",letterSpacing:y="normal"}=this.config;this.element&&(this.element.innerHTML=i,this.element.style.cssText+=`
95
+ font-size: ${typeof r=="number"?r+"px":r};
96
+ font-family: ${n};
97
+ color: ${s};
98
+ text-align: ${a};
99
+ opacity: ${c};
100
+ text-shadow: ${m};
101
+ font-weight: ${p};
102
+ letter-spacing: ${y};
103
+ display: flex;
104
+ align-items: center;
105
+ justify-content: ${a==="left"?"flex-start":a==="right"?"flex-end":"center"};
106
+ white-space: pre-wrap;
107
+ position: absolute;
108
+ width: auto;
109
+ height: auto;
110
+ min-width: max-content;
111
+ `);}this.mounted=true;}update(e){if(!this.mounted||!this.element)return;let{x:t=0,y:i=0,scale:r=1,rotation:n=0,opacity:s=1,textAlign:a="center"}=this.config,c=_(t,e.viewport.width),m=_(i,e.viewport.height),p="center center",y="-50%",f="-50%";a==="left"?(p="left center",y="0%"):a==="right"&&(p="right center",y="-100%"),this.element.style.transformOrigin=p,this.element.style.transform=`translate3d(${c}px, ${m}px, 0) translate(${y}, ${f}) scale(${r}) rotate(${n}deg)`,this.element.style.opacity=s.toString();}destroy(){if(this.element){let e=this.element.parentElement?.parentElement;e&&e.removeLayerElement&&e.removeLayerElement(this.id);}super.destroy();}},W=class extends E{constructor(e,t){super(e,"vignette",t);}mount(e){if(this.mounted)return;let t=e.renderer;if(t.createLayerElement){this.element=t.createLayerElement(this.id,this.zIndex);let{color:i="#000000",intensity:r=.5,size:n="50%",opacity:s=1}=this.config;this.element&&(this.element.style.cssText+=`
112
+ background: radial-gradient(ellipse ${n} ${n} at center, transparent 0%, ${i} 100%);
113
+ opacity: ${s*r};
114
+ pointer-events: none;
115
+ `);}this.mounted=true;}update(e){if(!this.mounted||!this.element)return;let{x:t=0,y:i=0,scale:r=1,rotation:n=0,opacity:s=1}=this.config,a=_(t,e.viewport.width),c=_(i,e.viewport.height);this.element.style.transform=`translate3d(${a}px, ${c}px, 0) scale(${r}) rotate(${n}deg)`,this.element.style.opacity=s.toString();}destroy(){if(this.element){let e=this.element.parentElement?.parentElement;e&&e.removeLayerElement&&e.removeLayerElement(this.id);}super.destroy();}},G=class extends E{constructor(e,t){super(e,"glowOrb",t);}mount(e){if(this.mounted)return;let t=e.renderer;if(t.createLayerElement){this.element=t.createLayerElement(this.id,this.zIndex);let{color:i="#ffffff",radius:r=50,blur:n=20,intensity:s=.8}=this.config;this.element&&(this.element.style.cssText+=`
116
+ background: radial-gradient(circle, ${i} 0%, transparent 70%);
117
+ width: ${r*2}px;
118
+ height: ${r*2}px;
119
+ border-radius: 50%;
120
+ filter: blur(${n}px);
121
+ opacity: ${s};
122
+ pointer-events: none;
123
+ position: absolute;
124
+ `);}this.mounted=true;}update(e){if(!this.mounted||!this.element)return;let{x:t=0,y:i=0,scale:r=1,rotation:n=0,intensity:s=.8,radius:a=50}=this.config,c=_(t,e.viewport.width)-a,m=_(i,e.viewport.height)-a;this.element.style.transform=`translate3d(${c}px, ${m}px, 0) scale(${r}) rotate(${n}deg)`,this.element.style.opacity=s.toString();}destroy(){if(this.element){let e=this.element.parentElement?.parentElement;e&&e.removeLayerElement&&e.removeLayerElement(this.id);}super.destroy();}},Y=class extends E{constructor(e,t){super(e,"noiseOverlay",t);}mount(e){if(this.mounted)return;let t=e.renderer;if(t.createLayerElement){this.element=t.createLayerElement(this.id,this.zIndex),this.canvas=document.createElement("canvas");let i=this.canvas.getContext("2d");i&&(this.ctx=i);let{opacity:r=.1}=this.config;this.canvas&&this.element&&(this.canvas.style.cssText=`
125
+ width: 100%;
126
+ height: 100%;
127
+ opacity: ${r};
128
+ mix-blend-mode: overlay;
129
+ pointer-events: none;
130
+ `,this.element.appendChild(this.canvas),this.generateNoise());}this.mounted=true;}update(e){if(!this.mounted||!this.element)return;let{x:t=0,y:i=0,scale:r=1,rotation:n=0,opacity:s=.1}=this.config,a=_(t,e.viewport.width),c=_(i,e.viewport.height);this.element.style.transform=`translate3d(${a}px, ${c}px, 0) scale(${r}) rotate(${n}deg)`,this.element.style.opacity=s.toString();let{animated:m=false,animationSpeed:p=100}=this.config;m&&e.timeMs%p<e.deltaMs&&this.generateNoise();}generateNoise(){if(!this.canvas||!this.ctx)return;let{width:e=256,height:t=256,intensity:i=.5}=this.config;this.canvas.width=e,this.canvas.height=t;let r=this.ctx.createImageData(e,t),n=r.data;for(let s=0;s<n.length;s+=4){let a=Math.random()*255*i;n[s]=a,n[s+1]=a,n[s+2]=a,n[s+3]=255;}this.ctx.putImageData(r,0,0);}resize(e,t){this.canvas&&this.generateNoise();}destroy(){if(this.element){let e=this.element.parentElement?.parentElement;e&&e.removeLayerElement&&e.removeLayerElement(this.id);}super.destroy();}},K=class extends E{constructor(t,i){super(t,"particles",i);this.particles=[];}mount(t){if(!this.mounted){if(this.canvas2DRenderer=t.renderer,this.canvas2DRenderer&&this.canvas2DRenderer.createLayerCanvas){let{width:i=t.container.clientWidth,height:r=t.container.clientHeight}=this.config;if(this.canvas=this.canvas2DRenderer.createLayerCanvas(i,r),this.canvas){let n=this.canvas.getContext("2d");this.ctx=n||void 0,this.canvas.style.cssText+=`
131
+ position: absolute;
132
+ top: 0;
133
+ left: 0;
134
+ pointer-events: none;
135
+ z-index: ${this.zIndex};
136
+ `,t.container.appendChild(this.canvas);}}this.mounted=true;}}update(t){if(!this.mounted||!this.canvas||!this.ctx)return;this.ctx.clearRect(0,0,this.canvas.width,this.canvas.height);let{count:i=100,color:r="#ffffff",size:n=2,speed:s=1,opacity:a=.8,type:c="circle",x:m=0,y:p=0,scale:y=1,rotation:f=0}=this.config,b=_(m,t.viewport.width),d=_(p,t.viewport.height);if(this.ctx.save(),this.ctx.translate(b,d),this.ctx.scale(y,y),this.ctx.rotate(f*Math.PI/180),this.ctx.globalAlpha=a,this.particles.length===0)for(let u=0;u<i;u++)this.particles.push({x:Math.random()*t.viewport.width,y:Math.random()*t.viewport.height,vx:(Math.random()-.5)*s,vy:(Math.random()-.5)*s,size:n*(.5+Math.random()*.5),opacity:.5+Math.random()*.5,life:0,maxLife:5e3+Math.random()*1e4});this.ctx.fillStyle=r;for(let u of this.particles)u.x+=u.vx*t.deltaMs/16.67,u.y+=u.vy*t.deltaMs/16.67,u.life+=t.deltaMs,u.x<0&&(u.x=t.viewport.width),u.x>t.viewport.width&&(u.x=0),u.y<0&&(u.y=t.viewport.height),u.y>t.viewport.height&&(u.y=0),u.life>=u.maxLife&&(u.x=Math.random()*t.viewport.width,u.y=Math.random()*t.viewport.height,u.life=0),this.ctx.save(),this.ctx.globalAlpha=u.opacity*a,c==="circle"?(this.ctx.beginPath(),this.ctx.arc(u.x,u.y,u.size,0,Math.PI*2),this.ctx.fill()):c==="square"&&this.ctx.fillRect(u.x-u.size/2,u.y-u.size/2,u.size,u.size),this.ctx.restore();this.ctx.restore();}destroy(){this.canvas&&this.canvas.parentNode&&this.canvas.parentNode.removeChild(this.canvas),this.particles=[],super.destroy();}},X=class extends E{constructor(t,i){super(t,"starfield",i);this.stars=[];}mount(t){if(!this.mounted){if(this.canvas2DRenderer=t.renderer,this.canvas2DRenderer&&this.canvas2DRenderer.createLayerCanvas){let{width:i=t.container.clientWidth,height:r=t.container.clientHeight}=this.config;if(this.canvas=this.canvas2DRenderer.createLayerCanvas(i,r),this.canvas){let n=this.canvas.getContext("2d");this.ctx=n||void 0,this.canvas.style.cssText+=`
137
+ position: absolute;
138
+ top: 0;
139
+ left: 0;
140
+ pointer-events: none;
141
+ z-index: ${this.zIndex};
142
+ `,t.container.appendChild(this.canvas);}}this.mounted=true;}}update(t){if(!this.mounted||!this.canvas||!this.ctx)return;this.ctx.clearRect(0,0,this.canvas.width,this.canvas.height);let{count:i=200,color:r="#ffffff",minSize:n=.5,maxSize:s=2,speed:a=.5,opacity:c=.8,twinkle:m=true,x:p=0,y=0,scale:f=1,rotation:b=0}=this.config,d=_(p,t.viewport.width),u=_(y,t.viewport.height);if(this.ctx.save(),this.ctx.translate(d,u),this.ctx.scale(f,f),this.ctx.rotate(b*Math.PI/180),this.ctx.globalAlpha=c,this.stars.length===0)for(let l=0;l<i;l++)this.stars.push({x:Math.random()*t.viewport.width,y:Math.random()*t.viewport.height,z:Math.random()*1e3,size:n+Math.random()*(s-n),baseOpacity:.3+Math.random()*.7,twinklePhase:Math.random()*Math.PI*2,twinkleSpeed:.5+Math.random()*1.5});this.ctx.fillStyle=r;for(let l of this.stars){l.z-=a*t.deltaMs/16.67,l.z<=0&&(l.z=1e3,l.x=Math.random()*t.viewport.width,l.y=Math.random()*t.viewport.height);let T=500,x=(l.x-t.viewport.width/2)*(T/l.z)+t.viewport.width/2,w=(l.y-t.viewport.height/2)*(T/l.z)+t.viewport.height/2,C=l.size*(T/l.z);if(x<-C||x>t.viewport.width+C||w<-C||w>t.viewport.height+C)continue;let M=l.baseOpacity;m&&(l.twinklePhase+=l.twinkleSpeed*t.deltaMs/1e3,M*=.5+.5*Math.sin(l.twinklePhase)),this.ctx.save(),this.ctx.globalAlpha=M*c,this.ctx.beginPath(),this.ctx.arc(x,w,Math.max(.5,C),0,Math.PI*2),this.ctx.fill(),this.ctx.restore();}this.ctx.restore();}destroy(){this.canvas&&this.canvas.parentNode&&this.canvas.parentNode.removeChild(this.canvas),this.stars=[],super.destroy();}},Z=class extends E{constructor(t,i){super(t,"dust",i);this.dustParticles=[];}mount(t){if(!this.mounted){if(this.canvas2DRenderer=t.renderer,this.canvas2DRenderer&&this.canvas2DRenderer.createLayerCanvas){let{width:i=t.container.clientWidth,height:r=t.container.clientHeight}=this.config;if(this.canvas=this.canvas2DRenderer.createLayerCanvas(i,r),this.canvas){let n=this.canvas.getContext("2d");this.ctx=n||void 0,this.canvas.style.cssText+=`
143
+ position: absolute;
144
+ top: 0;
145
+ left: 0;
146
+ pointer-events: none;
147
+ z-index: ${this.zIndex};
148
+ `,t.container.appendChild(this.canvas);}}this.mounted=true;}}update(t){if(!this.mounted||!this.canvas||!this.ctx)return;this.ctx.clearRect(0,0,this.canvas.width,this.canvas.height);let{count:i=50,color:r="#cccccc",minSize:n=1,maxSize:s=3,speed:a=.2,opacity:c=.4,drift:m=true,x:p=0,y=0,scale:f=1,rotation:b=0}=this.config;if(this.ctx.save(),this.ctx.translate(p,y),this.ctx.scale(f,f),this.ctx.rotate(b*Math.PI/180),this.ctx.globalAlpha=c,this.dustParticles.length===0)for(let d=0;d<i;d++)this.dustParticles.push({x:Math.random()*t.viewport.width,y:Math.random()*t.viewport.height,vx:(Math.random()-.5)*a,vy:(Math.random()-.5)*a,size:n+Math.random()*(s-n),baseOpacity:.2+Math.random()*.6,driftPhase:Math.random()*Math.PI*2,driftSpeed:.3+Math.random()*.7,life:0,maxLife:1e4+Math.random()*2e4});this.ctx.fillStyle=r;for(let d of this.dustParticles){let u=d.vx,l=d.vy;m&&(d.driftPhase+=d.driftSpeed*t.deltaMs/1e3,u+=Math.sin(d.driftPhase)*.1,l+=Math.cos(d.driftPhase*.7)*.1),d.x+=u*t.deltaMs/16.67,d.y+=l*t.deltaMs/16.67,d.life+=t.deltaMs,d.x<-d.size&&(d.x=t.viewport.width+d.size),d.x>t.viewport.width+d.size&&(d.x=-d.size),d.y<-d.size&&(d.y=t.viewport.height+d.size),d.y>t.viewport.height+d.size&&(d.y=-d.size),d.life>=d.maxLife&&(d.x=Math.random()*t.viewport.width,d.y=Math.random()*t.viewport.height,d.life=0);let T=d.life/d.maxLife,x=T<.1?T/.1:T>.9?(1-T)/.1:1;this.ctx.save(),this.ctx.globalAlpha=d.baseOpacity*x*c,this.ctx.beginPath(),this.ctx.arc(d.x,d.y,d.size,0,Math.PI*2),this.ctx.fill(),this.ctx.restore();}this.ctx.restore();}destroy(){this.canvas&&this.canvas.parentNode&&this.canvas.parentNode.removeChild(this.canvas),this.dustParticles=[],super.destroy();}},J=class extends E{constructor(e,t){super(e,"nebulaNoise",t);}mount(e){if(!this.mounted){if(this.canvas2DRenderer=e.renderer,this.canvas2DRenderer&&this.canvas2DRenderer.createLayerCanvas){let{width:t=e.container.clientWidth,height:i=e.container.clientHeight}=this.config;if(this.canvas=this.canvas2DRenderer.createLayerCanvas(t,i),this.canvas){let r=this.canvas.getContext("2d");this.ctx=r||void 0,this.canvas.style.cssText+=`
149
+ position: absolute;
150
+ top: 0;
151
+ left: 0;
152
+ pointer-events: none;
153
+ z-index: ${this.zIndex};
154
+ mix-blend-mode: screen;
155
+ `,e.container.appendChild(this.canvas);}}this.mounted=true;}}update(e){if(!this.mounted||!this.canvas||!this.ctx)return;this.ctx.clearRect(0,0,this.canvas.width,this.canvas.height);let{colors:t=["#ff0080","#0080ff","#8000ff"],intensity:i=.3,scale:r=.01,opacity:n=.6,animated:s=true,speed:a=.001,octaves:c=3,x:m=0,y:p=0,scaleTransform:y=1,rotation:f=0}=this.config;this.ctx.save(),this.ctx.translate(m,p),this.ctx.scale(y,y),this.ctx.rotate(f*Math.PI/180),this.ctx.globalAlpha=n;let b=Math.floor(e.viewport.width/2),d=Math.floor(e.viewport.height/2);(!this.noiseData||this.noiseData.width!==b||this.noiseData.height!==d)&&(this.noiseData=this.ctx.createImageData(b,d));let u=this.noiseData.data,l=s?e.timeMs*a:0;for(let T=0;T<d;T++)for(let x=0;x<b;x++){let w=(T*b+x)*4,C=0,M=1,S=r;for(let oe=0;oe<c;oe++)C+=this.perlinNoise(x*S+l,T*S+l)*M,M*=.5,S*=2;C=(C+1)*.5,C=Math.max(0,Math.min(1,C*i));let F=Math.floor(C*(t.length-1)),D=Math.min(F+1,t.length-1),g=C*(t.length-1)-F,L=this.hexToRgb(t[F]),P=this.hexToRgb(t[D]),I=Math.floor(L.r+(P.r-L.r)*g),h=Math.floor(L.g+(P.g-L.g)*g),A=Math.floor(L.b+(P.b-L.b)*g),O=Math.floor(C*255);u[w]=I,u[w+1]=h,u[w+2]=A,u[w+3]=O;}this.ctx.putImageData(this.noiseData,0,0),this.ctx.drawImage(this.canvas,0,0,b,d,0,0,e.viewport.width,e.viewport.height),this.ctx.restore();}perlinNoise(e,t){let i=this.noise(Math.floor(e),Math.floor(t)),r=this.noise(Math.floor(e)+1,Math.floor(t)),n=this.noise(Math.floor(e),Math.floor(t)+1),s=this.noise(Math.floor(e)+1,Math.floor(t)+1),a=e-Math.floor(e),c=t-Math.floor(t),m=a*a*(3-2*a),p=c*c*(3-2*c),y=i+m*(r-i),f=n+m*(s-n);return y+p*(f-y)}noise(e,t){let i=Math.sin(e*12.9898+t*78.233)*43758.5453;return (i-Math.floor(i))*2-1}hexToRgb(e){let t=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(e);return t&&t[1]&&t[2]&&t[3]?{r:parseInt(t[1],16),g:parseInt(t[2],16),b:parseInt(t[3],16)}:{r:255,g:255,b:255}}destroy(){this.canvas&&this.canvas.parentNode&&this.canvas.parentNode.removeChild(this.canvas),this.noiseData=void 0,super.destroy();}};var R=class R{constructor(){this.layerTypes=new Map;this.registerBuiltInLayers();}static getInstance(){return R.instance||(R.instance=new R),R.instance}registerLayerType(e,t){this.layerTypes.has(e)&&console.warn(`Layer type '${e}' is already registered. Overriding existing registration.`),this.layerTypes.set(e,t);}createLayer(e,t,i){let r=this.layerTypes.get(e);if(!r)throw new Error(`Unknown layer type: ${e}. Available types: ${this.getRegisteredTypes().join(", ")}`);return r(t,i)}hasLayerType(e){return this.layerTypes.has(e)}getRegisteredTypes(){return Array.from(this.layerTypes.keys()).sort()}getBuiltInTypes(){return {dom:["gradient","image","textBlock","vignette","glowOrb","noiseOverlay"],canvas2d:["particles","starfield","dust","nebulaNoise"]}}isBuiltInType(e){let t=this.getBuiltInTypes();return t.dom.includes(e)||t.canvas2d.includes(e)}getCustomTypes(){return this.getRegisteredTypes().filter(e=>!this.isBuiltInType(e))}unregisterLayerType(e){return this.isBuiltInType(e)?(console.warn(`Cannot unregister built-in layer type '${e}'`),false):this.layerTypes.delete(e)}clearCustomTypes(){this.getCustomTypes().forEach(t=>this.layerTypes.delete(t));}registerBuiltInLayers(){this.layerTypes.set("gradient",(e,t)=>new B(e,t)),this.layerTypes.set("image",(e,t)=>new j(e,t)),this.layerTypes.set("textBlock",(e,t)=>new U(e,t)),this.layerTypes.set("vignette",(e,t)=>new W(e,t)),this.layerTypes.set("glowOrb",(e,t)=>new G(e,t)),this.layerTypes.set("noiseOverlay",(e,t)=>new Y(e,t)),this.layerTypes.set("particles",(e,t)=>new K(e,t)),this.layerTypes.set("starfield",(e,t)=>new X(e,t)),this.layerTypes.set("dust",(e,t)=>new Z(e,t)),this.layerTypes.set("nebulaNoise",(e,t)=>new J(e,t));}};R.instance=null;var ee=R;var z=class{constructor(e){this.container=e;}};var te=class extends z{constructor(){super(...arguments);this.layerElements=new Map;this.initialized=false;}initialize(){this.initialized||(this.domContainer=document.createElement("div"),this.domContainer.style.cssText=`
156
+ position: absolute;
157
+ top: 0;
158
+ left: 0;
159
+ width: 100%;
160
+ height: 100%;
161
+ overflow: hidden;
162
+ pointer-events: none;
163
+ `,this.container.appendChild(this.domContainer),this.initialized=true);}render(t,i){this.initialized||this.initialize();let r=[...t].sort((n,s)=>n.zIndex-s.zIndex);for(let n of r)n.update(i);}resize(t,i){if(this.initialized){this.domContainer.style.width=`${t}px`,this.domContainer.style.height=`${i}px`;for(let r of this.layerElements.values());}}destroy(){this.initialized&&(this.layerElements.clear(),this.domContainer&&this.domContainer.parentNode&&this.domContainer.parentNode.removeChild(this.domContainer),this.initialized=false);}createLayerElement(t,i){if(this.layerElements.has(t))return this.layerElements.get(t);let r=document.createElement("div");return r.id=`layer-${t}`,r.style.cssText=`
164
+ position: absolute;
165
+ top: 0;
166
+ left: 0;
167
+ width: 100%;
168
+ height: 100%;
169
+ will-change: transform, opacity, filter;
170
+ transform-style: preserve-3d;
171
+ backface-visibility: hidden;
172
+ z-index: ${i};
173
+ `,this.domContainer.appendChild(r),this.layerElements.set(t,r),r}removeLayerElement(t){let i=this.layerElements.get(t);i&&i.parentNode&&(i.parentNode.removeChild(i),this.layerElements.delete(t));}getDOMContainer(){return this.domContainer}getLayerElement(t){return this.layerElements.get(t)}};var $={low:{particleCount:50,canvasResolution:.5,animationPrecision:30,enableBlur:false,enableShadows:false,targetFps:30,enableAdvancedEffects:false,textureQuality:.5,useHardwareAcceleration:false},medium:{particleCount:200,canvasResolution:.75,animationPrecision:60,enableBlur:true,enableShadows:false,targetFps:60,enableAdvancedEffects:false,textureQuality:.75,useHardwareAcceleration:true},high:{particleCount:500,canvasResolution:1,animationPrecision:60,enableBlur:true,enableShadows:true,targetFps:60,enableAdvancedEffects:true,textureQuality:1,useHardwareAcceleration:true},ultra:{particleCount:1e3,canvasResolution:1.5,animationPrecision:120,enableBlur:true,enableShadows:true,targetFps:120,enableAdvancedEffects:true,textureQuality:1.5,useHardwareAcceleration:true},auto:{particleCount:200,canvasResolution:1,animationPrecision:60,enableBlur:true,enableShadows:true,targetFps:60,enableAdvancedEffects:true,textureQuality:1,useHardwareAcceleration:true}};var se=class{constructor(e,t,i=100){this.pool=[];this.createFn=e,this.resetFn=t;for(let r=0;r<i;r++)this.pool.push(this.createFn());}get(){return this.pool.length>0?this.pool.pop():this.createFn()}release(e){this.resetFn(e),this.pool.push(e);}clear(){this.pool.length=0;}get poolSize(){return this.pool.length}},ie=class extends z{constructor(t){super(t);this.width=0;this.height=0;this.canvasWidth=0;this.canvasHeight=0;this.activeParticles=[];this.performanceMetrics={fps:60,frameTime:16.67,activeParticles:0,activeLayers:0,domNodes:0,drawCalls:0};this.lastFrameTime=0;this.frameCount=0;this.fpsUpdateTime=0;this.canvas=document.createElement("canvas"),this.canvas.style.cssText=`
174
+ position: absolute;
175
+ top: 0;
176
+ left: 0;
177
+ width: 100%;
178
+ height: 100%;
179
+ pointer-events: none;
180
+ z-index: 1000;
181
+ `;let i=this.canvas.getContext("2d");if(!i)throw new Error("Canvas2D context not available");this.ctx=i,this.devicePixelRatio=window.devicePixelRatio||1,this.particlePool=new se(()=>({x:0,y:0,vx:0,vy:0,size:1,opacity:1,color:"#ffffff",life:0,maxLife:1e3,rotation:0,rotationSpeed:0,active:false}),r=>{r.active=false,r.life=0,r.opacity=1;},500);}initialize(){this.container.appendChild(this.canvas);let t=this.container.getBoundingClientRect();this.resize(t.width,t.height),this.ctx.imageSmoothingEnabled=true,this.ctx.imageSmoothingQuality="high";}render(t,i){let r=performance.now();this.updatePerformanceMetrics(i),this.ctx.clearRect(0,0,this.canvasWidth,this.canvasHeight),this.ctx.save(),this.ctx.scale(this.devicePixelRatio,this.devicePixelRatio);let n=0,s=t.filter(a=>["particles","starfield","dust","nebulaNoise"].includes(a.type));for(let a of s)this.ctx.save(),a.type==="particles"||a.type==="starfield"||a.type==="dust"?n+=this.renderParticleLayer(a,i):a.type==="nebulaNoise"&&(n+=this.renderNoiseLayer(a,i)),this.ctx.restore();this.ctx.restore(),this.performanceMetrics.drawCalls=n,this.performanceMetrics.activeLayers=s.length,this.performanceMetrics.frameTime=performance.now()-r;}renderParticleLayer(t,i){let n=t.config||{},{count:s=100,color:a="#ffffff",size:c=2,speed:m=1,opacity:p=.8,type:y="circle"}=n,f=$[i.quality]||$.medium,b=Math.min(s,f.particleCount);for(;this.activeParticles.length<b;){let u=this.particlePool.get();this.initializeParticle(u,i.viewport),u.color=a,u.size=c,u.active=true,this.activeParticles.push(u);}for(;this.activeParticles.length>b;){let u=this.activeParticles.pop();u&&this.particlePool.release(u);}let d=0;for(let u=this.activeParticles.length-1;u>=0;u--){let l=this.activeParticles[u];if(!l||!l.active){this.activeParticles.splice(u,1),l&&this.particlePool.release(l);continue}l.x+=l.vx*m*i.deltaMs/16.67,l.y+=l.vy*m*i.deltaMs/16.67,l.rotation+=l.rotationSpeed*i.deltaMs/16.67,l.life+=i.deltaMs,(l.x<-l.size||l.x>i.viewport.width+l.size||l.y<-l.size||l.y>i.viewport.height+l.size||l.life>=l.maxLife)&&(this.initializeParticle(l,i.viewport),l.color=a,l.size=c),this.ctx.save(),this.ctx.globalAlpha=l.opacity*p,this.ctx.fillStyle=l.color,y==="circle"?(this.ctx.beginPath(),this.ctx.arc(l.x,l.y,l.size,0,Math.PI*2),this.ctx.fill()):y==="star"&&this.drawStar(l.x,l.y,l.size,l.rotation),this.ctx.restore(),d++;}return this.performanceMetrics.activeParticles=this.activeParticles.length,d}renderNoiseLayer(t,i){let n=t.config||{},{intensity:s=.5,scale:a=1,opacity:c=.3,animated:m=true,speed:p=.01}=n,f=($[i.quality]||$.medium).canvasResolution,b=Math.floor(i.viewport.width*f),d=Math.floor(i.viewport.height*f),u=this.ctx.createImageData(b,d),l=u.data,T=m?i.timeMs*p:0;for(let x=0;x<d;x++)for(let w=0;w<b;w++){let C=(x*b+w)*4,M=this.simpleNoise(w*a+T,x*a+T)*s,S=Math.floor(M*255);l[C]=S,l[C+1]=S,l[C+2]=S,l[C+3]=Math.floor(c*255);}return this.ctx.save(),this.ctx.putImageData(u,0,0),this.ctx.restore(),1}initializeParticle(t,i){t.x=Math.random()*i.width,t.y=Math.random()*i.height,t.vx=(Math.random()-.5)*2,t.vy=(Math.random()-.5)*2,t.size=1+Math.random()*3,t.opacity=.5+Math.random()*.5,t.life=0,t.maxLife=5e3+Math.random()*1e4,t.rotation=Math.random()*Math.PI*2,t.rotationSpeed=(Math.random()-.5)*.02,t.active=true;}drawStar(t,i,r,n){let a=r,c=r*.4;this.ctx.save(),this.ctx.translate(t,i),this.ctx.rotate(n),this.ctx.beginPath();for(let m=0;m<10;m++){let p=m*Math.PI/5,y=m%2===0?a:c,f=Math.cos(p)*y,b=Math.sin(p)*y;m===0?this.ctx.moveTo(f,b):this.ctx.lineTo(f,b);}this.ctx.closePath(),this.ctx.fill(),this.ctx.restore();}simpleNoise(t,i){let r=Math.sin(t*12.9898+i*78.233)*43758.5453;return r-Math.floor(r)}updatePerformanceMetrics(t){let i=performance.now();if(this.lastFrameTime>0){i-this.lastFrameTime;this.frameCount++,i-this.fpsUpdateTime>=1e3&&(this.performanceMetrics.fps=Math.round(this.frameCount*1e3/(i-this.fpsUpdateTime)),this.frameCount=0,this.fpsUpdateTime=i);}this.lastFrameTime=i,this.performanceMetrics.frameTime=t.deltaMs;}resize(t,i){this.width=t,this.height=i,this.canvasWidth=Math.floor(t*this.devicePixelRatio),this.canvasHeight=Math.floor(i*this.devicePixelRatio),this.canvas.width=this.canvasWidth,this.canvas.height=this.canvasHeight,this.canvas.style.width=t+"px",this.canvas.style.height=i+"px",this.ctx.imageSmoothingEnabled=true,this.ctx.imageSmoothingQuality="high";}destroy(){this.particlePool.clear(),this.activeParticles.length=0,this.canvas.parentNode&&this.canvas.parentNode.removeChild(this.canvas);}getPerformanceMetrics(){return {...this.performanceMetrics}}createLayerCanvas(t,i){let r=document.createElement("canvas");r.width=Math.floor(t*this.devicePixelRatio),r.height=Math.floor(i*this.devicePixelRatio),r.style.width=t+"px",r.style.height=i+"px";let n=r.getContext("2d");return n&&(n.scale(this.devicePixelRatio,this.devicePixelRatio),n.imageSmoothingEnabled=true,n.imageSmoothingQuality="high"),r}};var re=class{constructor(e){this.eventListeners=new Map;this._state="idle";this._currentTime=0;this._duration=0;this._currentEventId=null;this._currentSceneId=null;this._resizeListener=null;this._debugOverlay=null;this._domRenderer=null;this._canvas2DRenderer=null;this._layers=[];this._currentSceneLayers=[];this._resizeObserver=null;this._mounted=false;if(!e.container)throw new Error("CinematicRenderer2D: container element is required");if(!e.spec)throw new Error("CinematicRenderer2D: spec is required");let t=Q.validate(e.spec),i=Q.parse(t);this._container=e.container,this._spec=t,this._compiledSpec=i,this._options=e,this._quality=e.quality||this._spec.engine.quality||"auto",this._scheduler=new H({targetFps:this._spec.engine.targetFps||60,enableAdaptiveQuality:this._quality==="auto"}),this._qualitySystem=new N({respectUserPreferences:true,useDeviceDetection:true}),this._layerRegistry=ee.getInstance(),this._audioSystem=new q({preferWebAudio:true,masterVolume:1,maxConcurrentTracks:8,defaultFadeDuration:1e3}),this._qualitySystem.setQuality(this._quality),this._scheduler.addQualityChangeCallback(r=>{this._qualitySystem.updatePerformanceMetrics(r);}),this._qualitySystem.addEventListener(r=>{r.type==="quality-change"&&(this._quality=r.newQuality,this.emit("qualityChange",{previousQuality:r.previousQuality,currentQuality:r.newQuality,metrics:r.metrics}));}),this._scheduler.addFrameCallback(r=>{this._onFrame(r);}),this._audioSystem.on("track-error",(r,n)=>{this.emit("audioError",{trackId:r,error:n});}),this._audioSystem.on("autoplay-blocked",r=>{this.emit("autoplayBlocked",{trackId:r});}),this._calculateDuration(),this._setupResizeObserver(),this._options.debug&&(this._debugOverlay=new V(this,this._container,{position:"top-right",showPerformanceGraph:true}));}async mount(){if(this._state==="destroyed")throw new Error("Cannot mount destroyed renderer");if(!this._mounted)try{if(this._setState("loading"),this.emit("loading"),!document.contains(this._container))throw new Error("Container element must be attached to the DOM");this._setupContainer(),this._initializeRenderers(),this._initializeLayers(),await this._audioSystem.initialize(),this._setupResizeListener(),this._debugOverlay&&this._debugOverlay.show(),this._mounted=!0,this._setState("ready"),this.emit("ready"),this._options.autoplay&&this.play();}catch(e){throw this._setState("idle"),this.emit("error",e),e}}play(){if(this._state==="destroyed")throw new Error("Cannot play destroyed renderer");if(!this._mounted)throw new Error("Must mount renderer before playing");if(this._state==="playing")return;let e=this._state;this._setState("playing"),this._scheduler.start(),this._audioSystem.play(),this._updateCurrentSceneLayers(),this.emit("play",{previousState:e,currentTime:this._currentTime});}pause(){if(this._state!=="playing")return;let e=this._state;this._setState("paused"),this._scheduler.stop(),this._audioSystem.pause(),this.emit("pause",{previousState:e,currentTime:this._currentTime});}stop(){if(this._state==="destroyed"||this._state==="idle")return;let e=this._state;this._setState("stopped"),this._scheduler.stop(),this._audioSystem.stop(),this._currentTime=0,this._currentEventId=null,this._currentSceneId=null,this._resetLayersToInitialState(),this.emit("stop",{previousState:e});}destroy(){if(this._state==="destroyed")return;let e=this._state;this.stop(),this._resizeObserver&&(this._resizeObserver.disconnect(),this._resizeObserver=null),this._destroyAllLayers(),this._domRenderer&&(this._domRenderer.destroy(),this._domRenderer=null),this._canvas2DRenderer&&(this._canvas2DRenderer.destroy(),this._canvas2DRenderer=null),this._audioSystem.destroy(),this._debugOverlay&&(this._debugOverlay.destroy(),this._debugOverlay=null),this._container.innerHTML="",typeof this._container.removeAttribute=="function"&&this._container.removeAttribute("style"),this.eventListeners.clear(),this._resizeListener&&(window.removeEventListener("resize",this._resizeListener),this._resizeListener=null),this._mounted=false,this._setState("destroyed"),this.emit("destroy",{previousState:e});}seek(e){if(this._state==="destroyed")throw new Error("Cannot seek on destroyed renderer");if(!this._mounted)throw new Error("Must mount renderer before seeking");let t=Math.max(0,Math.min(e,this._duration));this._currentTime;this._currentTime=t,this._updateCurrentEventAndScene(),this._updateCurrentSceneLayers(),this._audioSystem.seek(t),this.emit("seek",this._currentTime);}goToEvent(e){if(this._state==="destroyed")throw new Error("Cannot navigate on destroyed renderer");if(!this._mounted)throw new Error("Must mount renderer before navigation");if(!this._spec.events.find(r=>r.id===e)){this.emit("error",new Error(`Event with id "${e}" not found`));return}let i=this._calculateEventStartTime(e);this.seek(i),this.emit("eventChange",e);}goToScene(e){if(this._state==="destroyed")throw new Error("Cannot navigate on destroyed renderer");if(!this._mounted)throw new Error("Must mount renderer before navigation");if(!this._spec.scenes.find(r=>r.id===e)){this.emit("error",new Error(`Scene with id "${e}" not found`));return}let i=this._calculateSceneStartTime(e);this.seek(i),this.emit("sceneChange",e);}setQuality(e){if(this._quality===e)return;this._quality;this._quality=e,this._qualitySystem.setQuality(e),this.emit("qualityChange",e);}resize(e,t){this._state!=="destroyed"&&(this._container.style.width=`${e}px`,this._container.style.height=`${t}px`,this._domRenderer&&this._domRenderer.resize(e,t),this._canvas2DRenderer&&this._canvas2DRenderer.resize(e,t),this.emit("resize",{width:e,height:t}));}on(e,t){this.eventListeners.has(e)||this.eventListeners.set(e,[]),this.eventListeners.get(e).push(t);}off(e,t){let i=this.eventListeners.get(e);if(i){let r=i.indexOf(t);r>-1&&i.splice(r,1);}}getCurrentTime(){return this._currentTime}getDuration(){return this._duration}isPlaying(){return this._state==="playing"}isPaused(){return this._state==="paused"}getCurrentEvent(){return this._currentEventId}getCurrentScene(){return this._currentSceneId}getState(){return this._state}getQuality(){return this._quality}isMounted(){return this._mounted}getCurrentFps(){return this._scheduler.getCurrentFps()}getPerformanceMetrics(){return this._scheduler.getPerformanceMetrics()}getQualitySettings(){return this._qualitySystem.getCurrentSettings()}getDeviceCapabilities(){return this._qualitySystem.getDeviceCapabilities()}setMasterVolume(e){this._audioSystem.setMasterVolume(e);}getMasterVolume(){return this._audioSystem.getMasterVolume()}isWebAudioAvailable(){return this._audioSystem.isWebAudioAvailable()}getActiveAudioTrackCount(){return this._audioSystem.getActiveTrackCount()}isDebugEnabled(){return this._debugOverlay!==null}toggleDebug(){this._debugOverlay&&this._debugOverlay.toggle();}showDebug(){this._debugOverlay&&this._debugOverlay.show();}hideDebug(){this._debugOverlay&&this._debugOverlay.hide();}emit(e,...t){let i=this.eventListeners.get(e);i&&i.forEach(r=>{try{r(...t);}catch(n){console.error(`Error in event listener for "${e}":`,n);}});}_onFrame(e){if(this._state==="playing"){if(this._currentTime+=e.deltaMs,this._currentTime>=this._duration){this._currentTime=this._duration,this.stop(),this.emit("ended");return}this._updateCurrentEventAndScene(),this._updateCurrentSceneLayers(),this._scheduler.updateMetrics({activeLayers:this._currentSceneLayers.length,activeParticles:0,domNodes:this._container.querySelectorAll("*").length,drawCalls:0}),this._renderCurrentFrame(e),this._audioSystem.update(this._currentTime),this.emit("frame",{currentTime:this._currentTime,fps:e.fps,deltaMs:e.deltaMs,currentEvent:this._currentEventId,currentScene:this._currentSceneId});}}_setState(e){let t=this._state;this._state=e,t!==e&&this.emit("stateChange",{previousState:t,currentState:e});}_calculateDuration(){let e=0;for(let t of this._spec.events){let i=0;for(let r of t.scenes){let n=this._spec.scenes.find(s=>s.id===r);n&&(i+=n.duration);}e=Math.max(e,i);}this._duration=e;}_calculateEventStartTime(e){let t=0;for(let i of this._spec.events){if(i.id===e)return t;for(let r of i.scenes){let n=this._spec.scenes.find(s=>s.id===r);n&&(t+=n.duration);}}return 0}_calculateSceneStartTime(e){let t=0;for(let i of this._spec.events){let r=0;for(let n of i.scenes){if(n===e)return t+r;let s=this._spec.scenes.find(a=>a.id===n);s&&(r+=s.duration);}t+=r;}return 0}_updateCurrentEventAndScene(){let e=0;for(let t of this._spec.events){let i=e,r=0;for(let n of t.scenes){let s=this._spec.scenes.find(a=>a.id===n);if(s){let a=i+r,c=a+s.duration;if(this._currentTime>=a&&this._currentTime<c){this._currentEventId=t.id,this._currentSceneId=s.id;return}r+=s.duration;}}e+=r;}if(this._spec.events.length>0){let t=this._spec.events[this._spec.events.length-1];if(t&&t.scenes.length>0){let i=t.scenes[t.scenes.length-1];this._currentEventId=t.id,this._currentSceneId=i||null;}}}_setupContainer(){let e=this._container.style;(!e.position||e.position==="static")&&(e.position="relative"),!e.width&&!e.height&&(e.width="100%",e.height="100%"),e.overflow="hidden",this._container.classList.add("cinematic-renderer2d"),e.setProperty("--cinematic-quality",this._quality);}_setupResizeObserver(){typeof ResizeObserver<"u"&&(this._resizeObserver=new ResizeObserver(e=>{for(let t of e){let{width:i,height:r}=t.contentRect;this.resize(i,r);}}),this._resizeObserver.observe(this._container));}_setupResizeListener(){this._resizeListener=()=>{let e=this._container.getBoundingClientRect();this.resize(e.width,e.height);},window.addEventListener("resize",this._resizeListener);}_initializeRenderers(){this._domRenderer=new te(this._container),this._domRenderer.initialize(),this._canvas2DRenderer=new ie(this._container),this._canvas2DRenderer.initialize();}_initializeLayers(){for(let e of this._spec.scenes)for(let t of e.layers)try{let i=this._layerRegistry.createLayer(t.type,t.id,t.config);this._layers.push(i);}catch(i){console.error(`Failed to create layer ${t.id} of type ${t.type}:`,i);}this._updateCurrentSceneLayers();}_updateCurrentSceneLayers(){let e=this._getCurrentScene();if(!e)return;let t=this._layers.filter(r=>e.layers.some(n=>n.id===r.id));if(t.length!==this._currentSceneLayers.length||t.some(r=>!this._currentSceneLayers.includes(r))){for(let r of this._currentSceneLayers)t.includes(r)||r.destroy();for(let r of t)this._currentSceneLayers.includes(r)||this._mountLayer(r);this._currentSceneLayers=t;}}_mountLayer(e){try{let t=this._layerRegistry.getBuiltInTypes(),i=this._domRenderer;if(t.canvas2d.includes(e.type)&&(i=this._canvas2DRenderer),!i){console.error(`No suitable renderer found for layer type: ${e.type}`);return}let r={container:this._container,renderer:i,assetManager:null,layerConfig:this._getLayerConfig(e.id)};e.mount(r);}catch(t){console.error(`Failed to mount layer ${e.id}:`,t);}}_renderCurrentFrame(e){let t={timeMs:this._currentTime,deltaMs:e.deltaMs,quality:this._quality,viewport:{width:this._container.clientWidth,height:this._container.clientHeight},devicePixelRatio:window.devicePixelRatio||1};if(this._domRenderer&&this._currentSceneLayers.length>0){let i=this._currentSceneLayers.filter(r=>this._layerRegistry.getBuiltInTypes().dom.includes(r.type));i.length>0&&this._domRenderer.render(i,t);}if(this._canvas2DRenderer&&this._currentSceneLayers.length>0){let i=this._currentSceneLayers.filter(r=>this._layerRegistry.getBuiltInTypes().canvas2d.includes(r.type));i.length>0&&this._canvas2DRenderer.render(i,t);}}_getCurrentScene(){return this._currentSceneId?this._spec.scenes.find(e=>e.id===this._currentSceneId):null}_getLayerConfig(e){for(let t of this._spec.scenes){let i=t.layers.find(r=>r.id===e);if(i)return i.config||{}}return {}}_resetLayersToInitialState(){for(let e of this._currentSceneLayers)e.destroy(),this._mountLayer(e);}_destroyAllLayers(){for(let e of this._layers)try{e.destroy();}catch(t){console.error(`Error destroying layer ${e.id}:`,t);}this._layers=[],this._currentSceneLayers=[];}};var me=react.forwardRef(({spec:v,autoplay:e=false,quality:t,debug:i=false,className:r,style:n,onReady:s,onPlay:a,onPause:c,onStop:m,onSeek:p,onEventChange:y,onSceneChange:f,onQualityChange:b,onResize:d,onFrame:u,onStateChange:l,onEnded:T,onError:x,onLoading:w,onDestroy:C,onAudioError:M,onAutoplayBlocked:S},F)=>{let D=react.useRef(null),g=react.useRef(null),L=react.useRef(false),P=react.useCallback(h=>{s&&h.on("ready",s),a&&h.on("play",a),c&&h.on("pause",c),m&&h.on("stop",m),p&&h.on("seek",p),y&&h.on("eventChange",y),f&&h.on("sceneChange",f),b&&h.on("qualityChange",b),d&&h.on("resize",d),u&&h.on("frame",u),l&&h.on("stateChange",l),T&&h.on("ended",T),x&&h.on("error",x),w&&h.on("loading",w),C&&h.on("destroy",C),M&&h.on("audioError",M),S&&h.on("autoplayBlocked",S);},[s,a,c,m,p,y,f,b,d,u,l,T,x,w,C,M,S]),I=react.useCallback(h=>{s&&h.off("ready",s),a&&h.off("play",a),c&&h.off("pause",c),m&&h.off("stop",m),p&&h.off("seek",p),y&&h.off("eventChange",y),f&&h.off("sceneChange",f),b&&h.off("qualityChange",b),d&&h.off("resize",d),u&&h.off("frame",u),l&&h.off("stateChange",l),T&&h.off("ended",T),x&&h.off("error",x),w&&h.off("loading",w),C&&h.off("destroy",C),M&&h.off("audioError",M),S&&h.off("autoplayBlocked",S);},[s,a,c,m,p,y,f,b,d,u,l,T,x,w,C,M,S]);return react.useEffect(()=>{if(!(!D.current||L.current)){try{let h={container:D.current,spec:v,autoplay:e,quality:t,debug:i},A=new re(h);g.current=A,L.current=!0,P(A),A.mount().catch(O=>{console.error("Failed to mount CinematicRenderer2D:",O),x&&x(O);});}catch(h){console.error("Failed to initialize CinematicRenderer2D:",h),x&&x(h);}return ()=>{g.current&&(I(g.current),g.current.destroy(),g.current=null),L.current=false;}}},[v,e,t,i,P,I,x]),react.useEffect(()=>{g.current&&(I(g.current),P(g.current));},[P,I]),react.useImperativeHandle(F,()=>({play:()=>g.current?.play(),pause:()=>g.current?.pause(),stop:()=>g.current?.stop(),seek:h=>g.current?.seek(h),goToEvent:h=>g.current?.goToEvent(h),goToScene:h=>g.current?.goToScene(h),setQuality:h=>g.current?.setQuality(h),resize:(h,A)=>g.current?.resize(h,A),getCurrentTime:()=>g.current?.getCurrentTime()??0,getDuration:()=>g.current?.getDuration()??0,isPlaying:()=>g.current?.isPlaying()??false,isPaused:()=>g.current?.isPaused()??false,getCurrentEvent:()=>g.current?.getCurrentEvent()??null,getCurrentScene:()=>g.current?.getCurrentScene()??null,getState:()=>g.current?.getState()??"idle",getQuality:()=>g.current?.getQuality()??"auto",isMounted:()=>g.current?.isMounted()??false,getCurrentFps:()=>g.current?.getCurrentFps()??0,getPerformanceMetrics:()=>g.current?.getPerformanceMetrics(),getQualitySettings:()=>g.current?.getQualitySettings(),getDeviceCapabilities:()=>g.current?.getDeviceCapabilities(),setMasterVolume:h=>g.current?.setMasterVolume(h),getMasterVolume:()=>g.current?.getMasterVolume()??1,isWebAudioAvailable:()=>g.current?.isWebAudioAvailable()??false,getActiveAudioTrackCount:()=>g.current?.getActiveAudioTrackCount()??0,getEngine:()=>g.current}),[]),jsxRuntime.jsx("div",{ref:D,className:r,style:{width:"100%",height:"100%",position:"relative",overflow:"hidden",...n}})});me.displayName="CinematicPlayer";exports.CinematicPlayer=me;//# sourceMappingURL=react.cjs.map
182
+ //# sourceMappingURL=react.cjs.map