cinematic-renderer2d 0.1.2 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/angular.cjs CHANGED
@@ -1,6 +1,6 @@
1
- 'use strict';var core=require('@angular/core'),zod=require('zod');var lt=Object.create;var ve=Object.defineProperty;var dt=Object.getOwnPropertyDescriptor;var Le=(u,e)=>(e=Symbol[u])?e:Symbol.for("Symbol."+u),k=u=>{throw TypeError(u)};var ut=(u,e,t)=>e in u?ve(u,e,{enumerable:true,configurable:true,writable:true,value:t}):u[e]=t;var Me=(u,e)=>ve(u,"name",{value:e,configurable:true});var Pe=u=>[,,,lt(null)],Re=["class","method","getter","setter","accessor","field","value","get","set"],F=u=>u!==void 0&&typeof u!="function"?k("Function expected"):u,ht=(u,e,t,i,n)=>({kind:Re[u],name:e,metadata:i,addInitializer:r=>t._?k("Already initialized"):n.push(F(r||null))}),mt=(u,e)=>ut(e,Le("metadata"),u[3]),b=(u,e,t,i)=>{for(var n=0,r=u[e>>1],s=r&&r.length;n<s;n++)e&1?r[n].call(t):i=r[n].call(t,i);return i},w=(u,e,t,i,n,r)=>{var s,a,o,d,h,c=e&7,m=!!(e&8),v=!!(e&16),f=c>3?u.length+1:c?m?1:2:0,g=Re[c+5],y=c>3&&(u[f-1]=[]),C=u[f]||(u[f]=[]),x=c&&(!v&&!m&&(n=n.prototype),c<5&&(c>3||!v)&&dt(c<4?n:{get[t](){return Ee(this,r)},set[t](S){return Ae(this,r,S)}},t));c?v&&c<4&&Me(r,(c>2?"set ":c>1?"get ":"")+t):Me(n,t);for(var M=i.length-1;M>=0;M--)d=ht(c,t,o={},u[3],C),c&&(d.static=m,d.private=v,h=d.access={has:v?S=>pt(n,S):S=>t in S},c^3&&(h.get=v?S=>(c^1?Ee:ft)(S,n,c^4?r:x.get):S=>S[t]),c>2&&(h.set=v?(S,_)=>Ae(S,n,_,c^4?r:x.set):(S,_)=>S[t]=_)),a=(0, i[M])(c?c<4?v?r:x[g]:c>4?void 0:{get:x.get,set:x.set}:n,d),o._=1,c^4||a===void 0?F(a)&&(c>4?y.unshift(a):c?v?r=a:x[g]=a:n=a):typeof a!="object"||a===null?k("Object expected"):(F(s=a.get)&&(x.get=s),F(s=a.set)&&(x.set=s),F(s=a.init)&&y.unshift(s));return c||mt(u,n),x&&ve(n,t,x),v?c^4?r:x:n};var be=(u,e,t)=>e.has(u)||k("Cannot "+t),pt=(u,e)=>Object(e)!==e?k('Cannot use the "in" operator on this value'):u.has(e),Ee=(u,e,t)=>(be(u,e,"read from private field"),t?t.call(u):e.get(u));var Ae=(u,e,t,i)=>(be(u,e,"write to private field"),i?i.call(u,t):e.set(u,t),t),ft=(u,e,t)=>(be(u,e,"access private method"),t);var O=class{static compileTrack(e){if(e.keyframes&&e.keyframes.length>0)return this.compileKeyframeTrack(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 compileKeyframeTrack(e){if(!e.keyframes||e.keyframes.length===0)throw new Error("compileKeyframeTrack called without keyframes");let t=[...e.keyframes].sort((r,s)=>r.time-s.time);for(let r of t)if(r.time<0||r.time>1)throw new Error(`Keyframe time must be between 0 and 1, got ${r.time}`);t[0].time!==0&&t.unshift({time:0,value:e.from,easing:e.easing}),t[t.length-1].time!==1&&t.push({time:1,value:e.to,easing:e.easing});let i=[];for(let r=0;r<t.length-1;r++){let s=t[r],a=t[r+1],o=s.easing||e.easing||"ease",d=this.compileEasing(o),h=this.compileInterpolation(s.value,a.value,d);i.push({startTime:s.time,endTime:a.time,interpolate:h});}let n=r=>{let s=Math.max(0,Math.min(1,r));for(let a of i)if(s>=a.startTime&&s<=a.endTime){let o=a.endTime-a.startTime;if(o===0)return a.interpolate(0);let d=(s-a.startTime)/o;return a.interpolate(d)}return i[i.length-1].interpolate(1)};return {property:e.property,startMs:e.startMs,endMs:e.endMs,interpolate:n,loop:e.loop||false,yoyo:e.yoyo||false,easingType:e.easing||"ease",currentLoop:0,isReverse:false,keyframeSegments:i}}static generateStaggeredAnimations(e,t,i){if(t<=0)return [];let n=[];i.from||"start";let s=this.calculateStaggerOffsets(t,i);for(let a=0;a<t;a++){let o=s[a],d={...e,startMs:e.startMs+o,endMs:e.endMs+o};n.push(this.compileTrack(d));}return n}static calculateStaggerOffsets(e,t){let i=[],n=t.from||"start";if(t.grid){let[r,s]=t.grid,a=r*s;if(e>a)throw new Error(`Target count (${e}) exceeds grid capacity (${a})`);for(let o=0;o<e;o++){let d=o%r,h=Math.floor(o/r),c;switch(n){case "center":let m=(r-1)/2,v=(s-1)/2;c=Math.sqrt(Math.pow(d-m,2)+Math.pow(h-v,2));break;case "end":c=(s-1-h)*r+(r-1-d);break;default:c=h*r+d;break}i.push(c*t.amount);}}else for(let r=0;r<e;r++){let s;switch(n){case "center":let a=(e-1)/2;s=Math.abs(r-a);break;case "end":s=e-1-r;break;default:s=r;break}i.push(s*t.amount);}return i}static applyRandomization(e,t){let i=this.generateRandomValue(t),n={...e};switch(t.property){case "from":typeof e.from=="number"&&(n.from=i);break;case "to":typeof e.to=="number"&&(n.to=i);break;case "duration":let r=e.endMs-e.startMs,s=Math.max(0,r+i);n.endMs=e.startMs+s;break;case "startMs":n.startMs=Math.max(0,e.startMs+i),n.endMs=n.startMs+(e.endMs-e.startMs);break;case "delay":n.startMs=e.startMs+i,n.endMs=e.endMs+i;break;default:n[t.property]=i;break}return n}static generateRandomValue(e){if(e.seed!==void 0){let t=this.seededRandom(e.seed);return e.min+t*(e.max-e.min)}return e.min+Math.random()*(e.max-e.min)}static seededRandom(e){let t=Math.sin(e)*1e4;return t-Math.floor(t)}static generateRandomizedAnimations(e,t,i){let n=[];for(let r=0;r<t;r++){let s=i.seed!==void 0?{...i,seed:i.seed+r}:i,a=this.applyRandomization(e,s);n.push(this.compileTrack(a));}return n}static calculateProgress(e,t){if(t<e.startMs)return null;let i=e.endMs-e.startMs;if(i<=0)return 1;let n=t-e.startMs;if(!e.loop){if(n>i)return null;let a=n/i;return Math.max(0,Math.min(1,a))}let r=Math.floor(n/i),s=n%i/i;if(e.currentLoop=r,e.yoyo){let a=r%2===1;return e.isReverse=a,a?1-s:s}return s}static applyAnimation(e,t){let i=this.calculateProgress(e,t);return i===null?null:e.interpolate(i)}static isAnimationActive(e,t){return t<e.startMs?false:e.loop?true:t<=e.endMs}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 n=this.getValueType(e),r=this.getValueType(t);if(n!==r)return s=>i(Math.max(0,Math.min(1,s)))<.5?e:t;switch(n){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,n){return r=>{let s=3*e,a=3*(i-e)-s,o=1-s-a,d=3*t,h=3*(n-t)-d,c=1-d-h,m=r;for(let v=0;v<8;v++){let f=((o*m+a)*m+s)*m,g=(3*o*m+2*a)*m+s;if(Math.abs(g)<1e-6)break;m=m-(f-r)/g;}return ((c*m+h)*m+d)*m}}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(n=>parseFloat(n.trim()));return i.length!==4||i.some(n=>isNaN(n))?this.cubicBezier(.25,.1,.25,1):this.cubicBezier(i[0],i[1],i[2],i[3])}static backEasing(e,t){let i=e,n=i*1.525,r=i+1;switch(t){case "in":return s=>r*s*s*s-i*s*s;case "out":return s=>1+r*Math.pow(s-1,3)+i*Math.pow(s-1,2);case "in-out":return s=>s<.5?Math.pow(2*s,2)*((n+1)*2*s-n)/2:(Math.pow(2*s-2,2)*((n+1)*(s*2-2)+n)+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 n=t-e;return r=>{let s=i(Math.max(0,Math.min(1,r)));return e+n*s}}static compileStringInterpolation(e,t,i){let n=e.match(/^([+-]?\d*\.?\d+)(.*)$/),r=t.match(/^([+-]?\d*\.?\d+)(.*)$/);if(n&&r&&n[2]===r[2]){let s=parseFloat(n[1]),a=parseFloat(r[1]),o=n[2],d=a-s;return h=>{let c=i(Math.max(0,Math.min(1,h))),m=s+d*c;return `${Math.round(m*1e6)/1e6}${o}`}}return s=>i(Math.max(0,Math.min(1,s)))<.5?e:t}static compileBooleanInterpolation(e,t,i){return n=>i(Math.max(0,Math.min(1,n)))<.5?e:t}static compileObjectInterpolation(e,t,i){let n=new Map,r=new Set([...Object.keys(e),...Object.keys(t)]);for(let s of r){let a=e[s],o=t[s];a!==void 0&&o!==void 0?n.set(s,this.compileInterpolation(a,o,i)):a!==void 0?n.set(s,()=>a):n.set(s,d=>i(Math.max(0,Math.min(1,d)))<.5?void 0:o);}return s=>{let a={};for(let[o,d]of n){let h=d(s);h!==void 0&&(a[o]=h);}return a}}};var Se=["1.0.0","1.1.0"],yt=zod.z.enum(["low","medium","high","ultra","auto"]),gt=zod.z.enum(["gradient","image","textBlock","vignette","glowOrb","noiseOverlay","particles","starfield","dust","nebulaNoise","webgl-custom","light","fog","parallaxGroup"]),xe=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+\)$/)),vt=zod.z.enum(["voiceover","ambience","transition","music","sfx"]),bt=zod.z.enum(["fade","crossfade","slide","zoom","wipe","dissolve","blur"]),St=zod.z.enum(["image","video","audio","font","json","binary"]),Tt=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(),xt=zod.z.object({opacity:zod.z.number().min(0).max(1).optional(),visible:zod.z.boolean().optional(),transform:Tt}).catchall(zod.z.any()),Te=zod.z.union([zod.z.number(),zod.z.string(),zod.z.boolean(),zod.z.array(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()]))]),wt=zod.z.object({time:zod.z.number().min(0).max(1),value:Te,easing:xe.optional()}),Ct=zod.z.object({amount:zod.z.number(),from:zod.z.enum(["start","center","end"]).optional().default("start"),grid:zod.z.tuple([zod.z.number().int().positive(),zod.z.number().int().positive()]).optional()}),_t=zod.z.object({property:zod.z.string().min(1),min:zod.z.number(),max:zod.z.number(),seed:zod.z.number().optional()}).refine(u=>u.max>=u.min,{message:"max must be greater than or equal to min",path:["max"]}),Mt=zod.z.object({property:zod.z.string().min(1),from:Te,to:Te,startMs:zod.z.number().min(0),endMs:zod.z.number().min(0),easing:xe.optional().default("ease"),loop:zod.z.boolean().optional().default(false),yoyo:zod.z.boolean().optional().default(false),keyframes:zod.z.array(wt).optional(),stagger:Ct.optional(),randomize:_t.optional()}).refine(u=>u.endMs>u.startMs,{message:"endMs must be greater than startMs",path:["endMs"]}),Et=zod.z.object({id:zod.z.string().min(1),type:vt,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)}),At=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(),Lt=zod.z.object({type:bt,duration:zod.z.number().min(0),easing:xe.optional().default("ease"),config:At}),Pt=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(),Rt=zod.z.object({id:zod.z.string().min(1),type:St,src:zod.z.string().min(1),preload:zod.z.boolean().optional().default(true),fallback:zod.z.string().optional(),metadata:Pt}),It=zod.z.object({id:zod.z.string().min(1),type:gt,zIndex:zod.z.number(),config:xt,animations:zod.z.array(Mt).optional().default([])}),zt=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(It).min(1),audio:zod.z.array(Et).optional().default([])}),Dt=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(Lt).optional().default([])}),$t=zod.z.object({targetFps:zod.z.number().min(1).max(240).optional().default(60),quality:yt.optional().default("auto"),debug:zod.z.boolean().optional().default(false),autoplay:zod.z.boolean().optional().default(false)}),Ft=zod.z.object({schemaVersion:zod.z.string().min(1),engine:$t,events:zod.z.array(Dt).min(1),scenes:zod.z.array(zt).min(1),assets:zod.z.array(Rt).optional().default([])}).refine(u=>{let e=new Set(u.scenes.map(i=>i.id)),t=new Set(u.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(u=>{let e=u.events.map(n=>n.id),t=u.scenes.map(n=>n.id),i=u.assets?.map(n=>n.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: "+Se.join(", "));if(!Se.includes(i))throw new Error(`Unsupported schema version: ${i}. Supported versions: ${Se.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(n=>n.type))),diagnostics:[],optimizations:{precompileAnimations:true,optimizeAssetLoading:true,enableObjectPooling:true,minimizeDOMUpdates:true,useWebWorkers:false}};try{let i=this.compileAssets(e.assets||[],t),n=this.compileScenes(e.scenes,t),r=this.compileEvents(e.events,n,t),s=Math.max(...Array.from(r.values()).map(o=>o.startTime+o.duration)),a={events:r,scenes:n,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 Ft.parse(e);default:throw new Error(`Unsupported schema version: ${t}`)}}static compileAssets(e,t){let i=new Map;for(let n of e){let r={id:n.id,type:n.type,src:n.src,data:null,loaded:false,error:null,fallback:n.fallback,metadata:{size:n.metadata?.size||0,mimeType:n.metadata?.mimeType||"",cacheDuration:n.metadata?.cacheDuration||36e5,dimensions:n.metadata?.dimensions,duration:n.metadata?.duration,quality:1,streamable:false,priority:"normal"},progress:0};i.set(n.id,r);}return i}static compileScenes(e,t){let i=new Map,n=0;for(let r of e){let s=this.compileLayers(r.layers,t),a=this.compileAudioTracks(r.audio||[],t),o={id:r.id,name:r.name,duration:r.duration,layers:s,audioTracks:a,startTime:n,endTime:n+r.duration};i.set(r.id,o),n+=r.duration;}return i}static compileLayers(e,t){return e.sort((i,n)=>i.zIndex-n.zIndex).map(i=>{let n=this.compileAnimationTracks(i.animations||[],t),r={id:i.id,type:i.type,zIndex:i.zIndex,mount:()=>{},update:()=>{},destroy:()=>{}};return {id:i.id,type:i.type,zIndex:i.zIndex,instance:r,animations:n,initialConfig:{...i.config},active:true}})}static compileAnimationTracks(e,t){return e.map(i=>O.compileTrack(i))}static compileAudioTracks(e,t){return e.map(i=>{let n={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:n,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 n=new Map,r=0;for(let s of e){let a=s.scenes.map(c=>{let m=t.get(c);if(!m)throw new Error(`Scene with ID "${c}" not found for event "${s.id}"`);return m}),o=this.compileTransitions(s.transitions||[],i),d=a.reduce((c,m)=>c+m.duration,0),h={id:s.id,name:s.name,scenes:a,transitions:o,duration:d,startTime:r};n.set(s.id,h),r+=d;}return n}static compileTransitions(e,t){return e.map(i=>{let n=O.compileEasing(i.easing||"ease"),r=(a,o,d)=>{};return {type:i.type,duration:i.duration,easingFunction:n,config:i.config||{},execute:r}})}static formatZodError(e){return `Specification validation failed:
1
+ 'use strict';var core=require('@angular/core'),zod=require('zod');var dt=Object.create;var be=Object.defineProperty;var ut=Object.getOwnPropertyDescriptor;var Pe=(u,e)=>(e=Symbol[u])?e:Symbol.for("Symbol."+u),O=u=>{throw TypeError(u)};var ht=(u,e,t)=>e in u?be(u,e,{enumerable:true,configurable:true,writable:true,value:t}):u[e]=t;var Ee=(u,e)=>be(u,"name",{value:e,configurable:true});var Ie=u=>[,,,dt(null)],Re=["class","method","getter","setter","accessor","field","value","get","set"],F=u=>u!==void 0&&typeof u!="function"?O("Function expected"):u,mt=(u,e,t,i,n)=>({kind:Re[u],name:e,metadata:i,addInitializer:r=>t._?O("Already initialized"):n.push(F(r||null))}),pt=(u,e)=>ht(e,Pe("metadata"),u[3]),b=(u,e,t,i)=>{for(var n=0,r=u[e>>1],s=r&&r.length;n<s;n++)e&1?r[n].call(t):i=r[n].call(t,i);return i},w=(u,e,t,i,n,r)=>{var s,a,o,d,h,c=e&7,m=!!(e&8),v=!!(e&16),f=c>3?u.length+1:c?m?1:2:0,g=Re[c+5],y=c>3&&(u[f-1]=[]),S=u[f]||(u[f]=[]),T=c&&(!v&&!m&&(n=n.prototype),c<5&&(c>3||!v)&&ut(c<4?n:{get[t](){return Le(this,r)},set[t](x){return Ae(this,r,x)}},t));c?v&&c<4&&Ee(r,(c>2?"set ":c>1?"get ":"")+t):Ee(n,t);for(var _=i.length-1;_>=0;_--)d=mt(c,t,o={},u[3],S),c&&(d.static=m,d.private=v,h=d.access={has:v?x=>ft(n,x):x=>t in x},c^3&&(h.get=v?x=>(c^1?Le:yt)(x,n,c^4?r:T.get):x=>x[t]),c>2&&(h.set=v?(x,M)=>Ae(x,n,M,c^4?r:T.set):(x,M)=>x[t]=M)),a=(0, i[_])(c?c<4?v?r:T[g]:c>4?void 0:{get:T.get,set:T.set}:n,d),o._=1,c^4||a===void 0?F(a)&&(c>4?y.unshift(a):c?v?r=a:T[g]=a:n=a):typeof a!="object"||a===null?O("Object expected"):(F(s=a.get)&&(T.get=s),F(s=a.set)&&(T.set=s),F(s=a.init)&&y.unshift(s));return c||pt(u,n),T&&be(n,t,T),v?c^4?r:T:n};var xe=(u,e,t)=>e.has(u)||O("Cannot "+t),ft=(u,e)=>Object(e)!==e?O('Cannot use the "in" operator on this value'):u.has(e),Le=(u,e,t)=>(xe(u,e,"read from private field"),t?t.call(u):e.get(u));var Ae=(u,e,t,i)=>(xe(u,e,"write to private field"),i?i.call(u,t):e.set(u,t),t),yt=(u,e,t)=>(xe(u,e,"access private method"),t);var N=class{static compileTrack(e){if(e.keyframes&&e.keyframes.length>0)return this.compileKeyframeTrack(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 compileKeyframeTrack(e){if(!e.keyframes||e.keyframes.length===0)throw new Error("compileKeyframeTrack called without keyframes");let t=[...e.keyframes].sort((r,s)=>r.time-s.time);for(let r of t)if(r.time<0||r.time>1)throw new Error(`Keyframe time must be between 0 and 1, got ${r.time}`);t[0].time!==0&&t.unshift({time:0,value:e.from,easing:e.easing}),t[t.length-1].time!==1&&t.push({time:1,value:e.to,easing:e.easing});let i=[];for(let r=0;r<t.length-1;r++){let s=t[r],a=t[r+1],o=s.easing||e.easing||"ease",d=this.compileEasing(o),h=this.compileInterpolation(s.value,a.value,d);i.push({startTime:s.time,endTime:a.time,interpolate:h});}let n=r=>{let s=Math.max(0,Math.min(1,r));for(let a of i)if(s>=a.startTime&&s<=a.endTime){let o=a.endTime-a.startTime;if(o===0)return a.interpolate(0);let d=(s-a.startTime)/o;return a.interpolate(d)}return i[i.length-1].interpolate(1)};return {property:e.property,startMs:e.startMs,endMs:e.endMs,interpolate:n,loop:e.loop||false,yoyo:e.yoyo||false,easingType:e.easing||"ease",currentLoop:0,isReverse:false,keyframeSegments:i}}static generateStaggeredAnimations(e,t,i){if(t<=0)return [];let n=[];i.from||"start";let s=this.calculateStaggerOffsets(t,i);for(let a=0;a<t;a++){let o=s[a],d={...e,startMs:e.startMs+o,endMs:e.endMs+o};n.push(this.compileTrack(d));}return n}static calculateStaggerOffsets(e,t){let i=[],n=t.from||"start";if(t.grid){let[r,s]=t.grid,a=r*s;if(e>a)throw new Error(`Target count (${e}) exceeds grid capacity (${a})`);for(let o=0;o<e;o++){let d=o%r,h=Math.floor(o/r),c;switch(n){case "center":let m=(r-1)/2,v=(s-1)/2;c=Math.sqrt(Math.pow(d-m,2)+Math.pow(h-v,2));break;case "end":c=(s-1-h)*r+(r-1-d);break;default:c=h*r+d;break}i.push(c*t.amount);}}else for(let r=0;r<e;r++){let s;switch(n){case "center":let a=(e-1)/2;s=Math.abs(r-a);break;case "end":s=e-1-r;break;default:s=r;break}i.push(s*t.amount);}return i}static applyRandomization(e,t){let i=this.generateRandomValue(t),n={...e};switch(t.property){case "from":typeof e.from=="number"&&(n.from=i);break;case "to":typeof e.to=="number"&&(n.to=i);break;case "duration":let r=e.endMs-e.startMs,s=Math.max(0,r+i);n.endMs=e.startMs+s;break;case "startMs":n.startMs=Math.max(0,e.startMs+i),n.endMs=n.startMs+(e.endMs-e.startMs);break;case "delay":n.startMs=e.startMs+i,n.endMs=e.endMs+i;break;default:n[t.property]=i;break}return n}static generateRandomValue(e){if(e.seed!==void 0){let t=this.seededRandom(e.seed);return e.min+t*(e.max-e.min)}return e.min+Math.random()*(e.max-e.min)}static seededRandom(e){let t=Math.sin(e)*1e4;return t-Math.floor(t)}static generateRandomizedAnimations(e,t,i){let n=[];for(let r=0;r<t;r++){let s=i.seed!==void 0?{...i,seed:i.seed+r}:i,a=this.applyRandomization(e,s);n.push(this.compileTrack(a));}return n}static calculateProgress(e,t){if(t<e.startMs)return null;let i=e.endMs-e.startMs;if(i<=0)return 1;let n=t-e.startMs;if(!e.loop){if(n>i)return null;let a=n/i;return Math.max(0,Math.min(1,a))}let r=Math.floor(n/i),s=n%i/i;if(e.currentLoop=r,e.yoyo){let a=r%2===1;return e.isReverse=a,a?1-s:s}return s}static applyAnimation(e,t){let i=this.calculateProgress(e,t);return i===null?null:e.interpolate(i)}static isAnimationActive(e,t){return t<e.startMs?false:e.loop?true:t<=e.endMs}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 n=this.getValueType(e),r=this.getValueType(t);if(n!==r)return s=>i(Math.max(0,Math.min(1,s)))<.5?e:t;switch(n){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,n){return r=>{let s=3*e,a=3*(i-e)-s,o=1-s-a,d=3*t,h=3*(n-t)-d,c=1-d-h,m=r;for(let v=0;v<8;v++){let f=((o*m+a)*m+s)*m,g=(3*o*m+2*a)*m+s;if(Math.abs(g)<1e-6)break;m=m-(f-r)/g;}return ((c*m+h)*m+d)*m}}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(n=>parseFloat(n.trim()));return i.length!==4||i.some(n=>isNaN(n))?this.cubicBezier(.25,.1,.25,1):this.cubicBezier(i[0],i[1],i[2],i[3])}static backEasing(e,t){let i=e,n=i*1.525,r=i+1;switch(t){case "in":return s=>r*s*s*s-i*s*s;case "out":return s=>1+r*Math.pow(s-1,3)+i*Math.pow(s-1,2);case "in-out":return s=>s<.5?Math.pow(2*s,2)*((n+1)*2*s-n)/2:(Math.pow(2*s-2,2)*((n+1)*(s*2-2)+n)+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 n=t-e;return r=>{let s=i(Math.max(0,Math.min(1,r)));return e+n*s}}static compileStringInterpolation(e,t,i){let n=e.match(/^([+-]?\d*\.?\d+)(.*)$/),r=t.match(/^([+-]?\d*\.?\d+)(.*)$/);if(n&&r&&n[2]===r[2]){let s=parseFloat(n[1]),a=parseFloat(r[1]),o=n[2],d=a-s;return h=>{let c=i(Math.max(0,Math.min(1,h))),m=s+d*c;return `${Math.round(m*1e6)/1e6}${o}`}}return s=>i(Math.max(0,Math.min(1,s)))<.5?e:t}static compileBooleanInterpolation(e,t,i){return n=>i(Math.max(0,Math.min(1,n)))<.5?e:t}static compileObjectInterpolation(e,t,i){let n=new Map,r=new Set([...Object.keys(e),...Object.keys(t)]);for(let s of r){let a=e[s],o=t[s];a!==void 0&&o!==void 0?n.set(s,this.compileInterpolation(a,o,i)):a!==void 0?n.set(s,()=>a):n.set(s,d=>i(Math.max(0,Math.min(1,d)))<.5?void 0:o);}return s=>{let a={};for(let[o,d]of n){let h=d(s);h!==void 0&&(a[o]=h);}return a}}};var Ce=["1.0.0","1.1.0"],gt=zod.z.enum(["low","medium","high","ultra","auto"]),vt=zod.z.enum(["gradient","image","textBlock","vignette","glowOrb","noiseOverlay","particles","starfield","dust","nebulaNoise","webgl-custom","light","fog","parallaxGroup"]),we=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+\)$/)),bt=zod.z.enum(["voiceover","ambience","transition","music","sfx"]),xt=zod.z.enum(["fade","crossfade","slide","zoom","wipe","dissolve","blur"]),Ct=zod.z.enum(["image","video","audio","font","json","binary"]),Tt=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(),wt=zod.z.object({opacity:zod.z.number().min(0).max(1).optional(),visible:zod.z.boolean().optional(),transform:Tt}).catchall(zod.z.any()),Te=zod.z.union([zod.z.number(),zod.z.string(),zod.z.boolean(),zod.z.array(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()]))]),St=zod.z.object({time:zod.z.number().min(0).max(1),value:Te,easing:we.optional()}),Mt=zod.z.object({amount:zod.z.number(),from:zod.z.enum(["start","center","end"]).optional().default("start"),grid:zod.z.tuple([zod.z.number().int().positive(),zod.z.number().int().positive()]).optional()}),_t=zod.z.object({property:zod.z.string().min(1),min:zod.z.number(),max:zod.z.number(),seed:zod.z.number().optional()}).refine(u=>u.max>=u.min,{message:"max must be greater than or equal to min",path:["max"]}),Et=zod.z.object({property:zod.z.string().min(1),from:Te,to:Te,startMs:zod.z.number().min(0),endMs:zod.z.number().min(0),easing:we.optional().default("ease"),loop:zod.z.boolean().optional().default(false),yoyo:zod.z.boolean().optional().default(false),keyframes:zod.z.array(St).optional(),stagger:Mt.optional(),randomize:_t.optional()}).refine(u=>u.endMs>u.startMs,{message:"endMs must be greater than startMs",path:["endMs"]}),Lt=zod.z.object({id:zod.z.string().min(1),type:bt,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)}),At=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(),Pt=zod.z.object({type:xt,duration:zod.z.number().min(0),easing:we.optional().default("ease"),config:At}),It=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(),Rt=zod.z.object({id:zod.z.string().min(1),type:Ct,src:zod.z.string().min(1),preload:zod.z.boolean().optional().default(true),fallback:zod.z.string().optional(),metadata:It}),Dt=zod.z.object({id:zod.z.string().min(1),type:vt,zIndex:zod.z.number(),config:wt,animations:zod.z.array(Et).optional().default([])}),zt=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(Dt).min(1),audio:zod.z.array(Lt).optional().default([])}),kt=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(Pt).optional().default([])}),$t=zod.z.object({targetFps:zod.z.number().min(1).max(240).optional().default(60),quality:gt.optional().default("auto"),debug:zod.z.boolean().optional().default(false),autoplay:zod.z.boolean().optional().default(false)}),Ft=zod.z.object({schemaVersion:zod.z.string().min(1),engine:$t,events:zod.z.array(kt).min(1),scenes:zod.z.array(zt).min(1),assets:zod.z.array(Rt).optional().default([])}).refine(u=>{let e=new Set(u.scenes.map(i=>i.id)),t=new Set(u.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(u=>{let e=u.events.map(n=>n.id),t=u.scenes.map(n=>n.id),i=u.assets?.map(n=>n.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: "+Ce.join(", "));if(!Ce.includes(i))throw new Error(`Unsupported schema version: ${i}. Supported versions: ${Ce.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(n=>n.type))),diagnostics:[],optimizations:{precompileAnimations:true,optimizeAssetLoading:true,enableObjectPooling:true,minimizeDOMUpdates:true,useWebWorkers:false}};try{let i=this.compileAssets(e.assets||[],t),n=this.compileScenes(e.scenes,t),r=this.compileEvents(e.events,n,t),s=Math.max(...Array.from(r.values()).map(o=>o.startTime+o.duration)),a={events:r,scenes:n,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 Ft.parse(e);default:throw new Error(`Unsupported schema version: ${t}`)}}static compileAssets(e,t){let i=new Map;for(let n of e){let r={id:n.id,type:n.type,src:n.src,data:null,loaded:false,error:null,fallback:n.fallback,metadata:{size:n.metadata?.size||0,mimeType:n.metadata?.mimeType||"",cacheDuration:n.metadata?.cacheDuration||36e5,dimensions:n.metadata?.dimensions,duration:n.metadata?.duration,quality:1,streamable:false,priority:"normal"},progress:0};i.set(n.id,r);}return i}static compileScenes(e,t){let i=new Map,n=0;for(let r of e){let s=this.compileLayers(r.layers,t),a=this.compileAudioTracks(r.audio||[],t),o={id:r.id,name:r.name,duration:r.duration,layers:s,audioTracks:a,startTime:n,endTime:n+r.duration};i.set(r.id,o),n+=r.duration;}return i}static compileLayers(e,t){return e.sort((i,n)=>i.zIndex-n.zIndex).map(i=>{let n=this.compileAnimationTracks(i.animations||[],t),r={id:i.id,type:i.type,zIndex:i.zIndex,mount:()=>{},update:()=>{},destroy:()=>{}};return {id:i.id,type:i.type,zIndex:i.zIndex,instance:r,animations:n,initialConfig:{...i.config},active:true}})}static compileAnimationTracks(e,t){return e.map(i=>N.compileTrack(i))}static compileAudioTracks(e,t){return e.map(i=>{let n={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:n,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 n=new Map,r=0;for(let s of e){let a=s.scenes.map(c=>{let m=t.get(c);if(!m)throw new Error(`Scene with ID "${c}" not found for event "${s.id}"`);return m}),o=this.compileTransitions(s.transitions||[],i),d=a.reduce((c,m)=>c+m.duration,0),h={id:s.id,name:s.name,scenes:a,transitions:o,duration:d,startTime:r};n.set(s.id,h),r+=d;}return n}static compileTransitions(e,t){return e.map(i=>{let n=N.compileEasing(i.easing||"ease"),r=(a,o,d)=>{};return {type:i.type,duration:i.duration,easingFunction:n,config:i.config||{},execute:r}})}static formatZodError(e){return `Specification validation failed:
2
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(n=>{try{n(i);}catch(r){console.error("Error in frame callback:",r);}}),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,n)=>i+n,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,n)=>{let r=n-e;return i+r*r},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 q=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,n=()=>{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:n()}}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((n,r)=>n+r.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",n=e.indexOf(i);if(t<n){let r=e[t+1];r&&this.setQuality(r);}}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 V=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),n=this._activeTracks.get(t.id);i&&!n?this._startTrack(t,e):!i&&n&&n.isPlaying?this._stopTrack(n):n&&n.isPlaying&&this._updateTrack(n,e);}}seek(e){this._currentTime=e;for(let t of this._activeTracks.values())t.isPlaying&&this._stopTrack(t);this._isPlaying&&this.update(e);}async crossfade(e,t=1e3){this._isInitialized||await this.initialize();let i=Array.from(this._activeTracks.values()).filter(s=>s.isPlaying);await this.loadTracks(e);let n=i.map(s=>this._fadeOutTrack(s,t)),r=e.map(async s=>{let a={id:s.id,type:s.type,startTime:s.startMs,endTime:s.endMs,volume:s.volume,fadeIn:t,fadeOut:s.fadeOut,loop:s.loop,audioNode:s.audioNode,audioElement:s.audioElement,isPlaying:false,isPaused:false,currentTime:0};this._activeTracks.set(a.id,a);try{this._audioContext&&a.audioNode?await this._startWebAudioTrackWithFade(a,s,0,a.volume,t):a.audioElement&&await this._startHTMLAudioTrackWithFade(a,0,a.volume,t),a.isPlaying=!0,this._emit("track-started",a.id);}catch(o){console.error(`AudioSystem: Failed to start track ${a.id} during crossfade:`,o),this._emit("track-error",a.id,o),this._activeTracks.delete(a.id);}});await Promise.all([...n,...r]),i.forEach(s=>{this._forceStopTrack(s);});}stopSceneTracks(e){for(let t of this._activeTracks.values())t.isPlaying&&this._stopTrack(t);}cleanupScene(e){this.stopSceneTracks(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 n=i.indexOf(t);n>-1&&i.splice(n,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(n){console.error(`AudioSystem: Failed to start track ${i.id}:`,n),this._emit("track-error",i.id,n),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 n=this._audioContext.createGain();e.gainNode=n,i.connect(n),n.connect(this._masterGainNode);let r=this._audioContext.currentTime;e.fadeIn>0?(n.gain.setValueAtTime(0,r),n.gain.linearRampToValueAtTime(e.volume,r+e.fadeIn/1e3)):n.gain.setValueAtTime(e.volume,r),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;}async _startWebAudioTrackWithFade(e,t,i,n,r){if(!this._audioContext||!this._masterGainNode)throw new Error("WebAudio context not available");let s=this._audioContext.createBufferSource();s.buffer=e.audioNode,s.loop=e.loop;let a=this._audioContext.createGain();e.gainNode=a,s.connect(a),a.connect(this._masterGainNode);let o=this._audioContext.currentTime;a.gain.setValueAtTime(i,o),a.gain.linearRampToValueAtTime(n,o+r/1e3),s.onended=()=>{e.isPlaying&&(e.isPlaying=false,this._emit("track-ended",e.id),this._activeTracks.delete(e.id));};let d=Math.max(0,e.currentTime/1e3);s.start(0,d),e.source=s;}_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(n=>{n.name==="NotAllowedError"?this._emit("autoplay-blocked",e.id):this._emit("track-error",e.id,n);});}async _startHTMLAudioTrackWithFade(e,t,i,n){if(!e.audioElement)throw new Error("HTMLAudio element not available");let r=e.audioElement;r.volume=this._config.masterVolume*t,e.currentTime>0&&(r.currentTime=e.currentTime/1e3),r.onended=()=>{e.isPlaying&&(e.isPlaying=false,this._emit("track-ended",e.id),this._activeTracks.delete(e.id));},r.onerror=()=>{this._emit("track-error",e.id,new Error("HTMLAudio playback error"));};let s=r.play();s&&await s.catch(a=>{throw a.name==="NotAllowedError"?this._emit("autoplay-blocked",e.id):this._emit("track-error",e.id,a),a}),await this._fadeHTMLAudio(r,this._config.masterVolume*i,n);}async _fadeOutTrack(e,t){if(e.gainNode&&this._audioContext){let i=this._audioContext.currentTime,n=e.gainNode.gain.value;e.gainNode.gain.setValueAtTime(n,i),e.gainNode.gain.linearRampToValueAtTime(0,i+t/1e3),await new Promise(r=>setTimeout(r,t));}else e.audioElement&&await this._fadeHTMLAudio(e.audioElement,0,t);}_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 n=1-i/e.fadeOut,r=e.volume*(1-n);e.gainNode&&this._audioContext?e.gainNode.gain.setValueAtTime(r,this._audioContext.currentTime):e.audioElement&&(e.audioElement.volume=this._config.masterVolume*r);}}}async _fadeHTMLAudio(e,t,i){let n=e.volume,r=performance.now();return new Promise(s=>{let a=()=>{let o=performance.now()-r,d=Math.min(o/i,1);e.volume=n+(t-n)*d,d<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(n=>{try{n(...t);}catch(r){console.error(`Error in audio system event listener for "${e}":`,r);}});}};var B=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(),n=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:n.activeLayers||0,activeParticles:n.activeParticles||0,domNodes:n.domNodes||0,drawCalls:n.drawCalls||0,memoryUsage:this.getMemoryUsage(),isPlaying:this.renderer.isPlaying(),isPaused:this.renderer.isPaused()}}generateDebugHTML(e){let t=a=>{let o=Math.floor(a/1e3),d=Math.floor(o/60),h=o%60,c=Math.floor(a%1e3);return d>0?`${d}:${h.toString().padStart(2,"0")}.${c.toString().padStart(3,"0")}`:`${h}.${c.toString().padStart(3,"0")}s`},i=(a,o)=>o===0?"0%":`${Math.round(a/o*100)}%`,n=e.isPlaying?"\u25B6\uFE0F":e.isPaused?"\u23F8\uFE0F":"\u23F9\uFE0F",r=this.getQualityColor(e.quality),s=`
3
+ `)}`}};var B=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(n=>{try{n(i);}catch(r){console.error("Error in frame callback:",r);}}),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,n)=>i+n,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,n)=>{let r=n-e;return i+r*r},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 q=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,n=()=>{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:n()}}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((n,r)=>n+r.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",n=e.indexOf(i);if(t<n){let r=e[t+1];r&&this.setQuality(r);}}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 V=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),n=this._activeTracks.get(t.id);i&&!n?this._startTrack(t,e):!i&&n&&n.isPlaying?this._stopTrack(n):n&&n.isPlaying&&this._updateTrack(n,e);}}seek(e){this._currentTime=e;for(let t of this._activeTracks.values())t.isPlaying&&this._stopTrack(t);this._isPlaying&&this.update(e);}async crossfade(e,t=1e3){this._isInitialized||await this.initialize();let i=Array.from(this._activeTracks.values()).filter(s=>s.isPlaying);await this.loadTracks(e);let n=i.map(s=>this._fadeOutTrack(s,t)),r=e.map(async s=>{let a={id:s.id,type:s.type,startTime:s.startMs,endTime:s.endMs,volume:s.volume,fadeIn:t,fadeOut:s.fadeOut,loop:s.loop,audioNode:s.audioNode,audioElement:s.audioElement,isPlaying:false,isPaused:false,currentTime:0};this._activeTracks.set(a.id,a);try{this._audioContext&&a.audioNode?await this._startWebAudioTrackWithFade(a,s,0,a.volume,t):a.audioElement&&await this._startHTMLAudioTrackWithFade(a,0,a.volume,t),a.isPlaying=!0,this._emit("track-started",a.id);}catch(o){console.error(`AudioSystem: Failed to start track ${a.id} during crossfade:`,o),this._emit("track-error",a.id,o),this._activeTracks.delete(a.id);}});await Promise.all([...n,...r]),i.forEach(s=>{this._forceStopTrack(s);});}stopSceneTracks(e){for(let t of this._activeTracks.values())t.isPlaying&&this._stopTrack(t);}cleanupScene(e){this.stopSceneTracks(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 n=i.indexOf(t);n>-1&&i.splice(n,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(n){console.error(`AudioSystem: Failed to start track ${i.id}:`,n),this._emit("track-error",i.id,n),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 n=this._audioContext.createGain();e.gainNode=n,i.connect(n),n.connect(this._masterGainNode);let r=this._audioContext.currentTime;e.fadeIn>0?(n.gain.setValueAtTime(0,r),n.gain.linearRampToValueAtTime(e.volume,r+e.fadeIn/1e3)):n.gain.setValueAtTime(e.volume,r),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;}async _startWebAudioTrackWithFade(e,t,i,n,r){if(!this._audioContext||!this._masterGainNode)throw new Error("WebAudio context not available");let s=this._audioContext.createBufferSource();s.buffer=e.audioNode,s.loop=e.loop;let a=this._audioContext.createGain();e.gainNode=a,s.connect(a),a.connect(this._masterGainNode);let o=this._audioContext.currentTime;a.gain.setValueAtTime(i,o),a.gain.linearRampToValueAtTime(n,o+r/1e3),s.onended=()=>{e.isPlaying&&(e.isPlaying=false,this._emit("track-ended",e.id),this._activeTracks.delete(e.id));};let d=Math.max(0,e.currentTime/1e3);s.start(0,d),e.source=s;}_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(n=>{n.name==="NotAllowedError"?this._emit("autoplay-blocked",e.id):this._emit("track-error",e.id,n);});}async _startHTMLAudioTrackWithFade(e,t,i,n){if(!e.audioElement)throw new Error("HTMLAudio element not available");let r=e.audioElement;r.volume=this._config.masterVolume*t,e.currentTime>0&&(r.currentTime=e.currentTime/1e3),r.onended=()=>{e.isPlaying&&(e.isPlaying=false,this._emit("track-ended",e.id),this._activeTracks.delete(e.id));},r.onerror=()=>{this._emit("track-error",e.id,new Error("HTMLAudio playback error"));};let s=r.play();s&&await s.catch(a=>{throw a.name==="NotAllowedError"?this._emit("autoplay-blocked",e.id):this._emit("track-error",e.id,a),a}),await this._fadeHTMLAudio(r,this._config.masterVolume*i,n);}async _fadeOutTrack(e,t){if(e.gainNode&&this._audioContext){let i=this._audioContext.currentTime,n=e.gainNode.gain.value;e.gainNode.gain.setValueAtTime(n,i),e.gainNode.gain.linearRampToValueAtTime(0,i+t/1e3),await new Promise(r=>setTimeout(r,t));}else e.audioElement&&await this._fadeHTMLAudio(e.audioElement,0,t);}_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 n=1-i/e.fadeOut,r=e.volume*(1-n);e.gainNode&&this._audioContext?e.gainNode.gain.setValueAtTime(r,this._audioContext.currentTime):e.audioElement&&(e.audioElement.volume=this._config.masterVolume*r);}}}async _fadeHTMLAudio(e,t,i){let n=e.volume,r=performance.now();return new Promise(s=>{let a=()=>{let o=performance.now()-r,d=Math.min(o/i,1);e.volume=n+(t-n)*d,d<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(n=>{try{n(...t);}catch(r){console.error(`Error in audio system event listener for "${e}":`,r);}});}};var k=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(),n=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:n.activeLayers||0,activeParticles:n.activeParticles||0,domNodes:n.domNodes||0,drawCalls:n.drawCalls||0,memoryUsage:this.getMemoryUsage(),isPlaying:this.renderer.isPlaying(),isPaused:this.renderer.isPaused()}}generateDebugHTML(e){let t=a=>{let o=Math.floor(a/1e3),d=Math.floor(o/60),h=o%60,c=Math.floor(a%1e3);return d>0?`${d}:${h.toString().padStart(2,"0")}.${c.toString().padStart(3,"0")}`:`${h}.${c.toString().padStart(3,"0")}s`},i=(a,o)=>o===0?"0%":`${Math.round(a/o*100)}%`,n=e.isPlaying?"\u25B6\uFE0F":e.isPaused?"\u23F8\uFE0F":"\u23F9\uFE0F",r=this.getQualityColor(e.quality),s=`
4
4
  <div style="margin-bottom: 8px; font-weight: bold; color: #00ff88;">
5
5
  \u{1F3AC} cinematicRenderer2D Debug
6
6
  </div>
@@ -79,7 +79,135 @@ ${e.errors.map(i=>`${i.path.length>0?`at ${i.path.join(".")}`:"at root"}: ${i.me
79
79
  />
80
80
  </svg>
81
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 E(u,e){if(typeof u=="string"&&u.endsWith("%")){let t=parseFloat(u)/100;return e*t}return typeof u=="number"?u:parseFloat(u)||0}var P=class{constructor(e,t,i){this.mounted=false;this.element=null;this.id=e,this.type=t,this.zIndex=i.zIndex||0,this.config=i;}destroy(){this.element&&this.element.parentNode&&this.element.parentNode.removeChild(this.element),this.element=null,this.mounted=false;}setVisible(e){this.mounted&&this.element&&(this.element.style.display=e?"block":"none");}setOpacity(e){this.mounted&&this.element&&(this.element.style.opacity=e.toString());}resize(e,t){this.mounted;}},U=class extends P{constructor(e,t){super(e,"gradient",t);}convertDirection(e){let t={vertical:"to bottom",horizontal:"to right",diagonal:"to bottom right",radial:"radial-gradient"};return e.startsWith("to ")||e.startsWith("radial")?e:t[e]||"to bottom"}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:n="vertical",opacity:r=1,width:s="100%",height:a="100%",centerX:o=.5,centerY:d=.5}=this.config,h=this.convertDirection(n),c=i.join(", ");if(this.element){let m;if(h==="radial-gradient"||n==="radial"){let v=(o*100).toFixed(0),f=(d*100).toFixed(0);m=`radial-gradient(circle at ${v}% ${f}%, ${c})`;}else m=`linear-gradient(${h}, ${c})`;this.element.style.cssText+=`
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}};var U=class{constructor(e,t,i){this.debugOverlay=null;this.editorContainer=null;this.timelineElement=null;this.inspectorElement=null;this.boundingBoxContainer=null;this.markers=[];this.selectedLayer=null;this.isDraggingScrubber=false;this.isEnabled=false;this.renderer=e,this.container=t,this.config={enabled:i.enabled,showTimeline:i.showTimeline!==false,showBoundingBoxes:i.showBoundingBoxes!==false,showPropertyInspector:i.showPropertyInspector!==false,showPerformanceMetrics:i.showPerformanceMetrics!==false,autoEnableWithDebug:i.autoEnableWithDebug!==false},this.config.enabled&&this.enable(),this.config.autoEnableWithDebug&&this.setupDebugModeIntegration();}enable(){this.isEnabled||(this.isEnabled=true,this.createEditorUI(),this.setupEventListeners(),this.config.showPerformanceMetrics&&this.enableDebugOverlay(),this.extractTimelineMarkers());}disable(){this.isEnabled&&(this.isEnabled=false,this.destroyEditorUI(),this.debugOverlay&&this.debugOverlay.hide());}toggle(){this.isEnabled?this.disable():this.enable();}setConfig(e){this.config={...this.config,...e},this.isEnabled&&(this.destroyEditorUI(),this.createEditorUI());}showTimeline(){this.timelineElement&&(this.timelineElement.style.display="block");}hideTimeline(){this.timelineElement&&(this.timelineElement.style.display="none");}showBoundingBoxes(){this.boundingBoxContainer||this.createBoundingBoxContainer(),this.updateBoundingBoxes();}hideBoundingBoxes(){this.boundingBoxContainer&&(this.boundingBoxContainer.style.display="none");}showPropertyInspector(e){let t=this.findLayerById(e);t&&(this.selectedLayer=t,this.updatePropertyInspector(),this.inspectorElement&&(this.inspectorElement.style.display="block"));}hidePropertyInspector(){this.inspectorElement&&(this.inspectorElement.style.display="none"),this.selectedLayer=null;}addMarker(e){this.markers.push(e),this.timelineElement&&this.renderTimeline();}removeMarker(e){this.markers=this.markers.filter(t=>t.time!==e),this.timelineElement&&this.renderTimeline();}onTimelineScrub(e){this.renderer.seek(e),this.updateTimeline();}onLayerClick(e){this.showPropertyInspector(e),this.highlightLayer(e);}destroy(){this.disable(),this.destroyEditorUI(),this.debugOverlay&&(this.debugOverlay.destroy(),this.debugOverlay=null);}setupDebugModeIntegration(){this.renderer.on("debugModeChanged",e=>{e&&!this.isEnabled&&this.enable();}),typeof this.renderer.isDebugEnabled=="function"&&this.renderer.isDebugEnabled()&&!this.isEnabled&&this.enable();}createEditorUI(){this.editorContainer=document.createElement("div"),this.editorContainer.className="cinematic-editor-mode",this.editorContainer.style.cssText=`
83
+ position: absolute;
84
+ top: 0;
85
+ left: 0;
86
+ width: 100%;
87
+ height: 100%;
88
+ pointer-events: none;
89
+ z-index: 9999;
90
+ `,this.config.showTimeline&&this.createTimeline(),this.config.showPropertyInspector&&this.createPropertyInspector(),this.config.showBoundingBoxes&&this.createBoundingBoxContainer(),this.container.appendChild(this.editorContainer);}destroyEditorUI(){this.editorContainer&&this.editorContainer.parentNode&&this.editorContainer.parentNode.removeChild(this.editorContainer),this.editorContainer=null,this.timelineElement=null,this.inspectorElement=null,this.boundingBoxContainer=null;}createTimeline(){this.timelineElement=document.createElement("div"),this.timelineElement.className="cinematic-timeline",this.timelineElement.style.cssText=`
91
+ position: absolute;
92
+ bottom: 0;
93
+ left: 0;
94
+ width: 100%;
95
+ height: 80px;
96
+ background: rgba(0, 0, 0, 0.9);
97
+ border-top: 2px solid #00ff88;
98
+ pointer-events: auto;
99
+ padding: 10px;
100
+ box-sizing: border-box;
101
+ `,this.renderTimeline(),this.editorContainer?.appendChild(this.timelineElement);}renderTimeline(){if(!this.timelineElement)return;let e=this.renderer.getDuration(),t=this.renderer.getCurrentTime(),i=e>0?t/e*100:0;this.timelineElement.innerHTML=`
102
+ <div style="color: #fff; font-family: monospace; font-size: 12px; margin-bottom: 5px;">
103
+ Timeline: ${this.formatTime(t)} / ${this.formatTime(e)}
104
+ </div>
105
+ <div style="position: relative; height: 30px; background: rgba(255,255,255,0.1); border-radius: 4px; cursor: pointer;" class="timeline-track">
106
+ ${this.renderMarkers()}
107
+ <div class="timeline-scrubber" style="
108
+ position: absolute;
109
+ left: ${i}%;
110
+ top: 0;
111
+ width: 3px;
112
+ height: 100%;
113
+ background: #00ff88;
114
+ cursor: ew-resize;
115
+ box-shadow: 0 0 10px rgba(0,255,136,0.5);
116
+ "></div>
117
+ </div>
118
+ <div style="color: #888; font-family: monospace; font-size: 10px; margin-top: 5px;">
119
+ Click or drag to scrub timeline
120
+ </div>
121
+ `,this.setupTimelineInteraction();}renderMarkers(){let e=this.renderer.getDuration();return e===0?"":this.markers.map(t=>{let i=t.time/e*100,n=t.color||this.getMarkerColor(t.type);return `
122
+ <div style="
123
+ position: absolute;
124
+ left: ${i}%;
125
+ top: 0;
126
+ width: 2px;
127
+ height: 100%;
128
+ background: ${n};
129
+ opacity: 0.7;
130
+ " title="${t.label}"></div>
131
+ `}).join("")}getMarkerColor(e){switch(e){case "scene":return "#ffcc00";case "event":return "#00ccff";case "custom":return "#ff00ff";default:return "#ffffff"}}setupTimelineInteraction(){if(!this.timelineElement)return;let e=this.timelineElement.querySelector(".timeline-track"),t=this.timelineElement.querySelector(".timeline-scrubber");if(!e||!t)return;let i=n=>{let r=e.getBoundingClientRect(),s=n.clientX-r.left,o=Math.max(0,Math.min(1,s/r.width))*this.renderer.getDuration();this.onTimelineScrub(o);};e.addEventListener("click",i),t.addEventListener("mousedown",n=>{n.preventDefault(),this.isDraggingScrubber=true;let r=a=>{this.isDraggingScrubber&&i(a);},s=()=>{this.isDraggingScrubber=false,document.removeEventListener("mousemove",r),document.removeEventListener("mouseup",s);};document.addEventListener("mousemove",r),document.addEventListener("mouseup",s);});}updateTimeline(){this.timelineElement&&this.renderTimeline();}createPropertyInspector(){this.inspectorElement=document.createElement("div"),this.inspectorElement.className="cinematic-property-inspector",this.inspectorElement.style.cssText=`
132
+ position: absolute;
133
+ top: 10px;
134
+ right: 10px;
135
+ width: 300px;
136
+ max-height: 80%;
137
+ background: rgba(0, 0, 0, 0.9);
138
+ border: 2px solid #00ff88;
139
+ border-radius: 4px;
140
+ pointer-events: auto;
141
+ padding: 15px;
142
+ box-sizing: border-box;
143
+ overflow-y: auto;
144
+ display: none;
145
+ `,this.editorContainer?.appendChild(this.inspectorElement);}updatePropertyInspector(){if(!this.inspectorElement||!this.selectedLayer)return;let e=this.selectedLayer,t=this.getLayerProperties(e);this.inspectorElement.innerHTML=`
146
+ <div style="color: #00ff88; font-family: monospace; font-size: 14px; font-weight: bold; margin-bottom: 10px; border-bottom: 1px solid #00ff88; padding-bottom: 5px;">
147
+ Layer Inspector
148
+ </div>
149
+ <div style="color: #fff; font-family: monospace; font-size: 12px;">
150
+ <div style="margin-bottom: 10px;">
151
+ <div style="color: #888;">ID:</div>
152
+ <div style="color: #ffcc00;">${e.id}</div>
153
+ </div>
154
+ <div style="margin-bottom: 10px;">
155
+ <div style="color: #888;">Type:</div>
156
+ <div style="color: #00ccff;">${e.type}</div>
157
+ </div>
158
+ <div style="margin-bottom: 10px;">
159
+ <div style="color: #888;">Z-Index:</div>
160
+ <div>${e.zIndex}</div>
161
+ </div>
162
+ ${this.renderProperties(t)}
163
+ </div>
164
+ <button style="
165
+ margin-top: 10px;
166
+ padding: 5px 10px;
167
+ background: #00ff88;
168
+ color: #000;
169
+ border: none;
170
+ border-radius: 3px;
171
+ cursor: pointer;
172
+ font-family: monospace;
173
+ font-size: 11px;
174
+ " onclick="this.parentElement.style.display='none'">Close</button>
175
+ `;}getLayerProperties(e){let t={};return "opacity"in e&&(t.opacity=e.opacity),"x"in e&&(t.x=e.x),"y"in e&&(t.y=e.y),"scale"in e&&(t.scale=e.scale),"rotation"in e&&(t.rotation=e.rotation),t}renderProperties(e){return Object.keys(e).length===0?'<div style="color: #888; font-style: italic;">No properties available</div>':Object.entries(e).map(([t,i])=>`
176
+ <div style="margin-bottom: 8px;">
177
+ <div style="color: #888;">${t}:</div>
178
+ <div style="color: #fff;">${this.formatPropertyValue(i)}</div>
179
+ </div>
180
+ `).join("")}formatPropertyValue(e){return typeof e=="number"?e.toFixed(2):typeof e=="object"?JSON.stringify(e,null,2):String(e)}createBoundingBoxContainer(){this.boundingBoxContainer=document.createElement("div"),this.boundingBoxContainer.className="cinematic-bounding-boxes",this.boundingBoxContainer.style.cssText=`
181
+ position: absolute;
182
+ top: 0;
183
+ left: 0;
184
+ width: 100%;
185
+ height: 100%;
186
+ pointer-events: none;
187
+ z-index: 9998;
188
+ `,this.editorContainer?.appendChild(this.boundingBoxContainer),this.updateBoundingBoxes();}updateBoundingBoxes(){if(!this.boundingBoxContainer)return;this.boundingBoxContainer.innerHTML="",this.getAllLayers().forEach(t=>{let i=this.createBoundingBox(t);i&&this.boundingBoxContainer?.appendChild(i);});}createBoundingBox(e){let t=this.container.querySelector(`[data-layer-id="${e.id}"]`);if(!t)return null;let i=t.getBoundingClientRect(),n=this.container.getBoundingClientRect(),r=document.createElement("div");r.className="layer-bounding-box",r.style.cssText=`
189
+ position: absolute;
190
+ left: ${i.left-n.left}px;
191
+ top: ${i.top-n.top}px;
192
+ width: ${i.width}px;
193
+ height: ${i.height}px;
194
+ border: 2px solid #00ff88;
195
+ pointer-events: auto;
196
+ cursor: pointer;
197
+ box-sizing: border-box;
198
+ `;let s=document.createElement("div");return s.style.cssText=`
199
+ position: absolute;
200
+ top: -20px;
201
+ left: 0;
202
+ background: #00ff88;
203
+ color: #000;
204
+ padding: 2px 6px;
205
+ font-family: monospace;
206
+ font-size: 10px;
207
+ font-weight: bold;
208
+ border-radius: 2px;
209
+ white-space: nowrap;
210
+ `,s.textContent=`${e.type}:${e.id}`,r.appendChild(s),r.addEventListener("click",()=>{this.onLayerClick(e.id);}),r}highlightLayer(e){this.boundingBoxContainer?.querySelectorAll(".layer-bounding-box")?.forEach(n=>{n.style.border="2px solid #00ff88";});let i=this.boundingBoxContainer?.querySelector(`[data-layer-id="${e}"]`);i&&(i.style.border="3px solid #ffcc00",i.style.boxShadow="0 0 10px rgba(255,204,0,0.5)");}setupEventListeners(){this.renderer.on("frame",()=>{this.config.showTimeline&&this.updateTimeline(),this.config.showBoundingBoxes&&this.updateBoundingBoxes(),this.config.showPropertyInspector&&this.selectedLayer&&this.updatePropertyInspector();}),document.addEventListener("keydown",e=>{(e.key==="e"||e.key==="E")&&(e.ctrlKey||e.metaKey)&&(e.preventDefault(),this.toggle());});}enableDebugOverlay(){this.debugOverlay||(this.debugOverlay=new k(this.renderer,this.container,{position:"top-left",showPerformanceGraph:true})),this.debugOverlay.show();}extractTimelineMarkers(){}findLayerById(e){return this.getAllLayers().find(i=>i.id===e)||null}getAllLayers(){return []}formatTime(e){let t=Math.floor(e/1e3),i=Math.floor(t/60),n=t%60,r=Math.floor(e%1e3);return i>0?`${i}:${n.toString().padStart(2,"0")}.${r.toString().padStart(3,"0")}`:`${n}.${r.toString().padStart(3,"0")}s`}};function E(u,e){if(typeof u=="string"&&u.endsWith("%")){let t=parseFloat(u)/100;return e*t}return typeof u=="number"?u:parseFloat(u)||0}var P=class{constructor(e,t,i){this.mounted=false;this.element=null;this.id=e,this.type=t,this.zIndex=i.zIndex||0,this.config=i;}destroy(){this.element&&this.element.parentNode&&this.element.parentNode.removeChild(this.element),this.element=null,this.mounted=false;}setVisible(e){this.mounted&&this.element&&(this.element.style.display=e?"block":"none");}setOpacity(e){this.mounted&&this.element&&(this.element.style.opacity=e.toString());}resize(e,t){this.mounted;}},W=class extends P{constructor(e,t){super(e,"gradient",t);}convertDirection(e){let t={vertical:"to bottom",horizontal:"to right",diagonal:"to bottom right",radial:"radial-gradient"};return e.startsWith("to ")||e.startsWith("radial")?e:t[e]||"to bottom"}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:n="vertical",opacity:r=1,width:s="100%",height:a="100%",centerX:o=.5,centerY:d=.5}=this.config,h=this.convertDirection(n),c=i.join(", ");if(this.element){let m;if(h==="radial-gradient"||n==="radial"){let v=(o*100).toFixed(0),f=(d*100).toFixed(0);m=`radial-gradient(circle at ${v}% ${f}%, ${c})`;}else m=`linear-gradient(${h}, ${c})`;this.element.style.cssText+=`
83
211
  background: ${m};
84
212
  opacity: ${r};
85
213
  width: ${typeof s=="number"?s+"px":s};
@@ -87,7 +215,7 @@ ${e.errors.map(i=>`${i.path.length>0?`at ${i.path.join(".")}`:"at root"}: ${i.me
87
215
  position: absolute;
88
216
  top: 0;
89
217
  left: 0;
90
- `;}}this.mounted=true;}update(e){if(!this.mounted||!this.element)return;let{x:t=0,y:i=0,scale:n=1,rotation:r=0,opacity:s=1}=this.config,a=E(t,e.viewport.width),o=E(i,e.viewport.height);this.element.style.transform=`translate3d(${a}px, ${o}px, 0) scale(${n}) rotate(${r}deg)`,this.element.style.opacity=s.toString();}},W=class extends P{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:n="",objectFit:r="cover",opacity:s=1,width:a,height:o}=this.config;if(this.img&&this.element){this.img.src=i,this.img.alt=n;let d=a||"100%",h=o||"100%";this.img.style.cssText=`
218
+ `;}}this.mounted=true;}update(e){if(!this.mounted||!this.element)return;let{x:t=0,y:i=0,scale:n=1,rotation:r=0,opacity:s=1}=this.config,a=E(t,e.viewport.width),o=E(i,e.viewport.height);this.element.style.transform=`translate3d(${a}px, ${o}px, 0) scale(${n}) rotate(${r}deg)`,this.element.style.opacity=s.toString();}},j=class extends P{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:n="",objectFit:r="cover",opacity:s=1,width:a,height:o}=this.config;if(this.img&&this.element){this.img.src=i,this.img.alt=n;let d=a||"100%",h=o||"100%";this.img.style.cssText=`
91
219
  width: ${typeof d=="number"?d+"px":d};
92
220
  height: ${typeof h=="number"?h+"px":h};
93
221
  object-fit: ${r};
@@ -113,11 +241,11 @@ ${e.errors.map(i=>`${i.path.length>0?`at ${i.path.join(".")}`:"at root"}: ${i.me
113
241
  width: auto;
114
242
  height: auto;
115
243
  min-width: max-content;
116
- `);}this.mounted=true;}update(e){if(!this.mounted||!this.element)return;let{x:t=0,y:i=0,scale:n=1,rotation:r=0,opacity:s=1,textAlign:a="center"}=this.config,o=E(t,e.viewport.width),d=E(i,e.viewport.height),h="center center",c="-50%",m="-50%";a==="left"?(h="left center",c="0%"):a==="right"&&(h="right center",c="-100%"),this.element.style.transformOrigin=h,this.element.style.transform=`translate3d(${o}px, ${d}px, 0) translate(${c}, ${m}) scale(${n}) rotate(${r}deg)`,this.element.style.opacity=s.toString();}},j=class extends P{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:n=.5,size:r="50%",opacity:s=1}=this.config;this.element&&(this.element.style.cssText+=`
244
+ `);}this.mounted=true;}update(e){if(!this.mounted||!this.element)return;let{x:t=0,y:i=0,scale:n=1,rotation:r=0,opacity:s=1,textAlign:a="center"}=this.config,o=E(t,e.viewport.width),d=E(i,e.viewport.height),h="center center",c="-50%",m="-50%";a==="left"?(h="left center",c="0%"):a==="right"&&(h="right center",c="-100%"),this.element.style.transformOrigin=h,this.element.style.transform=`translate3d(${o}px, ${d}px, 0) translate(${c}, ${m}) scale(${n}) rotate(${r}deg)`,this.element.style.opacity=s.toString();}},G=class extends P{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:n=.5,size:r="50%",opacity:s=1}=this.config;this.element&&(this.element.style.cssText+=`
117
245
  background: radial-gradient(ellipse ${r} ${r} at center, transparent 0%, ${i} 100%);
118
246
  opacity: ${s*n};
119
247
  pointer-events: none;
120
- `);}this.mounted=true;}update(e){if(!this.mounted||!this.element)return;let{x:t=0,y:i=0,scale:n=1,rotation:r=0,opacity:s=1}=this.config,a=E(t,e.viewport.width),o=E(i,e.viewport.height);this.element.style.transform=`translate3d(${a}px, ${o}px, 0) scale(${n}) rotate(${r}deg)`,this.element.style.opacity=s.toString();}},G=class extends P{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:n=50,blur:r=20,intensity:s=.8}=this.config;this.element&&(this.element.style.cssText+=`
248
+ `);}this.mounted=true;}update(e){if(!this.mounted||!this.element)return;let{x:t=0,y:i=0,scale:n=1,rotation:r=0,opacity:s=1}=this.config,a=E(t,e.viewport.width),o=E(i,e.viewport.height);this.element.style.transform=`translate3d(${a}px, ${o}px, 0) scale(${n}) rotate(${r}deg)`,this.element.style.opacity=s.toString();}},K=class extends P{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:n=50,blur:r=20,intensity:s=.8}=this.config;this.element&&(this.element.style.cssText+=`
121
249
  background: radial-gradient(circle, ${i} 0%, transparent 70%);
122
250
  width: ${n*2}px;
123
251
  height: ${n*2}px;
@@ -126,62 +254,62 @@ ${e.errors.map(i=>`${i.path.length>0?`at ${i.path.join(".")}`:"at root"}: ${i.me
126
254
  opacity: ${s};
127
255
  pointer-events: none;
128
256
  position: absolute;
129
- `);}this.mounted=true;}update(e){if(!this.mounted||!this.element)return;let{x:t=0,y:i=0,scale:n=1,rotation:r=0,intensity:s=.8,radius:a=50}=this.config,o=E(t,e.viewport.width)-a,d=E(i,e.viewport.height)-a;this.element.style.transform=`translate3d(${o}px, ${d}px, 0) scale(${n}) rotate(${r}deg)`,this.element.style.opacity=s.toString();}},K=class extends P{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:n=.1}=this.config;this.canvas&&this.element&&(this.canvas.style.cssText=`
257
+ `);}this.mounted=true;}update(e){if(!this.mounted||!this.element)return;let{x:t=0,y:i=0,scale:n=1,rotation:r=0,intensity:s=.8,radius:a=50}=this.config,o=E(t,e.viewport.width)-a,d=E(i,e.viewport.height)-a;this.element.style.transform=`translate3d(${o}px, ${d}px, 0) scale(${n}) rotate(${r}deg)`,this.element.style.opacity=s.toString();}},X=class extends P{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:n=.1}=this.config;this.canvas&&this.element&&(this.canvas.style.cssText=`
130
258
  width: 100%;
131
259
  height: 100%;
132
260
  opacity: ${n};
133
261
  mix-blend-mode: overlay;
134
262
  pointer-events: none;
135
- `,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:n=1,rotation:r=0,opacity:s=.1}=this.config,a=E(t,e.viewport.width),o=E(i,e.viewport.height);this.element.style.transform=`translate3d(${a}px, ${o}px, 0) scale(${n}) rotate(${r}deg)`,this.element.style.opacity=s.toString();let{animated:d=false,animationSpeed:h=100}=this.config;d&&e.timeMs%h<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 n=this.ctx.createImageData(e,t),r=n.data;for(let s=0;s<r.length;s+=4){let a=Math.random()*255*i;r[s]=a,r[s+1]=a,r[s+2]=a,r[s+3]=255;}this.ctx.putImageData(n,0,0);}resize(e,t){this.canvas&&this.generateNoise();}destroy(){this.ctx&&(this.ctx=void 0),this.canvas&&(this.canvas.width=0,this.canvas.height=0,this.canvas=void 0),super.destroy();}},X=class extends P{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:n=t.container.clientHeight}=this.config;if(this.canvas=this.canvas2DRenderer.createLayerCanvas(i,n),this.canvas){let r=this.canvas.getContext("2d");this.ctx=r||void 0,this.canvas.style.cssText+=`
263
+ `,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:n=1,rotation:r=0,opacity:s=.1}=this.config,a=E(t,e.viewport.width),o=E(i,e.viewport.height);this.element.style.transform=`translate3d(${a}px, ${o}px, 0) scale(${n}) rotate(${r}deg)`,this.element.style.opacity=s.toString();let{animated:d=false,animationSpeed:h=100}=this.config;d&&e.timeMs%h<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 n=this.ctx.createImageData(e,t),r=n.data;for(let s=0;s<r.length;s+=4){let a=Math.random()*255*i;r[s]=a,r[s+1]=a,r[s+2]=a,r[s+3]=255;}this.ctx.putImageData(n,0,0);}resize(e,t){this.canvas&&this.generateNoise();}destroy(){this.ctx&&(this.ctx=void 0),this.canvas&&(this.canvas.width=0,this.canvas.height=0,this.canvas=void 0),super.destroy();}},Z=class extends P{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:n=t.container.clientHeight}=this.config;if(this.canvas=this.canvas2DRenderer.createLayerCanvas(i,n),this.canvas){let r=this.canvas.getContext("2d");this.ctx=r||void 0,this.canvas.style.cssText+=`
136
264
  position: absolute;
137
265
  top: 0;
138
266
  left: 0;
139
267
  pointer-events: none;
140
268
  z-index: ${this.zIndex};
141
- `,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:n="#ffffff",size:r=2,speed:s=1,opacity:a=.8,type:o="circle",x:d=0,y:h=0,scale:c=1,rotation:m=0}=this.config,v=E(d,t.viewport.width),f=E(h,t.viewport.height);if(this.ctx.save(),this.ctx.translate(v,f),this.ctx.scale(c,c),this.ctx.rotate(m*Math.PI/180),this.ctx.globalAlpha=a,this.particles.length===0)for(let g=0;g<i;g++)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:r*(.5+Math.random()*.5),opacity:.5+Math.random()*.5,life:0,maxLife:5e3+Math.random()*1e4});this.ctx.fillStyle=n;for(let g of this.particles)g.x+=g.vx*t.deltaMs/16.67,g.y+=g.vy*t.deltaMs/16.67,g.life+=t.deltaMs,g.x<0&&(g.x=t.viewport.width),g.x>t.viewport.width&&(g.x=0),g.y<0&&(g.y=t.viewport.height),g.y>t.viewport.height&&(g.y=0),g.life>=g.maxLife&&(g.x=Math.random()*t.viewport.width,g.y=Math.random()*t.viewport.height,g.life=0),this.ctx.save(),this.ctx.globalAlpha=g.opacity*a,o==="circle"?(this.ctx.beginPath(),this.ctx.arc(g.x,g.y,g.size,0,Math.PI*2),this.ctx.fill()):o==="square"&&this.ctx.fillRect(g.x-g.size/2,g.y-g.size/2,g.size,g.size),this.ctx.restore();this.ctx.restore();}destroy(){this.canvas&&this.canvas.parentNode&&this.canvas.parentNode.removeChild(this.canvas),this.particles=[],super.destroy();}},Z=class extends P{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:n=t.container.clientHeight}=this.config;if(this.canvas=this.canvas2DRenderer.createLayerCanvas(i,n),this.canvas){let r=this.canvas.getContext("2d");this.ctx=r||void 0,this.canvas.style.cssText+=`
269
+ `,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:n="#ffffff",size:r=2,speed:s=1,opacity:a=.8,type:o="circle",x:d=0,y:h=0,scale:c=1,rotation:m=0}=this.config,v=E(d,t.viewport.width),f=E(h,t.viewport.height);if(this.ctx.save(),this.ctx.translate(v,f),this.ctx.scale(c,c),this.ctx.rotate(m*Math.PI/180),this.ctx.globalAlpha=a,this.particles.length===0)for(let g=0;g<i;g++)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:r*(.5+Math.random()*.5),opacity:.5+Math.random()*.5,life:0,maxLife:5e3+Math.random()*1e4});this.ctx.fillStyle=n;for(let g of this.particles)g.x+=g.vx*t.deltaMs/16.67,g.y+=g.vy*t.deltaMs/16.67,g.life+=t.deltaMs,g.x<0&&(g.x=t.viewport.width),g.x>t.viewport.width&&(g.x=0),g.y<0&&(g.y=t.viewport.height),g.y>t.viewport.height&&(g.y=0),g.life>=g.maxLife&&(g.x=Math.random()*t.viewport.width,g.y=Math.random()*t.viewport.height,g.life=0),this.ctx.save(),this.ctx.globalAlpha=g.opacity*a,o==="circle"?(this.ctx.beginPath(),this.ctx.arc(g.x,g.y,g.size,0,Math.PI*2),this.ctx.fill()):o==="square"&&this.ctx.fillRect(g.x-g.size/2,g.y-g.size/2,g.size,g.size),this.ctx.restore();this.ctx.restore();}destroy(){this.canvas&&this.canvas.parentNode&&this.canvas.parentNode.removeChild(this.canvas),this.particles=[],super.destroy();}},J=class extends P{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:n=t.container.clientHeight}=this.config;if(this.canvas=this.canvas2DRenderer.createLayerCanvas(i,n),this.canvas){let r=this.canvas.getContext("2d");this.ctx=r||void 0,this.canvas.style.cssText+=`
142
270
  position: absolute;
143
271
  top: 0;
144
272
  left: 0;
145
273
  pointer-events: none;
146
274
  z-index: ${this.zIndex};
147
- `,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:n="#ffffff",minSize:r=.5,maxSize:s=2,speed:a=.5,opacity:o=.8,twinkle:d=true,x:h=0,y:c=0,scale:m=1,rotation:v=0}=this.config,f=E(h,t.viewport.width),g=E(c,t.viewport.height);if(this.ctx.save(),this.ctx.translate(f,g),this.ctx.scale(m,m),this.ctx.rotate(v*Math.PI/180),this.ctx.globalAlpha=o,this.stars.length===0)for(let y=0;y<i;y++)this.stars.push({x:Math.random()*t.viewport.width,y:Math.random()*t.viewport.height,z:Math.random()*1e3,size:r+Math.random()*(s-r),baseOpacity:.3+Math.random()*.7,twinklePhase:Math.random()*Math.PI*2,twinkleSpeed:.5+Math.random()*1.5});this.ctx.fillStyle=n;for(let y of this.stars){y.z-=a*t.deltaMs/16.67,y.z<=0&&(y.z=1e3,y.x=Math.random()*t.viewport.width,y.y=Math.random()*t.viewport.height);let C=500,x=(y.x-t.viewport.width/2)*(C/y.z)+t.viewport.width/2,M=(y.y-t.viewport.height/2)*(C/y.z)+t.viewport.height/2,S=y.size*(C/y.z);if(x<-S||x>t.viewport.width+S||M<-S||M>t.viewport.height+S)continue;let _=y.baseOpacity;d&&(y.twinklePhase+=y.twinkleSpeed*t.deltaMs/1e3,_*=.5+.5*Math.sin(y.twinklePhase)),this.ctx.save(),this.ctx.globalAlpha=_*o,this.ctx.beginPath(),this.ctx.arc(x,M,Math.max(.5,S),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();}},J=class extends P{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:n=t.container.clientHeight}=this.config;if(this.canvas=this.canvas2DRenderer.createLayerCanvas(i,n),this.canvas){let r=this.canvas.getContext("2d");this.ctx=r||void 0,this.canvas.style.cssText+=`
275
+ `,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:n="#ffffff",minSize:r=.5,maxSize:s=2,speed:a=.5,opacity:o=.8,twinkle:d=true,x:h=0,y:c=0,scale:m=1,rotation:v=0}=this.config,f=E(h,t.viewport.width),g=E(c,t.viewport.height);if(this.ctx.save(),this.ctx.translate(f,g),this.ctx.scale(m,m),this.ctx.rotate(v*Math.PI/180),this.ctx.globalAlpha=o,this.stars.length===0)for(let y=0;y<i;y++)this.stars.push({x:Math.random()*t.viewport.width,y:Math.random()*t.viewport.height,z:Math.random()*1e3,size:r+Math.random()*(s-r),baseOpacity:.3+Math.random()*.7,twinklePhase:Math.random()*Math.PI*2,twinkleSpeed:.5+Math.random()*1.5});this.ctx.fillStyle=n;for(let y of this.stars){y.z-=a*t.deltaMs/16.67,y.z<=0&&(y.z=1e3,y.x=Math.random()*t.viewport.width,y.y=Math.random()*t.viewport.height);let S=500,T=(y.x-t.viewport.width/2)*(S/y.z)+t.viewport.width/2,_=(y.y-t.viewport.height/2)*(S/y.z)+t.viewport.height/2,x=y.size*(S/y.z);if(T<-x||T>t.viewport.width+x||_<-x||_>t.viewport.height+x)continue;let M=y.baseOpacity;d&&(y.twinklePhase+=y.twinkleSpeed*t.deltaMs/1e3,M*=.5+.5*Math.sin(y.twinklePhase)),this.ctx.save(),this.ctx.globalAlpha=M*o,this.ctx.beginPath(),this.ctx.arc(T,_,Math.max(.5,x),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();}},ee=class extends P{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:n=t.container.clientHeight}=this.config;if(this.canvas=this.canvas2DRenderer.createLayerCanvas(i,n),this.canvas){let r=this.canvas.getContext("2d");this.ctx=r||void 0,this.canvas.style.cssText+=`
148
276
  position: absolute;
149
277
  top: 0;
150
278
  left: 0;
151
279
  pointer-events: none;
152
280
  z-index: ${this.zIndex};
153
- `,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:n="#cccccc",minSize:r=1,maxSize:s=3,speed:a=.2,opacity:o=.4,drift:d=true,x:h=0,y:c=0,scale:m=1,rotation:v=0}=this.config;if(this.ctx.save(),this.ctx.translate(h,c),this.ctx.scale(m,m),this.ctx.rotate(v*Math.PI/180),this.ctx.globalAlpha=o,this.dustParticles.length===0)for(let f=0;f<i;f++)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:r+Math.random()*(s-r),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=n;for(let f of this.dustParticles){let g=f.vx,y=f.vy;d&&(f.driftPhase+=f.driftSpeed*t.deltaMs/1e3,g+=Math.sin(f.driftPhase)*.1,y+=Math.cos(f.driftPhase*.7)*.1),f.x+=g*t.deltaMs/16.67,f.y+=y*t.deltaMs/16.67,f.life+=t.deltaMs,f.x<-f.size&&(f.x=t.viewport.width+f.size),f.x>t.viewport.width+f.size&&(f.x=-f.size),f.y<-f.size&&(f.y=t.viewport.height+f.size),f.y>t.viewport.height+f.size&&(f.y=-f.size),f.life>=f.maxLife&&(f.x=Math.random()*t.viewport.width,f.y=Math.random()*t.viewport.height,f.life=0);let C=f.life/f.maxLife,x=C<.1?C/.1:C>.9?(1-C)/.1:1;this.ctx.save(),this.ctx.globalAlpha=f.baseOpacity*x*o,this.ctx.beginPath(),this.ctx.arc(f.x,f.y,f.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();}},ee=class extends P{constructor(t,i){super(t,"fog",i);this.fogOffset=0;}mount(t){if(!this.mounted){if(this.canvas2DRenderer=t.renderer,this.canvas2DRenderer&&this.canvas2DRenderer.createLayerCanvas){let{width:i=t.container.clientWidth,height:n=t.container.clientHeight}=this.config;if(this.canvas=this.canvas2DRenderer.createLayerCanvas(i,n),this.canvas){let r=this.canvas.getContext("2d");this.ctx=r||void 0,this.canvas.style.cssText+=`
281
+ `,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:n="#cccccc",minSize:r=1,maxSize:s=3,speed:a=.2,opacity:o=.4,drift:d=true,x:h=0,y:c=0,scale:m=1,rotation:v=0}=this.config;if(this.ctx.save(),this.ctx.translate(h,c),this.ctx.scale(m,m),this.ctx.rotate(v*Math.PI/180),this.ctx.globalAlpha=o,this.dustParticles.length===0)for(let f=0;f<i;f++)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:r+Math.random()*(s-r),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=n;for(let f of this.dustParticles){let g=f.vx,y=f.vy;d&&(f.driftPhase+=f.driftSpeed*t.deltaMs/1e3,g+=Math.sin(f.driftPhase)*.1,y+=Math.cos(f.driftPhase*.7)*.1),f.x+=g*t.deltaMs/16.67,f.y+=y*t.deltaMs/16.67,f.life+=t.deltaMs,f.x<-f.size&&(f.x=t.viewport.width+f.size),f.x>t.viewport.width+f.size&&(f.x=-f.size),f.y<-f.size&&(f.y=t.viewport.height+f.size),f.y>t.viewport.height+f.size&&(f.y=-f.size),f.life>=f.maxLife&&(f.x=Math.random()*t.viewport.width,f.y=Math.random()*t.viewport.height,f.life=0);let S=f.life/f.maxLife,T=S<.1?S/.1:S>.9?(1-S)/.1:1;this.ctx.save(),this.ctx.globalAlpha=f.baseOpacity*T*o,this.ctx.beginPath(),this.ctx.arc(f.x,f.y,f.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();}},te=class extends P{constructor(t,i){super(t,"fog",i);this.fogOffset=0;}mount(t){if(!this.mounted){if(this.canvas2DRenderer=t.renderer,this.canvas2DRenderer&&this.canvas2DRenderer.createLayerCanvas){let{width:i=t.container.clientWidth,height:n=t.container.clientHeight}=this.config;if(this.canvas=this.canvas2DRenderer.createLayerCanvas(i,n),this.canvas){let r=this.canvas.getContext("2d");this.ctx=r||void 0,this.canvas.style.cssText+=`
154
282
  position: absolute;
155
283
  top: 0;
156
284
  left: 0;
157
285
  pointer-events: none;
158
286
  z-index: ${this.zIndex};
159
- `,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{density:i=.5,color:n="#ffffff",speed:r=1,direction:s=0,opacity:a=.3,scale:o=1,x:d=0,y:h=0,rotation:c=0}=this.config;this.ctx.save(),this.ctx.translate(d,h),this.ctx.scale(o,o),this.ctx.rotate(c*Math.PI/180),this.ctx.globalAlpha=a;let m=s*Math.PI/180;this.fogOffset+=r*t.deltaMs/16.67;let v=Math.cos(m)*this.fogOffset,f=Math.sin(m)*this.fogOffset,g=Math.ceil(i*5)+1,y=t.viewport.width/g;for(let C=0;C<g;C++){let x=(v+C*y)%(t.viewport.width+y)-y,M=f%t.viewport.height,S=this.ctx.createRadialGradient(x+t.viewport.width/2,M+t.viewport.height/2,0,x+t.viewport.width/2,M+t.viewport.height/2,t.viewport.width*.8),_=this.parseColor(n);S.addColorStop(0,`rgba(${_.r}, ${_.g}, ${_.b}, ${i*.3})`),S.addColorStop(.5,`rgba(${_.r}, ${_.g}, ${_.b}, ${i*.15})`),S.addColorStop(1,`rgba(${_.r}, ${_.g}, ${_.b}, 0)`),this.ctx.fillStyle=S,this.ctx.fillRect(0,0,t.viewport.width,t.viewport.height);}this.ctx.restore();}parseColor(t){let i=t.replace("#","");return i.length===6?{r:parseInt(i.substring(0,2),16),g:parseInt(i.substring(2,4),16),b:parseInt(i.substring(4,6),16)}:{r:255,g:255,b:255}}destroy(){this.canvas&&this.canvas.parentNode&&this.canvas.parentNode.removeChild(this.canvas),super.destroy();}},te=class extends P{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 n=this.canvas.getContext("2d");this.ctx=n||void 0,this.canvas.style.cssText+=`
287
+ `,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{density:i=.5,color:n="#ffffff",speed:r=1,direction:s=0,opacity:a=.3,scale:o=1,x:d=0,y:h=0,rotation:c=0}=this.config;this.ctx.save(),this.ctx.translate(d,h),this.ctx.scale(o,o),this.ctx.rotate(c*Math.PI/180),this.ctx.globalAlpha=a;let m=s*Math.PI/180;this.fogOffset+=r*t.deltaMs/16.67;let v=Math.cos(m)*this.fogOffset,f=Math.sin(m)*this.fogOffset,g=Math.ceil(i*5)+1,y=t.viewport.width/g;for(let S=0;S<g;S++){let T=(v+S*y)%(t.viewport.width+y)-y,_=f%t.viewport.height,x=this.ctx.createRadialGradient(T+t.viewport.width/2,_+t.viewport.height/2,0,T+t.viewport.width/2,_+t.viewport.height/2,t.viewport.width*.8),M=this.parseColor(n);x.addColorStop(0,`rgba(${M.r}, ${M.g}, ${M.b}, ${i*.3})`),x.addColorStop(.5,`rgba(${M.r}, ${M.g}, ${M.b}, ${i*.15})`),x.addColorStop(1,`rgba(${M.r}, ${M.g}, ${M.b}, 0)`),this.ctx.fillStyle=x,this.ctx.fillRect(0,0,t.viewport.width,t.viewport.height);}this.ctx.restore();}parseColor(t){let i=t.replace("#","");return i.length===6?{r:parseInt(i.substring(0,2),16),g:parseInt(i.substring(2,4),16),b:parseInt(i.substring(4,6),16)}:{r:255,g:255,b:255}}destroy(){this.canvas&&this.canvas.parentNode&&this.canvas.parentNode.removeChild(this.canvas),super.destroy();}},ie=class extends P{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 n=this.canvas.getContext("2d");this.ctx=n||void 0,this.canvas.style.cssText+=`
160
288
  position: absolute;
161
289
  top: 0;
162
290
  left: 0;
163
291
  pointer-events: none;
164
292
  z-index: ${this.zIndex};
165
293
  mix-blend-mode: screen;
166
- `,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:n=.01,opacity:r=.6,animated:s=true,speed:a=.001,octaves:o=3,x:d=0,y:h=0,scaleTransform:c=1,rotation:m=0}=this.config;this.ctx.save(),this.ctx.translate(d,h),this.ctx.scale(c,c),this.ctx.rotate(m*Math.PI/180),this.ctx.globalAlpha=r;let v=Math.floor(e.viewport.width/2),f=Math.floor(e.viewport.height/2);(!this.noiseData||this.noiseData.width!==v||this.noiseData.height!==f)&&(this.noiseData=this.ctx.createImageData(v,f));let g=this.noiseData.data,y=s?e.timeMs*a:0;for(let C=0;C<f;C++)for(let x=0;x<v;x++){let M=(C*v+x)*4,S=0,_=1,R=n;for(let _e=0;_e<o;_e++)S+=this.perlinNoise(x*R+y,C*R+y)*_,_*=.5,R*=2;S=(S+1)*.5,S=Math.max(0,Math.min(1,S*i));let fe=Math.floor(S*(t.length-1)),rt=Math.min(fe+1,t.length-1),ye=S*(t.length-1)-fe,D=this.hexToRgb(t[fe]),ge=this.hexToRgb(t[rt]),st=Math.floor(D.r+(ge.r-D.r)*ye),at=Math.floor(D.g+(ge.g-D.g)*ye),ot=Math.floor(D.b+(ge.b-D.b)*ye),ct=Math.floor(S*255);g[M]=st,g[M+1]=at,g[M+2]=ot,g[M+3]=ct;}this.ctx.putImageData(this.noiseData,0,0),this.ctx.drawImage(this.canvas,0,0,v,f,0,0,e.viewport.width,e.viewport.height),this.ctx.restore();}perlinNoise(e,t){let i=this.noise(Math.floor(e),Math.floor(t)),n=this.noise(Math.floor(e)+1,Math.floor(t)),r=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),o=t-Math.floor(t),d=a*a*(3-2*a),h=o*o*(3-2*o),c=i+d*(n-i),m=r+d*(s-r);return c+h*(m-c)}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();}},ie=class extends P{constructor(t,i){super(t,"parallaxGroup",i);this.childLayers=[];}mount(t){if(this.mounted)return;let i=t.renderer;i.createLayerElement&&(this.element=i.createLayerElement(this.id,this.zIndex),this.element&&(this.element.style.cssText+=`
294
+ `,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:n=.01,opacity:r=.6,animated:s=true,speed:a=.001,octaves:o=3,x:d=0,y:h=0,scaleTransform:c=1,rotation:m=0}=this.config;this.ctx.save(),this.ctx.translate(d,h),this.ctx.scale(c,c),this.ctx.rotate(m*Math.PI/180),this.ctx.globalAlpha=r;let v=Math.floor(e.viewport.width/2),f=Math.floor(e.viewport.height/2);(!this.noiseData||this.noiseData.width!==v||this.noiseData.height!==f)&&(this.noiseData=this.ctx.createImageData(v,f));let g=this.noiseData.data,y=s?e.timeMs*a:0;for(let S=0;S<f;S++)for(let T=0;T<v;T++){let _=(S*v+T)*4,x=0,M=1,I=n;for(let _e=0;_e<o;_e++)x+=this.perlinNoise(T*I+y,S*I+y)*M,M*=.5,I*=2;x=(x+1)*.5,x=Math.max(0,Math.min(1,x*i));let ye=Math.floor(x*(t.length-1)),st=Math.min(ye+1,t.length-1),ge=x*(t.length-1)-ye,z=this.hexToRgb(t[ye]),ve=this.hexToRgb(t[st]),at=Math.floor(z.r+(ve.r-z.r)*ge),ot=Math.floor(z.g+(ve.g-z.g)*ge),ct=Math.floor(z.b+(ve.b-z.b)*ge),lt=Math.floor(x*255);g[_]=at,g[_+1]=ot,g[_+2]=ct,g[_+3]=lt;}this.ctx.putImageData(this.noiseData,0,0),this.ctx.drawImage(this.canvas,0,0,v,f,0,0,e.viewport.width,e.viewport.height),this.ctx.restore();}perlinNoise(e,t){let i=this.noise(Math.floor(e),Math.floor(t)),n=this.noise(Math.floor(e)+1,Math.floor(t)),r=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),o=t-Math.floor(t),d=a*a*(3-2*a),h=o*o*(3-2*o),c=i+d*(n-i),m=r+d*(s-r);return c+h*(m-c)}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();}},ne=class extends P{constructor(t,i){super(t,"parallaxGroup",i);this.childLayers=[];}mount(t){if(this.mounted)return;let i=t.renderer;i.createLayerElement&&(this.element=i.createLayerElement(this.id,this.zIndex),this.element&&(this.element.style.cssText+=`
167
295
  position: absolute;
168
296
  width: 100%;
169
297
  height: 100%;
170
298
  overflow: hidden;
171
299
  pointer-events: none;
172
- `));let{layers:n=[]}=this.config;this.mounted=true;}update(t){if(!this.mounted||!this.element)return;let{scrollSpeed:i=1,x:n=0,y:r=0,scale:s=1,rotation:a=0,opacity:o=1}=this.config,d=E(n,t.viewport.width),h=E(r,t.viewport.height);this.element.style.transform=`translate3d(${d}px, ${h}px, 0) scale(${s}) rotate(${a}deg)`,this.element.style.opacity=o.toString();for(let c of this.childLayers){let m=c.config,v=m.depth||.5,f=m.speed||1,g=v*f*i,y=d*g,C=h*g;m.x=y,m.y=C,c.update(t);}}destroy(){for(let t of this.childLayers)t.destroy();this.childLayers=[],super.destroy();}};function ne(u,e){if(typeof u=="string"&&u.endsWith("%")){let t=parseFloat(u)/100;return e*t}return typeof u=="number"?u:parseFloat(u)||0}var re=class{constructor(e,t){this.type="light";this.element=null;this.mounted=false;this.id=e,this.zIndex=t.zIndex||0;let i=t,n=t.position||{x:i.x||"50%",y:i.y||"50%"};this.config={...t,mode:t.mode||"radial",position:n,radius:t.radius||200,intensity:t.intensity!==void 0?t.intensity:1,color:t.color||"#ffffff",angle:t.angle||45,direction:t.direction||0,blendMode:t.blendMode||"screen",opacity:t.opacity!==void 0?t.opacity:1};}mount(e){if(this.mounted)return;let t=e.renderer;t.createLayerElement&&(this.element=t.createLayerElement(this.id,this.zIndex),this.element&&(this.element.style.cssText=`
300
+ `));let{layers:n=[]}=this.config;this.mounted=true;}update(t){if(!this.mounted||!this.element)return;let{scrollSpeed:i=1,x:n=0,y:r=0,scale:s=1,rotation:a=0,opacity:o=1}=this.config,d=E(n,t.viewport.width),h=E(r,t.viewport.height);this.element.style.transform=`translate3d(${d}px, ${h}px, 0) scale(${s}) rotate(${a}deg)`,this.element.style.opacity=o.toString();for(let c of this.childLayers){let m=c.config,v=m.depth||.5,f=m.speed||1,g=v*f*i,y=d*g,S=h*g;m.x=y,m.y=S,c.update(t);}}destroy(){for(let t of this.childLayers)t.destroy();this.childLayers=[],super.destroy();}};function re(u,e){if(typeof u=="string"&&u.endsWith("%")){let t=parseFloat(u)/100;return e*t}return typeof u=="number"?u:parseFloat(u)||0}var se=class{constructor(e,t){this.type="light";this.element=null;this.mounted=false;this.id=e,this.zIndex=t.zIndex||0;let i=t,n=t.position||{x:i.x||"50%",y:i.y||"50%"};this.config={...t,mode:t.mode||"radial",position:n,radius:t.radius||200,intensity:t.intensity!==void 0?t.intensity:1,color:t.color||"#ffffff",angle:t.angle||45,direction:t.direction||0,blendMode:t.blendMode||"screen",opacity:t.opacity!==void 0?t.opacity:1};}mount(e){if(this.mounted)return;let t=e.renderer;t.createLayerElement&&(this.element=t.createLayerElement(this.id,this.zIndex),this.element&&(this.element.style.cssText=`
173
301
  position: absolute;
174
302
  width: 100%;
175
303
  height: 100%;
176
304
  pointer-events: none;
177
305
  mix-blend-mode: ${this.config.blendMode};
178
306
  opacity: ${this.config.opacity};
179
- `,this._renderLight(e))),this.mounted=true;}update(e){!this.mounted||!this.element||(this.config.opacity!==void 0&&(this.element.style.opacity=this.config.opacity.toString()),this._renderLight(e));}destroy(){this.element&&this.element.parentNode&&this.element.parentNode.removeChild(this.element),this.element=null,this.mounted=false;}setVisible(e){this.mounted&&this.element&&(this.element.style.display=e?"block":"none");}setOpacity(e){this.config.opacity=e,this.mounted&&this.element&&(this.element.style.opacity=e.toString());}resize(e,t){}setPosition(e,t){this.config.position={x:e,y:t},this.mounted;}setIntensity(e){this.config.intensity=Math.max(0,Math.min(1,e)),this.mounted;}setColor(e){this.config.color=e,this.mounted;}setRadius(e){this.config.radius=Math.max(0,e),this.mounted;}_renderLight(e){if(!this.element)return;let{mode:t}=this.config;switch(t){case "radial":this._renderRadialLight(e);break;case "spot":this._renderSpotLight(e);break;case "ambient":this._renderAmbientLight();break;case "vignette":this._renderVignetteLight();break}}_renderRadialLight(e){if(!this.element)return;let{position:t,radius:i,intensity:n,color:r}=this.config,s="viewport"in e?e.viewport.width:e.container.clientWidth,a="viewport"in e?e.viewport.height:e.container.clientHeight,o=t?ne(t.x,s):s/2,d=t?ne(t.y,a):a/2,h=n||1,c=`radial-gradient(circle at ${o}px ${d}px, ${this._addAlpha(r,h)} 0%, transparent ${i}px)`;this.element.style.background=c;}_renderSpotLight(e){if(!this.element)return;let{position:t,radius:i,intensity:n,color:r,angle:s,direction:a}=this.config,o="viewport"in e?e.viewport.width:e.container.clientWidth,d="viewport"in e?e.viewport.height:e.container.clientHeight,h=t?ne(t.x,o):o/2,c=t?ne(t.y,d):d/2,m=n||1,v=(s||45)/2,y=`conic-gradient(from ${(a||0)-v}deg at ${h}px ${c}px,
307
+ `,this._renderLight(e))),this.mounted=true;}update(e){!this.mounted||!this.element||(this.config.opacity!==void 0&&(this.element.style.opacity=this.config.opacity.toString()),this._renderLight(e));}destroy(){this.element&&this.element.parentNode&&this.element.parentNode.removeChild(this.element),this.element=null,this.mounted=false;}setVisible(e){this.mounted&&this.element&&(this.element.style.display=e?"block":"none");}setOpacity(e){this.config.opacity=e,this.mounted&&this.element&&(this.element.style.opacity=e.toString());}resize(e,t){}setPosition(e,t){this.config.position={x:e,y:t},this.mounted;}setIntensity(e){this.config.intensity=Math.max(0,Math.min(1,e)),this.mounted;}setColor(e){this.config.color=e,this.mounted;}setRadius(e){this.config.radius=Math.max(0,e),this.mounted;}_renderLight(e){if(!this.element)return;let{mode:t}=this.config;switch(t){case "radial":this._renderRadialLight(e);break;case "spot":this._renderSpotLight(e);break;case "ambient":this._renderAmbientLight();break;case "vignette":this._renderVignetteLight();break}}_renderRadialLight(e){if(!this.element)return;let{position:t,radius:i,intensity:n,color:r}=this.config,s="viewport"in e?e.viewport.width:e.container.clientWidth,a="viewport"in e?e.viewport.height:e.container.clientHeight,o=t?re(t.x,s):s/2,d=t?re(t.y,a):a/2,h=n||1,c=`radial-gradient(circle at ${o}px ${d}px, ${this._addAlpha(r,h)} 0%, transparent ${i}px)`;this.element.style.background=c;}_renderSpotLight(e){if(!this.element)return;let{position:t,radius:i,intensity:n,color:r,angle:s,direction:a}=this.config,o="viewport"in e?e.viewport.width:e.container.clientWidth,d="viewport"in e?e.viewport.height:e.container.clientHeight,h=t?re(t.x,o):o/2,c=t?re(t.y,d):d/2,m=n||1,v=(s||45)/2,y=`conic-gradient(from ${(a||0)-v}deg at ${h}px ${c}px,
180
308
  transparent 0deg,
181
309
  ${this._addAlpha(r,m)} ${v}deg,
182
310
  ${this._addAlpha(r,m)} ${v}deg,
183
311
  transparent ${s}deg,
184
- transparent 360deg)`;this.element.style.background=y,this.element.style.maskImage=`radial-gradient(circle at ${h}px ${c}px, black 0%, transparent ${i}px)`,this.element.style.webkitMaskImage=`radial-gradient(circle at ${h}px ${c}px, black 0%, transparent ${i}px)`;}_renderAmbientLight(){if(!this.element)return;let{intensity:e,color:t}=this.config,i=e||1;this.element.style.background=this._addAlpha(t,i);}_renderVignetteLight(){if(!this.element)return;let{radius:e,intensity:t,color:i}=this.config,n=t||1,s=`radial-gradient(ellipse at center, transparent ${e||70}%, ${this._addAlpha(i,n)} 100%)`;this.element.style.background=s;}_addAlpha(e,t){if(e.startsWith("#")){let i=e.slice(1),n=parseInt(i.slice(0,2),16),r=parseInt(i.slice(2,4),16),s=parseInt(i.slice(4,6),16);return `rgba(${n}, ${r}, ${s}, ${t})`}return e.startsWith("rgb")?e.replace(/rgba?\(([^)]+)\)/,(i,n)=>{let r=n.split(",").map(s=>s.trim());return `rgba(${r[0]}, ${r[1]}, ${r[2]}, ${t})`}):e}};var I=class I{constructor(){this.layerTypes=new Map;this.registerBuiltInLayers();}static getInstance(){return I.instance||(I.instance=new I),I.instance}registerLayerType(e,t){this.layerTypes.has(e)&&console.warn(`Layer type '${e}' is already registered. Overriding existing registration.`);try{let i=t("__validation_test__",{});this.validateLayerInterface(i,e);}catch(i){throw new Error(`Failed to register layer type '${e}': ${i instanceof Error?i.message:"Unknown error"}`)}this.layerTypes.set(e,t);}validateLayerInterface(e,t){let i=["id","type","zIndex"],n=["mount","update","destroy"];for(let r of i)if(!(r in e))throw new Error(`Layer type '${t}' does not implement required property '${r}'. All layers must implement the ICinematicLayer interface with properties: ${i.join(", ")}`);for(let r of n)if(typeof e[r]!="function")throw new Error(`Layer type '${t}' does not implement required method '${r}()'. All layers must implement the ICinematicLayer interface with methods: ${n.join(", ")}`);if(typeof e.id!="string")throw new Error(`Layer type '${t}' has invalid 'id' property. Expected string, got ${typeof e.id}`);if(typeof e.type!="string")throw new Error(`Layer type '${t}' has invalid 'type' property. Expected string, got ${typeof e.type}`);if(typeof e.zIndex!="number")throw new Error(`Layer type '${t}' has invalid 'zIndex' property. Expected number, got ${typeof e.zIndex}`)}createLayer(e,t,i){let n=this.layerTypes.get(e);if(!n)throw new Error(`Unknown layer type: ${e}. Available types: ${this.getRegisteredTypes().join(", ")}`);return n(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","light","parallaxGroup"],canvas2d:["particles","starfield","dust","nebulaNoise","fog"]}}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 U(e,t)),this.layerTypes.set("image",(e,t)=>new W(e,t)),this.layerTypes.set("textBlock",(e,t)=>new Y(e,t)),this.layerTypes.set("vignette",(e,t)=>new j(e,t)),this.layerTypes.set("glowOrb",(e,t)=>new G(e,t)),this.layerTypes.set("noiseOverlay",(e,t)=>new K(e,t)),this.layerTypes.set("light",(e,t)=>new re(e,t)),this.layerTypes.set("parallaxGroup",(e,t)=>new ie(e,t)),this.layerTypes.set("particles",(e,t)=>new X(e,t)),this.layerTypes.set("starfield",(e,t)=>new Z(e,t)),this.layerTypes.set("dust",(e,t)=>new J(e,t)),this.layerTypes.set("nebulaNoise",(e,t)=>new te(e,t)),this.layerTypes.set("fog",(e,t)=>new ee(e,t));}};I.instance=null;var se=I;var $=class{constructor(e){this.container=e;}};var ae=class extends ${constructor(){super(...arguments);this.layerElements=new Map;this.initialized=false;}initialize(){this.initialized||(this.domContainer=document.createElement("div"),this.domContainer.style.cssText=`
312
+ transparent 360deg)`;this.element.style.background=y,this.element.style.maskImage=`radial-gradient(circle at ${h}px ${c}px, black 0%, transparent ${i}px)`,this.element.style.webkitMaskImage=`radial-gradient(circle at ${h}px ${c}px, black 0%, transparent ${i}px)`;}_renderAmbientLight(){if(!this.element)return;let{intensity:e,color:t}=this.config,i=e||1;this.element.style.background=this._addAlpha(t,i);}_renderVignetteLight(){if(!this.element)return;let{radius:e,intensity:t,color:i}=this.config,n=t||1,s=`radial-gradient(ellipse at center, transparent ${e||70}%, ${this._addAlpha(i,n)} 100%)`;this.element.style.background=s;}_addAlpha(e,t){if(e.startsWith("#")){let i=e.slice(1),n=parseInt(i.slice(0,2),16),r=parseInt(i.slice(2,4),16),s=parseInt(i.slice(4,6),16);return `rgba(${n}, ${r}, ${s}, ${t})`}return e.startsWith("rgb")?e.replace(/rgba?\(([^)]+)\)/,(i,n)=>{let r=n.split(",").map(s=>s.trim());return `rgba(${r[0]}, ${r[1]}, ${r[2]}, ${t})`}):e}};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.`);try{let i=t("__validation_test__",{});this.validateLayerInterface(i,e);}catch(i){throw new Error(`Failed to register layer type '${e}': ${i instanceof Error?i.message:"Unknown error"}`)}this.layerTypes.set(e,t);}validateLayerInterface(e,t){let i=["id","type","zIndex"],n=["mount","update","destroy"];for(let r of i)if(!(r in e))throw new Error(`Layer type '${t}' does not implement required property '${r}'. All layers must implement the ICinematicLayer interface with properties: ${i.join(", ")}`);for(let r of n)if(typeof e[r]!="function")throw new Error(`Layer type '${t}' does not implement required method '${r}()'. All layers must implement the ICinematicLayer interface with methods: ${n.join(", ")}`);if(typeof e.id!="string")throw new Error(`Layer type '${t}' has invalid 'id' property. Expected string, got ${typeof e.id}`);if(typeof e.type!="string")throw new Error(`Layer type '${t}' has invalid 'type' property. Expected string, got ${typeof e.type}`);if(typeof e.zIndex!="number")throw new Error(`Layer type '${t}' has invalid 'zIndex' property. Expected number, got ${typeof e.zIndex}`)}createLayer(e,t,i){let n=this.layerTypes.get(e);if(!n)throw new Error(`Unknown layer type: ${e}. Available types: ${this.getRegisteredTypes().join(", ")}`);return n(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","light","parallaxGroup"],canvas2d:["particles","starfield","dust","nebulaNoise","fog"]}}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 W(e,t)),this.layerTypes.set("image",(e,t)=>new j(e,t)),this.layerTypes.set("textBlock",(e,t)=>new Y(e,t)),this.layerTypes.set("vignette",(e,t)=>new G(e,t)),this.layerTypes.set("glowOrb",(e,t)=>new K(e,t)),this.layerTypes.set("noiseOverlay",(e,t)=>new X(e,t)),this.layerTypes.set("light",(e,t)=>new se(e,t)),this.layerTypes.set("parallaxGroup",(e,t)=>new ne(e,t)),this.layerTypes.set("particles",(e,t)=>new Z(e,t)),this.layerTypes.set("starfield",(e,t)=>new J(e,t)),this.layerTypes.set("dust",(e,t)=>new ee(e,t)),this.layerTypes.set("nebulaNoise",(e,t)=>new ie(e,t)),this.layerTypes.set("fog",(e,t)=>new te(e,t));}};R.instance=null;var ae=R;var $=class{constructor(e){this.container=e;}};var oe=class extends ${constructor(){super(...arguments);this.layerElements=new Map;this.initialized=false;}initialize(){this.initialized||(this.domContainer=document.createElement("div"),this.domContainer.style.cssText=`
185
313
  position: absolute;
186
314
  top: 0;
187
315
  left: 0;
@@ -199,7 +327,7 @@ ${e.errors.map(i=>`${i.path.length>0?`at ${i.path.join(".")}`:"at root"}: ${i.me
199
327
  transform-style: preserve-3d;
200
328
  backface-visibility: hidden;
201
329
  z-index: ${i};
202
- `,this.domContainer.appendChild(n),this.layerElements.set(t,n),n}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 N={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 we=class{constructor(e,t,i=100){this.pool=[];this.createFn=e,this.resetFn=t;for(let n=0;n<i;n++)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}},oe=class extends ${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=`
330
+ `,this.domContainer.appendChild(n),this.layerElements.set(t,n),n}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 H={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 n=0;n<i;n++)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}},ce=class extends ${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=`
203
331
  position: absolute;
204
332
  top: 0;
205
333
  left: 0;
@@ -207,12 +335,12 @@ ${e.errors.map(i=>`${i.path.length>0?`at ${i.path.join(".")}`:"at root"}: ${i.me
207
335
  height: 100%;
208
336
  pointer-events: none;
209
337
  z-index: 1000;
210
- `;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 we(()=>({x:0,y:0,vx:0,vy:0,size:1,opacity:1,color:"#ffffff",life:0,maxLife:1e3,rotation:0,rotationSpeed:0,active:false}),n=>{n.active=false,n.life=0,n.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 n=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 r=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"?r+=this.renderParticleLayer(a,i):a.type==="nebulaNoise"&&(r+=this.renderNoiseLayer(a,i)),this.ctx.restore();this.ctx.restore(),this.performanceMetrics.drawCalls=r,this.performanceMetrics.activeLayers=s.length,this.performanceMetrics.frameTime=performance.now()-n;}renderParticleLayer(t,i){let r=t.config||{},{count:s=100,color:a="#ffffff",size:o=2,speed:d=1,opacity:h=.8,type:c="circle"}=r,m=N[i.quality]||N.medium,v=Math.min(s,m.particleCount);for(;this.activeParticles.length<v;){let g=this.particlePool.get();this.initializeParticle(g,i.viewport),g.color=a,g.size=o,g.active=true,this.activeParticles.push(g);}for(;this.activeParticles.length>v;){let g=this.activeParticles.pop();g&&this.particlePool.release(g);}let f=0;for(let g=this.activeParticles.length-1;g>=0;g--){let y=this.activeParticles[g];if(!y||!y.active){this.activeParticles.splice(g,1),y&&this.particlePool.release(y);continue}y.x+=y.vx*d*i.deltaMs/16.67,y.y+=y.vy*d*i.deltaMs/16.67,y.rotation+=y.rotationSpeed*i.deltaMs/16.67,y.life+=i.deltaMs,(y.x<-y.size||y.x>i.viewport.width+y.size||y.y<-y.size||y.y>i.viewport.height+y.size||y.life>=y.maxLife)&&(this.initializeParticle(y,i.viewport),y.color=a,y.size=o),this.ctx.save(),this.ctx.globalAlpha=y.opacity*h,this.ctx.fillStyle=y.color,c==="circle"?(this.ctx.beginPath(),this.ctx.arc(y.x,y.y,y.size,0,Math.PI*2),this.ctx.fill()):c==="star"&&this.drawStar(y.x,y.y,y.size,y.rotation),this.ctx.restore(),f++;}return this.performanceMetrics.activeParticles=this.activeParticles.length,f}renderNoiseLayer(t,i){let r=t.config||{},{intensity:s=.5,scale:a=1,opacity:o=.3,animated:d=true,speed:h=.01}=r,m=(N[i.quality]||N.medium).canvasResolution,v=Math.floor(i.viewport.width*m),f=Math.floor(i.viewport.height*m),g=this.ctx.createImageData(v,f),y=g.data,C=d?i.timeMs*h:0;for(let x=0;x<f;x++)for(let M=0;M<v;M++){let S=(x*v+M)*4,_=this.simpleNoise(M*a+C,x*a+C)*s,R=Math.floor(_*255);y[S]=R,y[S+1]=R,y[S+2]=R,y[S+3]=Math.floor(o*255);}return this.ctx.save(),this.ctx.putImageData(g,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,n,r){let a=n,o=n*.4;this.ctx.save(),this.ctx.translate(t,i),this.ctx.rotate(r),this.ctx.beginPath();for(let d=0;d<10;d++){let h=d*Math.PI/5,c=d%2===0?a:o,m=Math.cos(h)*c,v=Math.sin(h)*c;d===0?this.ctx.moveTo(m,v):this.ctx.lineTo(m,v);}this.ctx.closePath(),this.ctx.fill(),this.ctx.restore();}simpleNoise(t,i){let n=Math.sin(t*12.9898+i*78.233)*43758.5453;return n-Math.floor(n)}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 n=document.createElement("canvas");n.width=Math.floor(t*this.devicePixelRatio),n.height=Math.floor(i*this.devicePixelRatio),n.style.width=t+"px",n.style.height=i+"px";let r=n.getContext("2d");return r&&(r.scale(this.devicePixelRatio,this.devicePixelRatio),r.imageSmoothingEnabled=true,r.imageSmoothingQuality="high"),n}};var Ce=(s=>(s.IDLE="idle",s.READY="ready",s.PLAYING="playing",s.PAUSED="paused",s.STOPPED="stopped",s.DESTROYED="destroyed",s))(Ce||{});var ce=class{constructor(e){this.currentState=e,this.transitions=new Map,this.listeners=new Set,this.sceneStates=new Map,this.activeSceneId=null,this._registerDefaultTransitions();}_registerDefaultTransitions(){this.registerTransition({from:"idle",to:"ready"}),this.registerTransition({from:"ready",to:"playing"}),this.registerTransition({from:"playing",to:"paused"}),this.registerTransition({from:"playing",to:"stopped"}),this.registerTransition({from:"paused",to:"playing"}),this.registerTransition({from:"paused",to:"stopped"}),this.registerTransition({from:"stopped",to:"playing"});for(let e of Object.values(Ce))e!=="destroyed"&&this.registerTransition({from:e,to:"destroyed"});this.registerTransition({from:"created",to:"mounted"}),this.registerTransition({from:"mounted",to:"active"}),this.registerTransition({from:"active",to:"exiting"}),this.registerTransition({from:"exiting",to:"unmounted"}),this.registerTransition({from:"unmounted",to:"created"});}registerTransition(e){let t=this._getTransitionKey(e.from,e.to);this.transitions.set(t,e);}canTransition(e){let t=this._getTransitionKey(this.currentState,e),i=this.transitions.get(t);return i?i.guard?i.guard():true:false}async transition(e){if(!this.canTransition(e))throw new Error(`Invalid state transition: ${this.currentState} -> ${e}. Valid transitions from ${this.currentState}: ${this._getValidTransitions().join(", ")}`);let t=this._getTransitionKey(this.currentState,e),i=this.transitions.get(t),n=this.currentState;i?.action&&await i.action(),this.currentState=e,this._notifyListeners(n,e);}getState(){return this.currentState}addListener(e){this.listeners.add(e);}removeListener(e){this.listeners.delete(e);}_getValidTransitions(){let e=[];for(let[t,i]of this.transitions.entries())i.from===this.currentState&&(!i.guard||i.guard())&&e.push(i.to);return e}_getTransitionKey(e,t){return `${e}->${t}`}_notifyListeners(e,t){for(let i of this.listeners)try{i(e,t);}catch(n){console.error("Error in state change listener:",n);}}setSceneState(e,t){if(t==="active"){if(this.activeSceneId!==null&&this.activeSceneId!==e)throw new Error(`Cannot activate scene "${e}": scene "${this.activeSceneId}" is already active. Only one scene can be active at a time.`);this.activeSceneId=e;}this.activeSceneId===e&&t!=="active"&&(this.activeSceneId=null),this.sceneStates.set(e,t);}getSceneState(e){return this.sceneStates.get(e)}getActiveSceneId(){return this.activeSceneId}isSceneActive(e){return this.activeSceneId===e}getAllSceneStates(){return new Map(this.sceneStates)}};var de=class de{constructor(){this.activeTransition=null;this.transitionHandlers=new Map;this.cancelRequested=false;this.registerBuiltInTransitions();}static getDefaultTransition(){return {...de.DEFAULT_TRANSITION}}async executeTransition(e,t){this.activeTransition&&(this.cancelTransition(),await this.activeTransition);let i=this.transitionHandlers.get(e.type);if(!i)throw new Error(`Unknown transition type: ${e.type}. Available types: ${Array.from(this.transitionHandlers.keys()).join(", ")}`);this.cancelRequested=false,this.activeTransition=i.execute(e,t);try{await this.activeTransition,this.cancelRequested||t.onComplete();}finally{this.activeTransition=null;}}registerTransition(e,t){this.transitionHandlers.set(e,t);}isTransitioning(){return this.activeTransition!==null}cancelTransition(){this.cancelRequested=true;}getAvailableTransitions(){return Array.from(this.transitionHandlers.keys())}registerBuiltInTransitions(){this.registerTransition("crossfade",{execute:async(e,t)=>{await this.executeCrossfade(e,t);}}),this.registerTransition("slide",{execute:async(e,t)=>{await this.executeSlide(e,t);}}),this.registerTransition("zoom",{execute:async(e,t)=>{await this.executeZoom(e,t);}}),this.registerTransition("wipe",{execute:async(e,t)=>{await this.executeWipe(e,t);}}),this.registerTransition("dissolve",{execute:async(e,t)=>{await this.executeDissolve(e,t);}}),this.registerTransition("blur",{execute:async(e,t)=>{await this.executeBlur(e,t);}});}async executeCrossfade(e,t){let i=performance.now(),n=e.duration,r=document.createElement("div"),s=document.createElement("div");return r.style.position="absolute",r.style.top="0",r.style.left="0",r.style.width="100%",r.style.height="100%",r.style.pointerEvents="none",s.style.position="absolute",s.style.top="0",s.style.left="0",s.style.width="100%",s.style.height="100%",s.style.pointerEvents="none",s.style.opacity="0",t.container.appendChild(r),t.container.appendChild(s),new Promise(a=>{let o=()=>{if(this.cancelRequested){r.remove(),s.remove(),a();return}let d=performance.now()-i,h=Math.min(d/n,1),c=this.applyEasing(h,e.easing);t.onProgress(h);let m=1-c,v=c;r.style.opacity=m.toString(),s.style.opacity=v.toString(),h<1?requestAnimationFrame(o):(r.remove(),s.remove(),a());};requestAnimationFrame(o);})}async executeSlide(e,t){let i=performance.now(),n=e.duration,r=e.direction||"left",s=document.createElement("div"),a=document.createElement("div");switch(s.style.position="absolute",s.style.top="0",s.style.left="0",s.style.width="100%",s.style.height="100%",s.style.pointerEvents="none",a.style.position="absolute",a.style.top="0",a.style.left="0",a.style.width="100%",a.style.height="100%",a.style.pointerEvents="none",r){case "left":a.style.transform="translateX(100%)";break;case "right":a.style.transform="translateX(-100%)";break;case "up":a.style.transform="translateY(100%)";break;case "down":a.style.transform="translateY(-100%)";break}return t.container.appendChild(s),t.container.appendChild(a),new Promise(o=>{let d=()=>{if(this.cancelRequested){s.remove(),a.remove(),o();return}let h=performance.now()-i,c=Math.min(h/n,1),m=this.applyEasing(c,e.easing);t.onProgress(c);let v="",f="";switch(r){case "left":v=`translateX(${-m*100}%)`,f=`translateX(${(1-m)*100}%)`;break;case "right":v=`translateX(${m*100}%)`,f=`translateX(${-(1-m)*100}%)`;break;case "up":v=`translateY(${-m*100}%)`,f=`translateY(${(1-m)*100}%)`;break;case "down":v=`translateY(${m*100}%)`,f=`translateY(${-(1-m)*100}%)`;break}s.style.transform=v,a.style.transform=f,c<1?requestAnimationFrame(d):(s.remove(),a.remove(),o());};requestAnimationFrame(d);})}async executeZoom(e,t){let i=performance.now(),n=e.duration,r=document.createElement("div"),s=document.createElement("div");return r.style.position="absolute",r.style.top="0",r.style.left="0",r.style.width="100%",r.style.height="100%",r.style.pointerEvents="none",r.style.transformOrigin="center center",s.style.position="absolute",s.style.top="0",s.style.left="0",s.style.width="100%",s.style.height="100%",s.style.pointerEvents="none",s.style.transformOrigin="center center",s.style.transform="scale(0)",s.style.opacity="0",t.container.appendChild(r),t.container.appendChild(s),new Promise(a=>{let o=()=>{if(this.cancelRequested){r.remove(),s.remove(),a();return}let d=performance.now()-i,h=Math.min(d/n,1),c=this.applyEasing(h,e.easing);t.onProgress(h);let m=1-c,v=c,f=1-c,g=c;r.style.transform=`scale(${m})`,r.style.opacity=f.toString(),s.style.transform=`scale(${v})`,s.style.opacity=g.toString(),h<1?requestAnimationFrame(o):(r.remove(),s.remove(),a());};requestAnimationFrame(o);})}async executeWipe(e,t){let i=performance.now(),n=e.duration,r=e.direction||"left",s=document.createElement("div"),a=document.createElement("div");return s.style.position="absolute",s.style.top="0",s.style.left="0",s.style.width="100%",s.style.height="100%",s.style.pointerEvents="none",a.style.position="absolute",a.style.top="0",a.style.left="0",a.style.width="100%",a.style.height="100%",a.style.pointerEvents="none",t.container.appendChild(s),t.container.appendChild(a),new Promise(o=>{let d=()=>{if(this.cancelRequested){s.remove(),a.remove(),o();return}let h=performance.now()-i,c=Math.min(h/n,1),m=this.applyEasing(c,e.easing);t.onProgress(c);let v="";switch(r){case "left":v=`inset(0 ${(1-m)*100}% 0 0)`;break;case "right":v=`inset(0 0 0 ${(1-m)*100}%)`;break;case "up":v=`inset(0 0 ${(1-m)*100}% 0)`;break;case "down":v=`inset(${(1-m)*100}% 0 0 0)`;break;default:v=`inset(0 ${(1-m)*100}% 0 0)`;}a.style.clipPath=v,c<1?requestAnimationFrame(d):(s.remove(),a.remove(),o());};requestAnimationFrame(d);})}async executeDissolve(e,t){let i=performance.now(),n=e.duration,r=document.createElement("div"),s=document.createElement("div");return r.style.position="absolute",r.style.top="0",r.style.left="0",r.style.width="100%",r.style.height="100%",r.style.pointerEvents="none",s.style.position="absolute",s.style.top="0",s.style.left="0",s.style.width="100%",s.style.height="100%",s.style.pointerEvents="none",s.style.opacity="0",t.container.appendChild(r),t.container.appendChild(s),new Promise(a=>{let o=()=>{if(this.cancelRequested){r.remove(),s.remove(),a();return}let d=performance.now()-i,h=Math.min(d/n,1),c=this.applyEasing(h,e.easing);t.onProgress(h);let m=Math.floor(c*20);m>0&&(r.style.filter=`blur(${m}px) contrast(${1+c})`),r.style.opacity=(1-c).toString(),s.style.opacity=c.toString(),h<1?requestAnimationFrame(o):(r.remove(),s.remove(),a());};requestAnimationFrame(o);})}async executeBlur(e,t){let i=performance.now(),n=e.duration,r=e.blurAmount||10,s=document.createElement("div"),a=document.createElement("div");return s.style.position="absolute",s.style.top="0",s.style.left="0",s.style.width="100%",s.style.height="100%",s.style.pointerEvents="none",a.style.position="absolute",a.style.top="0",a.style.left="0",a.style.width="100%",a.style.height="100%",a.style.pointerEvents="none",a.style.opacity="0",t.container.appendChild(s),t.container.appendChild(a),new Promise(o=>{let d=()=>{if(this.cancelRequested){s.remove(),a.remove(),o();return}let h=performance.now()-i,c=Math.min(h/n,1),m=this.applyEasing(c,e.easing);t.onProgress(c);let v=r*m;s.style.filter=`blur(${v}px)`,s.style.opacity=(1-m*.5).toString(),a.style.opacity=m.toString(),c<1?requestAnimationFrame(d):(s.remove(),a.remove(),o());};requestAnimationFrame(d);})}applyEasing(e,t){switch(t){case "linear":return e;case "ease-in":return e*e;case "ease-out":return e*(2-e);case "ease-in-out":return e<.5?2*e*e:-1+(4-2*e)*e;default:return e}}};de.DEFAULT_TRANSITION={type:"crossfade",duration:500,easing:"ease-in-out"};var le=de;var ue=class{constructor(e){this.activeScene=null;this.sceneStates=new Map;this.assetManager=e.assetManager,this.layerRegistry=e.layerRegistry,this.container=e.container,this.transitionEngine=new le;}async activateScene(e,t){let i=this.activeScene;i&&t?await this.transitionToScene(i,e,t):(i&&await this.deactivateScene(i),await this.executePhase(e,{name:"prepare",execute:async n=>await this.prepare(n)}),await this.executePhase(e,{name:"mount",execute:async n=>await this.mount(n)}),await this.executePhase(e,{name:"play",execute:async n=>await this.play(n)}),this.activeScene=e);}async transitionToScene(e,t,i){await this.executePhase(t,{name:"prepare",execute:async n=>await this.prepare(n)}),await this.executePhase(t,{name:"mount",execute:async n=>await this.mount(n)}),this.sceneStates.set(e.id,"exiting"),await this.transitionEngine.executeTransition(i,{fromScene:e,toScene:t,container:this.container,onProgress:n=>{},onComplete:()=>{}}),await this.deactivateScene(e),await this.executePhase(t,{name:"play",execute:async n=>await this.play(n)}),this.activeScene=t;}getTransitionEngine(){return this.transitionEngine}async executePhase(e,t){try{await t.execute(e);}catch(i){throw new Error(`Failed to execute ${t.name} phase for scene ${e.id}: ${i}`)}}getActiveScene(){return this.activeScene}getSceneState(e){return this.sceneStates.get(e)||"created"}async deactivateScene(e){this.activeScene?.id===e.id&&(await this.executePhase(e,{name:"unmount",execute:async t=>await this.unmount(t)}),await this.executePhase(e,{name:"destroy",execute:async t=>await this.destroy(t)}),this.activeScene=null);}async prepare(e){let t=[];for(let i of e.layers)i.initialConfig.assetId&&t.push(i.initialConfig.assetId),i.initialConfig.src&&t.push(i.initialConfig.src);for(let i of e.audioTracks)i.asset&&t.push(i.asset.id);if(t.length>0)for(let i of t)this.assetManager.isAssetLoaded(i);this.sceneStates.set(e.id,"created");}async mount(e){for(let t of e.layers){if(!t.instance){let n=this.layerRegistry.createLayer(t.type,t.id,t.initialConfig);t.instance=n;}let i=t.instance;i&&typeof i.mount=="function"&&i.mount({container:this.container,renderer:null,assetManager:this.assetManager,layerConfig:t.initialConfig});}this.sceneStates.set(e.id,"mounted");}async play(e){for(let t of e.layers)t.instance&&(t.active=true);this.sceneStates.set(e.id,"active");}async unmount(e){for(let t of e.layers)t.instance&&typeof t.instance.destroy=="function"&&t.instance.destroy(),t.active=false;this.sceneStates.set(e.id,"unmounted");}async destroy(e){for(let t of e.layers)t.instance&&(typeof t.instance.destroy=="function"&&t.instance.destroy(),t.instance=null),t.animations=[];e.audioTracks=[],this.sceneStates.delete(e.id);}ensureSingleActiveScene(){let e=0;for(let[t,i]of this.sceneStates.entries())if(i==="active"&&(e++,e>1))throw new Error("Multiple scenes in ACTIVE state detected. Only one scene can be active at a time.")}};var he=class{constructor(e={}){this._assets=new Map;this._eventListeners=new Map;this._loadingQueue=[];this._activeLoads=new Set;this._cacheSize=0;this._loadStartTime=0;this._loadedBytes=0;this._config={maxConcurrentLoads:e.maxConcurrentLoads||6,defaultTimeout:e.defaultTimeout||3e4,defaultRetries:e.defaultRetries||3,baseUrl:e.baseUrl||"",cache:{maxSize:e.cache?.maxSize||100*1024*1024,defaultDuration:e.cache?.defaultDuration||1440*60*1e3,storageType:e.cache?.storageType||"memory",compress:e.cache?.compress||false,evictionStrategy:e.cache?.evictionStrategy||"lru"}};}async loadAssets(e){if(e.length===0)return [];this._loadStartTime=performance.now(),this._loadedBytes=0;let t=this._sortByPriority(e);t.map(a=>this._createAsset(a)).forEach(a=>this._assets.set(a.id,a)),this._loadingQueue=[...t];let n=[];for(;this._loadingQueue.length>0||this._activeLoads.size>0;){for(;this._loadingQueue.length>0&&this._activeLoads.size<this._config.maxConcurrentLoads;){let a=this._loadingQueue.shift(),o=this._assets.get(a.id);this._activeLoads.add(a.id);let d=this._loadSingleAsset(o,a);n.push(d),d.finally(()=>{this._activeLoads.delete(a.id);});}if(this._activeLoads.size>0){let a=n.filter(o=>o&&!this._isPromiseSettled(o));a.length>0&&await Promise.race(a);}this._emitProgress();}let s=(await Promise.allSettled(n)).filter(a=>a.status==="fulfilled").map(a=>a.value);return this._emit("complete",s),s}getAsset(e){return this._assets.get(e)||null}isAssetLoaded(e){let t=this._assets.get(e);return t?t.loaded&&!t.error:false}getAllAssets(){return Array.from(this._assets.values())}getAssetsByType(e){return Array.from(this._assets.values()).filter(t=>t.type===e)}async preloadAsset(e){let t=this._createAsset(e);return this._assets.set(t.id,t),this._loadSingleAsset(t,e)}clearCache(){this._assets.clear(),this._cacheSize=0;}removeAsset(e){let t=this._assets.get(e);return t?(this._cacheSize-=t.size||0,this._assets.delete(e),true):false}getCacheStats(){return {totalAssets:this._assets.size,cacheSize:this._cacheSize,maxCacheSize:this._config.cache.maxSize,cacheUtilization:this._cacheSize/this._config.cache.maxSize}}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 n=i.indexOf(t);n>-1&&i.splice(n,1);}}_createAsset(e){return {id:e.id,type:e.type,src:this._resolveUrl(e.src),data:null,loaded:false,error:null,fallback:e.fallback,progress:0,metadata:this._createDefaultMetadata(e)}}_createDefaultMetadata(e){return {...{size:0,mimeType:this._getMimeType(e.type),cacheDuration:this._config.cache.defaultDuration,priority:e.metadata?.priority||"normal"},...e.metadata}}_resolveUrl(e){return e.startsWith("http")||e.startsWith("data:")||e.startsWith("blob:")?e:this._config.baseUrl+e}_getMimeType(e){return {image:"image/*",video:"video/*",audio:"audio/*",font:"font/*",json:"application/json",binary:"application/octet-stream",text:"text/plain"}[e]}_sortByPriority(e){let t={critical:0,high:1,normal:2,low:3,lazy:4};return [...e].sort((i,n)=>{let r=i.metadata?.priority||"normal",s=n.metadata?.priority||"normal";return t[r]-t[s]})}async _loadSingleAsset(e,t){let i={timeout:this._config.defaultTimeout,retries:this._config.defaultRetries,useCache:true},n=null;for(let r=0;r<=i.retries;r++)try{return await this._loadAssetData(e,i),e.loaded=!0,e.progress=1,e.size&&(this._cacheSize+=e.size,this._loadedBytes+=e.size),this._enforceCache(),this._emit("asset-loaded",e),e}catch(s){n=s,r<i.retries&&await new Promise(a=>setTimeout(a,Math.pow(2,r)*1e3));}if(t.fallback)try{let r={...e,src:this._resolveUrl(t.fallback)};return await this._loadAssetData(r,i),e.data=r.data,e.loaded=!0,e.progress=1,this._emit("asset-loaded",e),e}catch(r){n=r;}return e.error=n,e.progress=0,this._emit("asset-error",e.id,n),e}async _loadAssetData(e,t){switch(e.type){case "image":e.data=await this._loadImage(e.src,t);break;case "video":e.data=await this._loadVideo(e.src,t);break;case "audio":e.data=await this._loadAudio(e.src,t);break;case "font":e.data=await this._loadFont(e.src,t);break;case "json":e.data=await this._loadJson(e.src,t);break;case "text":e.data=await this._loadText(e.src,t);break;case "binary":e.data=await this._loadBinary(e.src,t);break;default:throw new Error(`Unsupported asset type: ${e.type}`)}if(!e.size&&e.data){let i=this._estimateAssetSize(e.data);e.size=i;}}async _loadImage(e,t){return new Promise((i,n)=>{let r=new Image,s=setTimeout(()=>{n(new Error(`Image load timeout: ${e}`));},t.timeout);r.onload=()=>{clearTimeout(s),i(r);},r.onerror=()=>{clearTimeout(s),n(new Error(`Failed to load image: ${e}`));},t.mode==="cors"&&(r.crossOrigin="anonymous"),r.src=e;})}async _loadVideo(e,t){return new Promise((i,n)=>{let r=document.createElement("video"),s=setTimeout(()=>{n(new Error(`Video load timeout: ${e}`));},t.timeout);r.oncanplaythrough=()=>{clearTimeout(s),i(r);},r.onerror=()=>{clearTimeout(s),n(new Error(`Failed to load video: ${e}`));},t.mode==="cors"&&(r.crossOrigin="anonymous"),r.preload="auto",r.src=e,r.load();})}async _loadAudio(e,t){return new Promise((i,n)=>{let r=new Audio,s=setTimeout(()=>{n(new Error(`Audio load timeout: ${e}`));},t.timeout);r.oncanplaythrough=()=>{clearTimeout(s),i(r);},r.onerror=()=>{clearTimeout(s),n(new Error(`Failed to load audio: ${e}`));},t.mode==="cors"&&(r.crossOrigin="anonymous"),r.preload="auto",r.src=e,r.load();})}async _loadFont(e,t){let n=await(await this._fetchWithTimeout(e,t)).arrayBuffer(),r=e.split("/").pop()?.split(".")[0]||"CustomFont",s=new FontFace(r,n);return await s.load(),typeof document<"u"&&document.fonts&&document.fonts.add(s),s}async _loadJson(e,t){return (await this._fetchWithTimeout(e,t)).json()}async _loadText(e,t){return (await this._fetchWithTimeout(e,t)).text()}async _loadBinary(e,t){return (await this._fetchWithTimeout(e,t)).arrayBuffer()}async _fetchWithTimeout(e,t){let i=new AbortController,n=setTimeout(()=>i.abort(),t.timeout);try{let r=await fetch(e,{signal:i.signal,mode:t.mode,credentials:t.credentials,headers:t.headers});if(!r.ok)throw new Error(`HTTP ${r.status}: ${r.statusText}`);return r}finally{clearTimeout(n);}}_estimateAssetSize(e){return e instanceof HTMLImageElement?e.width*e.height*4:e instanceof ArrayBuffer?e.byteLength:typeof e=="string"?e.length*2:e instanceof HTMLVideoElement||e instanceof HTMLAudioElement?1024*1024:0}_enforceCache(){if(this._cacheSize<=this._config.cache.maxSize)return;this._emit("cache-full",this._cacheSize);let e=Array.from(this._assets.values());switch(this._config.cache.evictionStrategy){case "lru":e.sort((t,i)=>(t.cachedAt||0)-(i.cachedAt||0));break;case "lfu":e.sort((t,i)=>(t.cachedAt||0)-(i.cachedAt||0));break;case "fifo":e.sort((t,i)=>(t.cachedAt||0)-(i.cachedAt||0));break}for(;this._cacheSize>this._config.cache.maxSize*.8&&e.length>0;){let t=e.shift();t&&this.removeAsset(t.id);}}_emitProgress(){let e=this._assets.size,t=Array.from(this._assets.values()).filter(s=>s.loaded||s.error).length,i=Array.from(this._assets.values()).find(s=>!s.loaded&&!s.error)?.id,n={loaded:t,total:e,currentAsset:i,percentage:e>0?t/e*100:0},r=performance.now()-this._loadStartTime;if(r>0&&this._loadedBytes>0){n.speed=this._loadedBytes/(r/1e3);let s=e-t;if(s>0&&n.speed>0){let a=this._loadedBytes/t,o=s*a;n.estimatedTimeRemaining=o/n.speed*1e3;}}this._emit("progress",n);}_emit(e,...t){let i=this._eventListeners.get(e);i&&i.forEach(n=>{try{n(...t);}catch(r){console.error(`Error in asset manager event listener for "${e}":`,r);}});}_isPromiseSettled(e){return false}};var me=class{constructor(e){this.container=e,this.state={x:0,y:0,zoom:1,rotate:0},this.animations=[],this.easingFunctions=this.initializeEasingFunctions(),this.applyTransform();}initializeEasingFunctions(){let e=new Map;return e.set("linear",t=>t),e.set("ease",t=>t<.5?4*t*t*t:1-Math.pow(-2*t+2,3)/2),e.set("ease-in",t=>t*t*t),e.set("ease-out",t=>1-Math.pow(1-t,3)),e.set("ease-in-out",t=>t<.5?4*t*t*t:1-Math.pow(-2*t+2,3)/2),e.set("ease-in-sine",t=>1-Math.cos(t*Math.PI/2)),e.set("ease-out-sine",t=>Math.sin(t*Math.PI/2)),e.set("ease-in-out-sine",t=>-(Math.cos(Math.PI*t)-1)/2),e}setState(e){this.state={...this.state,...e},this.applyTransform();}getState(){return {...this.state}}addAnimation(e){this.animations.push(e);}clearAnimations(){this.animations=[];}update(e){let t={},i=false;for(let n of this.animations)if(e>=n.startMs&&e<=n.endMs){let r=n.endMs-n.startMs,s=e-n.startMs,a=r>0?s/r:1,d=(this.easingFunctions.get(n.easing)||(c=>c))(a),h=n.from+(n.to-n.from)*d;t[n.property]=h,i=true;}i&&this.setState(t);}applyTransform(){let{x:e,y:t,zoom:i,rotate:n}=this.state,r=`translate(${-e}px, ${-t}px) scale(${i}) rotate(${n}deg)`;this.container.style.transform=r,this.container.style.transformOrigin="center center";}reset(){this.state={x:0,y:0,zoom:1,rotate:0},this.animations=[],this.applyTransform();}getTransformMatrix(){let{x:e,y:t,zoom:i,rotate:n}=this.state;if(typeof DOMMatrix>"u"){let s=n*Math.PI/180,a=Math.cos(s),o=Math.sin(s);return {a:i*a,b:i*o,c:-i*o,d:i*a,e:-e*i,f:-t*i}}return new DOMMatrix().translate(-e,-t).scale(i,i).rotate(0,0,n)}hasActiveAnimations(e){return this.animations.some(t=>e>=t.startMs&&e<=t.endMs)}getAnimations(){return [...this.animations]}};var pe=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._sceneLifecycleManager=null;this._cameraSystem=null;this._layers=[];this._currentSceneLayers=[];this._layerStates=new Map;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._stateMachine=new ce("idle"),this._stateMachine.addListener((n,r)=>{this.emit("state-change",{from:n,to:r});}),this._scheduler=new H({targetFps:this._spec.engine.targetFps||60,enableAdaptiveQuality:this._quality==="auto"}),this._qualitySystem=new q({respectUserPreferences:true,useDeviceDetection:true}),this._layerRegistry=se.getInstance(),this._assetManager=new he({maxConcurrentLoads:6,defaultTimeout:3e4,defaultRetries:3,baseUrl:""}),this._audioSystem=new V({preferWebAudio:true,masterVolume:1,maxConcurrentTracks:8,defaultFadeDuration:1e3}),this._qualitySystem.setQuality(this._quality),this._scheduler.addQualityChangeCallback(n=>{this._qualitySystem.updatePerformanceMetrics(n);}),this._qualitySystem.addEventListener(n=>{n.type==="quality-change"&&(this._quality=n.newQuality,this.emit("qualityChange",{previousQuality:n.previousQuality,currentQuality:n.newQuality,metrics:n.metrics}));}),this._scheduler.addFrameCallback(n=>{this._onFrame(n);}),this._audioSystem.on("track-error",(n,r)=>{this.emit("audioError",{trackId:n,error:r});}),this._audioSystem.on("autoplay-blocked",n=>{this.emit("autoplayBlocked",{trackId:n});}),this._calculateDuration(),this._setupResizeObserver(),this._options.debug&&(this._debugOverlay=new B(this,this._container,{position:"top-right",showPerformanceGraph:true}));}async mount(){if(this._stateMachine.getState()==="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._cameraSystem=new me(this._container),this._sceneLifecycleManager=new ue({assetManager:this._assetManager,layerRegistry:this._layerRegistry,container:this._container}),this._initializeLayers(),await this._audioSystem.initialize(),this._setupResizeListener(),this._debugOverlay&&this._debugOverlay.show(),this._mounted=!0,await this._stateMachine.transition("ready"),this._setState("ready"),this.emit("ready"),this._options.autoplay&&this.play();}catch(e){throw this._setState("idle"),await this._stateMachine.transition("idle").catch(()=>{}),this.emit("error",e),e}}play(){if(this._stateMachine.getState()==="destroyed")throw new Error("Cannot play destroyed renderer");if(!this._mounted)throw new Error("Must mount renderer before playing");let e=this._stateMachine.getState();if(e==="playing")return;if(!this._stateMachine.canTransition("playing"))throw new Error(`Cannot play from state: ${e}`);let t=this._state;this._stateMachine.transition("playing").catch(i=>{console.error("State transition error:",i);}),this._setState("playing"),this._scheduler.start(),this._audioSystem.play(),this._updateCurrentSceneLayers(),this.emit("play",{previousState:t,currentTime:this._currentTime});}pause(){if(this._stateMachine.getState()!=="playing")return;let t=this._state;this._stateMachine.transition("paused").catch(i=>{console.error("State transition error:",i);}),this._setState("paused"),this._scheduler.stop(),this._audioSystem.pause(),this.emit("pause",{previousState:t,currentTime:this._currentTime});}stop(){let e=this._stateMachine.getState();if(e==="destroyed"||e==="idle"||e==="stopped")return;let t=this._state;this._stateMachine.transition("stopped").catch(i=>{console.error("State transition error:",i);}),this._setState("stopped"),this._scheduler.stop(),this._audioSystem.stop(),this._currentTime=0,this._currentEventId=null,this._currentSceneId=null,this._resetLayersToInitialState(),this.emit("stop",{previousState:t});}destroy(){if(this._stateMachine.getState()==="destroyed")return;let t=this._state;if(this.stop(),this._stateMachine.transition("destroyed").catch(i=>{console.error("State transition error:",i);}),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._sceneLifecycleManager){let i=this._sceneLifecycleManager.getActiveScene();i&&this._sceneLifecycleManager.deactivateScene(i).catch(n=>{console.error("Error deactivating scene during destroy:",n);}),this._sceneLifecycleManager=null;}this._cameraSystem&&(this._cameraSystem.reset(),this._cameraSystem=null),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:t});}seek(e){if(this._stateMachine.getState()==="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._stateMachine.getState()==="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(n=>n.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._stateMachine.getState()==="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(n=>n.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._stateMachine.getState()!=="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 n=i.indexOf(t);n>-1&&i.splice(n,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()}getCameraState(){if(!this._cameraSystem)throw new Error("Camera system not initialized. Call mount() first.");return this._cameraSystem.getState()}setCameraState(e){if(!this._cameraSystem)throw new Error("Camera system not initialized. Call mount() first.");this._cameraSystem.setState(e);}addCameraAnimation(e){if(!this._cameraSystem)throw new Error("Camera system not initialized. Call mount() first.");this._cameraSystem.addAnimation(e);}resetCamera(){if(!this._cameraSystem)throw new Error("Camera system not initialized. Call mount() first.");this._cameraSystem.reset();}getCameraTransformMatrix(){if(!this._cameraSystem)throw new Error("Camera system not initialized. Call mount() first.");return this._cameraSystem.getTransformMatrix()}isDebugEnabled(){return this._debugOverlay!==null}toggleDebug(){this._debugOverlay&&this._debugOverlay.toggle();}showDebug(){this._debugOverlay&&this._debugOverlay.show();}hideDebug(){this._debugOverlay&&this._debugOverlay.hide();}getSceneLifecycleManager(){return this._sceneLifecycleManager}emit(e,...t){let i=this.eventListeners.get(e);i&&i.forEach(n=>{try{n(...t);}catch(r){console.error(`Error in event listener for "${e}":`,r);}});}_onFrame(e){if(this._stateMachine.getState()==="playing"){if(this._currentTime+=e.deltaMs,this._currentTime>=this._duration){this._currentTime=this._duration,this.stop(),this.emit("ended");return}this._updateCurrentEventAndScene(),this._cameraSystem&&this._cameraSystem.update(this._currentTime),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 n of t.scenes){let r=this._spec.scenes.find(s=>s.id===n);r&&(i+=r.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 n of i.scenes){let r=this._spec.scenes.find(s=>s.id===n);r&&(t+=r.duration);}}return 0}_calculateSceneStartTime(e){let t=0;for(let i of this._spec.events){let n=0;for(let r of i.scenes){if(r===e)return t+n;let s=this._spec.scenes.find(a=>a.id===r);s&&(n+=s.duration);}t+=n;}return 0}_updateCurrentEventAndScene(){let e=0;for(let t of this._spec.events){let i=e,n=0;for(let r of t.scenes){let s=this._spec.scenes.find(a=>a.id===r);if(s){let a=i+n,o=a+s.duration;if(this._currentTime>=a&&this._currentTime<o){this._currentEventId=t.id,this._currentSceneId=s.id;return}n+=s.duration;}}e+=n;}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:n}=t.contentRect;this.resize(i,n);}}),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 ae(this._container),this._domRenderer.initialize(),this._canvas2DRenderer=new oe(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),this._layerStates.set(i.id,"created");}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(n=>e.layers.some(r=>r.id===n.id));if(t.length!==this._currentSceneLayers.length||t.some(n=>!this._currentSceneLayers.includes(n))){let n=this._currentSceneLayers.filter(r=>!t.includes(r));for(let r of n)this._destroyLayer(r);for(let r of t)this._currentSceneLayers.includes(r)||this._mountLayer(r);this._currentSceneLayers=t,this.emit("sceneLayersChanged",{destroyed:n.length,mounted:t.filter(r=>!this._currentSceneLayers.includes(r)).length,active:this._currentSceneLayers.length});}}_mountLayer(e){try{let t=this._layerStates.get(e.id);if(t==="mounted"||t==="active"){console.warn(`Layer ${e.id} is already mounted, skipping mount`);return}if(t==="destroyed"){console.error(`Cannot mount destroyed layer ${e.id}`);return}let i=this._layerRegistry.getBuiltInTypes(),n=this._domRenderer;if(i.canvas2d.includes(e.type)&&(n=this._canvas2DRenderer),!n){console.error(`No suitable renderer found for layer type: ${e.type}`);return}let r={container:this._container,renderer:n,assetManager:null,layerConfig:this._getLayerConfig(e.id)};e.mount(r),this._layerStates.set(e.id,"mounted");}catch(t){console.error(`Failed to mount layer ${e.id}:`,t);}}_destroyLayer(e){try{if(this._layerStates.get(e.id)==="destroyed")return;e.destroy(),this._layerStates.set(e.id,"destroyed"),this._options.debug&&console.log(`Layer ${e.id} destroyed`);}catch(t){console.error(`Error destroying 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(n=>this._layerRegistry.getBuiltInTypes().dom.includes(n.type));i.length>0&&this._domRenderer.render(i,t);}if(this._canvas2DRenderer&&this._currentSceneLayers.length>0){let i=this._currentSceneLayers.filter(n=>this._layerRegistry.getBuiltInTypes().canvas2d.includes(n.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(n=>n.id===e);if(i)return i.config||{}}return {}}_resetLayersToInitialState(){for(let e of this._currentSceneLayers)this._destroyLayer(e),this._layerStates.set(e.id,"created"),this._mountLayer(e);}_destroyAllLayers(){for(let e of this._layers)this._destroyLayer(e);this._layers=[],this._currentSceneLayers=[],this._layerStates.clear();}};var Ie,ze,De,$e,Fe,ke,Oe,Qe,Ne,He,qe,Ve,Be,Ue,We,Ye,je,Ge,Ke,Xe,Ze,Je,et,tt,it,nt,p;nt=[core.Component({selector:"cinematic-player",template:`
338
+ `;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}),n=>{n.active=false,n.life=0,n.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 n=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 r=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"?r+=this.renderParticleLayer(a,i):a.type==="nebulaNoise"&&(r+=this.renderNoiseLayer(a,i)),this.ctx.restore();this.ctx.restore(),this.performanceMetrics.drawCalls=r,this.performanceMetrics.activeLayers=s.length,this.performanceMetrics.frameTime=performance.now()-n;}renderParticleLayer(t,i){let r=t.config||{},{count:s=100,color:a="#ffffff",size:o=2,speed:d=1,opacity:h=.8,type:c="circle"}=r,m=H[i.quality]||H.medium,v=Math.min(s,m.particleCount);for(;this.activeParticles.length<v;){let g=this.particlePool.get();this.initializeParticle(g,i.viewport),g.color=a,g.size=o,g.active=true,this.activeParticles.push(g);}for(;this.activeParticles.length>v;){let g=this.activeParticles.pop();g&&this.particlePool.release(g);}let f=0;for(let g=this.activeParticles.length-1;g>=0;g--){let y=this.activeParticles[g];if(!y||!y.active){this.activeParticles.splice(g,1),y&&this.particlePool.release(y);continue}y.x+=y.vx*d*i.deltaMs/16.67,y.y+=y.vy*d*i.deltaMs/16.67,y.rotation+=y.rotationSpeed*i.deltaMs/16.67,y.life+=i.deltaMs,(y.x<-y.size||y.x>i.viewport.width+y.size||y.y<-y.size||y.y>i.viewport.height+y.size||y.life>=y.maxLife)&&(this.initializeParticle(y,i.viewport),y.color=a,y.size=o),this.ctx.save(),this.ctx.globalAlpha=y.opacity*h,this.ctx.fillStyle=y.color,c==="circle"?(this.ctx.beginPath(),this.ctx.arc(y.x,y.y,y.size,0,Math.PI*2),this.ctx.fill()):c==="star"&&this.drawStar(y.x,y.y,y.size,y.rotation),this.ctx.restore(),f++;}return this.performanceMetrics.activeParticles=this.activeParticles.length,f}renderNoiseLayer(t,i){let r=t.config||{},{intensity:s=.5,scale:a=1,opacity:o=.3,animated:d=true,speed:h=.01}=r,m=(H[i.quality]||H.medium).canvasResolution,v=Math.floor(i.viewport.width*m),f=Math.floor(i.viewport.height*m),g=this.ctx.createImageData(v,f),y=g.data,S=d?i.timeMs*h:0;for(let T=0;T<f;T++)for(let _=0;_<v;_++){let x=(T*v+_)*4,M=this.simpleNoise(_*a+S,T*a+S)*s,I=Math.floor(M*255);y[x]=I,y[x+1]=I,y[x+2]=I,y[x+3]=Math.floor(o*255);}return this.ctx.save(),this.ctx.putImageData(g,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,n,r){let a=n,o=n*.4;this.ctx.save(),this.ctx.translate(t,i),this.ctx.rotate(r),this.ctx.beginPath();for(let d=0;d<10;d++){let h=d*Math.PI/5,c=d%2===0?a:o,m=Math.cos(h)*c,v=Math.sin(h)*c;d===0?this.ctx.moveTo(m,v):this.ctx.lineTo(m,v);}this.ctx.closePath(),this.ctx.fill(),this.ctx.restore();}simpleNoise(t,i){let n=Math.sin(t*12.9898+i*78.233)*43758.5453;return n-Math.floor(n)}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 n=document.createElement("canvas");n.width=Math.floor(t*this.devicePixelRatio),n.height=Math.floor(i*this.devicePixelRatio),n.style.width=t+"px",n.style.height=i+"px";let r=n.getContext("2d");return r&&(r.scale(this.devicePixelRatio,this.devicePixelRatio),r.imageSmoothingEnabled=true,r.imageSmoothingQuality="high"),n}};var Me=(s=>(s.IDLE="idle",s.READY="ready",s.PLAYING="playing",s.PAUSED="paused",s.STOPPED="stopped",s.DESTROYED="destroyed",s))(Me||{});var le=class{constructor(e){this.currentState=e,this.transitions=new Map,this.listeners=new Set,this.sceneStates=new Map,this.activeSceneId=null,this._registerDefaultTransitions();}_registerDefaultTransitions(){this.registerTransition({from:"idle",to:"ready"}),this.registerTransition({from:"ready",to:"playing"}),this.registerTransition({from:"playing",to:"paused"}),this.registerTransition({from:"playing",to:"stopped"}),this.registerTransition({from:"paused",to:"playing"}),this.registerTransition({from:"paused",to:"stopped"}),this.registerTransition({from:"stopped",to:"playing"});for(let e of Object.values(Me))e!=="destroyed"&&this.registerTransition({from:e,to:"destroyed"});this.registerTransition({from:"created",to:"mounted"}),this.registerTransition({from:"mounted",to:"active"}),this.registerTransition({from:"active",to:"exiting"}),this.registerTransition({from:"exiting",to:"unmounted"}),this.registerTransition({from:"unmounted",to:"created"});}registerTransition(e){let t=this._getTransitionKey(e.from,e.to);this.transitions.set(t,e);}canTransition(e){let t=this._getTransitionKey(this.currentState,e),i=this.transitions.get(t);return i?i.guard?i.guard():true:false}async transition(e){if(!this.canTransition(e))throw new Error(`Invalid state transition: ${this.currentState} -> ${e}. Valid transitions from ${this.currentState}: ${this._getValidTransitions().join(", ")}`);let t=this._getTransitionKey(this.currentState,e),i=this.transitions.get(t),n=this.currentState;i?.action&&await i.action(),this.currentState=e,this._notifyListeners(n,e);}getState(){return this.currentState}addListener(e){this.listeners.add(e);}removeListener(e){this.listeners.delete(e);}_getValidTransitions(){let e=[];for(let[t,i]of this.transitions.entries())i.from===this.currentState&&(!i.guard||i.guard())&&e.push(i.to);return e}_getTransitionKey(e,t){return `${e}->${t}`}_notifyListeners(e,t){for(let i of this.listeners)try{i(e,t);}catch(n){console.error("Error in state change listener:",n);}}setSceneState(e,t){if(t==="active"){if(this.activeSceneId!==null&&this.activeSceneId!==e)throw new Error(`Cannot activate scene "${e}": scene "${this.activeSceneId}" is already active. Only one scene can be active at a time.`);this.activeSceneId=e;}this.activeSceneId===e&&t!=="active"&&(this.activeSceneId=null),this.sceneStates.set(e,t);}getSceneState(e){return this.sceneStates.get(e)}getActiveSceneId(){return this.activeSceneId}isSceneActive(e){return this.activeSceneId===e}getAllSceneStates(){return new Map(this.sceneStates)}};var ue=class ue{constructor(){this.activeTransition=null;this.transitionHandlers=new Map;this.cancelRequested=false;this.registerBuiltInTransitions();}static getDefaultTransition(){return {...ue.DEFAULT_TRANSITION}}async executeTransition(e,t){this.activeTransition&&(this.cancelTransition(),await this.activeTransition);let i=this.transitionHandlers.get(e.type);if(!i)throw new Error(`Unknown transition type: ${e.type}. Available types: ${Array.from(this.transitionHandlers.keys()).join(", ")}`);this.cancelRequested=false,this.activeTransition=i.execute(e,t);try{await this.activeTransition,this.cancelRequested||t.onComplete();}finally{this.activeTransition=null;}}registerTransition(e,t){this.transitionHandlers.set(e,t);}isTransitioning(){return this.activeTransition!==null}cancelTransition(){this.cancelRequested=true;}getAvailableTransitions(){return Array.from(this.transitionHandlers.keys())}registerBuiltInTransitions(){this.registerTransition("crossfade",{execute:async(e,t)=>{await this.executeCrossfade(e,t);}}),this.registerTransition("slide",{execute:async(e,t)=>{await this.executeSlide(e,t);}}),this.registerTransition("zoom",{execute:async(e,t)=>{await this.executeZoom(e,t);}}),this.registerTransition("wipe",{execute:async(e,t)=>{await this.executeWipe(e,t);}}),this.registerTransition("dissolve",{execute:async(e,t)=>{await this.executeDissolve(e,t);}}),this.registerTransition("blur",{execute:async(e,t)=>{await this.executeBlur(e,t);}});}async executeCrossfade(e,t){let i=performance.now(),n=e.duration,r=document.createElement("div"),s=document.createElement("div");return r.style.position="absolute",r.style.top="0",r.style.left="0",r.style.width="100%",r.style.height="100%",r.style.pointerEvents="none",s.style.position="absolute",s.style.top="0",s.style.left="0",s.style.width="100%",s.style.height="100%",s.style.pointerEvents="none",s.style.opacity="0",t.container.appendChild(r),t.container.appendChild(s),new Promise(a=>{let o=()=>{if(this.cancelRequested){r.remove(),s.remove(),a();return}let d=performance.now()-i,h=Math.min(d/n,1),c=this.applyEasing(h,e.easing);t.onProgress(h);let m=1-c,v=c;r.style.opacity=m.toString(),s.style.opacity=v.toString(),h<1?requestAnimationFrame(o):(r.remove(),s.remove(),a());};requestAnimationFrame(o);})}async executeSlide(e,t){let i=performance.now(),n=e.duration,r=e.direction||"left",s=document.createElement("div"),a=document.createElement("div");switch(s.style.position="absolute",s.style.top="0",s.style.left="0",s.style.width="100%",s.style.height="100%",s.style.pointerEvents="none",a.style.position="absolute",a.style.top="0",a.style.left="0",a.style.width="100%",a.style.height="100%",a.style.pointerEvents="none",r){case "left":a.style.transform="translateX(100%)";break;case "right":a.style.transform="translateX(-100%)";break;case "up":a.style.transform="translateY(100%)";break;case "down":a.style.transform="translateY(-100%)";break}return t.container.appendChild(s),t.container.appendChild(a),new Promise(o=>{let d=()=>{if(this.cancelRequested){s.remove(),a.remove(),o();return}let h=performance.now()-i,c=Math.min(h/n,1),m=this.applyEasing(c,e.easing);t.onProgress(c);let v="",f="";switch(r){case "left":v=`translateX(${-m*100}%)`,f=`translateX(${(1-m)*100}%)`;break;case "right":v=`translateX(${m*100}%)`,f=`translateX(${-(1-m)*100}%)`;break;case "up":v=`translateY(${-m*100}%)`,f=`translateY(${(1-m)*100}%)`;break;case "down":v=`translateY(${m*100}%)`,f=`translateY(${-(1-m)*100}%)`;break}s.style.transform=v,a.style.transform=f,c<1?requestAnimationFrame(d):(s.remove(),a.remove(),o());};requestAnimationFrame(d);})}async executeZoom(e,t){let i=performance.now(),n=e.duration,r=document.createElement("div"),s=document.createElement("div");return r.style.position="absolute",r.style.top="0",r.style.left="0",r.style.width="100%",r.style.height="100%",r.style.pointerEvents="none",r.style.transformOrigin="center center",s.style.position="absolute",s.style.top="0",s.style.left="0",s.style.width="100%",s.style.height="100%",s.style.pointerEvents="none",s.style.transformOrigin="center center",s.style.transform="scale(0)",s.style.opacity="0",t.container.appendChild(r),t.container.appendChild(s),new Promise(a=>{let o=()=>{if(this.cancelRequested){r.remove(),s.remove(),a();return}let d=performance.now()-i,h=Math.min(d/n,1),c=this.applyEasing(h,e.easing);t.onProgress(h);let m=1-c,v=c,f=1-c,g=c;r.style.transform=`scale(${m})`,r.style.opacity=f.toString(),s.style.transform=`scale(${v})`,s.style.opacity=g.toString(),h<1?requestAnimationFrame(o):(r.remove(),s.remove(),a());};requestAnimationFrame(o);})}async executeWipe(e,t){let i=performance.now(),n=e.duration,r=e.direction||"left",s=document.createElement("div"),a=document.createElement("div");return s.style.position="absolute",s.style.top="0",s.style.left="0",s.style.width="100%",s.style.height="100%",s.style.pointerEvents="none",a.style.position="absolute",a.style.top="0",a.style.left="0",a.style.width="100%",a.style.height="100%",a.style.pointerEvents="none",t.container.appendChild(s),t.container.appendChild(a),new Promise(o=>{let d=()=>{if(this.cancelRequested){s.remove(),a.remove(),o();return}let h=performance.now()-i,c=Math.min(h/n,1),m=this.applyEasing(c,e.easing);t.onProgress(c);let v="";switch(r){case "left":v=`inset(0 ${(1-m)*100}% 0 0)`;break;case "right":v=`inset(0 0 0 ${(1-m)*100}%)`;break;case "up":v=`inset(0 0 ${(1-m)*100}% 0)`;break;case "down":v=`inset(${(1-m)*100}% 0 0 0)`;break;default:v=`inset(0 ${(1-m)*100}% 0 0)`;}a.style.clipPath=v,c<1?requestAnimationFrame(d):(s.remove(),a.remove(),o());};requestAnimationFrame(d);})}async executeDissolve(e,t){let i=performance.now(),n=e.duration,r=document.createElement("div"),s=document.createElement("div");return r.style.position="absolute",r.style.top="0",r.style.left="0",r.style.width="100%",r.style.height="100%",r.style.pointerEvents="none",s.style.position="absolute",s.style.top="0",s.style.left="0",s.style.width="100%",s.style.height="100%",s.style.pointerEvents="none",s.style.opacity="0",t.container.appendChild(r),t.container.appendChild(s),new Promise(a=>{let o=()=>{if(this.cancelRequested){r.remove(),s.remove(),a();return}let d=performance.now()-i,h=Math.min(d/n,1),c=this.applyEasing(h,e.easing);t.onProgress(h);let m=Math.floor(c*20);m>0&&(r.style.filter=`blur(${m}px) contrast(${1+c})`),r.style.opacity=(1-c).toString(),s.style.opacity=c.toString(),h<1?requestAnimationFrame(o):(r.remove(),s.remove(),a());};requestAnimationFrame(o);})}async executeBlur(e,t){let i=performance.now(),n=e.duration,r=e.blurAmount||10,s=document.createElement("div"),a=document.createElement("div");return s.style.position="absolute",s.style.top="0",s.style.left="0",s.style.width="100%",s.style.height="100%",s.style.pointerEvents="none",a.style.position="absolute",a.style.top="0",a.style.left="0",a.style.width="100%",a.style.height="100%",a.style.pointerEvents="none",a.style.opacity="0",t.container.appendChild(s),t.container.appendChild(a),new Promise(o=>{let d=()=>{if(this.cancelRequested){s.remove(),a.remove(),o();return}let h=performance.now()-i,c=Math.min(h/n,1),m=this.applyEasing(c,e.easing);t.onProgress(c);let v=r*m;s.style.filter=`blur(${v}px)`,s.style.opacity=(1-m*.5).toString(),a.style.opacity=m.toString(),c<1?requestAnimationFrame(d):(s.remove(),a.remove(),o());};requestAnimationFrame(d);})}applyEasing(e,t){switch(t){case "linear":return e;case "ease-in":return e*e;case "ease-out":return e*(2-e);case "ease-in-out":return e<.5?2*e*e:-1+(4-2*e)*e;default:return e}}};ue.DEFAULT_TRANSITION={type:"crossfade",duration:500,easing:"ease-in-out"};var de=ue;var he=class{constructor(e){this.activeScene=null;this.sceneStates=new Map;this.assetManager=e.assetManager,this.layerRegistry=e.layerRegistry,this.container=e.container,this.transitionEngine=new de;}async activateScene(e,t){let i=this.activeScene;i&&t?await this.transitionToScene(i,e,t):(i&&await this.deactivateScene(i),await this.executePhase(e,{name:"prepare",execute:async n=>await this.prepare(n)}),await this.executePhase(e,{name:"mount",execute:async n=>await this.mount(n)}),await this.executePhase(e,{name:"play",execute:async n=>await this.play(n)}),this.activeScene=e);}async transitionToScene(e,t,i){await this.executePhase(t,{name:"prepare",execute:async n=>await this.prepare(n)}),await this.executePhase(t,{name:"mount",execute:async n=>await this.mount(n)}),this.sceneStates.set(e.id,"exiting"),await this.transitionEngine.executeTransition(i,{fromScene:e,toScene:t,container:this.container,onProgress:n=>{},onComplete:()=>{}}),await this.deactivateScene(e),await this.executePhase(t,{name:"play",execute:async n=>await this.play(n)}),this.activeScene=t;}getTransitionEngine(){return this.transitionEngine}async executePhase(e,t){try{await t.execute(e);}catch(i){throw new Error(`Failed to execute ${t.name} phase for scene ${e.id}: ${i}`)}}getActiveScene(){return this.activeScene}getSceneState(e){return this.sceneStates.get(e)||"created"}async deactivateScene(e){this.activeScene?.id===e.id&&(await this.executePhase(e,{name:"unmount",execute:async t=>await this.unmount(t)}),await this.executePhase(e,{name:"destroy",execute:async t=>await this.destroy(t)}),this.activeScene=null);}async prepare(e){let t=[];for(let i of e.layers)i.initialConfig.assetId&&t.push(i.initialConfig.assetId),i.initialConfig.src&&t.push(i.initialConfig.src);for(let i of e.audioTracks)i.asset&&t.push(i.asset.id);if(t.length>0)for(let i of t)this.assetManager.isAssetLoaded(i);this.sceneStates.set(e.id,"created");}async mount(e){for(let t of e.layers){if(!t.instance){let n=this.layerRegistry.createLayer(t.type,t.id,t.initialConfig);t.instance=n;}let i=t.instance;i&&typeof i.mount=="function"&&i.mount({container:this.container,renderer:null,assetManager:this.assetManager,layerConfig:t.initialConfig});}this.sceneStates.set(e.id,"mounted");}async play(e){for(let t of e.layers)t.instance&&(t.active=true);this.sceneStates.set(e.id,"active");}async unmount(e){for(let t of e.layers)t.instance&&typeof t.instance.destroy=="function"&&t.instance.destroy(),t.active=false;this.sceneStates.set(e.id,"unmounted");}async destroy(e){for(let t of e.layers)t.instance&&(typeof t.instance.destroy=="function"&&t.instance.destroy(),t.instance=null),t.animations=[];e.audioTracks=[],this.sceneStates.delete(e.id);}ensureSingleActiveScene(){let e=0;for(let[t,i]of this.sceneStates.entries())if(i==="active"&&(e++,e>1))throw new Error("Multiple scenes in ACTIVE state detected. Only one scene can be active at a time.")}};var me=class{constructor(e={}){this._assets=new Map;this._eventListeners=new Map;this._loadingQueue=[];this._activeLoads=new Set;this._cacheSize=0;this._loadStartTime=0;this._loadedBytes=0;this._config={maxConcurrentLoads:e.maxConcurrentLoads||6,defaultTimeout:e.defaultTimeout||3e4,defaultRetries:e.defaultRetries||3,baseUrl:e.baseUrl||"",cache:{maxSize:e.cache?.maxSize||100*1024*1024,defaultDuration:e.cache?.defaultDuration||1440*60*1e3,storageType:e.cache?.storageType||"memory",compress:e.cache?.compress||false,evictionStrategy:e.cache?.evictionStrategy||"lru"}};}async loadAssets(e){if(e.length===0)return [];this._loadStartTime=performance.now(),this._loadedBytes=0;let t=this._sortByPriority(e);t.map(a=>this._createAsset(a)).forEach(a=>this._assets.set(a.id,a)),this._loadingQueue=[...t];let n=[];for(;this._loadingQueue.length>0||this._activeLoads.size>0;){for(;this._loadingQueue.length>0&&this._activeLoads.size<this._config.maxConcurrentLoads;){let a=this._loadingQueue.shift(),o=this._assets.get(a.id);this._activeLoads.add(a.id);let d=this._loadSingleAsset(o,a);n.push(d),d.finally(()=>{this._activeLoads.delete(a.id);});}if(this._activeLoads.size>0){let a=n.filter(o=>o&&!this._isPromiseSettled(o));a.length>0&&await Promise.race(a);}this._emitProgress();}let s=(await Promise.allSettled(n)).filter(a=>a.status==="fulfilled").map(a=>a.value);return this._emit("complete",s),s}getAsset(e){return this._assets.get(e)||null}isAssetLoaded(e){let t=this._assets.get(e);return t?t.loaded&&!t.error:false}getAllAssets(){return Array.from(this._assets.values())}getAssetsByType(e){return Array.from(this._assets.values()).filter(t=>t.type===e)}async preloadAsset(e){let t=this._createAsset(e);return this._assets.set(t.id,t),this._loadSingleAsset(t,e)}clearCache(){this._assets.clear(),this._cacheSize=0;}removeAsset(e){let t=this._assets.get(e);return t?(this._cacheSize-=t.size||0,this._assets.delete(e),true):false}getCacheStats(){return {totalAssets:this._assets.size,cacheSize:this._cacheSize,maxCacheSize:this._config.cache.maxSize,cacheUtilization:this._cacheSize/this._config.cache.maxSize}}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 n=i.indexOf(t);n>-1&&i.splice(n,1);}}_createAsset(e){return {id:e.id,type:e.type,src:this._resolveUrl(e.src),data:null,loaded:false,error:null,fallback:e.fallback,progress:0,metadata:this._createDefaultMetadata(e)}}_createDefaultMetadata(e){return {...{size:0,mimeType:this._getMimeType(e.type),cacheDuration:this._config.cache.defaultDuration,priority:e.metadata?.priority||"normal"},...e.metadata}}_resolveUrl(e){return e.startsWith("http")||e.startsWith("data:")||e.startsWith("blob:")?e:this._config.baseUrl+e}_getMimeType(e){return {image:"image/*",video:"video/*",audio:"audio/*",font:"font/*",json:"application/json",binary:"application/octet-stream",text:"text/plain"}[e]}_sortByPriority(e){let t={critical:0,high:1,normal:2,low:3,lazy:4};return [...e].sort((i,n)=>{let r=i.metadata?.priority||"normal",s=n.metadata?.priority||"normal";return t[r]-t[s]})}async _loadSingleAsset(e,t){let i={timeout:this._config.defaultTimeout,retries:this._config.defaultRetries,useCache:true},n=null;for(let r=0;r<=i.retries;r++)try{return await this._loadAssetData(e,i),e.loaded=!0,e.progress=1,e.size&&(this._cacheSize+=e.size,this._loadedBytes+=e.size),this._enforceCache(),this._emit("asset-loaded",e),e}catch(s){n=s,r<i.retries&&await new Promise(a=>setTimeout(a,Math.pow(2,r)*1e3));}if(t.fallback)try{let r={...e,src:this._resolveUrl(t.fallback)};return await this._loadAssetData(r,i),e.data=r.data,e.loaded=!0,e.progress=1,this._emit("asset-loaded",e),e}catch(r){n=r;}return e.error=n,e.progress=0,this._emit("asset-error",e.id,n),e}async _loadAssetData(e,t){switch(e.type){case "image":e.data=await this._loadImage(e.src,t);break;case "video":e.data=await this._loadVideo(e.src,t);break;case "audio":e.data=await this._loadAudio(e.src,t);break;case "font":e.data=await this._loadFont(e.src,t);break;case "json":e.data=await this._loadJson(e.src,t);break;case "text":e.data=await this._loadText(e.src,t);break;case "binary":e.data=await this._loadBinary(e.src,t);break;default:throw new Error(`Unsupported asset type: ${e.type}`)}if(!e.size&&e.data){let i=this._estimateAssetSize(e.data);e.size=i;}}async _loadImage(e,t){return new Promise((i,n)=>{let r=new Image,s=setTimeout(()=>{n(new Error(`Image load timeout: ${e}`));},t.timeout);r.onload=()=>{clearTimeout(s),i(r);},r.onerror=()=>{clearTimeout(s),n(new Error(`Failed to load image: ${e}`));},t.mode==="cors"&&(r.crossOrigin="anonymous"),r.src=e;})}async _loadVideo(e,t){return new Promise((i,n)=>{let r=document.createElement("video"),s=setTimeout(()=>{n(new Error(`Video load timeout: ${e}`));},t.timeout);r.oncanplaythrough=()=>{clearTimeout(s),i(r);},r.onerror=()=>{clearTimeout(s),n(new Error(`Failed to load video: ${e}`));},t.mode==="cors"&&(r.crossOrigin="anonymous"),r.preload="auto",r.src=e,r.load();})}async _loadAudio(e,t){return new Promise((i,n)=>{let r=new Audio,s=setTimeout(()=>{n(new Error(`Audio load timeout: ${e}`));},t.timeout);r.oncanplaythrough=()=>{clearTimeout(s),i(r);},r.onerror=()=>{clearTimeout(s),n(new Error(`Failed to load audio: ${e}`));},t.mode==="cors"&&(r.crossOrigin="anonymous"),r.preload="auto",r.src=e,r.load();})}async _loadFont(e,t){let n=await(await this._fetchWithTimeout(e,t)).arrayBuffer(),r=e.split("/").pop()?.split(".")[0]||"CustomFont",s=new FontFace(r,n);return await s.load(),typeof document<"u"&&document.fonts&&document.fonts.add(s),s}async _loadJson(e,t){return (await this._fetchWithTimeout(e,t)).json()}async _loadText(e,t){return (await this._fetchWithTimeout(e,t)).text()}async _loadBinary(e,t){return (await this._fetchWithTimeout(e,t)).arrayBuffer()}async _fetchWithTimeout(e,t){let i=new AbortController,n=setTimeout(()=>i.abort(),t.timeout);try{let r=await fetch(e,{signal:i.signal,mode:t.mode,credentials:t.credentials,headers:t.headers});if(!r.ok)throw new Error(`HTTP ${r.status}: ${r.statusText}`);return r}finally{clearTimeout(n);}}_estimateAssetSize(e){return e instanceof HTMLImageElement?e.width*e.height*4:e instanceof ArrayBuffer?e.byteLength:typeof e=="string"?e.length*2:e instanceof HTMLVideoElement||e instanceof HTMLAudioElement?1024*1024:0}_enforceCache(){if(this._cacheSize<=this._config.cache.maxSize)return;this._emit("cache-full",this._cacheSize);let e=Array.from(this._assets.values());switch(this._config.cache.evictionStrategy){case "lru":e.sort((t,i)=>(t.cachedAt||0)-(i.cachedAt||0));break;case "lfu":e.sort((t,i)=>(t.cachedAt||0)-(i.cachedAt||0));break;case "fifo":e.sort((t,i)=>(t.cachedAt||0)-(i.cachedAt||0));break}for(;this._cacheSize>this._config.cache.maxSize*.8&&e.length>0;){let t=e.shift();t&&this.removeAsset(t.id);}}_emitProgress(){let e=this._assets.size,t=Array.from(this._assets.values()).filter(s=>s.loaded||s.error).length,i=Array.from(this._assets.values()).find(s=>!s.loaded&&!s.error)?.id,n={loaded:t,total:e,currentAsset:i,percentage:e>0?t/e*100:0},r=performance.now()-this._loadStartTime;if(r>0&&this._loadedBytes>0){n.speed=this._loadedBytes/(r/1e3);let s=e-t;if(s>0&&n.speed>0){let a=this._loadedBytes/t,o=s*a;n.estimatedTimeRemaining=o/n.speed*1e3;}}this._emit("progress",n);}_emit(e,...t){let i=this._eventListeners.get(e);i&&i.forEach(n=>{try{n(...t);}catch(r){console.error(`Error in asset manager event listener for "${e}":`,r);}});}_isPromiseSettled(e){return false}};var pe=class{constructor(e){this.container=e,this.state={x:0,y:0,zoom:1,rotate:0},this.animations=[],this.easingFunctions=this.initializeEasingFunctions(),this.applyTransform();}initializeEasingFunctions(){let e=new Map;return e.set("linear",t=>t),e.set("ease",t=>t<.5?4*t*t*t:1-Math.pow(-2*t+2,3)/2),e.set("ease-in",t=>t*t*t),e.set("ease-out",t=>1-Math.pow(1-t,3)),e.set("ease-in-out",t=>t<.5?4*t*t*t:1-Math.pow(-2*t+2,3)/2),e.set("ease-in-sine",t=>1-Math.cos(t*Math.PI/2)),e.set("ease-out-sine",t=>Math.sin(t*Math.PI/2)),e.set("ease-in-out-sine",t=>-(Math.cos(Math.PI*t)-1)/2),e}setState(e){this.state={...this.state,...e},this.applyTransform();}getState(){return {...this.state}}addAnimation(e){this.animations.push(e);}clearAnimations(){this.animations=[];}update(e){let t={},i=false;for(let n of this.animations)if(e>=n.startMs&&e<=n.endMs){let r=n.endMs-n.startMs,s=e-n.startMs,a=r>0?s/r:1,d=(this.easingFunctions.get(n.easing)||(c=>c))(a),h=n.from+(n.to-n.from)*d;t[n.property]=h,i=true;}i&&this.setState(t);}applyTransform(){let{x:e,y:t,zoom:i,rotate:n}=this.state,r=`translate(${-e}px, ${-t}px) scale(${i}) rotate(${n}deg)`;this.container.style.transform=r,this.container.style.transformOrigin="center center";}reset(){this.state={x:0,y:0,zoom:1,rotate:0},this.animations=[],this.applyTransform();}getTransformMatrix(){let{x:e,y:t,zoom:i,rotate:n}=this.state;if(typeof DOMMatrix>"u"){let s=n*Math.PI/180,a=Math.cos(s),o=Math.sin(s);return {a:i*a,b:i*o,c:-i*o,d:i*a,e:-e*i,f:-t*i}}return new DOMMatrix().translate(-e,-t).scale(i,i).rotate(0,0,n)}hasActiveAnimations(e){return this.animations.some(t=>e>=t.startMs&&e<=t.endMs)}getAnimations(){return [...this.animations]}};var fe=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._editorMode=null;this._domRenderer=null;this._canvas2DRenderer=null;this._sceneLifecycleManager=null;this._cameraSystem=null;this._layers=[];this._currentSceneLayers=[];this._layerStates=new Map;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);if(this._container=e.container,this._spec=t,this._compiledSpec=i,this._options=e,this._quality=e.quality||this._spec.engine.quality||"auto",this._stateMachine=new le("idle"),this._stateMachine.addListener((n,r)=>{this.emit("state-change",{from:n,to:r});}),this._scheduler=new B({targetFps:this._spec.engine.targetFps||60,enableAdaptiveQuality:this._quality==="auto"}),this._qualitySystem=new q({respectUserPreferences:true,useDeviceDetection:true}),this._layerRegistry=ae.getInstance(),this._assetManager=new me({maxConcurrentLoads:6,defaultTimeout:3e4,defaultRetries:3,baseUrl:""}),this._audioSystem=new V({preferWebAudio:true,masterVolume:1,maxConcurrentTracks:8,defaultFadeDuration:1e3}),this._qualitySystem.setQuality(this._quality),this._scheduler.addQualityChangeCallback(n=>{this._qualitySystem.updatePerformanceMetrics(n);}),this._qualitySystem.addEventListener(n=>{n.type==="quality-change"&&(this._quality=n.newQuality,this.emit("qualityChange",{previousQuality:n.previousQuality,currentQuality:n.newQuality,metrics:n.metrics}));}),this._scheduler.addFrameCallback(n=>{this._onFrame(n);}),this._audioSystem.on("track-error",(n,r)=>{this.emit("audioError",{trackId:n,error:r});}),this._audioSystem.on("autoplay-blocked",n=>{this.emit("autoplayBlocked",{trackId:n});}),this._calculateDuration(),this._setupResizeObserver(),this._options.debug&&(this._debugOverlay=new k(this,this._container,{position:"top-right",showPerformanceGraph:true})),this._options.editorMode){let n=typeof this._options.editorMode=="boolean"?{enabled:true,autoEnableWithDebug:true}:{enabled:true,...this._options.editorMode};this._editorMode=new U(this,this._container,n);}}async mount(){if(this._stateMachine.getState()==="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._cameraSystem=new pe(this._container),this._sceneLifecycleManager=new he({assetManager:this._assetManager,layerRegistry:this._layerRegistry,container:this._container}),this._initializeLayers(),await this._audioSystem.initialize(),this._setupResizeListener(),this._debugOverlay&&this._debugOverlay.show(),this._mounted=!0,await this._stateMachine.transition("ready"),this._setState("ready"),this.emit("ready"),this._options.autoplay&&this.play();}catch(e){throw this._setState("idle"),await this._stateMachine.transition("idle").catch(()=>{}),this.emit("error",e),e}}play(){if(this._stateMachine.getState()==="destroyed")throw new Error("Cannot play destroyed renderer");if(!this._mounted)throw new Error("Must mount renderer before playing");let e=this._stateMachine.getState();if(e==="playing")return;if(!this._stateMachine.canTransition("playing"))throw new Error(`Cannot play from state: ${e}`);let t=this._state;this._stateMachine.transition("playing").catch(i=>{console.error("State transition error:",i);}),this._setState("playing"),this._scheduler.start(),this._audioSystem.play(),this._updateCurrentSceneLayers(),this.emit("play",{previousState:t,currentTime:this._currentTime});}pause(){if(this._stateMachine.getState()!=="playing")return;let t=this._state;this._stateMachine.transition("paused").catch(i=>{console.error("State transition error:",i);}),this._setState("paused"),this._scheduler.stop(),this._audioSystem.pause(),this.emit("pause",{previousState:t,currentTime:this._currentTime});}stop(){let e=this._stateMachine.getState();if(e==="destroyed"||e==="idle"||e==="stopped")return;let t=this._state;this._stateMachine.transition("stopped").catch(i=>{console.error("State transition error:",i);}),this._setState("stopped"),this._scheduler.stop(),this._audioSystem.stop(),this._currentTime=0,this._currentEventId=null,this._currentSceneId=null,this._resetLayersToInitialState(),this.emit("stop",{previousState:t});}destroy(){if(this._stateMachine.getState()==="destroyed")return;let t=this._state;if(this.stop(),this._stateMachine.transition("destroyed").catch(i=>{console.error("State transition error:",i);}),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._sceneLifecycleManager){let i=this._sceneLifecycleManager.getActiveScene();i&&this._sceneLifecycleManager.deactivateScene(i).catch(n=>{console.error("Error deactivating scene during destroy:",n);}),this._sceneLifecycleManager=null;}this._cameraSystem&&(this._cameraSystem.reset(),this._cameraSystem=null),this._debugOverlay&&(this._debugOverlay.destroy(),this._debugOverlay=null),this._editorMode&&(this._editorMode.destroy(),this._editorMode=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:t});}seek(e){if(this._stateMachine.getState()==="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._stateMachine.getState()==="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(n=>n.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._stateMachine.getState()==="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(n=>n.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._stateMachine.getState()!=="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 n=i.indexOf(t);n>-1&&i.splice(n,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()}getCameraState(){if(!this._cameraSystem)throw new Error("Camera system not initialized. Call mount() first.");return this._cameraSystem.getState()}setCameraState(e){if(!this._cameraSystem)throw new Error("Camera system not initialized. Call mount() first.");this._cameraSystem.setState(e);}addCameraAnimation(e){if(!this._cameraSystem)throw new Error("Camera system not initialized. Call mount() first.");this._cameraSystem.addAnimation(e);}resetCamera(){if(!this._cameraSystem)throw new Error("Camera system not initialized. Call mount() first.");this._cameraSystem.reset();}getCameraTransformMatrix(){if(!this._cameraSystem)throw new Error("Camera system not initialized. Call mount() first.");return this._cameraSystem.getTransformMatrix()}isDebugEnabled(){return this._debugOverlay!==null}toggleDebug(){this._debugOverlay&&(this._debugOverlay.toggle(),this.emit("debugModeChanged",this._debugOverlay!==null));}showDebug(){this._debugOverlay&&(this._debugOverlay.show(),this.emit("debugModeChanged",true));}hideDebug(){this._debugOverlay&&(this._debugOverlay.hide(),this.emit("debugModeChanged",false));}isEditorModeEnabled(){return this._editorMode!==null}toggleEditorMode(){this._editorMode&&this._editorMode.toggle();}showEditorMode(){this._editorMode&&this._editorMode.enable();}hideEditorMode(){this._editorMode&&this._editorMode.disable();}getEditorMode(){return this._editorMode}getSceneLifecycleManager(){return this._sceneLifecycleManager}emit(e,...t){let i=this.eventListeners.get(e);i&&i.forEach(n=>{try{n(...t);}catch(r){console.error(`Error in event listener for "${e}":`,r);}});}_onFrame(e){if(this._stateMachine.getState()==="playing"){if(this._currentTime+=e.deltaMs,this._currentTime>=this._duration){this._currentTime=this._duration,this.stop(),this.emit("ended");return}this._updateCurrentEventAndScene(),this._cameraSystem&&this._cameraSystem.update(this._currentTime),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 n of t.scenes){let r=this._spec.scenes.find(s=>s.id===n);r&&(i+=r.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 n of i.scenes){let r=this._spec.scenes.find(s=>s.id===n);r&&(t+=r.duration);}}return 0}_calculateSceneStartTime(e){let t=0;for(let i of this._spec.events){let n=0;for(let r of i.scenes){if(r===e)return t+n;let s=this._spec.scenes.find(a=>a.id===r);s&&(n+=s.duration);}t+=n;}return 0}_updateCurrentEventAndScene(){let e=0;for(let t of this._spec.events){let i=e,n=0;for(let r of t.scenes){let s=this._spec.scenes.find(a=>a.id===r);if(s){let a=i+n,o=a+s.duration;if(this._currentTime>=a&&this._currentTime<o){this._currentEventId=t.id,this._currentSceneId=s.id;return}n+=s.duration;}}e+=n;}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:n}=t.contentRect;this.resize(i,n);}}),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 oe(this._container),this._domRenderer.initialize(),this._canvas2DRenderer=new ce(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),this._layerStates.set(i.id,"created");}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(n=>e.layers.some(r=>r.id===n.id));if(t.length!==this._currentSceneLayers.length||t.some(n=>!this._currentSceneLayers.includes(n))){let n=this._currentSceneLayers.filter(r=>!t.includes(r));for(let r of n)this._destroyLayer(r);for(let r of t)this._currentSceneLayers.includes(r)||this._mountLayer(r);this._currentSceneLayers=t,this.emit("sceneLayersChanged",{destroyed:n.length,mounted:t.filter(r=>!this._currentSceneLayers.includes(r)).length,active:this._currentSceneLayers.length});}}_mountLayer(e){try{let t=this._layerStates.get(e.id);if(t==="mounted"||t==="active"){console.warn(`Layer ${e.id} is already mounted, skipping mount`);return}if(t==="destroyed"){console.error(`Cannot mount destroyed layer ${e.id}`);return}let i=this._layerRegistry.getBuiltInTypes(),n=this._domRenderer;if(i.canvas2d.includes(e.type)&&(n=this._canvas2DRenderer),!n){console.error(`No suitable renderer found for layer type: ${e.type}`);return}let r={container:this._container,renderer:n,assetManager:null,layerConfig:this._getLayerConfig(e.id)};e.mount(r),this._layerStates.set(e.id,"mounted");}catch(t){console.error(`Failed to mount layer ${e.id}:`,t);}}_destroyLayer(e){try{if(this._layerStates.get(e.id)==="destroyed")return;e.destroy(),this._layerStates.set(e.id,"destroyed"),this._options.debug&&console.log(`Layer ${e.id} destroyed`);}catch(t){console.error(`Error destroying 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(n=>this._layerRegistry.getBuiltInTypes().dom.includes(n.type));i.length>0&&this._domRenderer.render(i,t);}if(this._canvas2DRenderer&&this._currentSceneLayers.length>0){let i=this._currentSceneLayers.filter(n=>this._layerRegistry.getBuiltInTypes().canvas2d.includes(n.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(n=>n.id===e);if(i)return i.config||{}}return {}}_resetLayersToInitialState(){for(let e of this._currentSceneLayers)this._destroyLayer(e),this._layerStates.set(e.id,"created"),this._mountLayer(e);}_destroyAllLayers(){for(let e of this._layers)this._destroyLayer(e);this._layers=[],this._currentSceneLayers=[],this._layerStates.clear();}};var De,ze,ke,$e,Fe,Oe,Ne,Qe,He,Be,qe,Ve,Ue,We,je,Ye,Ge,Ke,Xe,Ze,Je,et,tt,it,nt,rt,p;rt=[core.Component({selector:"cinematic-player",template:`
211
339
  <div
212
340
  #container
213
341
  [class]="containerClass"
214
342
  [ngStyle]="containerStyle"
215
343
  style="width: 100%; height: 100%; position: relative; overflow: hidden;">
216
344
  </div>
217
- `,changeDetection:core.ChangeDetectionStrategy.OnPush})],it=[core.ViewChild("container",{static:true})],tt=[core.Input()],et=[core.Input()],Je=[core.Input()],Ze=[core.Input()],Xe=[core.Input()],Ke=[core.Input()],Ge=[core.Input()],je=[core.Output()],Ye=[core.Output()],We=[core.Output()],Ue=[core.Output()],Be=[core.Output()],Ve=[core.Output()],qe=[core.Output()],He=[core.Output()],Ne=[core.Output()],Qe=[core.Output()],Oe=[core.Output()],ke=[core.Output()],Fe=[core.Output()],$e=[core.Output()],De=[core.Output()],ze=[core.Output()],Ie=[core.Output()];exports.CinematicPlayerComponent=class T{constructor(e){this.ngZone=e;this.containerRef=b(p,8,this),b(p,11,this);this.spec=b(p,12,this),b(p,15,this);this.autoplay=b(p,16,this,false),b(p,19,this);this.quality=b(p,20,this),b(p,23,this);this.debug=b(p,24,this,false),b(p,27,this);this.editorMode=b(p,28,this,false),b(p,31,this);this.containerClass=b(p,32,this),b(p,35,this);this.containerStyle=b(p,36,this),b(p,39,this);this.ready=b(p,40,this,new core.EventEmitter),b(p,43,this);this.play=b(p,44,this,new core.EventEmitter),b(p,47,this);this.pause=b(p,48,this,new core.EventEmitter),b(p,51,this);this.stop=b(p,52,this,new core.EventEmitter),b(p,55,this);this.seek=b(p,56,this,new core.EventEmitter),b(p,59,this);this.eventChange=b(p,60,this,new core.EventEmitter),b(p,63,this);this.sceneChange=b(p,64,this,new core.EventEmitter),b(p,67,this);this.qualityChange=b(p,68,this,new core.EventEmitter),b(p,71,this);this.resize=b(p,72,this,new core.EventEmitter),b(p,75,this);this.frame=b(p,76,this,new core.EventEmitter),b(p,79,this);this.stateChange=b(p,80,this,new core.EventEmitter),b(p,83,this);this.ended=b(p,84,this,new core.EventEmitter),b(p,87,this);this.error=b(p,88,this,new core.EventEmitter),b(p,91,this);this.loading=b(p,92,this,new core.EventEmitter),b(p,95,this);this.destroy=b(p,96,this,new core.EventEmitter),b(p,99,this);this.audioError=b(p,100,this,new core.EventEmitter),b(p,103,this);this.autoplayBlocked=b(p,104,this,new core.EventEmitter),b(p,107,this);this.engine=null;this.initialized=false;}ngOnInit(){if(!this.spec)throw new Error("CinematicPlayerComponent: spec input is required");this.initializeEngine();}ngOnChanges(e){this.initialized&&(e.spec&&!e.spec.firstChange&&(this.destroyEngine(),this.initializeEngine()),e.quality&&!e.quality.firstChange&&this.engine&&this.engine.setQuality(this.quality||"auto"));}ngOnDestroy(){this.destroyEngine();}playEngine(){this.engine?.play();}pauseEngine(){this.engine?.pause();}stopEngine(){this.engine?.stop();}seekEngine(e){this.engine?.seek(e);}goToEvent(e){this.engine?.goToEvent(e);}goToScene(e){this.engine?.goToScene(e);}setQuality(e){this.engine?.setQuality(e);}resizeEngine(e,t){this.engine?.resize(e,t);}getCurrentTime(){return this.engine?.getCurrentTime()??0}getDuration(){return this.engine?.getDuration()??0}isPlaying(){return this.engine?.isPlaying()??false}isPaused(){return this.engine?.isPaused()??false}getCurrentEvent(){return this.engine?.getCurrentEvent()??null}getCurrentScene(){return this.engine?.getCurrentScene()??null}getState(){return this.engine?.getState()??"idle"}getQuality(){return this.engine?.getQuality()??"auto"}isMounted(){return this.engine?.isMounted()??false}getCurrentFps(){return this.engine?.getCurrentFps()??0}getPerformanceMetrics(){return this.engine?.getPerformanceMetrics()}getQualitySettings(){return this.engine?.getQualitySettings()}getDeviceCapabilities(){return this.engine?.getDeviceCapabilities()}setMasterVolume(e){this.engine?.setMasterVolume(e);}getMasterVolume(){return this.engine?.getMasterVolume()??1}isWebAudioAvailable(){return this.engine?.isWebAudioAvailable()??false}getActiveAudioTrackCount(){return this.engine?.getActiveAudioTrackCount()??0}getEngine(){return this.engine}initializeEngine(){if(!this.containerRef?.nativeElement)throw new Error("Container element not available");try{let e={container:this.containerRef.nativeElement,spec:this.spec,autoplay:this.autoplay,quality:this.quality,debug:this.debug};this.engine=new pe(e),this.setupEventListeners(),this.ngZone.runOutsideAngular(()=>{this.engine.mount().catch(t=>{console.error("Failed to mount CinematicRenderer2D:",t),this.ngZone.run(()=>{this.error.emit(t);});});}),this.initialized=!0;}catch(e){console.error("Failed to initialize CinematicRenderer2D:",e),this.error.emit(e);}}setupEventListeners(){this.engine&&(this.engine.on("ready",()=>{this.ngZone.run(()=>this.ready.emit());}),this.engine.on("play",e=>{this.ngZone.run(()=>this.play.emit(e));}),this.engine.on("pause",e=>{this.ngZone.run(()=>this.pause.emit(e));}),this.engine.on("stop",e=>{this.ngZone.run(()=>this.stop.emit(e));}),this.engine.on("seek",e=>{this.ngZone.run(()=>this.seek.emit(e));}),this.engine.on("eventChange",e=>{this.ngZone.run(()=>this.eventChange.emit(e));}),this.engine.on("sceneChange",e=>{this.ngZone.run(()=>this.sceneChange.emit(e));}),this.engine.on("qualityChange",e=>{this.ngZone.run(()=>this.qualityChange.emit(e));}),this.engine.on("resize",e=>{this.ngZone.run(()=>this.resize.emit(e));}),this.engine.on("frame",e=>{this.ngZone.run(()=>this.frame.emit(e));}),this.engine.on("stateChange",e=>{this.ngZone.run(()=>this.stateChange.emit(e));}),this.engine.on("ended",()=>{this.ngZone.run(()=>this.ended.emit());}),this.engine.on("error",e=>{this.ngZone.run(()=>this.error.emit(e));}),this.engine.on("loading",()=>{this.ngZone.run(()=>this.loading.emit());}),this.engine.on("destroy",e=>{this.ngZone.run(()=>this.destroy.emit(e));}),this.engine.on("audioError",e=>{this.ngZone.run(()=>this.audioError.emit(e));}),this.engine.on("autoplayBlocked",e=>{this.ngZone.run(()=>this.autoplayBlocked.emit(e));}));}destroyEngine(){this.engine&&(this.engine.destroy(),this.engine=null),this.initialized=false;}};p=Pe(),w(p,5,"containerRef",it,exports.CinematicPlayerComponent),w(p,5,"spec",tt,exports.CinematicPlayerComponent),w(p,5,"autoplay",et,exports.CinematicPlayerComponent),w(p,5,"quality",Je,exports.CinematicPlayerComponent),w(p,5,"debug",Ze,exports.CinematicPlayerComponent),w(p,5,"editorMode",Xe,exports.CinematicPlayerComponent),w(p,5,"containerClass",Ke,exports.CinematicPlayerComponent),w(p,5,"containerStyle",Ge,exports.CinematicPlayerComponent),w(p,5,"ready",je,exports.CinematicPlayerComponent),w(p,5,"play",Ye,exports.CinematicPlayerComponent),w(p,5,"pause",We,exports.CinematicPlayerComponent),w(p,5,"stop",Ue,exports.CinematicPlayerComponent),w(p,5,"seek",Be,exports.CinematicPlayerComponent),w(p,5,"eventChange",Ve,exports.CinematicPlayerComponent),w(p,5,"sceneChange",qe,exports.CinematicPlayerComponent),w(p,5,"qualityChange",He,exports.CinematicPlayerComponent),w(p,5,"resize",Ne,exports.CinematicPlayerComponent),w(p,5,"frame",Qe,exports.CinematicPlayerComponent),w(p,5,"stateChange",Oe,exports.CinematicPlayerComponent),w(p,5,"ended",ke,exports.CinematicPlayerComponent),w(p,5,"error",Fe,exports.CinematicPlayerComponent),w(p,5,"loading",$e,exports.CinematicPlayerComponent),w(p,5,"destroy",De,exports.CinematicPlayerComponent),w(p,5,"audioError",ze,exports.CinematicPlayerComponent),w(p,5,"autoplayBlocked",Ie,exports.CinematicPlayerComponent),exports.CinematicPlayerComponent=w(p,0,"CinematicPlayerComponent",nt,exports.CinematicPlayerComponent),b(p,1,exports.CinematicPlayerComponent);//# sourceMappingURL=angular.cjs.map
345
+ `,changeDetection:core.ChangeDetectionStrategy.OnPush})],nt=[core.ViewChild("container",{static:true})],it=[core.Input()],tt=[core.Input()],et=[core.Input()],Je=[core.Input()],Ze=[core.Input()],Xe=[core.Input()],Ke=[core.Input()],Ge=[core.Output()],Ye=[core.Output()],je=[core.Output()],We=[core.Output()],Ue=[core.Output()],Ve=[core.Output()],qe=[core.Output()],Be=[core.Output()],He=[core.Output()],Qe=[core.Output()],Ne=[core.Output()],Oe=[core.Output()],Fe=[core.Output()],$e=[core.Output()],ke=[core.Output()],ze=[core.Output()],De=[core.Output()];exports.CinematicPlayerComponent=class C{constructor(e){this.ngZone=e;this.containerRef=b(p,8,this),b(p,11,this);this.spec=b(p,12,this),b(p,15,this);this.autoplay=b(p,16,this,false),b(p,19,this);this.quality=b(p,20,this),b(p,23,this);this.debug=b(p,24,this,false),b(p,27,this);this.editorMode=b(p,28,this,false),b(p,31,this);this.containerClass=b(p,32,this),b(p,35,this);this.containerStyle=b(p,36,this),b(p,39,this);this.ready=b(p,40,this,new core.EventEmitter),b(p,43,this);this.play=b(p,44,this,new core.EventEmitter),b(p,47,this);this.pause=b(p,48,this,new core.EventEmitter),b(p,51,this);this.stop=b(p,52,this,new core.EventEmitter),b(p,55,this);this.seek=b(p,56,this,new core.EventEmitter),b(p,59,this);this.eventChange=b(p,60,this,new core.EventEmitter),b(p,63,this);this.sceneChange=b(p,64,this,new core.EventEmitter),b(p,67,this);this.qualityChange=b(p,68,this,new core.EventEmitter),b(p,71,this);this.resize=b(p,72,this,new core.EventEmitter),b(p,75,this);this.frame=b(p,76,this,new core.EventEmitter),b(p,79,this);this.stateChange=b(p,80,this,new core.EventEmitter),b(p,83,this);this.ended=b(p,84,this,new core.EventEmitter),b(p,87,this);this.error=b(p,88,this,new core.EventEmitter),b(p,91,this);this.loading=b(p,92,this,new core.EventEmitter),b(p,95,this);this.destroy=b(p,96,this,new core.EventEmitter),b(p,99,this);this.audioError=b(p,100,this,new core.EventEmitter),b(p,103,this);this.autoplayBlocked=b(p,104,this,new core.EventEmitter),b(p,107,this);this.engine=null;this.initialized=false;}ngOnInit(){if(!this.spec)throw new Error("CinematicPlayerComponent: spec input is required");this.initializeEngine();}ngOnChanges(e){this.initialized&&(e.spec&&!e.spec.firstChange&&(this.destroyEngine(),this.initializeEngine()),e.quality&&!e.quality.firstChange&&this.engine&&this.engine.setQuality(this.quality||"auto"));}ngOnDestroy(){this.destroyEngine();}playEngine(){this.engine?.play();}pauseEngine(){this.engine?.pause();}stopEngine(){this.engine?.stop();}seekEngine(e){this.engine?.seek(e);}goToEvent(e){this.engine?.goToEvent(e);}goToScene(e){this.engine?.goToScene(e);}setQuality(e){this.engine?.setQuality(e);}resizeEngine(e,t){this.engine?.resize(e,t);}getCurrentTime(){return this.engine?.getCurrentTime()??0}getDuration(){return this.engine?.getDuration()??0}isPlaying(){return this.engine?.isPlaying()??false}isPaused(){return this.engine?.isPaused()??false}getCurrentEvent(){return this.engine?.getCurrentEvent()??null}getCurrentScene(){return this.engine?.getCurrentScene()??null}getState(){return this.engine?.getState()??"idle"}getQuality(){return this.engine?.getQuality()??"auto"}isMounted(){return this.engine?.isMounted()??false}getCurrentFps(){return this.engine?.getCurrentFps()??0}getPerformanceMetrics(){return this.engine?.getPerformanceMetrics()}getQualitySettings(){return this.engine?.getQualitySettings()}getDeviceCapabilities(){return this.engine?.getDeviceCapabilities()}setMasterVolume(e){this.engine?.setMasterVolume(e);}getMasterVolume(){return this.engine?.getMasterVolume()??1}isWebAudioAvailable(){return this.engine?.isWebAudioAvailable()??false}getActiveAudioTrackCount(){return this.engine?.getActiveAudioTrackCount()??0}isDebugEnabled(){return this.engine?.isDebugEnabled()??false}toggleDebug(){this.engine?.toggleDebug();}showDebug(){this.engine?.showDebug();}hideDebug(){this.engine?.hideDebug();}isEditorModeEnabled(){return this.engine?.isEditorModeEnabled()??false}toggleEditorMode(){this.engine?.toggleEditorMode();}showEditorMode(){this.engine?.showEditorMode();}hideEditorMode(){this.engine?.hideEditorMode();}getEditorMode(){return this.engine?.getEditorMode()??null}getEngine(){return this.engine}initializeEngine(){if(!this.containerRef?.nativeElement)throw new Error("Container element not available");try{let e={container:this.containerRef.nativeElement,spec:this.spec,autoplay:this.autoplay,quality:this.quality,debug:this.debug,editorMode:this.editorMode};this.engine=new fe(e),this.setupEventListeners(),this.ngZone.runOutsideAngular(()=>{this.engine.mount().catch(t=>{console.error("Failed to mount CinematicRenderer2D:",t),this.ngZone.run(()=>{this.error.emit(t);});});}),this.initialized=!0;}catch(e){console.error("Failed to initialize CinematicRenderer2D:",e),this.error.emit(e);}}setupEventListeners(){this.engine&&(this.engine.on("ready",()=>{this.ngZone.run(()=>this.ready.emit());}),this.engine.on("play",e=>{this.ngZone.run(()=>this.play.emit(e));}),this.engine.on("pause",e=>{this.ngZone.run(()=>this.pause.emit(e));}),this.engine.on("stop",e=>{this.ngZone.run(()=>this.stop.emit(e));}),this.engine.on("seek",e=>{this.ngZone.run(()=>this.seek.emit(e));}),this.engine.on("eventChange",e=>{this.ngZone.run(()=>this.eventChange.emit(e));}),this.engine.on("sceneChange",e=>{this.ngZone.run(()=>this.sceneChange.emit(e));}),this.engine.on("qualityChange",e=>{this.ngZone.run(()=>this.qualityChange.emit(e));}),this.engine.on("resize",e=>{this.ngZone.run(()=>this.resize.emit(e));}),this.engine.on("frame",e=>{this.ngZone.run(()=>this.frame.emit(e));}),this.engine.on("stateChange",e=>{this.ngZone.run(()=>this.stateChange.emit(e));}),this.engine.on("ended",()=>{this.ngZone.run(()=>this.ended.emit());}),this.engine.on("error",e=>{this.ngZone.run(()=>this.error.emit(e));}),this.engine.on("loading",()=>{this.ngZone.run(()=>this.loading.emit());}),this.engine.on("destroy",e=>{this.ngZone.run(()=>this.destroy.emit(e));}),this.engine.on("audioError",e=>{this.ngZone.run(()=>this.audioError.emit(e));}),this.engine.on("autoplayBlocked",e=>{this.ngZone.run(()=>this.autoplayBlocked.emit(e));}));}destroyEngine(){this.engine&&(this.engine.destroy(),this.engine=null),this.initialized=false;}};p=Ie(),w(p,5,"containerRef",nt,exports.CinematicPlayerComponent),w(p,5,"spec",it,exports.CinematicPlayerComponent),w(p,5,"autoplay",tt,exports.CinematicPlayerComponent),w(p,5,"quality",et,exports.CinematicPlayerComponent),w(p,5,"debug",Je,exports.CinematicPlayerComponent),w(p,5,"editorMode",Ze,exports.CinematicPlayerComponent),w(p,5,"containerClass",Xe,exports.CinematicPlayerComponent),w(p,5,"containerStyle",Ke,exports.CinematicPlayerComponent),w(p,5,"ready",Ge,exports.CinematicPlayerComponent),w(p,5,"play",Ye,exports.CinematicPlayerComponent),w(p,5,"pause",je,exports.CinematicPlayerComponent),w(p,5,"stop",We,exports.CinematicPlayerComponent),w(p,5,"seek",Ue,exports.CinematicPlayerComponent),w(p,5,"eventChange",Ve,exports.CinematicPlayerComponent),w(p,5,"sceneChange",qe,exports.CinematicPlayerComponent),w(p,5,"qualityChange",Be,exports.CinematicPlayerComponent),w(p,5,"resize",He,exports.CinematicPlayerComponent),w(p,5,"frame",Qe,exports.CinematicPlayerComponent),w(p,5,"stateChange",Ne,exports.CinematicPlayerComponent),w(p,5,"ended",Oe,exports.CinematicPlayerComponent),w(p,5,"error",Fe,exports.CinematicPlayerComponent),w(p,5,"loading",$e,exports.CinematicPlayerComponent),w(p,5,"destroy",ke,exports.CinematicPlayerComponent),w(p,5,"audioError",ze,exports.CinematicPlayerComponent),w(p,5,"autoplayBlocked",De,exports.CinematicPlayerComponent),exports.CinematicPlayerComponent=w(p,0,"CinematicPlayerComponent",rt,exports.CinematicPlayerComponent),b(p,1,exports.CinematicPlayerComponent);//# sourceMappingURL=angular.cjs.map
218
346
  //# sourceMappingURL=angular.cjs.map