cinematic-renderer2d 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,189 @@
1
+ 'use strict';var core=require('@angular/core'),zod=require('zod');var Ke=Object.create;var ce=Object.defineProperty;var Xe=Object.getOwnPropertyDescriptor;var ye=(c,e)=>(e=Symbol[c])?e:Symbol.for("Symbol."+c),Q=c=>{throw TypeError(c)};var Je=(c,e,t)=>e in c?ce(c,e,{enumerable:true,configurable:true,writable:true,value:t}):c[e]=t;var me=(c,e)=>ce(c,"name",{value:e,configurable:true});var ve=c=>[,,,Ke(null)],ge=["class","method","getter","setter","accessor","field","value","get","set"],D=c=>c!==void 0&&typeof c!="function"?Q("Function expected"):c,et=(c,e,t,i,n)=>({kind:ge[c],name:e,metadata:i,addInitializer:r=>t._?Q("Already initialized"):n.push(D(r||null))}),tt=(c,e)=>Je(e,ye("metadata"),c[3]),y=(c,e,t,i)=>{for(var n=0,r=c[e>>1],s=r&&r.length;n<s;n++)e&1?r[n].call(t):i=r[n].call(t,i);return i},T=(c,e,t,i,n,r)=>{var s,a,u,f,v,h=e&7,g=!!(e&8),b=!!(e&16),p=h>3?c.length+1:h?g?1:2:0,m=ge[h+5],d=h>3&&(c[p-1]=[]),_=c[p]||(c[p]=[]),w=h&&(!b&&!g&&(n=n.prototype),h<5&&(h>3||!b)&&Xe(h<4?n:{get[t](){return pe(this,r)},set[t](x){return fe(this,r,x)}},t));h?b&&h<4&&me(r,(h>2?"set ":h>1?"get ":"")+t):me(n,t);for(var M=i.length-1;M>=0;M--)f=et(h,t,u={},c[3],_),h&&(f.static=g,f.private=b,v=f.access={has:b?x=>it(n,x):x=>t in x},h^3&&(v.get=b?x=>(h^1?pe:nt)(x,n,h^4?r:w.get):x=>x[t]),h>2&&(v.set=b?(x,A)=>fe(x,n,A,h^4?r:w.set):(x,A)=>x[t]=A)),a=(0, i[M])(h?h<4?b?r:w[m]:h>4?void 0:{get:w.get,set:w.set}:n,f),u._=1,h^4||a===void 0?D(a)&&(h>4?d.unshift(a):h?b?r=a:w[m]=a:n=a):typeof a!="object"||a===null?Q("Object expected"):(D(s=a.get)&&(w.get=s),D(s=a.set)&&(w.set=s),D(s=a.init)&&d.unshift(s));return h||tt(c,n),w&&ce(n,t,w),b?h^4?r:w:n};var le=(c,e,t)=>e.has(c)||Q("Cannot "+t),it=(c,e)=>Object(e)!==e?Q('Cannot use the "in" operator on this value'):c.has(e),pe=(c,e,t)=>(le(c,e,"read from private field"),t?t.call(c):e.get(c));var fe=(c,e,t,i)=>(le(c,e,"write to private field"),i?i.call(c,t):e.set(c,t),t),nt=(c,e,t)=>(le(c,e,"access private method"),t);var $=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 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,u=1-s-a,f=3*t,v=3*(n-t)-f,h=1-f-v,g=r;for(let b=0;b<8;b++){let p=((u*g+a)*g+s)*g,m=(3*u*g+2*a)*g+s;if(Math.abs(m)<1e-6)break;g=g-(p-r)/m;}return ((h*g+v)*g+f)*g}}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]),u=n[2],f=a-s;return v=>{let h=i(Math.max(0,Math.min(1,v))),g=s+f*h;return `${Math.round(g*1e6)/1e6}${u}`}}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],u=t[s];a!==void 0&&u!==void 0?n.set(s,this.compileInterpolation(a,u,i)):a!==void 0?n.set(s,()=>a):n.set(s,f=>i(Math.max(0,Math.min(1,f)))<.5?void 0:u);}return s=>{let a={};for(let[u,f]of n){let v=f(s);v!==void 0&&(a[u]=v);}return a}}};var ue=["1.0.0","1.1.0"],rt=zod.z.enum(["low","medium","high","ultra","auto"]),st=zod.z.enum(["gradient","image","textBlock","vignette","glowOrb","noiseOverlay","particles","starfield","dust","nebulaNoise","webgl-custom"]),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+\)$/)),at=zod.z.enum(["voiceover","ambience","transition","music","sfx"]),ot=zod.z.enum(["fade","slide","zoom","wipe","dissolve","blur"]),ct=zod.z.enum(["image","video","audio","font","json","binary"]),lt=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(),ut=zod.z.object({opacity:zod.z.number().min(0).max(1).optional(),visible:zod.z.boolean().optional(),transform:lt}).catchall(zod.z.any()),be=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()]))]),dt=zod.z.object({property:zod.z.string().min(1),from:be,to:be,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)}).refine(c=>c.endMs>c.startMs,{message:"endMs must be greater than startMs",path:["endMs"]}),ht=zod.z.object({id:zod.z.string().min(1),type:at,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)}),mt=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:ot,duration:zod.z.number().min(0),easing:xe.optional().default("ease"),config:mt}),ft=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(),yt=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:ft}),vt=zod.z.object({id:zod.z.string().min(1),type:st,zIndex:zod.z.number(),config:ut,animations:zod.z.array(dt).optional().default([])}),gt=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(vt).min(1),audio:zod.z.array(ht).optional().default([])}),bt=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([])}),xt=zod.z.object({targetFps:zod.z.number().min(1).max(240).optional().default(60),quality:rt.optional().default("auto"),debug:zod.z.boolean().optional().default(false),autoplay:zod.z.boolean().optional().default(false)}),Ct=zod.z.object({schemaVersion:zod.z.string().min(1),engine:xt,events:zod.z.array(bt).min(1),scenes:zod.z.array(gt).min(1),assets:zod.z.array(yt).optional().default([])}).refine(c=>{let e=new Set(c.scenes.map(i=>i.id)),t=new Set(c.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(c=>{let e=c.events.map(n=>n.id),t=c.scenes.map(n=>n.id),i=c.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"]}),O=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: "+ue.join(", "));if(!ue.includes(i))throw new Error(`Unsupported schema version: ${i}. Supported versions: ${ue.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(u=>u.startTime+u.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 Ct.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),u={id:r.id,name:r.name,duration:r.duration,layers:s,audioTracks:a,startTime:n,endTime:n+r.duration};i.set(r.id,u),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=>$.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(h=>{let g=t.get(h);if(!g)throw new Error(`Scene with ID "${h}" not found for event "${s.id}"`);return g}),u=this.compileTransitions(s.transitions||[],i),f=a.reduce((h,g)=>h+g.duration,0),v={id:s.id,name:s.name,scenes:a,transitions:u,duration:f,startTime:r};n.set(s.id,v),r+=f;}return n}static compileTransitions(e,t){return e.map(i=>{let n=$.compileEasing(i.easing||"ease"),r=(a,u,f)=>{};return {type:i.type,duration:i.duration,easingFunction:n,config:i.config||{},execute:r}})}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 q=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 N=class{constructor(e={}){this.currentQuality="auto";this.performanceHistory=[];this.badFrameCount=0;this.goodFrameCount=0;this.lastQualityChange=0;this.eventCallbacks=[];if(this.config={monitoringInterval:e.monitoringInterval||1e3,fpsThreshold:e.fpsThreshold||50,badFrameThreshold:e.badFrameThreshold||5,goodFrameThreshold:e.goodFrameThreshold||30,respectUserPreferences:e.respectUserPreferences!==false,useDeviceDetection:e.useDeviceDetection!==false,customLevels:e.customLevels||{}},this.deviceCapabilities=this.detectDeviceCapabilities(),this.currentQuality="auto",this.currentSettings=this.getQualitySettings("auto"),this.config.useDeviceDetection){let t=this.determineInitialQuality();t!=="auto"&&(this.currentQuality=t,this.currentSettings=this.getQualitySettings(t));}}setQuality(e){if(this.currentQuality===e)return;let t=this.currentQuality;this.currentQuality=e,this.currentSettings=this.getQualitySettings(e),this.lastQualityChange=performance.now(),this.badFrameCount=0,this.goodFrameCount=0,this.emitEvent({type:"quality-change",metrics:this.getLatestMetrics(),previousQuality:t,newQuality:e,timestamp:performance.now()});}getCurrentQuality(){return this.currentQuality}getCurrentSettings(){return {...this.currentSettings}}getDeviceCapabilities(){return {...this.deviceCapabilities}}updatePerformanceMetrics(e){this.performanceHistory.push({...e,timestamp:performance.now()});let t=performance.now()-6e4;this.performanceHistory=this.performanceHistory.filter(i=>i.timestamp>t),this.currentQuality==="auto"&&this.evaluatePerformanceAndAdjust(e),this.checkPerformanceWarnings(e);}addEventListener(e){this.eventCallbacks.push(e);}removeEventListener(e){let t=this.eventCallbacks.indexOf(e);t>-1&&this.eventCallbacks.splice(t,1);}getQualitySettings(e){if(this.config.customLevels[e])return {...this.config.customLevels[e]};let t=this.getQualityPresets();if(e==="auto"){let i=this.determineAutoQuality();return {...t[i]}}return {...t[e]}}getQualityPresets(){return {low:{particleCount:50,canvasResolution:.5,animationPrecision:30,enableBlur:false,enableShadows:false,targetFps:30,enableAdvancedEffects:false,textureQuality:.5,useHardwareAcceleration:false},medium:{particleCount:200,canvasResolution:.75,animationPrecision:60,enableBlur:true,enableShadows:false,targetFps:60,enableAdvancedEffects:false,textureQuality:.75,useHardwareAcceleration:true},high:{particleCount:500,canvasResolution:1,animationPrecision:60,enableBlur:true,enableShadows:true,targetFps:60,enableAdvancedEffects:true,textureQuality:1,useHardwareAcceleration:true},ultra:{particleCount:1e3,canvasResolution:1.5,animationPrecision:120,enableBlur:true,enableShadows:true,targetFps:120,enableAdvancedEffects:true,textureQuality:1.5,useHardwareAcceleration:true},auto:{particleCount:200,canvasResolution:1,animationPrecision:60,enableBlur:true,enableShadows:true,targetFps:60,enableAdvancedEffects:true,textureQuality:1,useHardwareAcceleration:true}}}detectDeviceCapabilities(){let e=navigator,t=()=>typeof window<"u"&&window.matchMedia?window.matchMedia("(prefers-reduced-motion: reduce)").matches:false,i=()=>typeof window<"u"&&window.devicePixelRatio?window.devicePixelRatio:1,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);}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;}_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);});}_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 u=performance.now()-r,f=Math.min(u/i,1);e.volume=n+(t-n)*f,f<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 u=Math.floor(a/1e3),f=Math.floor(u/60),v=u%60,h=Math.floor(a%1e3);return f>0?`${f}:${v.toString().padStart(2,"0")}.${h.toString().padStart(3,"0")}`:`${v}.${h.toString().padStart(3,"0")}s`},i=(a,u)=>u===0?"0%":`${Math.round(a/u*100)}%`,n=e.isPlaying?"\u25B6\uFE0F":e.isPaused?"\u23F8\uFE0F":"\u23F9\uFE0F",r=this.getQualityColor(e.quality),s=`
4
+ <div style="margin-bottom: 8px; font-weight: bold; color: #00ff88;">
5
+ \u{1F3AC} cinematicRenderer2D Debug
6
+ </div>
7
+
8
+ <div style="margin-bottom: 6px;">
9
+ <span style="color: #888;">FPS:</span>
10
+ <span style="color: ${this.getFpsColor(e.fps)}; font-weight: bold;">
11
+ ${e.fps}
12
+ </span>
13
+ <span style="color: #888;"> / Target: ${this.getTargetFps()}</span>
14
+ </div>
15
+
16
+ <div style="margin-bottom: 6px;">
17
+ <span style="color: #888;">Quality:</span>
18
+ <span style="color: ${r}; 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> ${n}
25
+ <div style="margin-left: 10px; font-size: ${this.options.fontSize-1}px;">
26
+ ${t(e.currentTime)} / ${t(e.duration)}
27
+ <div style="color: #666;">
28
+ ${i(e.currentTime,e.duration)} complete
29
+ </div>
30
+ </div>
31
+ </div>
32
+
33
+ <div style="margin-bottom: 8px;">
34
+ <span style="color: #888;">Current:</span>
35
+ <div style="margin-left: 10px; font-size: ${this.options.fontSize-1}px;">
36
+ <div>Event: <span style="color: #88ccff;">${e.currentEvent||"None"}</span></div>
37
+ <div>Scene: <span style="color: #ffcc88;">${e.currentScene||"None"}</span></div>
38
+ </div>
39
+ </div>
40
+
41
+ <div style="margin-bottom: 8px;">
42
+ <span style="color: #888;">Rendering:</span>
43
+ <div style="margin-left: 10px; font-size: ${this.options.fontSize-1}px;">
44
+ <div>Layers: <span style="color: #88ff88;">${e.activeLayers}</span></div>
45
+ <div>Particles: <span style="color: #ff8888;">${e.activeParticles}</span></div>
46
+ <div>DOM Nodes: <span style="color: #8888ff;">${e.domNodes}</span></div>
47
+ <div>Draw Calls: <span style="color: #ffff88;">${e.drawCalls}</span></div>
48
+ </div>
49
+ </div>
50
+ `;return e.memoryUsage!==void 0&&(s+=`
51
+ <div style="margin-bottom: 8px;">
52
+ <span style="color: #888;">Memory:</span>
53
+ <span style="color: #ff88ff;">${(e.memoryUsage/1024/1024).toFixed(1)} MB</span>
54
+ </div>
55
+ `),this.options.showPerformanceGraph&&this.fpsHistory.length>1&&(s+=this.generatePerformanceGraph()),s+=`
56
+ <div style="margin-top: 8px; font-size: ${this.options.fontSize-2}px; color: #666; border-top: 1px solid #333; padding-top: 4px;">
57
+ Press Ctrl+D to toggle debug overlay
58
+ </div>
59
+ `,s}generatePerformanceGraph(){let i=Math.max(60,Math.max(...this.fpsHistory)),n=Math.min(0,Math.min(...this.fpsHistory)),r=i-n;if(r===0)return "";let s=this.fpsHistory.map((a,u)=>{let f=u/(this.fpsHistory.length-1)*180,v=40-(a-n)/r*40;return `${f},${v}`}).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 (${n.toFixed(1)} - ${i.toFixed(1)})
63
+ </div>
64
+ <svg width="180" height="40" style="background: rgba(255,255,255,0.1); border-radius: 2px;">
65
+ <polyline
66
+ points="${s}"
67
+ fill="none"
68
+ stroke="#00ff88"
69
+ stroke-width="1.5"
70
+ opacity="0.8"
71
+ />
72
+ <line
73
+ x1="0" y1="${40-(60-n)/r*40}"
74
+ x2="180" y2="${40-(60-n)/r*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 L(c,e){if(typeof c=="string"&&c.endsWith("%")){let t=parseFloat(c)/100;return e*t}return typeof c=="number"?c:parseFloat(c)||0}var P=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;}},j=class extends P{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:n="to bottom",opacity:r=1,width:s="100%",height:a="100%"}=this.config,u=i.join(", ");this.element&&(this.element.style.cssText+=`
83
+ background: linear-gradient(${n}, ${u});
84
+ opacity: ${r};
85
+ width: ${typeof s=="number"?s+"px":s};
86
+ height: ${typeof a=="number"?a+"px":a};
87
+ position: absolute;
88
+ `);}this.mounted=true;}update(e){if(!this.mounted||!this.element)return;let{x:t=0,y:i=0,scale:n=1,rotation:r=0,opacity:s=1}=this.config,a=L(t,e.viewport.width),u=L(i,e.viewport.height);this.element.style.transform=`translate3d(${a}px, ${u}px, 0) scale(${n}) rotate(${r}deg)`,this.element.style.opacity=s.toString();}destroy(){if(this.element){let e=this.element.parentElement?.parentElement;e&&e.removeLayerElement&&e.removeLayerElement(this.id);}super.destroy();}},U=class extends 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}=this.config;this.img&&this.element&&(this.img.src=i,this.img.alt=n,this.img.style.cssText=`
89
+ width: 100%;
90
+ height: 100%;
91
+ object-fit: ${r};
92
+ opacity: ${s};
93
+ display: block;
94
+ `,this.element.appendChild(this.img));}this.mounted=true;}update(e){if(!this.mounted||!this.element)return;let{x:t=0,y:i=0,scale:n=1,rotation:r=0,opacity:s=1}=this.config,a=L(t,e.viewport.width),u=L(i,e.viewport.height);this.element.style.transform=`translate3d(${a}px, ${u}px, 0) scale(${n}) rotate(${r}deg)`,this.element.style.opacity=s.toString();}destroy(){if(this.element){let e=this.element.parentElement?.parentElement;e&&e.removeLayerElement&&e.removeLayerElement(this.id);}super.destroy();}},W=class extends P{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:n="16px",fontFamily:r="Arial, sans-serif",color:s="#ffffff",textAlign:a="center",opacity:u=1,textShadow:f="none",fontWeight:v="normal",letterSpacing:h="normal"}=this.config;this.element&&(this.element.innerHTML=i,this.element.style.cssText+=`
95
+ font-size: ${typeof n=="number"?n+"px":n};
96
+ font-family: ${r};
97
+ color: ${s};
98
+ text-align: ${a};
99
+ opacity: ${u};
100
+ text-shadow: ${f};
101
+ font-weight: ${v};
102
+ letter-spacing: ${h};
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:n=1,rotation:r=0,opacity:s=1,textAlign:a="center"}=this.config,u=L(t,e.viewport.width),f=L(i,e.viewport.height),v="center center",h="-50%",g="-50%";a==="left"?(v="left center",h="0%"):a==="right"&&(v="right center",h="-100%"),this.element.style.transformOrigin=v,this.element.style.transform=`translate3d(${u}px, ${f}px, 0) translate(${h}, ${g}) scale(${n}) rotate(${r}deg)`,this.element.style.opacity=s.toString();}destroy(){if(this.element){let e=this.element.parentElement?.parentElement;e&&e.removeLayerElement&&e.removeLayerElement(this.id);}super.destroy();}},G=class extends 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+=`
112
+ background: radial-gradient(ellipse ${r} ${r} at center, transparent 0%, ${i} 100%);
113
+ opacity: ${s*n};
114
+ pointer-events: none;
115
+ `);}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=L(t,e.viewport.width),u=L(i,e.viewport.height);this.element.style.transform=`translate3d(${a}px, ${u}px, 0) scale(${n}) rotate(${r}deg)`,this.element.style.opacity=s.toString();}destroy(){if(this.element){let e=this.element.parentElement?.parentElement;e&&e.removeLayerElement&&e.removeLayerElement(this.id);}super.destroy();}},Z=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+=`
116
+ background: radial-gradient(circle, ${i} 0%, transparent 70%);
117
+ width: ${n*2}px;
118
+ height: ${n*2}px;
119
+ border-radius: 50%;
120
+ filter: blur(${r}px);
121
+ opacity: ${s};
122
+ pointer-events: none;
123
+ position: absolute;
124
+ `);}this.mounted=true;}update(e){if(!this.mounted||!this.element)return;let{x:t=0,y:i=0,scale:n=1,rotation:r=0,intensity:s=.8,radius:a=50}=this.config,u=L(t,e.viewport.width)-a,f=L(i,e.viewport.height)-a;this.element.style.transform=`translate3d(${u}px, ${f}px, 0) scale(${n}) rotate(${r}deg)`,this.element.style.opacity=s.toString();}destroy(){if(this.element){let e=this.element.parentElement?.parentElement;e&&e.removeLayerElement&&e.removeLayerElement(this.id);}super.destroy();}},Y=class extends 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=`
125
+ width: 100%;
126
+ height: 100%;
127
+ opacity: ${n};
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:n=1,rotation:r=0,opacity:s=.1}=this.config,a=L(t,e.viewport.width),u=L(i,e.viewport.height);this.element.style.transform=`translate3d(${a}px, ${u}px, 0) scale(${n}) rotate(${r}deg)`,this.element.style.opacity=s.toString();let{animated:f=false,animationSpeed:v=100}=this.config;f&&e.timeMs%v<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(){if(this.element){let e=this.element.parentElement?.parentElement;e&&e.removeLayerElement&&e.removeLayerElement(this.id);}super.destroy();}},K=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+=`
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:n="#ffffff",size:r=2,speed:s=1,opacity:a=.8,type:u="circle",x:f=0,y:v=0,scale:h=1,rotation:g=0}=this.config,b=L(f,t.viewport.width),p=L(v,t.viewport.height);if(this.ctx.save(),this.ctx.translate(b,p),this.ctx.scale(h,h),this.ctx.rotate(g*Math.PI/180),this.ctx.globalAlpha=a,this.particles.length===0)for(let m=0;m<i;m++)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 m of this.particles)m.x+=m.vx*t.deltaMs/16.67,m.y+=m.vy*t.deltaMs/16.67,m.life+=t.deltaMs,m.x<0&&(m.x=t.viewport.width),m.x>t.viewport.width&&(m.x=0),m.y<0&&(m.y=t.viewport.height),m.y>t.viewport.height&&(m.y=0),m.life>=m.maxLife&&(m.x=Math.random()*t.viewport.width,m.y=Math.random()*t.viewport.height,m.life=0),this.ctx.save(),this.ctx.globalAlpha=m.opacity*a,u==="circle"?(this.ctx.beginPath(),this.ctx.arc(m.x,m.y,m.size,0,Math.PI*2),this.ctx.fill()):u==="square"&&this.ctx.fillRect(m.x-m.size/2,m.y-m.size/2,m.size,m.size),this.ctx.restore();this.ctx.restore();}destroy(){this.canvas&&this.canvas.parentNode&&this.canvas.parentNode.removeChild(this.canvas),this.particles=[],super.destroy();}},X=class extends 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+=`
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:n="#ffffff",minSize:r=.5,maxSize:s=2,speed:a=.5,opacity:u=.8,twinkle:f=true,x:v=0,y:h=0,scale:g=1,rotation:b=0}=this.config,p=L(v,t.viewport.width),m=L(h,t.viewport.height);if(this.ctx.save(),this.ctx.translate(p,m),this.ctx.scale(g,g),this.ctx.rotate(b*Math.PI/180),this.ctx.globalAlpha=u,this.stars.length===0)for(let d=0;d<i;d++)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 d of this.stars){d.z-=a*t.deltaMs/16.67,d.z<=0&&(d.z=1e3,d.x=Math.random()*t.viewport.width,d.y=Math.random()*t.viewport.height);let _=500,w=(d.x-t.viewport.width/2)*(_/d.z)+t.viewport.width/2,M=(d.y-t.viewport.height/2)*(_/d.z)+t.viewport.height/2,x=d.size*(_/d.z);if(w<-x||w>t.viewport.width+x||M<-x||M>t.viewport.height+x)continue;let A=d.baseOpacity;f&&(d.twinklePhase+=d.twinkleSpeed*t.deltaMs/1e3,A*=.5+.5*Math.sin(d.twinklePhase)),this.ctx.save(),this.ctx.globalAlpha=A*u,this.ctx.beginPath(),this.ctx.arc(w,M,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();}},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+=`
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:n="#cccccc",minSize:r=1,maxSize:s=3,speed:a=.2,opacity:u=.4,drift:f=true,x:v=0,y:h=0,scale:g=1,rotation:b=0}=this.config;if(this.ctx.save(),this.ctx.translate(v,h),this.ctx.scale(g,g),this.ctx.rotate(b*Math.PI/180),this.ctx.globalAlpha=u,this.dustParticles.length===0)for(let p=0;p<i;p++)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 p of this.dustParticles){let m=p.vx,d=p.vy;f&&(p.driftPhase+=p.driftSpeed*t.deltaMs/1e3,m+=Math.sin(p.driftPhase)*.1,d+=Math.cos(p.driftPhase*.7)*.1),p.x+=m*t.deltaMs/16.67,p.y+=d*t.deltaMs/16.67,p.life+=t.deltaMs,p.x<-p.size&&(p.x=t.viewport.width+p.size),p.x>t.viewport.width+p.size&&(p.x=-p.size),p.y<-p.size&&(p.y=t.viewport.height+p.size),p.y>t.viewport.height+p.size&&(p.y=-p.size),p.life>=p.maxLife&&(p.x=Math.random()*t.viewport.width,p.y=Math.random()*t.viewport.height,p.life=0);let _=p.life/p.maxLife,w=_<.1?_/.1:_>.9?(1-_)/.1:1;this.ctx.save(),this.ctx.globalAlpha=p.baseOpacity*w*u,this.ctx.beginPath(),this.ctx.arc(p.x,p.y,p.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(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+=`
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:n=.01,opacity:r=.6,animated:s=true,speed:a=.001,octaves:u=3,x:f=0,y:v=0,scaleTransform:h=1,rotation:g=0}=this.config;this.ctx.save(),this.ctx.translate(f,v),this.ctx.scale(h,h),this.ctx.rotate(g*Math.PI/180),this.ctx.globalAlpha=r;let b=Math.floor(e.viewport.width/2),p=Math.floor(e.viewport.height/2);(!this.noiseData||this.noiseData.width!==b||this.noiseData.height!==p)&&(this.noiseData=this.ctx.createImageData(b,p));let m=this.noiseData.data,d=s?e.timeMs*a:0;for(let _=0;_<p;_++)for(let w=0;w<b;w++){let M=(_*b+w)*4,x=0,A=1,R=n;for(let he=0;he<u;he++)x+=this.perlinNoise(w*R+d,_*R+d)*A,A*=.5,R*=2;x=(x+1)*.5,x=Math.max(0,Math.min(1,x*i));let se=Math.floor(x*(t.length-1)),Ue=Math.min(se+1,t.length-1),ae=x*(t.length-1)-se,z=this.hexToRgb(t[se]),oe=this.hexToRgb(t[Ue]),We=Math.floor(z.r+(oe.r-z.r)*ae),Ge=Math.floor(z.g+(oe.g-z.g)*ae),Ze=Math.floor(z.b+(oe.b-z.b)*ae),Ye=Math.floor(x*255);m[M]=We,m[M+1]=Ge,m[M+2]=Ze,m[M+3]=Ye;}this.ctx.putImageData(this.noiseData,0,0),this.ctx.drawImage(this.canvas,0,0,b,p,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),u=t-Math.floor(t),f=a*a*(3-2*a),v=u*u*(3-2*u),h=i+f*(n-i),g=r+f*(s-r);return h+v*(g-h)}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 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.`),this.layerTypes.set(e,t);}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"],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 j(e,t)),this.layerTypes.set("image",(e,t)=>new U(e,t)),this.layerTypes.set("textBlock",(e,t)=>new W(e,t)),this.layerTypes.set("vignette",(e,t)=>new G(e,t)),this.layerTypes.set("glowOrb",(e,t)=>new Z(e,t)),this.layerTypes.set("noiseOverlay",(e,t)=>new Y(e,t)),this.layerTypes.set("particles",(e,t)=>new K(e,t)),this.layerTypes.set("starfield",(e,t)=>new X(e,t)),this.layerTypes.set("dust",(e,t)=>new J(e,t)),this.layerTypes.set("nebulaNoise",(e,t)=>new ee(e,t));}};I.instance=null;var te=I;var F=class{constructor(e){this.container=e;}};var ie=class extends F{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 n=[...t].sort((r,s)=>r.zIndex-s.zIndex);for(let r of n)r.update(i);}resize(t,i){if(this.initialized){this.domContainer.style.width=`${t}px`,this.domContainer.style.height=`${i}px`;for(let n 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 n=document.createElement("div");return n.id=`layer-${t}`,n.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(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 de=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}},ne=class extends F{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 de(()=>({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:u=2,speed:f=1,opacity:v=.8,type:h="circle"}=r,g=H[i.quality]||H.medium,b=Math.min(s,g.particleCount);for(;this.activeParticles.length<b;){let m=this.particlePool.get();this.initializeParticle(m,i.viewport),m.color=a,m.size=u,m.active=true,this.activeParticles.push(m);}for(;this.activeParticles.length>b;){let m=this.activeParticles.pop();m&&this.particlePool.release(m);}let p=0;for(let m=this.activeParticles.length-1;m>=0;m--){let d=this.activeParticles[m];if(!d||!d.active){this.activeParticles.splice(m,1),d&&this.particlePool.release(d);continue}d.x+=d.vx*f*i.deltaMs/16.67,d.y+=d.vy*f*i.deltaMs/16.67,d.rotation+=d.rotationSpeed*i.deltaMs/16.67,d.life+=i.deltaMs,(d.x<-d.size||d.x>i.viewport.width+d.size||d.y<-d.size||d.y>i.viewport.height+d.size||d.life>=d.maxLife)&&(this.initializeParticle(d,i.viewport),d.color=a,d.size=u),this.ctx.save(),this.ctx.globalAlpha=d.opacity*v,this.ctx.fillStyle=d.color,h==="circle"?(this.ctx.beginPath(),this.ctx.arc(d.x,d.y,d.size,0,Math.PI*2),this.ctx.fill()):h==="star"&&this.drawStar(d.x,d.y,d.size,d.rotation),this.ctx.restore(),p++;}return this.performanceMetrics.activeParticles=this.activeParticles.length,p}renderNoiseLayer(t,i){let r=t.config||{},{intensity:s=.5,scale:a=1,opacity:u=.3,animated:f=true,speed:v=.01}=r,g=(H[i.quality]||H.medium).canvasResolution,b=Math.floor(i.viewport.width*g),p=Math.floor(i.viewport.height*g),m=this.ctx.createImageData(b,p),d=m.data,_=f?i.timeMs*v:0;for(let w=0;w<p;w++)for(let M=0;M<b;M++){let x=(w*b+M)*4,A=this.simpleNoise(M*a+_,w*a+_)*s,R=Math.floor(A*255);d[x]=R,d[x+1]=R,d[x+2]=R,d[x+3]=Math.floor(u*255);}return this.ctx.save(),this.ctx.putImageData(m,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,u=n*.4;this.ctx.save(),this.ctx.translate(t,i),this.ctx.rotate(r),this.ctx.beginPath();for(let f=0;f<10;f++){let v=f*Math.PI/5,h=f%2===0?a:u,g=Math.cos(v)*h,b=Math.sin(v)*h;f===0?this.ctx.moveTo(g,b):this.ctx.lineTo(g,b);}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 re=class{constructor(e){this.eventListeners=new Map;this._state="idle";this._currentTime=0;this._duration=0;this._currentEventId=null;this._currentSceneId=null;this._resizeListener=null;this._debugOverlay=null;this._domRenderer=null;this._canvas2DRenderer=null;this._layers=[];this._currentSceneLayers=[];this._resizeObserver=null;this._mounted=false;if(!e.container)throw new Error("CinematicRenderer2D: container element is required");if(!e.spec)throw new Error("CinematicRenderer2D: spec is required");let t=O.validate(e.spec),i=O.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 q({targetFps:this._spec.engine.targetFps||60,enableAdaptiveQuality:this._quality==="auto"}),this._qualitySystem=new N({respectUserPreferences:true,useDeviceDetection:true}),this._layerRegistry=te.getInstance(),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._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(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._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(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._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 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()}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(n=>{try{n(...t);}catch(r){console.error(`Error in event listener for "${e}":`,r);}});}_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 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,u=a+s.duration;if(this._currentTime>=a&&this._currentTime<u){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 ie(this._container),this._domRenderer.initialize(),this._canvas2DRenderer=new ne(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(n=>e.layers.some(r=>r.id===n.id));if(t.length!==this._currentSceneLayers.length||t.some(n=>!this._currentSceneLayers.includes(n))){for(let n of this._currentSceneLayers)t.includes(n)||n.destroy();for(let n of t)this._currentSceneLayers.includes(n)||this._mountLayer(n);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 n={container:this._container,renderer:i,assetManager:null,layerConfig:this._getLayerConfig(e.id)};e.mount(n);}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(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)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 Ce,we,Te,_e,Me,Se,Ee,Le,Pe,Ae,Re,Ie,ze,Fe,ke,De,Qe,$e,Oe,He,qe,Ne,Ve,Be,je,l;je=[core.Component({selector:"cinematic-player",template:`
182
+ <div
183
+ #container
184
+ [class]="containerClass"
185
+ [ngStyle]="containerStyle"
186
+ style="width: 100%; height: 100%; position: relative; overflow: hidden;">
187
+ </div>
188
+ `,changeDetection:core.ChangeDetectionStrategy.OnPush})],Be=[core.ViewChild("container",{static:true})],Ve=[core.Input()],Ne=[core.Input()],qe=[core.Input()],He=[core.Input()],Oe=[core.Input()],$e=[core.Input()],Qe=[core.Output()],De=[core.Output()],ke=[core.Output()],Fe=[core.Output()],ze=[core.Output()],Ie=[core.Output()],Re=[core.Output()],Ae=[core.Output()],Pe=[core.Output()],Le=[core.Output()],Ee=[core.Output()],Se=[core.Output()],Me=[core.Output()],_e=[core.Output()],Te=[core.Output()],we=[core.Output()],Ce=[core.Output()];exports.CinematicPlayerComponent=class C{constructor(e){this.ngZone=e;this.containerRef=y(l,8,this),y(l,11,this);this.spec=y(l,12,this),y(l,15,this);this.autoplay=y(l,16,this,false),y(l,19,this);this.quality=y(l,20,this),y(l,23,this);this.debug=y(l,24,this,false),y(l,27,this);this.containerClass=y(l,28,this),y(l,31,this);this.containerStyle=y(l,32,this),y(l,35,this);this.ready=y(l,36,this,new core.EventEmitter),y(l,39,this);this.play=y(l,40,this,new core.EventEmitter),y(l,43,this);this.pause=y(l,44,this,new core.EventEmitter),y(l,47,this);this.stop=y(l,48,this,new core.EventEmitter),y(l,51,this);this.seek=y(l,52,this,new core.EventEmitter),y(l,55,this);this.eventChange=y(l,56,this,new core.EventEmitter),y(l,59,this);this.sceneChange=y(l,60,this,new core.EventEmitter),y(l,63,this);this.qualityChange=y(l,64,this,new core.EventEmitter),y(l,67,this);this.resize=y(l,68,this,new core.EventEmitter),y(l,71,this);this.frame=y(l,72,this,new core.EventEmitter),y(l,75,this);this.stateChange=y(l,76,this,new core.EventEmitter),y(l,79,this);this.ended=y(l,80,this,new core.EventEmitter),y(l,83,this);this.error=y(l,84,this,new core.EventEmitter),y(l,87,this);this.loading=y(l,88,this,new core.EventEmitter),y(l,91,this);this.destroy=y(l,92,this,new core.EventEmitter),y(l,95,this);this.audioError=y(l,96,this,new core.EventEmitter),y(l,99,this);this.autoplayBlocked=y(l,100,this,new core.EventEmitter),y(l,103,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 re(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;}};l=ve(),T(l,5,"containerRef",Be,exports.CinematicPlayerComponent),T(l,5,"spec",Ve,exports.CinematicPlayerComponent),T(l,5,"autoplay",Ne,exports.CinematicPlayerComponent),T(l,5,"quality",qe,exports.CinematicPlayerComponent),T(l,5,"debug",He,exports.CinematicPlayerComponent),T(l,5,"containerClass",Oe,exports.CinematicPlayerComponent),T(l,5,"containerStyle",$e,exports.CinematicPlayerComponent),T(l,5,"ready",Qe,exports.CinematicPlayerComponent),T(l,5,"play",De,exports.CinematicPlayerComponent),T(l,5,"pause",ke,exports.CinematicPlayerComponent),T(l,5,"stop",Fe,exports.CinematicPlayerComponent),T(l,5,"seek",ze,exports.CinematicPlayerComponent),T(l,5,"eventChange",Ie,exports.CinematicPlayerComponent),T(l,5,"sceneChange",Re,exports.CinematicPlayerComponent),T(l,5,"qualityChange",Ae,exports.CinematicPlayerComponent),T(l,5,"resize",Pe,exports.CinematicPlayerComponent),T(l,5,"frame",Le,exports.CinematicPlayerComponent),T(l,5,"stateChange",Ee,exports.CinematicPlayerComponent),T(l,5,"ended",Se,exports.CinematicPlayerComponent),T(l,5,"error",Me,exports.CinematicPlayerComponent),T(l,5,"loading",_e,exports.CinematicPlayerComponent),T(l,5,"destroy",Te,exports.CinematicPlayerComponent),T(l,5,"audioError",we,exports.CinematicPlayerComponent),T(l,5,"autoplayBlocked",Ce,exports.CinematicPlayerComponent),exports.CinematicPlayerComponent=T(l,0,"CinematicPlayerComponent",je,exports.CinematicPlayerComponent),y(l,1,exports.CinematicPlayerComponent);//# sourceMappingURL=angular.cjs.map
189
+ //# sourceMappingURL=angular.cjs.map