cinematic-renderer2d 0.1.0

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