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/LICENSE +21 -0
- package/README.md +827 -0
- package/dist/angular.cjs +189 -0
- package/dist/angular.cjs.map +1 -0
- package/dist/angular.d.cts +577 -0
- package/dist/angular.d.ts +577 -0
- package/dist/angular.js +189 -0
- package/dist/angular.js.map +1 -0
- package/dist/cli/index.js +1243 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/index.cjs +182 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +1663 -0
- package/dist/index.d.ts +1663 -0
- package/dist/index.js +182 -0
- package/dist/index.js.map +1 -0
- package/dist/metafile-cjs.json +1 -0
- package/dist/metafile-esm.json +1 -0
- package/dist/react.cjs +182 -0
- package/dist/react.cjs.map +1 -0
- package/dist/react.d.cts +510 -0
- package/dist/react.d.ts +510 -0
- package/dist/react.js +182 -0
- package/dist/react.js.map +1 -0
- package/package.json +151 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/adapters/angular/index.ts","../src/animation/AnimationCompiler.ts","../src/parsing/SpecParser.ts","../src/core/Scheduler.ts","../src/performance/QualitySystem.ts","../src/audio/AudioSystem.ts","../src/debug/DebugOverlay.ts","../src/core/layers/BuiltInLayers.ts","../src/core/LayerRegistry.ts","../src/rendering/RenderBackend.ts","../src/rendering/dom/DOMRenderer.ts","../src/types/QualityTypes.ts","../src/rendering/canvas2d/Canvas2DRenderer.ts","../src/core/CinematicRenderer2D.ts"],"names":["AnimationCompiler","track","easingFunction","interpolationFunction","easing","from","to","fromType","toType","progress","x1","y1","x2","y2","t","cx","bx","ax","cy","by","ay","x","i","currentX","currentSlope","bezierString","match","values","v","c","type","c1","c2","c3","value","delta","easedProgress","fromMatch","toMatch","fromNum","toNum","unit","interpolatedValue","propertyInterpolators","allKeys","key","fromValue","toValue","result","interpolator","SUPPORTED_SCHEMA_VERSIONS","QualityLevelSchema","z","LayerTypeSchema","EasingTypeSchema","AudioTrackTypeSchema","TransitionTypeSchema","AssetTypeSchema","TransformConfigSchema","LayerConfigSchema","AnimationValueSchema","AnimationTrackSpecSchema","data","AudioTrackSpecSchema","TransitionConfigSchema","TransitionSpecSchema","AssetMetadataSchema","AssetDefinitionSchema","LayerSpecSchema","CinematicSceneSchema","CinematicEventSchema","EngineConfigSchema","CinematicSpecSchema","sceneIds","scene","referencedSceneIds","event","sceneId","eventIds","e","s","assetIds","a","SpecParser","spec","schemaVersion","error","context","l","compiledAssets","compiledScenes","compiledEvents","totalDuration","compiledSpec","version","assets","_context","assetDef","asset","scenes","currentStartTime","compiledLayers","compiledAudioTracks","compiledScene","layers","b","layer","compiledAnimations","layerInstance","tracks","events","eventScenes","compiledTransitions","eventDuration","total","compiledEvent","transitions","transition","executeFunction","_fromElement","_toElement","err","Scheduler","options","callback","index","updates","currentTime","deltaMs","frameContext","averageFrameTime","sum","time","targetFps","average","diff","variance","fpsRatio","isStable","QualitySystem","config","initialQuality","level","previousQuality","metrics","cutoffTime","m","presets","autoLevel","nav","getMatchMedia","getDevicePixelRatio","getRefreshRate","canvas","connection","caps","recentMetrics","avgFps","currentFps","qualityLevels","currentIndex","newQuality","maxLevel","maxIndex","latest","AudioSystem","audioBuffer","timeMs","compiledTrack","shouldPlay","activeTrack","volume","listeners","AudioContextClass","audio","currentTimeMs","_compiledTrack","source","gainNode","now","offset","playPromise","timeUntilEnd","fadeProgress","targetVolume","durationMs","startVolume","startTime","resolve","updateVolume","elapsed","handleInteraction","args","DebugOverlay","renderer","container","styles","baseStyles","frameData","update","debugInfo","html","duration","fps","info","formatTime","ms","seconds","minutes","remainingSeconds","remainingMs","formatPercent","current","playbackIcon","qualityColor","maxFps","minFps","fpsRange","points","y","quality","resolvePosition","containerSize","percentage","BaseLayer","id","_visible","_opacity","_width","_height","GradientLayer","ctx","domRenderer","colors","direction","opacity","width","height","gradientColors","scale","rotation","resolvedX","resolvedY","ImageLayer","src","alt","objectFit","TextBlockLayer","text","fontSize","fontFamily","color","textAlign","textShadow","fontWeight","letterSpacing","transformOrigin","translateX","translateY","VignetteLayer","intensity","size","GlowOrbLayer","radius","blur","NoiseOverlayLayer","canvasContext","animated","animationSpeed","imageData","noise","ParticlesLayer","count","speed","particle","StarfieldLayer","minSize","maxSize","twinkle","star","perspective","screenX","screenY","starSize","starOpacity","DustLayer","drift","vx","vy","lifeRatio","fadeOpacity","NebulaNoiseLayer","octaves","scaleTransform","py","px","amplitude","frequency","octave","colorIndex","nextColorIndex","color1","color2","r","g","n1","n2","n3","n4","fx","fy","sx","sy","i1","i2","n","hex","_LayerRegistry","factory","builtInTypes","LayerRegistry","RenderBackend","DOMRenderer","sortedLayers","element","layerId","zIndex","QUALITY_PRESETS","ObjectPool","createFn","resetFn","initialSize","obj","Canvas2DRenderer","rect","drawCalls","canvas2DLayers","qualitySettings","maxParticles","resolution","viewport","outerRadius","innerRadius","angle","CinematicRenderer2D","validatedSpec","trackId","previousState","clampedTime","eventId","eventStartTime","sceneStartTime","newState","maxDuration","totalTime","eventTime","eventSceneId","accumulatedTime","sceneEndTime","lastEvent","lastSceneId","containerStyle","entries","entry","layerSpec","currentScene","newSceneLayers","mountContext","layerContext","domLayers","_autoplayBlocked_dec","_audioError_dec","_destroy_dec","_loading_dec","_error_dec","_ended_dec","_stateChange_dec","_frame_dec","_resize_dec","_qualityChange_dec","_sceneChange_dec","_eventChange_dec","_seek_dec","_stop_dec","_pause_dec","_play_dec","_ready_dec","_containerStyle_dec","_containerClass_dec","_debug_dec","_quality_dec","_autoplay_dec","_spec_dec","_containerRef_dec","_CinematicPlayerComponent_decorators","_init","Component","ChangeDetectionStrategy","ViewChild","Input","Output","CinematicPlayerComponent","ngZone","__runInitializers","EventEmitter","changes","__decoratorStart","__decorateElement"],"mappings":"kEASA,IAAA,EAAA,CAAA,MAAA,CAAA,MAAA,CAAA,IAAA,EAAA,CAAA,MAAA,CAAA,cAAA,CAAA,IAAA,EAAA,CAAA,MAAA,CAAA,wBAAA,CAAA,IAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,GAAA,CAAA,CAAA,CAAA,MAAA,CAAA,CAAA,CAAA,EAAA,CAAA,CAAA,MAAA,CAAA,GAAA,CAAA,SAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAA,CAAA,MAAA,SAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,GAAA,CAAA,IAAA,CAAA,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,UAAA,CAAA,IAAA,CAAA,YAAA,CAAA,IAAA,CAAA,QAAA,CAAA,IAAA,CAAA,KAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,GAAA,EAAA,CAAA,CAAA,CAAA,MAAA,CAAA,CAAA,KAAA,CAAA,CAAA,CAAA,YAAA,CAAA,IAAA,CAAA,CAAA,CAAA,IAAA,EAAA,CAAA,CAAA,EAAA,IAAA,EAAA,CAAA,IAAA,CAAA,CAAA,CAAA,EAAA,CAAA,CAAA,OAAA,CAAA,QAAA,CAAA,QAAA,CAAA,QAAA,CAAA,UAAA,CAAA,OAAA,CAAA,OAAA,CAAA,KAAA,CAAA,KAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAA,CAAA,GAAA,MAAA,EAAA,OAAA,CAAA,EAAA,UAAA,CAAA,CAAA,CAAA,mBAAA,CAAA,CAAA,CAAA,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAA,CAAA,IAAA,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA,IAAA,CAAA,CAAA,CAAA,QAAA,CAAA,CAAA,CAAA,cAAA,CAAA,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,qBAAA,CAAA,CAAA,CAAA,CAAA,IAAA,CAAA,CAAA,CAAA,CAAA,EAAA,IAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,GAAA,EAAA,CAAA,CAAA,CAAA,EAAA,CAAA,UAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,GAAA,CAAA,IAAA,IAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAA,CAAA,CAAA,MAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,OAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,GAAA,CAAA,IAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAA,CAAA,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,MAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,GAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,GAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,GAAA,CAAA,CAAA,EAAA,CAAA,CAAA,GAAA,CAAA,CAAA,CAAA,CAAA,SAAA,CAAA,CAAA,CAAA,CAAA,CAAA,GAAA,CAAA,CAAA,CAAA,EAAA,CAAA,CAAA,CAAA,EAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAA,CAAA,CAAA,EAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAA,CAAA,CAAA,CAAA,EAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,MAAA,CAAA,CAAA,CAAA,CAAA,CAAA,MAAA,CAAA,EAAA,EAAA,CAAA,CAAA,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAA,IAAA,CAAA,CAAA,CAAA,CAAA,MAAA,CAAA,CAAA,CAAA,CAAA,EAAA,CAAA,CAAA,CAAA,EAAA,CAAA,CAAA,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,GAAA,CAAA,CAAA,MAAA,CAAA,CAAA,CAAA,CAAA,CAAA,OAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,MAAA,CAAA,CAAA,GAAA,CAAA,CAAA,CAAA,CAAA,EAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAA,CAAA,IAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,GAAA,CAAA,CAAA,GAAA,CAAA,CAAA,CAAA,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,GAAA,CAAA,CAAA,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,GAAA,CAAA,CAAA,GAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,GAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,GAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,GAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAA,CAAA,CAAA,CAAA,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,MAAA,CAAA,CAAA,GAAA,CAAA,CAAA,CAAA,GAAA,CAAA,GAAA,CAAA,CAAA,CAAA,GAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAA,CAAA,GAAA,MAAA,CAAA,CAAA,CAAA,CAAA,CAAA,GAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,OAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,OAAA,CAAA,EAAA,QAAA,EAAA,CAAA,GAAA,IAAA,CAAA,CAAA,CAAA,iBAAA,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,GAAA,CAAA,GAAA,CAAA,CAAA,GAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,GAAA,CAAA,GAAA,CAAA,CAAA,GAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAA,CAAA,EAAA,CAAA,CAAA,OAAA,CAAA,CAAA,CAAA,CAAA,CAAA,OAAA,CAAA,EAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,GAAA,CAAA,CAAA,GAAA,CAAA,CAAA,CAAA,EAAA,CAAA,CAAA,SAAA,CAAA,CAAA,CAAA,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,GAAA,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","file":"angular.cjs","sourcesContent":["/**\n * Angular adapter for cinematicRenderer2D\n * \n * Provides a CinematicPlayerComponent Angular component that wraps the core engine\n * with Angular-specific lifecycle management and event handling.\n * \n * Requirements: 10.2, 10.3, 10.4, 10.5 - Angular integration with proper lifecycle\n */\n\nimport {\n Component,\n Input,\n Output,\n EventEmitter,\n ElementRef,\n OnInit,\n OnDestroy,\n OnChanges,\n SimpleChanges,\n ViewChild,\n ChangeDetectionStrategy,\n NgZone,\n} from '@angular/core';\nimport { CinematicRenderer2D, type CinematicRenderer2DOptions, type PlaybackState } from '../../core/CinematicRenderer2D';\nimport type { CinematicSpec } from '../../types/CinematicSpec';\nimport type { QualityLevel } from '../../types/QualityTypes';\n\nexport interface CinematicPlayerEvents {\n ready: void;\n play: { previousState: PlaybackState; currentTime: number };\n pause: { previousState: PlaybackState; currentTime: number };\n stop: { previousState: PlaybackState };\n seek: { previousTime: number; currentTime: number; currentEvent: string | null; currentScene: string | null };\n eventChange: { eventId: string; eventName: string; currentTime: number };\n sceneChange: { sceneId: string; sceneName: string; currentTime: number };\n qualityChange: { previousQuality: QualityLevel; currentQuality: QualityLevel; metrics?: any };\n resize: { width: number; height: number };\n frame: { currentTime: number; fps: number; deltaMs: number; currentEvent: string | null; currentScene: string | null };\n stateChange: { previousState: PlaybackState; currentState: PlaybackState };\n ended: void;\n error: Error;\n loading: void;\n destroy: { previousState: PlaybackState };\n audioError: { trackId: string; error: Error };\n autoplayBlocked: { trackId: string };\n}\n\n/**\n * CinematicPlayerComponent Angular Component\n * \n * An Angular wrapper for the CinematicRenderer2D engine that handles:\n * - Angular lifecycle integration (ngOnInit/ngOnDestroy)\n * - Input/Output bindings for spec and events\n * - Event forwarding to Angular event system\n * - Automatic cleanup on component destruction\n */\n@Component({\n selector: 'cinematic-player',\n template: `\n <div \n #container \n [class]=\"containerClass\"\n [ngStyle]=\"containerStyle\"\n style=\"width: 100%; height: 100%; position: relative; overflow: hidden;\">\n </div>\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class CinematicPlayerComponent implements OnInit, OnDestroy, OnChanges {\n @ViewChild('container', { static: true }) containerRef!: ElementRef<HTMLDivElement>;\n\n // Input properties\n @Input() spec!: CinematicSpec;\n @Input() autoplay: boolean = false;\n @Input() quality?: QualityLevel;\n @Input() debug: boolean = false;\n @Input() containerClass?: string;\n @Input() containerStyle?: { [key: string]: any };\n\n // Output events - forward all engine events to Angular event system\n @Output() ready = new EventEmitter<void>();\n @Output() play = new EventEmitter<CinematicPlayerEvents['play']>();\n @Output() pause = new EventEmitter<CinematicPlayerEvents['pause']>();\n @Output() stop = new EventEmitter<CinematicPlayerEvents['stop']>();\n @Output() seek = new EventEmitter<CinematicPlayerEvents['seek']>();\n @Output() eventChange = new EventEmitter<CinematicPlayerEvents['eventChange']>();\n @Output() sceneChange = new EventEmitter<CinematicPlayerEvents['sceneChange']>();\n @Output() qualityChange = new EventEmitter<CinematicPlayerEvents['qualityChange']>();\n @Output() resize = new EventEmitter<CinematicPlayerEvents['resize']>();\n @Output() frame = new EventEmitter<CinematicPlayerEvents['frame']>();\n @Output() stateChange = new EventEmitter<CinematicPlayerEvents['stateChange']>();\n @Output() ended = new EventEmitter<void>();\n @Output() error = new EventEmitter<Error>();\n @Output() loading = new EventEmitter<void>();\n @Output() destroy = new EventEmitter<CinematicPlayerEvents['destroy']>();\n @Output() audioError = new EventEmitter<CinematicPlayerEvents['audioError']>();\n @Output() autoplayBlocked = new EventEmitter<CinematicPlayerEvents['autoplayBlocked']>();\n\n private engine: CinematicRenderer2D | null = null;\n private initialized = false;\n\n constructor(private ngZone: NgZone) {}\n\n ngOnInit(): void {\n if (!this.spec) {\n throw new Error('CinematicPlayerComponent: spec input is required');\n }\n\n this.initializeEngine();\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (this.initialized) {\n // Handle spec changes by reinitializing the engine\n if (changes['spec'] && !changes['spec'].firstChange) {\n this.destroyEngine();\n this.initializeEngine();\n }\n\n // Handle quality changes\n if (changes['quality'] && !changes['quality'].firstChange && this.engine) {\n this.engine.setQuality(this.quality || 'auto');\n }\n }\n }\n\n ngOnDestroy(): void {\n this.destroyEngine();\n }\n\n // Public API methods for programmatic control\n playEngine(): void {\n this.engine?.play();\n }\n\n pauseEngine(): void {\n this.engine?.pause();\n }\n\n stopEngine(): void {\n this.engine?.stop();\n }\n\n seekEngine(timeMs: number): void {\n this.engine?.seek(timeMs);\n }\n\n goToEvent(eventId: string): void {\n this.engine?.goToEvent(eventId);\n }\n\n goToScene(sceneId: string): void {\n this.engine?.goToScene(sceneId);\n }\n\n setQuality(level: QualityLevel): void {\n this.engine?.setQuality(level);\n }\n\n resizeEngine(width: number, height: number): void {\n this.engine?.resize(width, height);\n }\n\n // State getters\n getCurrentTime(): number {\n return this.engine?.getCurrentTime() ?? 0;\n }\n\n getDuration(): number {\n return this.engine?.getDuration() ?? 0;\n }\n\n isPlaying(): boolean {\n return this.engine?.isPlaying() ?? false;\n }\n\n isPaused(): boolean {\n return this.engine?.isPaused() ?? false;\n }\n\n getCurrentEvent(): string | null {\n return this.engine?.getCurrentEvent() ?? null;\n }\n\n getCurrentScene(): string | null {\n return this.engine?.getCurrentScene() ?? null;\n }\n\n getState(): PlaybackState {\n return this.engine?.getState() ?? 'idle';\n }\n\n getQuality(): QualityLevel {\n return this.engine?.getQuality() ?? 'auto';\n }\n\n isMounted(): boolean {\n return this.engine?.isMounted() ?? false;\n }\n\n // Performance monitoring\n getCurrentFps(): number {\n return this.engine?.getCurrentFps() ?? 0;\n }\n\n getPerformanceMetrics(): any {\n return this.engine?.getPerformanceMetrics();\n }\n\n getQualitySettings(): any {\n return this.engine?.getQualitySettings();\n }\n\n getDeviceCapabilities(): any {\n return this.engine?.getDeviceCapabilities();\n }\n\n // Audio methods\n setMasterVolume(volume: number): void {\n this.engine?.setMasterVolume(volume);\n }\n\n getMasterVolume(): number {\n return this.engine?.getMasterVolume() ?? 1;\n }\n\n isWebAudioAvailable(): boolean {\n return this.engine?.isWebAudioAvailable() ?? false;\n }\n\n getActiveAudioTrackCount(): number {\n return this.engine?.getActiveAudioTrackCount() ?? 0;\n }\n\n // Direct engine access for advanced use cases\n getEngine(): CinematicRenderer2D | null {\n return this.engine;\n }\n\n private initializeEngine(): void {\n if (!this.containerRef?.nativeElement) {\n throw new Error('Container element not available');\n }\n\n try {\n const options: CinematicRenderer2DOptions = {\n container: this.containerRef.nativeElement,\n spec: this.spec,\n autoplay: this.autoplay,\n quality: this.quality,\n debug: this.debug,\n };\n\n this.engine = new CinematicRenderer2D(options);\n this.setupEventListeners();\n\n // Mount the engine outside Angular zone to avoid triggering change detection on every frame\n this.ngZone.runOutsideAngular(() => {\n this.engine!.mount().catch((error) => {\n console.error('Failed to mount CinematicRenderer2D:', error);\n this.ngZone.run(() => {\n this.error.emit(error);\n });\n });\n });\n\n this.initialized = true;\n\n } catch (error) {\n console.error('Failed to initialize CinematicRenderer2D:', error);\n this.error.emit(error as Error);\n }\n }\n\n private setupEventListeners(): void {\n if (!this.engine) return;\n\n // Forward all engine events to Angular outputs\n // Run event emissions inside Angular zone to trigger change detection\n this.engine.on('ready', () => {\n this.ngZone.run(() => this.ready.emit());\n });\n\n this.engine.on('play', (event: CinematicPlayerEvents['play']) => {\n this.ngZone.run(() => this.play.emit(event));\n });\n\n this.engine.on('pause', (event: CinematicPlayerEvents['pause']) => {\n this.ngZone.run(() => this.pause.emit(event));\n });\n\n this.engine.on('stop', (event: CinematicPlayerEvents['stop']) => {\n this.ngZone.run(() => this.stop.emit(event));\n });\n\n this.engine.on('seek', (event: CinematicPlayerEvents['seek']) => {\n this.ngZone.run(() => this.seek.emit(event));\n });\n\n this.engine.on('eventChange', (event: CinematicPlayerEvents['eventChange']) => {\n this.ngZone.run(() => this.eventChange.emit(event));\n });\n\n this.engine.on('sceneChange', (event: CinematicPlayerEvents['sceneChange']) => {\n this.ngZone.run(() => this.sceneChange.emit(event));\n });\n\n this.engine.on('qualityChange', (event: CinematicPlayerEvents['qualityChange']) => {\n this.ngZone.run(() => this.qualityChange.emit(event));\n });\n\n this.engine.on('resize', (event: CinematicPlayerEvents['resize']) => {\n this.ngZone.run(() => this.resize.emit(event));\n });\n\n this.engine.on('frame', (event: CinematicPlayerEvents['frame']) => {\n // Frame events are high-frequency, so we might want to throttle these\n // or only emit them when specifically needed to avoid performance issues\n this.ngZone.run(() => this.frame.emit(event));\n });\n\n this.engine.on('stateChange', (event: CinematicPlayerEvents['stateChange']) => {\n this.ngZone.run(() => this.stateChange.emit(event));\n });\n\n this.engine.on('ended', () => {\n this.ngZone.run(() => this.ended.emit());\n });\n\n this.engine.on('error', (error: Error) => {\n this.ngZone.run(() => this.error.emit(error));\n });\n\n this.engine.on('loading', () => {\n this.ngZone.run(() => this.loading.emit());\n });\n\n this.engine.on('destroy', (event: CinematicPlayerEvents['destroy']) => {\n this.ngZone.run(() => this.destroy.emit(event));\n });\n\n this.engine.on('audioError', (event: CinematicPlayerEvents['audioError']) => {\n this.ngZone.run(() => this.audioError.emit(event));\n });\n\n this.engine.on('autoplayBlocked', (event: CinematicPlayerEvents['autoplayBlocked']) => {\n this.ngZone.run(() => this.autoplayBlocked.emit(event));\n });\n }\n\n private destroyEngine(): void {\n if (this.engine) {\n this.engine.destroy();\n this.engine = null;\n }\n this.initialized = false;\n }\n}","/**\n * Animation track compilation system\n * \n * Provides high-performance animation compilation with comprehensive easing functions,\n * interpolation for different value types, and support for loops and yoyo effects.\n * All animations are precompiled at parse time to avoid per-frame calculations.\n * \n * Requirements: 6.1, 6.2, 6.3, 6.4, 6.5\n */\n\nimport type { AnimationTrackSpec, EasingType, AnimationValue } from '../types/CinematicSpec';\nimport type { CompiledAnimationTrack, EasingFunction, InterpolationFunction } from '../types/CompiledSpec';\n\n/**\n * Animation compilation system with optimized easing and interpolation functions\n */\nexport class AnimationCompiler {\n /**\n * Compiles an animation track specification into an optimized runtime track\n * \n * @param track - Animation track specification to compile\n * @returns Compiled animation track with precompiled interpolation function\n */\n static compileTrack(track: AnimationTrackSpec): CompiledAnimationTrack {\n const easingFunction = this.compileEasing(track.easing || 'ease');\n const interpolationFunction = this.compileInterpolation(track.from, track.to, easingFunction);\n \n return {\n property: track.property,\n startMs: track.startMs,\n endMs: track.endMs,\n interpolate: interpolationFunction,\n loop: track.loop || false,\n yoyo: track.yoyo || false,\n easingType: track.easing || 'ease',\n currentLoop: 0,\n isReverse: false\n };\n }\n \n /**\n * Compiles an easing function from string specification to optimized function\n * \n * @param easing - Easing type or cubic-bezier specification\n * @returns Optimized easing function that maps [0,1] to [0,1]\n */\n static compileEasing(easing: EasingType): EasingFunction {\n // Handle cubic-bezier functions\n if (typeof easing === 'string' && easing.startsWith('cubic-bezier(')) {\n return this.compileCubicBezier(easing);\n }\n \n // Standard easing functions with optimized implementations\n switch (easing) {\n case 'linear':\n return (t: number) => t;\n \n case 'ease':\n return this.cubicBezier(0.25, 0.1, 0.25, 1);\n \n case 'ease-in':\n return this.cubicBezier(0.42, 0, 1, 1);\n \n case 'ease-out':\n return this.cubicBezier(0, 0, 0.58, 1);\n \n case 'ease-in-out':\n return this.cubicBezier(0.42, 0, 0.58, 1);\n \n // Sine easing functions\n case 'ease-in-sine':\n return (t: number) => 1 - Math.cos((t * Math.PI) / 2);\n \n case 'ease-out-sine':\n return (t: number) => Math.sin((t * Math.PI) / 2);\n \n case 'ease-in-out-sine':\n return (t: number) => -(Math.cos(Math.PI * t) - 1) / 2;\n \n // Quadratic easing functions\n case 'ease-in-quad':\n return (t: number) => t * t;\n \n case 'ease-out-quad':\n return (t: number) => 1 - (1 - t) * (1 - t);\n \n case 'ease-in-out-quad':\n return (t: number) => t < 0.5 ? 2 * t * t : 1 - Math.pow(-2 * t + 2, 2) / 2;\n \n // Cubic easing functions\n case 'ease-in-cubic':\n return (t: number) => t * t * t;\n \n case 'ease-out-cubic':\n return (t: number) => 1 - Math.pow(1 - t, 3);\n \n case 'ease-in-out-cubic':\n return (t: number) => t < 0.5 ? 4 * t * t * t : 1 - Math.pow(-2 * t + 2, 3) / 2;\n \n // Quartic easing functions\n case 'ease-in-quart':\n return (t: number) => t * t * t * t;\n \n case 'ease-out-quart':\n return (t: number) => 1 - Math.pow(1 - t, 4);\n \n case 'ease-in-out-quart':\n return (t: number) => t < 0.5 ? 8 * t * t * t * t : 1 - Math.pow(-2 * t + 2, 4) / 2;\n \n // Quintic easing functions\n case 'ease-in-quint':\n return (t: number) => t * t * t * t * t;\n \n case 'ease-out-quint':\n return (t: number) => 1 - Math.pow(1 - t, 5);\n \n case 'ease-in-out-quint':\n return (t: number) => t < 0.5 ? 16 * t * t * t * t * t : 1 - Math.pow(-2 * t + 2, 5) / 2;\n \n // Exponential easing functions\n case 'ease-in-expo':\n return (t: number) => t === 0 ? 0 : Math.pow(2, 10 * (t - 1));\n \n case 'ease-out-expo':\n return (t: number) => t === 1 ? 1 : 1 - Math.pow(2, -10 * t);\n \n case 'ease-in-out-expo':\n return (t: number) => {\n if (t === 0) return 0;\n if (t === 1) return 1;\n return t < 0.5 \n ? Math.pow(2, 20 * t - 10) / 2\n : (2 - Math.pow(2, -20 * t + 10)) / 2;\n };\n \n // Circular easing functions\n case 'ease-in-circ':\n return (t: number) => 1 - Math.sqrt(1 - Math.pow(t, 2));\n \n case 'ease-out-circ':\n return (t: number) => Math.sqrt(1 - Math.pow(t - 1, 2));\n \n case 'ease-in-out-circ':\n return (t: number) => t < 0.5\n ? (1 - Math.sqrt(1 - Math.pow(2 * t, 2))) / 2\n : (Math.sqrt(1 - Math.pow(-2 * t + 2, 2)) + 1) / 2;\n \n // Back easing functions\n case 'ease-in-back':\n return this.backEasing(1.70158, 'in');\n \n case 'ease-out-back':\n return this.backEasing(1.70158, 'out');\n \n case 'ease-in-out-back':\n return this.backEasing(1.70158, 'in-out');\n \n // Elastic easing functions\n case 'ease-in-elastic':\n return this.elasticEasing(2 * Math.PI / 3, 'in');\n \n case 'ease-out-elastic':\n return this.elasticEasing(2 * Math.PI / 3, 'out');\n \n case 'ease-in-out-elastic':\n return this.elasticEasing(2 * Math.PI / 4.5, 'in-out');\n \n // Bounce easing functions\n case 'ease-in-bounce':\n return (t: number) => 1 - this.bounceOut(1 - t);\n \n case 'ease-out-bounce':\n return this.bounceOut;\n \n case 'ease-in-out-bounce':\n return (t: number) => t < 0.5\n ? (1 - this.bounceOut(1 - 2 * t)) / 2\n : (1 + this.bounceOut(2 * t - 1)) / 2;\n \n default:\n // Fallback to ease\n return this.cubicBezier(0.25, 0.1, 0.25, 1);\n }\n }\n \n /**\n * Compiles an interpolation function for animating between two values\n * \n * @param from - Starting value\n * @param to - Ending value\n * @param easingFunction - Easing function to apply\n * @returns Optimized interpolation function\n */\n static compileInterpolation(from: AnimationValue, to: AnimationValue, easingFunction: EasingFunction): InterpolationFunction {\n // Determine the interpolation strategy based on value types\n const fromType = this.getValueType(from);\n const toType = this.getValueType(to);\n \n if (fromType !== toType) {\n // Type mismatch - use discrete transition\n return (progress: number) => {\n const easedProgress = easingFunction(Math.max(0, Math.min(1, progress)));\n return easedProgress < 0.5 ? from : to;\n };\n }\n \n switch (fromType) {\n case 'number':\n return this.compileNumberInterpolation(from as number, to as number, easingFunction);\n \n case 'string':\n return this.compileStringInterpolation(from as string, to as string, easingFunction);\n \n case 'boolean':\n return this.compileBooleanInterpolation(from as boolean, to as boolean, easingFunction);\n \n case 'object':\n return this.compileObjectInterpolation(\n from as Record<string, any>, \n to as Record<string, any>, \n easingFunction\n );\n \n default:\n // Fallback to discrete transition\n return (progress: number) => {\n const easedProgress = easingFunction(Math.max(0, Math.min(1, progress)));\n return easedProgress < 0.5 ? from : to;\n };\n }\n }\n \n /**\n * Creates a cubic-bezier easing function with the given control points\n */\n private static cubicBezier(x1: number, y1: number, x2: number, y2: number): EasingFunction {\n // Simplified cubic-bezier implementation\n // In a production system, this would use a more accurate algorithm\n return (t: number) => {\n // Use Newton-Raphson method approximation\n const cx = 3 * x1;\n const bx = 3 * (x2 - x1) - cx;\n const ax = 1 - cx - bx;\n \n const cy = 3 * y1;\n const by = 3 * (y2 - y1) - cy;\n const ay = 1 - cy - by;\n \n // Solve for t given x using Newton-Raphson\n let x = t;\n for (let i = 0; i < 8; i++) {\n const currentX = ((ax * x + bx) * x + cx) * x;\n const currentSlope = (3 * ax * x + 2 * bx) * x + cx;\n if (Math.abs(currentSlope) < 1e-6) break;\n x = x - (currentX - t) / currentSlope;\n }\n \n // Calculate y for the solved t\n return ((ay * x + by) * x + cy) * x;\n };\n }\n \n /**\n * Parses and compiles a cubic-bezier string specification\n */\n private static compileCubicBezier(bezierString: string): EasingFunction {\n const match = bezierString.match(/cubic-bezier\\(([^)]+)\\)/);\n if (!match || !match[1]) {\n return this.cubicBezier(0.25, 0.1, 0.25, 1); // Fallback to ease\n }\n \n const values = match[1].split(',').map(v => parseFloat(v.trim()));\n if (values.length !== 4 || values.some(v => isNaN(v))) {\n return this.cubicBezier(0.25, 0.1, 0.25, 1); // Fallback to ease\n }\n \n return this.cubicBezier(values[0]!, values[1]!, values[2]!, values[3]!);\n }\n \n /**\n * Creates a back easing function with overshoot\n */\n private static backEasing(c: number, type: 'in' | 'out' | 'in-out'): EasingFunction {\n const c1 = c;\n const c2 = c1 * 1.525;\n const c3 = c1 + 1;\n \n switch (type) {\n case 'in':\n return (t: number) => c3 * t * t * t - c1 * t * t;\n \n case 'out':\n return (t: number) => 1 + c3 * Math.pow(t - 1, 3) + c1 * Math.pow(t - 1, 2);\n \n case 'in-out':\n return (t: number) => t < 0.5\n ? (Math.pow(2 * t, 2) * ((c2 + 1) * 2 * t - c2)) / 2\n : (Math.pow(2 * t - 2, 2) * ((c2 + 1) * (t * 2 - 2) + c2) + 2) / 2;\n \n default:\n return (t: number) => t;\n }\n }\n \n /**\n * Creates an elastic easing function with oscillation\n */\n private static elasticEasing(c: number, type: 'in' | 'out' | 'in-out'): EasingFunction {\n switch (type) {\n case 'in':\n return (t: number) => {\n if (t === 0) return 0;\n if (t === 1) return 1;\n return -Math.pow(2, 10 * t - 10) * Math.sin((t * 10 - 10.75) * c);\n };\n \n case 'out':\n return (t: number) => {\n if (t === 0) return 0;\n if (t === 1) return 1;\n return Math.pow(2, -10 * t) * Math.sin((t * 10 - 0.75) * c) + 1;\n };\n \n case 'in-out':\n return (t: number) => {\n if (t === 0) return 0;\n if (t === 1) return 1;\n return t < 0.5\n ? -(Math.pow(2, 20 * t - 10) * Math.sin((20 * t - 11.125) * c)) / 2\n : (Math.pow(2, -20 * t + 10) * Math.sin((20 * t - 11.125) * c)) / 2 + 1;\n };\n \n default:\n return (t: number) => t;\n }\n }\n \n /**\n * Bounce easing out function\n */\n private static bounceOut(t: number): number {\n const n1 = 7.5625;\n const d1 = 2.75;\n \n if (t < 1 / d1) {\n return n1 * t * t;\n } else if (t < 2 / d1) {\n return n1 * (t -= 1.5 / d1) * t + 0.75;\n } else if (t < 2.5 / d1) {\n return n1 * (t -= 2.25 / d1) * t + 0.9375;\n } else {\n return n1 * (t -= 2.625 / d1) * t + 0.984375;\n }\n }\n \n /**\n * Determines the type of an animation value\n */\n private static getValueType(value: AnimationValue): 'number' | 'string' | 'boolean' | 'object' {\n if (typeof value === 'number') return 'number';\n if (typeof value === 'string') return 'string';\n if (typeof value === 'boolean') return 'boolean';\n if (typeof value === 'object' && value !== null) return 'object';\n return 'object'; // Fallback\n }\n \n /**\n * Compiles number interpolation with optimized performance\n */\n private static compileNumberInterpolation(from: number, to: number, easingFunction: EasingFunction): InterpolationFunction {\n const delta = to - from;\n return (progress: number) => {\n const easedProgress = easingFunction(Math.max(0, Math.min(1, progress)));\n return from + delta * easedProgress;\n };\n }\n \n /**\n * Compiles string interpolation with CSS value support\n */\n private static compileStringInterpolation(from: string, to: string, easingFunction: EasingFunction): InterpolationFunction {\n // Check if strings contain numeric values that can be interpolated\n const fromMatch = from.match(/^([+-]?\\d*\\.?\\d+)(.*)$/);\n const toMatch = to.match(/^([+-]?\\d*\\.?\\d+)(.*)$/);\n \n if (fromMatch && toMatch && fromMatch[2] === toMatch[2]) {\n // Interpolate numeric part, keep unit\n const fromNum = parseFloat(fromMatch[1]!);\n const toNum = parseFloat(toMatch[1]!);\n const unit = fromMatch[2];\n const delta = toNum - fromNum;\n \n return (progress: number) => {\n const easedProgress = easingFunction(Math.max(0, Math.min(1, progress)));\n const interpolatedValue = fromNum + delta * easedProgress;\n // Round to avoid floating point precision issues\n const roundedValue = Math.round(interpolatedValue * 1000000) / 1000000;\n return `${roundedValue}${unit}`;\n };\n }\n \n // Discrete transition for non-numeric strings\n return (progress: number) => {\n const easedProgress = easingFunction(Math.max(0, Math.min(1, progress)));\n return easedProgress < 0.5 ? from : to;\n };\n }\n \n /**\n * Compiles boolean interpolation (discrete transition)\n */\n private static compileBooleanInterpolation(from: boolean, to: boolean, easingFunction: EasingFunction): InterpolationFunction {\n return (progress: number) => {\n const easedProgress = easingFunction(Math.max(0, Math.min(1, progress)));\n return easedProgress < 0.5 ? from : to;\n };\n }\n \n /**\n * Compiles object interpolation for complex values\n */\n private static compileObjectInterpolation(\n from: Record<string, any>, \n to: Record<string, any>, \n easingFunction: EasingFunction\n ): InterpolationFunction {\n // Pre-compile interpolation functions for each property\n const propertyInterpolators = new Map<string, InterpolationFunction>();\n \n // Get all unique keys from both objects\n const allKeys = new Set([...Object.keys(from), ...Object.keys(to)]);\n \n for (const key of allKeys) {\n const fromValue = from[key];\n const toValue = to[key];\n \n if (fromValue !== undefined && toValue !== undefined) {\n // Both objects have this property - create interpolator\n propertyInterpolators.set(key, this.compileInterpolation(fromValue, toValue, easingFunction));\n } else if (fromValue !== undefined) {\n // Only from has this property - keep constant\n propertyInterpolators.set(key, () => fromValue);\n } else {\n // Only to has this property - discrete transition\n propertyInterpolators.set(key, (progress: number) => {\n const easedProgress = easingFunction(Math.max(0, Math.min(1, progress)));\n return easedProgress < 0.5 ? undefined : toValue;\n });\n }\n }\n \n return (progress: number) => {\n const result: Record<string, any> = {};\n \n for (const [key, interpolator] of propertyInterpolators) {\n const value = interpolator(progress);\n if (value !== undefined) {\n result[key] = value;\n }\n }\n \n return result;\n };\n }\n}","/**\n * JSON Specification Parser with Zod validation\n * \n * Provides comprehensive JSON schema validation, default value application,\n * and descriptive error message generation for cinematic specifications.\n * Supports schema versioning for backward compatibility.\n * \n * Requirements: 3.1, 3.2, 3.4, 3.5\n */\n\nimport { z } from 'zod';\nimport type { \n CinematicSpec, \n CinematicEvent, \n CinematicScene, \n LayerSpec, \n AnimationTrackSpec, \n AudioTrackSpec, \n TransitionSpec, \n AssetDefinition,\n EasingType\n} from '../types/CinematicSpec';\nimport type { \n CompiledSpec, \n CompiledEvent, \n CompiledScene, \n CompiledLayer, \n CompiledAnimationTrack, \n CompiledAudioTrack, \n CompiledTransition,\n CompilationContext\n} from '../types/CompiledSpec';\nimport type { Asset } from '../types/AssetTypes';\nimport { AnimationCompiler } from '../animation/AnimationCompiler';\n\n/**\n * Supported schema versions for backward compatibility\n */\nconst SUPPORTED_SCHEMA_VERSIONS = ['1.0.0', '1.1.0'] as const;\n\n/**\n * Zod schema definitions for comprehensive validation\n */\n\n// Basic type schemas\nconst QualityLevelSchema = z.enum(['low', 'medium', 'high', 'ultra', 'auto']);\nconst LayerTypeSchema = z.enum([\n 'gradient', 'image', 'textBlock', 'vignette', 'glowOrb', 'noiseOverlay',\n 'particles', 'starfield', 'dust', 'nebulaNoise', 'webgl-custom'\n]);\nconst EasingTypeSchema = z.enum([\n 'linear', 'ease', 'ease-in', 'ease-out', 'ease-in-out',\n 'ease-in-sine', 'ease-out-sine', 'ease-in-out-sine',\n 'ease-in-quad', 'ease-out-quad', 'ease-in-out-quad',\n 'ease-in-cubic', 'ease-out-cubic', 'ease-in-out-cubic',\n 'ease-in-quart', 'ease-out-quart', 'ease-in-out-quart',\n 'ease-in-quint', 'ease-out-quint', 'ease-in-out-quint',\n 'ease-in-expo', 'ease-out-expo', 'ease-in-out-expo',\n 'ease-in-circ', 'ease-out-circ', 'ease-in-out-circ',\n 'ease-in-back', 'ease-out-back', 'ease-in-out-back',\n 'ease-in-elastic', 'ease-out-elastic', 'ease-in-out-elastic',\n 'ease-in-bounce', 'ease-out-bounce', 'ease-in-out-bounce'\n]).or(z.string().regex(/^cubic-bezier\\(\\d*\\.?\\d+,\\d*\\.?\\d+,\\d*\\.?\\d+,\\d*\\.?\\d+\\)$/));\nconst AudioTrackTypeSchema = z.enum(['voiceover', 'ambience', 'transition', 'music', 'sfx']);\nconst TransitionTypeSchema = z.enum(['fade', 'slide', 'zoom', 'wipe', 'dissolve', 'blur']);\nconst AssetTypeSchema = z.enum(['image', 'video', 'audio', 'font', 'json', 'binary']);\n\n// Transform configuration schema\nconst TransformConfigSchema = z.object({\n x: z.union([z.number(), z.string()]).optional(),\n y: z.union([z.number(), z.string()]).optional(),\n scale: z.number().optional(),\n rotation: z.number().optional(),\n origin: z.string().optional()\n}).optional();\n\n// Layer configuration schema\nconst LayerConfigSchema = z.object({\n opacity: z.number().min(0).max(1).optional(),\n visible: z.boolean().optional(),\n transform: TransformConfigSchema\n}).catchall(z.any()); // Allow additional layer-specific properties\n\n// Animation value schema\nconst AnimationValueSchema = z.union([\n z.number(),\n z.string(),\n z.boolean(),\n z.record(z.union([z.number(), z.string(), z.boolean()]))\n]);\n\n// Animation track schema\nconst AnimationTrackSpecSchema = z.object({\n property: z.string().min(1),\n from: AnimationValueSchema,\n to: AnimationValueSchema,\n startMs: z.number().min(0),\n endMs: z.number().min(0),\n easing: EasingTypeSchema.optional().default('ease' as EasingType),\n loop: z.boolean().optional().default(false),\n yoyo: z.boolean().optional().default(false)\n}).refine(data => data.endMs > data.startMs, {\n message: \"endMs must be greater than startMs\",\n path: [\"endMs\"]\n});\n\n// Audio track schema\nconst AudioTrackSpecSchema = z.object({\n id: z.string().min(1),\n type: AudioTrackTypeSchema,\n src: z.string().min(1),\n startMs: z.number().min(0),\n endMs: z.number().min(0).optional(),\n volume: z.number().min(0).max(1).optional().default(1),\n fadeIn: z.number().min(0).optional().default(0),\n fadeOut: z.number().min(0).optional().default(0),\n loop: z.boolean().optional().default(false)\n});\n\n// Transition configuration schema\nconst TransitionConfigSchema = z.object({\n direction: z.enum(['up', 'down', 'left', 'right', 'in', 'out']).optional(),\n blurAmount: z.number().min(0).optional()\n}).catchall(z.any()).optional();\n\n// Transition spec schema\nconst TransitionSpecSchema = z.object({\n type: TransitionTypeSchema,\n duration: z.number().min(0),\n easing: EasingTypeSchema.optional().default('ease' as EasingType),\n config: TransitionConfigSchema\n});\n\n// Asset metadata schema\nconst AssetMetadataSchema = z.object({\n size: z.number().min(0).optional(),\n mimeType: z.string().optional(),\n cacheDuration: z.number().min(0).optional(),\n dimensions: z.object({\n width: z.number().min(1),\n height: z.number().min(1)\n }).optional(),\n duration: z.number().min(0).optional()\n}).optional();\n\n// Asset definition schema\nconst AssetDefinitionSchema = z.object({\n id: z.string().min(1),\n type: AssetTypeSchema,\n src: z.string().min(1),\n preload: z.boolean().optional().default(true),\n fallback: z.string().optional(),\n metadata: AssetMetadataSchema\n});\n\n// Layer spec schema\nconst LayerSpecSchema = z.object({\n id: z.string().min(1),\n type: LayerTypeSchema,\n zIndex: z.number(),\n config: LayerConfigSchema,\n animations: z.array(AnimationTrackSpecSchema).optional().default([])\n});\n\n// Scene schema\nconst CinematicSceneSchema = z.object({\n id: z.string().min(1),\n name: z.string().min(1),\n duration: z.number().min(0),\n layers: z.array(LayerSpecSchema).min(1),\n audio: z.array(AudioTrackSpecSchema).optional().default([])\n});\n\n// Event schema\nconst CinematicEventSchema = z.object({\n id: z.string().min(1),\n name: z.string().min(1),\n scenes: z.array(z.string().min(1)).min(1),\n transitions: z.array(TransitionSpecSchema).optional().default([])\n});\n\n// Engine configuration schema\nconst EngineConfigSchema = z.object({\n targetFps: z.number().min(1).max(240).optional().default(60),\n quality: QualityLevelSchema.optional().default('auto'),\n debug: z.boolean().optional().default(false),\n autoplay: z.boolean().optional().default(false)\n});\n\n// Main cinematic spec schema\nconst CinematicSpecSchema = z.object({\n schemaVersion: z.string().min(1),\n engine: EngineConfigSchema,\n events: z.array(CinematicEventSchema).min(1),\n scenes: z.array(CinematicSceneSchema).min(1),\n assets: z.array(AssetDefinitionSchema).optional().default([])\n}).refine(data => {\n // Validate that all scene IDs referenced in events exist\n const sceneIds = new Set(data.scenes.map(scene => scene.id));\n const referencedSceneIds = new Set(data.events.flatMap(event => event.scenes));\n \n for (const sceneId of referencedSceneIds) {\n if (!sceneIds.has(sceneId)) {\n return false;\n }\n }\n return true;\n}, {\n message: \"All scene IDs referenced in events must exist in the scenes array\",\n path: [\"events\"]\n}).refine(data => {\n // Validate unique IDs within each collection\n const eventIds = data.events.map(e => e.id);\n const sceneIds = data.scenes.map(s => s.id);\n const assetIds = data.assets?.map(a => a.id) || [];\n \n return new Set(eventIds).size === eventIds.length &&\n new Set(sceneIds).size === sceneIds.length &&\n new Set(assetIds).size === assetIds.length;\n}, {\n message: \"All IDs must be unique within their respective collections\",\n path: [\"events\", \"scenes\", \"assets\"]\n});\n\n/**\n * SpecParser class with comprehensive Zod validation and compilation\n */\nexport class SpecParser {\n /**\n * Validates and parses a raw JSON specification into a validated CinematicSpec\n * \n * @param spec - Raw JSON specification to validate\n * @returns Validated CinematicSpec with applied defaults\n * @throws ZodError with descriptive validation messages\n */\n static validate(spec: unknown): CinematicSpec {\n try {\n // First validate the schema version\n if (typeof spec !== 'object' || spec === null) {\n throw new Error('Specification must be a valid object');\n }\n \n const rawSpec = spec as Record<string, any>;\n const schemaVersion = rawSpec['schemaVersion'];\n \n if (!schemaVersion || typeof schemaVersion !== 'string') {\n throw new Error('Missing or invalid schemaVersion. Current supported versions: ' + \n SUPPORTED_SCHEMA_VERSIONS.join(', '));\n }\n \n if (!SUPPORTED_SCHEMA_VERSIONS.includes(schemaVersion as any)) {\n throw new Error(`Unsupported schema version: ${schemaVersion}. ` +\n `Supported versions: ${SUPPORTED_SCHEMA_VERSIONS.join(', ')}`);\n }\n \n // Apply schema version-specific validation\n const validatedSpec = this.validateByVersion(spec, schemaVersion);\n \n return validatedSpec;\n } catch (error) {\n if (error instanceof z.ZodError) {\n throw new Error(this.formatZodError(error));\n }\n throw error;\n }\n }\n \n /**\n * Compiles a validated CinematicSpec into an optimized CompiledSpec\n * \n * @param spec - Validated CinematicSpec to compile\n * @returns CompiledSpec with precompiled animations and optimized runtime structures\n */\n static parse(spec: CinematicSpec): CompiledSpec {\n const context: CompilationContext = {\n schemaVersion: spec.schemaVersion,\n assetPromises: new Map(),\n layerTypes: new Set(spec.scenes.flatMap(s => s.layers.map(l => l.type))),\n diagnostics: [],\n optimizations: {\n precompileAnimations: true,\n optimizeAssetLoading: true,\n enableObjectPooling: true,\n minimizeDOMUpdates: true,\n useWebWorkers: false // Disabled for now\n }\n };\n \n try {\n // Compile assets\n const compiledAssets = this.compileAssets(spec.assets || [], context);\n \n // Compile scenes first (needed for events)\n const compiledScenes = this.compileScenes(spec.scenes, context);\n \n // Compile events\n const compiledEvents = this.compileEvents(spec.events, compiledScenes, context);\n \n // Calculate total duration\n const totalDuration = Math.max(...Array.from(compiledEvents.values())\n .map(event => event.startTime + event.duration));\n \n const compiledSpec: CompiledSpec = {\n events: compiledEvents,\n scenes: compiledScenes,\n assets: compiledAssets,\n globalConfig: spec.engine,\n schemaVersion: spec.schemaVersion,\n totalDuration,\n compiledAt: Date.now()\n };\n \n // Log any compilation warnings\n if (context.diagnostics.length > 0) {\n console.warn('Compilation completed with warnings:', context.diagnostics);\n }\n \n return compiledSpec;\n } catch (error) {\n context.diagnostics.push({\n level: 'error',\n message: error instanceof Error ? error.message : 'Unknown compilation error',\n code: 'COMPILATION_ERROR'\n });\n throw new Error(`Compilation failed: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n }\n \n /**\n * Validates specification based on schema version\n */\n private static validateByVersion(spec: unknown, version: string): CinematicSpec {\n // For now, all supported versions use the same schema\n // In the future, this would handle version-specific differences\n switch (version) {\n case '1.0.0':\n case '1.1.0':\n return CinematicSpecSchema.parse(spec) as CinematicSpec;\n default:\n throw new Error(`Unsupported schema version: ${version}`);\n }\n }\n \n /**\n * Compiles asset definitions into runtime assets\n */\n private static compileAssets(assets: AssetDefinition[], _context: CompilationContext): Map<string, Asset> {\n const compiledAssets = new Map<string, Asset>();\n \n for (const assetDef of assets) {\n // Create a basic asset object (actual loading would happen in AssetManager)\n const asset: Asset = {\n id: assetDef.id,\n type: assetDef.type,\n src: assetDef.src,\n data: null,\n loaded: false,\n error: null,\n fallback: assetDef.fallback,\n metadata: {\n size: assetDef.metadata?.size || 0,\n mimeType: assetDef.metadata?.mimeType || '',\n cacheDuration: assetDef.metadata?.cacheDuration || 3600000, // 1 hour default\n dimensions: assetDef.metadata?.dimensions,\n duration: assetDef.metadata?.duration,\n quality: 1,\n streamable: false,\n priority: 'normal'\n },\n progress: 0\n };\n \n compiledAssets.set(assetDef.id, asset);\n }\n \n return compiledAssets;\n }\n \n /**\n * Compiles scene definitions into runtime scenes\n */\n private static compileScenes(scenes: CinematicScene[], context: CompilationContext): Map<string, CompiledScene> {\n const compiledScenes = new Map<string, CompiledScene>();\n let currentStartTime = 0;\n \n for (const scene of scenes) {\n const compiledLayers = this.compileLayers(scene.layers, context);\n const compiledAudioTracks = this.compileAudioTracks(scene.audio || [], context);\n \n const compiledScene: CompiledScene = {\n id: scene.id,\n name: scene.name,\n duration: scene.duration,\n layers: compiledLayers,\n audioTracks: compiledAudioTracks,\n startTime: currentStartTime,\n endTime: currentStartTime + scene.duration\n };\n \n compiledScenes.set(scene.id, compiledScene);\n currentStartTime += scene.duration;\n }\n \n return compiledScenes;\n }\n \n /**\n * Compiles layer specifications into runtime layers\n */\n private static compileLayers(layers: LayerSpec[], context: CompilationContext): CompiledLayer[] {\n return layers\n .sort((a, b) => a.zIndex - b.zIndex) // Sort by z-index for rendering order\n .map(layer => {\n const compiledAnimations = this.compileAnimationTracks(layer.animations || [], context);\n \n // Create a placeholder layer instance (actual instantiation happens in LayerRegistry)\n const layerInstance = {\n id: layer.id,\n type: layer.type,\n zIndex: layer.zIndex,\n mount: () => {},\n update: () => {},\n destroy: () => {}\n } as any; // Placeholder - real implementation in LayerRegistry\n \n const compiledLayer: CompiledLayer = {\n id: layer.id,\n type: layer.type,\n zIndex: layer.zIndex,\n instance: layerInstance,\n animations: compiledAnimations,\n initialConfig: { ...layer.config },\n active: true\n };\n \n return compiledLayer;\n });\n }\n \n /**\n * Compiles animation tracks into optimized runtime animations\n */\n private static compileAnimationTracks(tracks: AnimationTrackSpec[], _context: CompilationContext): CompiledAnimationTrack[] {\n return tracks.map(track => AnimationCompiler.compileTrack(track));\n }\n \n /**\n * Compiles audio tracks into runtime audio objects\n */\n private static compileAudioTracks(tracks: AudioTrackSpec[], _context: CompilationContext): CompiledAudioTrack[] {\n return tracks.map(track => {\n // Create placeholder asset reference (actual loading in AssetManager)\n const asset: Asset = {\n id: track.id,\n type: 'audio',\n src: track.src,\n data: null,\n loaded: false,\n error: null,\n metadata: {\n size: 0,\n mimeType: 'audio/mpeg',\n cacheDuration: 3600000,\n priority: 'normal'\n },\n progress: 0\n };\n \n const compiledTrack: CompiledAudioTrack = {\n id: track.id,\n type: track.type,\n asset,\n startMs: track.startMs,\n endMs: track.endMs || 0, // Will be set when audio loads\n volume: track.volume || 1,\n fadeIn: track.fadeIn || 0,\n fadeOut: track.fadeOut || 0,\n loop: track.loop || false\n };\n \n return compiledTrack;\n });\n }\n \n /**\n * Compiles event definitions into runtime events\n */\n private static compileEvents(events: CinematicEvent[], scenes: Map<string, CompiledScene>, context: CompilationContext): Map<string, CompiledEvent> {\n const compiledEvents = new Map<string, CompiledEvent>();\n let currentStartTime = 0;\n \n for (const event of events) {\n const eventScenes = event.scenes.map(sceneId => {\n const scene = scenes.get(sceneId);\n if (!scene) {\n throw new Error(`Scene with ID \"${sceneId}\" not found for event \"${event.id}\"`);\n }\n return scene;\n });\n \n const compiledTransitions = this.compileTransitions(event.transitions || [], context);\n const eventDuration = eventScenes.reduce((total, scene) => total + scene.duration, 0);\n \n const compiledEvent: CompiledEvent = {\n id: event.id,\n name: event.name,\n scenes: eventScenes,\n transitions: compiledTransitions,\n duration: eventDuration,\n startTime: currentStartTime\n };\n \n compiledEvents.set(event.id, compiledEvent);\n currentStartTime += eventDuration;\n }\n \n return compiledEvents;\n }\n \n /**\n * Compiles transition specifications into runtime transitions\n */\n private static compileTransitions(transitions: TransitionSpec[], _context: CompilationContext): CompiledTransition[] {\n return transitions.map(transition => {\n const easingFunction = AnimationCompiler.compileEasing(transition.easing || 'ease');\n \n // Create placeholder transition execution function\n const executeFunction = (progress: number, _fromElement: HTMLElement, _toElement: HTMLElement) => {\n // Actual implementation would be in the transition system\n // TODO: Implement transition execution logic\n void progress; // Suppress unused parameter warning\n };\n \n const compiledTransition: CompiledTransition = {\n type: transition.type,\n duration: transition.duration,\n easingFunction,\n config: transition.config || {},\n execute: executeFunction\n };\n \n return compiledTransition;\n });\n }\n \n /**\n * Formats Zod validation errors into human-readable messages\n */\n private static formatZodError(error: z.ZodError): string {\n const messages = error.errors.map(err => {\n const path = err.path.length > 0 ? `at ${err.path.join('.')}` : 'at root';\n return `${path}: ${err.message}`;\n });\n \n return `Specification validation failed:\\n${messages.join('\\n')}`;\n }\n}","/**\n * Frame scheduling system using requestAnimationFrame with FPS monitoring\n * and performance tracking for adaptive quality management.\n * \n * Requirements: 2.5, 8.1, 8.2, 8.3\n */\n\nimport type { PerformanceMetrics, QualityLevel } from '../types/QualityTypes';\n\nexport interface FrameContext {\n /** Time elapsed since last frame in milliseconds */\n deltaMs: number;\n /** Current timestamp from performance.now() */\n currentTime: number;\n /** Current frames per second */\n fps: number;\n /** Frame number since start */\n frameNumber: number;\n /** Current performance metrics */\n metrics: PerformanceMetrics;\n}\n\nexport interface SchedulerOptions {\n /** Target FPS (default: 60) */\n targetFps?: number;\n /** FPS monitoring window size in frames (default: 60) */\n fpsWindowSize?: number;\n /** Performance monitoring interval in milliseconds (default: 1000) */\n monitoringInterval?: number;\n /** Whether to enable adaptive quality (default: true) */\n enableAdaptiveQuality?: boolean;\n}\n\nexport class Scheduler {\n private isRunning = false;\n private animationFrameId: number | null = null;\n private lastFrameTime = 0;\n private frameCallbacks: ((context: FrameContext) => void)[] = [];\n \n // Performance monitoring\n private frameNumber = 0;\n private frameTimes: number[] = [];\n private currentFps = 0;\n private lastMonitoringTime = 0;\n private performanceMetrics: PerformanceMetrics;\n \n // Configuration\n private options: Required<SchedulerOptions>;\n \n // Quality system integration\n private qualityChangeCallbacks: ((metrics: PerformanceMetrics) => void)[] = [];\n \n constructor(options: SchedulerOptions = {}) {\n this.options = {\n targetFps: options.targetFps || 60,\n fpsWindowSize: options.fpsWindowSize || 60,\n monitoringInterval: options.monitoringInterval || 1000,\n enableAdaptiveQuality: options.enableAdaptiveQuality !== false,\n };\n \n this.performanceMetrics = {\n fps: 0,\n frameTime: 0,\n activeParticles: 0,\n activeLayers: 0,\n domNodes: 0,\n drawCalls: 0,\n };\n }\n \n start(): void {\n if (this.isRunning) return;\n \n this.isRunning = true;\n this.frameNumber = 0;\n this.frameTimes = [];\n this.lastFrameTime = performance.now();\n this.lastMonitoringTime = this.lastFrameTime;\n this.scheduleFrame();\n }\n \n stop(): void {\n this.isRunning = false;\n if (this.animationFrameId !== null) {\n cancelAnimationFrame(this.animationFrameId);\n this.animationFrameId = null;\n }\n \n // Reset performance tracking\n this.frameNumber = 0;\n this.frameTimes = [];\n this.currentFps = 0;\n }\n \n addFrameCallback(callback: (context: FrameContext) => void): void {\n this.frameCallbacks.push(callback);\n }\n \n removeFrameCallback(callback: (context: FrameContext) => void): void {\n const index = this.frameCallbacks.indexOf(callback);\n if (index > -1) {\n this.frameCallbacks.splice(index, 1);\n }\n }\n \n addQualityChangeCallback(callback: (metrics: PerformanceMetrics) => void): void {\n this.qualityChangeCallbacks.push(callback);\n }\n \n removeQualityChangeCallback(callback: (metrics: PerformanceMetrics) => void): void {\n const index = this.qualityChangeCallbacks.indexOf(callback);\n if (index > -1) {\n this.qualityChangeCallbacks.splice(index, 1);\n }\n }\n \n getCurrentFps(): number {\n return this.currentFps;\n }\n \n getPerformanceMetrics(): PerformanceMetrics {\n return { ...this.performanceMetrics };\n }\n \n updateMetrics(updates: Partial<PerformanceMetrics>): void {\n this.performanceMetrics = { ...this.performanceMetrics, ...updates };\n }\n \n private scheduleFrame(): void {\n if (!this.isRunning) return;\n \n this.animationFrameId = requestAnimationFrame((currentTime) => {\n const deltaMs = currentTime - this.lastFrameTime;\n this.lastFrameTime = currentTime;\n this.frameNumber++;\n \n // Update FPS tracking\n this.updateFpsTracking(deltaMs);\n \n // Update performance metrics\n this.performanceMetrics.fps = this.currentFps;\n this.performanceMetrics.frameTime = deltaMs;\n \n // Create frame context\n const frameContext: FrameContext = {\n deltaMs,\n currentTime,\n fps: this.currentFps,\n frameNumber: this.frameNumber,\n metrics: { ...this.performanceMetrics },\n };\n \n // Execute all frame callbacks\n this.frameCallbacks.forEach(callback => {\n try {\n callback(frameContext);\n } catch (error) {\n console.error('Error in frame callback:', error);\n }\n });\n \n // Check for performance monitoring\n if (this.options.enableAdaptiveQuality && \n currentTime - this.lastMonitoringTime >= this.options.monitoringInterval) {\n this.performPerformanceCheck();\n this.lastMonitoringTime = currentTime;\n }\n \n // Schedule next frame\n this.scheduleFrame();\n });\n }\n \n private updateFpsTracking(deltaMs: number): void {\n // Add current frame time to tracking window\n this.frameTimes.push(deltaMs);\n \n // Keep only the last N frame times for rolling average\n if (this.frameTimes.length > this.options.fpsWindowSize) {\n this.frameTimes.shift();\n }\n \n // Calculate FPS from average frame time\n if (this.frameTimes.length > 0) {\n const averageFrameTime = this.frameTimes.reduce((sum, time) => sum + time, 0) / this.frameTimes.length;\n this.currentFps = averageFrameTime > 0 ? 1000 / averageFrameTime : 0;\n }\n }\n \n private performPerformanceCheck(): void {\n const targetFps = this.options.targetFps;\n const currentFps = this.currentFps;\n \n // Check if we're significantly below target FPS\n const fpsRatio = currentFps / targetFps;\n const isPerformancePoor = fpsRatio < 0.8; // 20% below target\n const isPerformanceGood = fpsRatio > 0.95; // Within 5% of target\n \n // Notify quality system callbacks\n this.qualityChangeCallbacks.forEach(callback => {\n try {\n callback(this.performanceMetrics);\n } catch (error) {\n console.error('Error in quality change callback:', error);\n }\n });\n \n // Log performance warnings in development\n if (typeof process !== 'undefined' && process.env && process.env['NODE_ENV'] === 'development') {\n if (isPerformancePoor) {\n console.warn(`Performance warning: FPS ${currentFps.toFixed(1)} is below target ${targetFps}`);\n }\n }\n }\n \n // Utility methods for performance monitoring\n \n /** Get average frame time over the monitoring window */\n getAverageFrameTime(): number {\n if (this.frameTimes.length === 0) return 0;\n return this.frameTimes.reduce((sum, time) => sum + time, 0) / this.frameTimes.length;\n }\n \n /** Get frame time variance (measure of frame time consistency) */\n getFrameTimeVariance(): number {\n if (this.frameTimes.length < 2) return 0;\n \n const average = this.getAverageFrameTime();\n const variance = this.frameTimes.reduce((sum, time) => {\n const diff = time - average;\n return sum + (diff * diff);\n }, 0) / this.frameTimes.length;\n \n return variance;\n }\n \n /** Check if performance is stable (low variance) */\n isPerformanceStable(): boolean {\n const variance = this.getFrameTimeVariance();\n const averageFrameTime = this.getAverageFrameTime();\n \n // Consider performance stable if variance is less than 10% of average frame time\n return variance < (averageFrameTime * 0.1);\n }\n \n /** Get performance grade (A, B, C, D, F) */\n getPerformanceGrade(): string {\n const fpsRatio = this.currentFps / this.options.targetFps;\n const isStable = this.isPerformanceStable();\n \n if (fpsRatio >= 0.95 && isStable) return 'A';\n if (fpsRatio >= 0.85 && isStable) return 'B';\n if (fpsRatio >= 0.70) return 'C';\n if (fpsRatio >= 0.50) return 'D';\n return 'F';\n }\n}","/**\n * Adaptive quality system for performance optimization\n * \n * This system monitors performance metrics and automatically adjusts\n * rendering quality to maintain target frame rates while respecting\n * user preferences and device capabilities.\n * \n * Requirements: 8.1, 8.2, 8.3, 8.4, 8.5\n */\n\nimport type { \n QualityLevel, \n QualitySettings, \n PerformanceMetrics, \n DeviceCapabilities,\n QualitySystemConfig,\n PerformanceEvent,\n QUALITY_PRESETS \n} from '../types/QualityTypes';\n\nexport class QualitySystem {\n private currentQuality: QualityLevel = 'auto';\n private currentSettings: QualitySettings;\n private deviceCapabilities: DeviceCapabilities;\n private config: Required<QualitySystemConfig>;\n \n // Performance tracking\n private performanceHistory: PerformanceMetrics[] = [];\n private badFrameCount = 0;\n private goodFrameCount = 0;\n private lastQualityChange = 0;\n \n // Event callbacks\n private eventCallbacks: ((event: PerformanceEvent) => void)[] = [];\n \n constructor(config: Partial<QualitySystemConfig> = {}) {\n this.config = {\n monitoringInterval: config.monitoringInterval || 1000,\n fpsThreshold: config.fpsThreshold || 50,\n badFrameThreshold: config.badFrameThreshold || 5,\n goodFrameThreshold: config.goodFrameThreshold || 30,\n respectUserPreferences: config.respectUserPreferences !== false,\n useDeviceDetection: config.useDeviceDetection !== false,\n customLevels: config.customLevels || {},\n };\n \n // Detect device capabilities\n this.deviceCapabilities = this.detectDeviceCapabilities();\n \n // Start with auto quality\n this.currentQuality = 'auto';\n this.currentSettings = this.getQualitySettings('auto');\n \n // Apply initial quality based on device capabilities if device detection is enabled\n if (this.config.useDeviceDetection) {\n const initialQuality = this.determineInitialQuality();\n // Only change from auto if we determined a specific quality\n if (initialQuality !== 'auto') {\n this.currentQuality = initialQuality;\n this.currentSettings = this.getQualitySettings(initialQuality);\n }\n }\n }\n \n setQuality(level: QualityLevel): void {\n if (this.currentQuality === level) return;\n \n const previousQuality = this.currentQuality;\n this.currentQuality = level;\n this.currentSettings = this.getQualitySettings(level);\n this.lastQualityChange = performance.now();\n \n // Reset frame counters\n this.badFrameCount = 0;\n this.goodFrameCount = 0;\n \n // Emit quality change event\n this.emitEvent({\n type: 'quality-change',\n metrics: this.getLatestMetrics(),\n previousQuality,\n newQuality: level,\n timestamp: performance.now(),\n });\n }\n \n getCurrentQuality(): QualityLevel {\n return this.currentQuality;\n }\n \n getCurrentSettings(): QualitySettings {\n return { ...this.currentSettings };\n }\n \n getDeviceCapabilities(): DeviceCapabilities {\n return { ...this.deviceCapabilities };\n }\n \n updatePerformanceMetrics(metrics: PerformanceMetrics): void {\n // Add to performance history\n this.performanceHistory.push({ ...metrics, timestamp: performance.now() } as any);\n \n // Keep only recent history (last 60 seconds)\n const cutoffTime = performance.now() - 60000;\n this.performanceHistory = this.performanceHistory.filter(\n m => (m as any).timestamp > cutoffTime\n );\n \n // Only adjust quality in auto mode\n if (this.currentQuality === 'auto') {\n this.evaluatePerformanceAndAdjust(metrics);\n }\n \n // Check for performance warnings\n this.checkPerformanceWarnings(metrics);\n }\n \n addEventListener(callback: (event: PerformanceEvent) => void): void {\n this.eventCallbacks.push(callback);\n }\n \n removeEventListener(callback: (event: PerformanceEvent) => void): void {\n const index = this.eventCallbacks.indexOf(callback);\n if (index > -1) {\n this.eventCallbacks.splice(index, 1);\n }\n }\n \n // Get quality settings for a specific level\n private getQualitySettings(level: QualityLevel): QualitySettings {\n // Check for custom levels first\n if (this.config.customLevels[level]) {\n return { ...this.config.customLevels[level] };\n }\n \n // Use preset levels\n const presets = this.getQualityPresets();\n \n if (level === 'auto') {\n // Auto mode: determine best quality based on device capabilities\n const autoLevel = this.determineAutoQuality();\n return { ...presets[autoLevel] };\n }\n \n return { ...presets[level] };\n }\n \n private getQualityPresets() {\n // Import QUALITY_PRESETS or define inline to avoid circular dependency\n return {\n low: {\n particleCount: 50,\n canvasResolution: 0.5,\n animationPrecision: 30,\n enableBlur: false,\n enableShadows: false,\n targetFps: 30,\n enableAdvancedEffects: false,\n textureQuality: 0.5,\n useHardwareAcceleration: false,\n },\n medium: {\n particleCount: 200,\n canvasResolution: 0.75,\n animationPrecision: 60,\n enableBlur: true,\n enableShadows: false,\n targetFps: 60,\n enableAdvancedEffects: false,\n textureQuality: 0.75,\n useHardwareAcceleration: true,\n },\n high: {\n particleCount: 500,\n canvasResolution: 1.0,\n animationPrecision: 60,\n enableBlur: true,\n enableShadows: true,\n targetFps: 60,\n enableAdvancedEffects: true,\n textureQuality: 1.0,\n useHardwareAcceleration: true,\n },\n ultra: {\n particleCount: 1000,\n canvasResolution: 1.5,\n animationPrecision: 120,\n enableBlur: true,\n enableShadows: true,\n targetFps: 120,\n enableAdvancedEffects: true,\n textureQuality: 1.5,\n useHardwareAcceleration: true,\n },\n auto: {\n particleCount: 200,\n canvasResolution: 1.0,\n animationPrecision: 60,\n enableBlur: true,\n enableShadows: true,\n targetFps: 60,\n enableAdvancedEffects: true,\n textureQuality: 1.0,\n useHardwareAcceleration: true,\n },\n } as Record<QualityLevel, QualitySettings>;\n }\n \n private detectDeviceCapabilities(): DeviceCapabilities {\n const nav = navigator as any;\n \n // Safe access to browser APIs with fallbacks for test environments\n const getMatchMedia = () => {\n if (typeof window !== 'undefined' && window.matchMedia) {\n return window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n }\n return false;\n };\n \n const getDevicePixelRatio = () => {\n if (typeof window !== 'undefined' && window.devicePixelRatio) {\n return window.devicePixelRatio;\n }\n return 1;\n };\n \n const getRefreshRate = () => {\n if (typeof screen !== 'undefined' && (screen as any).refreshRate) {\n return (screen as any).refreshRate;\n }\n return undefined;\n };\n \n return {\n memory: nav.deviceMemory,\n cores: nav.hardwareConcurrency,\n prefersReducedMotion: getMatchMedia(),\n devicePixelRatio: getDevicePixelRatio(),\n supportsHardwareAcceleration: this.detectHardwareAcceleration(),\n isMobile: this.detectMobile(),\n connectionType: this.detectConnectionType(),\n refreshRate: getRefreshRate(),\n };\n }\n \n private detectHardwareAcceleration(): boolean {\n try {\n if (typeof document === 'undefined') return false;\n \n const canvas = document.createElement('canvas');\n const gl = canvas.getContext('webgl') || canvas.getContext('experimental-webgl');\n return !!gl;\n } catch {\n return false;\n }\n }\n \n private detectMobile(): boolean {\n if (typeof navigator === 'undefined') return false;\n return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);\n }\n \n private detectConnectionType(): DeviceCapabilities['connectionType'] {\n if (typeof navigator === 'undefined') return undefined;\n \n const nav = navigator as any;\n const connection = nav.connection || nav.mozConnection || nav.webkitConnection;\n \n if (connection) {\n return connection.effectiveType || connection.type;\n }\n \n return undefined;\n }\n \n private determineInitialQuality(): QualityLevel {\n const caps = this.deviceCapabilities;\n \n // Respect user preferences\n if (this.config.respectUserPreferences && caps.prefersReducedMotion) {\n return 'low';\n }\n \n // Mobile devices default to medium\n if (caps.isMobile) {\n return 'medium';\n }\n \n // Low memory devices\n if (caps.memory && caps.memory < 4) {\n return 'low';\n }\n \n // High-end devices\n if (caps.memory && caps.memory >= 8 && caps.cores && caps.cores >= 8) {\n return 'high';\n }\n \n // Default to medium\n return 'medium';\n }\n \n private determineAutoQuality(): QualityLevel {\n const recentMetrics = this.getRecentMetrics();\n \n if (recentMetrics.length === 0) {\n return this.determineInitialQuality();\n }\n \n const avgFps = recentMetrics.reduce((sum, m) => sum + m.fps, 0) / recentMetrics.length;\n const targetFps = this.currentSettings.targetFps;\n \n // Determine quality based on performance\n if (avgFps >= targetFps * 0.95) {\n // Performance is good, can potentially increase quality\n if (this.currentQuality === 'low') return 'medium';\n if (this.currentQuality === 'medium') return 'high';\n if (this.currentQuality === 'high' && !this.deviceCapabilities.isMobile) return 'ultra';\n } else if (avgFps < targetFps * 0.8) {\n // Performance is poor, should decrease quality\n if (this.currentQuality === 'ultra') return 'high';\n if (this.currentQuality === 'high') return 'medium';\n if (this.currentQuality === 'medium') return 'low';\n }\n \n return this.currentQuality;\n }\n \n private evaluatePerformanceAndAdjust(metrics: PerformanceMetrics): void {\n const targetFps = this.currentSettings.targetFps;\n const currentFps = metrics.fps;\n \n // Avoid frequent quality changes\n const timeSinceLastChange = performance.now() - this.lastQualityChange;\n if (timeSinceLastChange < this.config.monitoringInterval * 2) {\n return;\n }\n \n // Track performance\n if (currentFps < targetFps * 0.8) {\n this.badFrameCount++;\n this.goodFrameCount = 0;\n } else if (currentFps >= targetFps * 0.95) {\n this.goodFrameCount++;\n this.badFrameCount = 0;\n }\n \n // Adjust quality based on frame counts\n if (this.badFrameCount >= this.config.badFrameThreshold) {\n this.reduceQuality();\n } else if (this.goodFrameCount >= this.config.goodFrameThreshold) {\n this.increaseQuality();\n }\n }\n \n private reduceQuality(): void {\n const qualityLevels: QualityLevel[] = ['ultra', 'high', 'medium', 'low'];\n const currentIndex = qualityLevels.indexOf(this.currentQuality);\n \n if (currentIndex < qualityLevels.length - 1) {\n const newQuality = qualityLevels[currentIndex + 1];\n if (newQuality) {\n this.setQuality(newQuality);\n }\n }\n }\n \n private increaseQuality(): void {\n const qualityLevels: QualityLevel[] = ['low', 'medium', 'high', 'ultra'];\n const currentIndex = qualityLevels.indexOf(this.currentQuality);\n \n // Don't increase to ultra on mobile devices\n const maxLevel = this.deviceCapabilities.isMobile ? 'high' : 'ultra';\n const maxIndex = qualityLevels.indexOf(maxLevel);\n \n if (currentIndex < maxIndex) {\n const newQuality = qualityLevels[currentIndex + 1];\n if (newQuality) {\n this.setQuality(newQuality);\n }\n }\n }\n \n private checkPerformanceWarnings(metrics: PerformanceMetrics): void {\n // Check for FPS drops\n if (metrics.fps < this.config.fpsThreshold) {\n this.emitEvent({\n type: 'fps-drop',\n metrics,\n timestamp: performance.now(),\n });\n }\n \n // Check for memory warnings\n if (metrics.memoryUsage && metrics.memoryUsage > 100) { // 100MB threshold\n this.emitEvent({\n type: 'memory-warning',\n metrics,\n timestamp: performance.now(),\n });\n }\n \n // Check for good performance\n if (metrics.fps >= this.currentSettings.targetFps * 0.95) {\n this.emitEvent({\n type: 'performance-good',\n metrics,\n timestamp: performance.now(),\n });\n }\n }\n \n private getRecentMetrics(): PerformanceMetrics[] {\n const cutoffTime = performance.now() - this.config.monitoringInterval;\n return this.performanceHistory.filter(m => (m as any).timestamp > cutoffTime);\n }\n \n private getLatestMetrics(): PerformanceMetrics {\n if (this.performanceHistory.length > 0) {\n const latest = this.performanceHistory[this.performanceHistory.length - 1];\n if (latest) {\n return latest;\n }\n }\n \n return {\n fps: 0,\n frameTime: 0,\n activeParticles: 0,\n activeLayers: 0,\n domNodes: 0,\n drawCalls: 0,\n };\n }\n \n private emitEvent(event: PerformanceEvent): void {\n this.eventCallbacks.forEach(callback => {\n try {\n callback(event);\n } catch (error) {\n console.error('Error in performance event callback:', error);\n }\n });\n }\n}","/**\n * Audio system with WebAudio API and HTMLAudio fallback\n * \n * This system handles audio playback for cinematic experiences with support for:\n * - WebAudio API for precise timing and effects\n * - HTMLAudio fallback for compatibility\n * - Multiple audio track types (voiceover, ambience, transition, music, sfx)\n * - Fade in/out effects and volume control\n * - Audio-visual timeline synchronization\n * - Graceful handling of autoplay restrictions\n * \n * Requirements: 7.1, 7.2, 7.3, 7.4, 7.5\n */\n\nimport type { CompiledAudioTrack } from '../types/CompiledSpec';\nimport type { AudioTrackType } from '../types/CinematicSpec';\nimport type { Asset } from '../types/AssetTypes';\n\nexport interface AudioSystemConfig {\n /** Preferred audio context sample rate */\n sampleRate?: number;\n /** Master volume (0-1) */\n masterVolume?: number;\n /** Whether to use WebAudio API when available */\n preferWebAudio?: boolean;\n /** Maximum number of concurrent audio tracks */\n maxConcurrentTracks?: number;\n /** Default fade duration in milliseconds */\n defaultFadeDuration?: number;\n}\n\nexport interface AudioSystemEvents {\n 'track-started': (trackId: string) => void;\n 'track-ended': (trackId: string) => void;\n 'track-error': (trackId: string, error: Error) => void;\n 'context-suspended': () => void;\n 'context-resumed': () => void;\n 'autoplay-blocked': (trackId: string) => void;\n}\n\ninterface ActiveTrack {\n id: string;\n type: AudioTrackType;\n startTime: number;\n endTime?: number;\n volume: number;\n fadeIn: number;\n fadeOut: number;\n loop: boolean;\n audioNode?: AudioNode;\n audioElement?: HTMLAudioElement;\n gainNode?: GainNode;\n source?: AudioBufferSourceNode;\n isPlaying: boolean;\n isPaused: boolean;\n currentTime: number;\n}\n\nexport class AudioSystem {\n private _config: Required<AudioSystemConfig>;\n private _eventListeners: Map<keyof AudioSystemEvents, Function[]> = new Map();\n private _audioContext: AudioContext | null = null;\n private _masterGainNode: GainNode | null = null;\n private _activeTracks: Map<string, ActiveTrack> = new Map();\n private _compiledTracks: Map<string, CompiledAudioTrack> = new Map();\n private _isInitialized: boolean = false;\n private _currentTime: number = 0;\n private _isPlaying: boolean = false;\n private _userInteracted: boolean = false;\n \n constructor(config: AudioSystemConfig = {}) {\n this._config = {\n sampleRate: config.sampleRate || 44100,\n masterVolume: config.masterVolume || 1.0,\n preferWebAudio: config.preferWebAudio !== false,\n maxConcurrentTracks: config.maxConcurrentTracks || 8,\n defaultFadeDuration: config.defaultFadeDuration || 1000,\n };\n \n // Set up user interaction detection for autoplay handling\n this._setupUserInteractionDetection();\n }\n \n /**\n * Initialize the audio system\n */\n async initialize(): Promise<void> {\n if (this._isInitialized) {\n return;\n }\n \n try {\n // Try to initialize WebAudio API first\n if (this._config.preferWebAudio && typeof AudioContext !== 'undefined') {\n await this._initializeWebAudio();\n }\n \n this._isInitialized = true;\n \n } catch (error) {\n console.warn('AudioSystem: WebAudio initialization failed, using HTMLAudio fallback:', error);\n // HTMLAudio fallback will be used automatically\n this._isInitialized = true;\n }\n }\n \n /**\n * Load and compile audio tracks for a scene\n */\n async loadTracks(tracks: CompiledAudioTrack[]): Promise<void> {\n if (!this._isInitialized) {\n await this.initialize();\n }\n \n for (const track of tracks) {\n this._compiledTracks.set(track.id, track);\n \n // Prepare audio nodes/elements based on available APIs\n if (this._audioContext && track.asset.data instanceof ArrayBuffer) {\n try {\n // Decode audio data for WebAudio API\n const audioBuffer = await this._audioContext.decodeAudioData(track.asset.data.slice(0));\n track.audioNode = audioBuffer as any; // Store buffer as audioNode for now\n } catch (error) {\n console.warn(`AudioSystem: Failed to decode audio for track ${track.id}:`, error);\n // Fall back to HTMLAudio\n this._createHTMLAudioElement(track);\n }\n } else if (track.asset.data instanceof HTMLAudioElement) {\n track.audioElement = track.asset.data;\n } else {\n // Create HTMLAudio element from asset source\n this._createHTMLAudioElement(track);\n }\n }\n }\n \n /**\n * Start playback of the audio system\n */\n play(): void {\n this._isPlaying = true;\n \n // Resume audio context if suspended (handles autoplay restrictions)\n if (this._audioContext && this._audioContext.state === 'suspended') {\n if (this._userInteracted) {\n this._audioContext.resume().catch(error => {\n console.warn('AudioSystem: Failed to resume audio context:', error);\n this._emit('context-suspended');\n });\n } else {\n this._emit('autoplay-blocked', 'system');\n }\n }\n }\n \n /**\n * Pause playback of all audio tracks\n */\n pause(): void {\n this._isPlaying = false;\n \n // Pause all active tracks\n for (const track of this._activeTracks.values()) {\n if (track.isPlaying) {\n this._pauseTrack(track);\n }\n }\n }\n \n /**\n * Stop playback and reset all tracks\n */\n stop(): void {\n this._isPlaying = false;\n this._currentTime = 0;\n \n // Stop all active tracks\n for (const track of this._activeTracks.values()) {\n this._stopTrack(track);\n }\n \n this._activeTracks.clear();\n }\n \n /**\n * Update audio system with current timeline position\n */\n update(timeMs: number): void {\n this._currentTime = timeMs;\n \n if (!this._isPlaying) {\n return;\n }\n \n // Check which tracks should be playing at current time\n for (const compiledTrack of this._compiledTracks.values()) {\n const shouldPlay = timeMs >= compiledTrack.startMs && \n (compiledTrack.endMs === undefined || timeMs < compiledTrack.endMs);\n \n const activeTrack = this._activeTracks.get(compiledTrack.id);\n \n if (shouldPlay && !activeTrack) {\n // Start new track\n this._startTrack(compiledTrack, timeMs);\n } else if (!shouldPlay && activeTrack && activeTrack.isPlaying) {\n // Stop track that should no longer be playing\n this._stopTrack(activeTrack);\n } else if (activeTrack && activeTrack.isPlaying) {\n // Update existing track\n this._updateTrack(activeTrack, timeMs);\n }\n }\n }\n \n /**\n * Seek to a specific time position\n */\n seek(timeMs: number): void {\n this._currentTime = timeMs;\n \n // Stop all currently playing tracks\n for (const track of this._activeTracks.values()) {\n if (track.isPlaying) {\n this._stopTrack(track);\n }\n }\n \n // Update will start appropriate tracks for the new time if we're playing\n if (this._isPlaying) {\n this.update(timeMs);\n }\n }\n \n /**\n * Set master volume\n */\n setMasterVolume(volume: number): void {\n this._config.masterVolume = Math.max(0, Math.min(1, volume));\n \n if (this._masterGainNode) {\n this._masterGainNode.gain.setValueAtTime(\n this._config.masterVolume,\n this._audioContext!.currentTime\n );\n }\n \n // Update HTMLAudio elements\n for (const track of this._activeTracks.values()) {\n if (track.audioElement) {\n track.audioElement.volume = this._config.masterVolume * track.volume;\n }\n }\n }\n \n /**\n * Get current master volume\n */\n getMasterVolume(): number {\n return this._config.masterVolume;\n }\n \n /**\n * Check if audio context is available and active\n */\n isWebAudioAvailable(): boolean {\n return this._audioContext !== null && this._audioContext.state !== 'closed';\n }\n \n /**\n * Get current audio context state\n */\n getAudioContextState(): AudioContextState | null {\n return this._audioContext?.state || null;\n }\n \n /**\n * Get active track count\n */\n getActiveTrackCount(): number {\n return Array.from(this._activeTracks.values()).filter(t => t.isPlaying).length;\n }\n \n /**\n * Destroy the audio system and clean up resources\n */\n destroy(): void {\n this.stop();\n \n if (this._audioContext) {\n // Check if close method exists (not available in all test environments)\n if (typeof this._audioContext.close === 'function') {\n this._audioContext.close();\n }\n this._audioContext = null;\n this._masterGainNode = null;\n }\n \n this._compiledTracks.clear();\n this._eventListeners.clear();\n this._isInitialized = false;\n }\n \n /**\n * Add event listener\n */\n on<K extends keyof AudioSystemEvents>(event: K, callback: AudioSystemEvents[K]): void {\n if (!this._eventListeners.has(event)) {\n this._eventListeners.set(event, []);\n }\n this._eventListeners.get(event)!.push(callback);\n }\n \n /**\n * Remove event listener\n */\n off<K extends keyof AudioSystemEvents>(event: K, callback: AudioSystemEvents[K]): void {\n const listeners = this._eventListeners.get(event);\n if (listeners) {\n const index = listeners.indexOf(callback);\n if (index > -1) {\n listeners.splice(index, 1);\n }\n }\n }\n \n // Private methods\n \n private async _initializeWebAudio(): Promise<void> {\n const AudioContextClass = window.AudioContext || (window as any).webkitAudioContext;\n \n if (!AudioContextClass) {\n throw new Error('WebAudio API not supported');\n }\n \n this._audioContext = new AudioContextClass({\n sampleRate: this._config.sampleRate,\n });\n \n // Create master gain node\n this._masterGainNode = this._audioContext.createGain();\n this._masterGainNode.gain.setValueAtTime(\n this._config.masterVolume,\n this._audioContext.currentTime\n );\n this._masterGainNode.connect(this._audioContext.destination);\n \n // Handle context state changes\n this._audioContext.addEventListener('statechange', () => {\n if (this._audioContext!.state === 'suspended') {\n this._emit('context-suspended');\n } else if (this._audioContext!.state === 'running') {\n this._emit('context-resumed');\n }\n });\n }\n \n private _createHTMLAudioElement(track: CompiledAudioTrack): void {\n const audio = new Audio();\n audio.src = track.asset.src;\n audio.preload = 'auto';\n audio.loop = track.loop;\n \n // Handle loading errors\n audio.onerror = () => {\n this._emit('track-error', track.id, new Error(`Failed to load audio: ${track.asset.src}`));\n };\n \n track.audioElement = audio;\n }\n \n private _startTrack(compiledTrack: CompiledAudioTrack, currentTimeMs: number): void {\n if (this._activeTracks.size >= this._config.maxConcurrentTracks) {\n console.warn(`AudioSystem: Maximum concurrent tracks (${this._config.maxConcurrentTracks}) reached`);\n return;\n }\n \n const track: ActiveTrack = {\n id: compiledTrack.id,\n type: compiledTrack.type,\n startTime: compiledTrack.startMs,\n endTime: compiledTrack.endMs,\n volume: compiledTrack.volume,\n fadeIn: compiledTrack.fadeIn,\n fadeOut: compiledTrack.fadeOut,\n loop: compiledTrack.loop,\n audioNode: compiledTrack.audioNode,\n audioElement: compiledTrack.audioElement,\n isPlaying: false,\n isPaused: false,\n currentTime: currentTimeMs - compiledTrack.startMs,\n };\n \n this._activeTracks.set(track.id, track);\n \n try {\n if (this._audioContext && track.audioNode) {\n this._startWebAudioTrack(track, compiledTrack);\n } else if (track.audioElement) {\n this._startHTMLAudioTrack(track);\n } else {\n throw new Error('No audio source available');\n }\n \n track.isPlaying = true;\n this._emit('track-started', track.id);\n \n } catch (error) {\n console.error(`AudioSystem: Failed to start track ${track.id}:`, error);\n this._emit('track-error', track.id, error as Error);\n this._activeTracks.delete(track.id);\n }\n }\n \n private _startWebAudioTrack(track: ActiveTrack, _compiledTrack: CompiledAudioTrack): void {\n if (!this._audioContext || !this._masterGainNode) {\n throw new Error('WebAudio context not available');\n }\n \n // Create source node\n const source = this._audioContext.createBufferSource();\n source.buffer = track.audioNode as unknown as AudioBuffer;\n source.loop = track.loop;\n \n // Create gain node for this track\n const gainNode = this._audioContext.createGain();\n track.gainNode = gainNode;\n \n // Connect audio graph\n source.connect(gainNode);\n gainNode.connect(this._masterGainNode);\n \n // Set initial volume (with fade in if specified)\n const now = this._audioContext.currentTime;\n if (track.fadeIn > 0) {\n gainNode.gain.setValueAtTime(0, now);\n gainNode.gain.linearRampToValueAtTime(track.volume, now + track.fadeIn / 1000);\n } else {\n gainNode.gain.setValueAtTime(track.volume, now);\n }\n \n // Handle track end\n source.onended = () => {\n if (track.isPlaying) {\n track.isPlaying = false;\n this._emit('track-ended', track.id);\n this._activeTracks.delete(track.id);\n }\n };\n \n // Start playback\n const offset = Math.max(0, track.currentTime / 1000);\n source.start(0, offset);\n track.source = source;\n }\n \n private _startHTMLAudioTrack(track: ActiveTrack): void {\n if (!track.audioElement) {\n throw new Error('HTMLAudio element not available');\n }\n \n const audio = track.audioElement;\n \n // Set volume\n audio.volume = this._config.masterVolume * track.volume;\n \n // Set current time if seeking\n if (track.currentTime > 0) {\n audio.currentTime = track.currentTime / 1000;\n }\n \n // Handle fade in\n if (track.fadeIn > 0) {\n audio.volume = 0;\n this._fadeHTMLAudio(audio, this._config.masterVolume * track.volume, track.fadeIn);\n }\n \n // Handle track end\n audio.onended = () => {\n if (track.isPlaying) {\n track.isPlaying = false;\n this._emit('track-ended', track.id);\n this._activeTracks.delete(track.id);\n }\n };\n \n // Handle errors\n audio.onerror = () => {\n this._emit('track-error', track.id, new Error('HTMLAudio playback error'));\n };\n \n // Start playback\n const playPromise = audio.play();\n if (playPromise) {\n playPromise.catch(error => {\n if (error.name === 'NotAllowedError') {\n this._emit('autoplay-blocked', track.id);\n } else {\n this._emit('track-error', track.id, error);\n }\n });\n }\n }\n \n private _pauseTrack(track: ActiveTrack): void {\n track.isPaused = true;\n \n if (track.source) {\n // WebAudio: can't pause, need to stop and restart later\n track.source.stop();\n track.source = undefined;\n } else if (track.audioElement) {\n track.audioElement.pause();\n }\n }\n \n private _stopTrack(track: ActiveTrack): void {\n track.isPlaying = false;\n track.isPaused = false;\n \n // Handle fade out\n if (track.fadeOut > 0) {\n if (track.gainNode && this._audioContext) {\n const now = this._audioContext.currentTime;\n track.gainNode.gain.linearRampToValueAtTime(0, now + track.fadeOut / 1000);\n \n // Stop after fade completes\n setTimeout(() => {\n this._forceStopTrack(track);\n }, track.fadeOut);\n } else if (track.audioElement) {\n this._fadeHTMLAudio(track.audioElement, 0, track.fadeOut).then(() => {\n this._forceStopTrack(track);\n });\n }\n } else {\n this._forceStopTrack(track);\n }\n }\n \n private _forceStopTrack(track: ActiveTrack): void {\n if (track.source) {\n try {\n track.source.stop();\n } catch (error) {\n // Source might already be stopped\n }\n track.source = undefined;\n }\n \n if (track.audioElement) {\n track.audioElement.pause();\n track.audioElement.currentTime = 0;\n }\n \n this._activeTracks.delete(track.id);\n }\n \n private _updateTrack(track: ActiveTrack, currentTimeMs: number): void {\n track.currentTime = currentTimeMs - track.startTime;\n \n // Handle fade out near end time\n if (track.endTime && track.fadeOut > 0) {\n const timeUntilEnd = track.endTime - currentTimeMs;\n if (timeUntilEnd <= track.fadeOut && timeUntilEnd > 0) {\n const fadeProgress = 1 - (timeUntilEnd / track.fadeOut);\n const targetVolume = track.volume * (1 - fadeProgress);\n \n if (track.gainNode && this._audioContext) {\n track.gainNode.gain.setValueAtTime(targetVolume, this._audioContext.currentTime);\n } else if (track.audioElement) {\n track.audioElement.volume = this._config.masterVolume * targetVolume;\n }\n }\n }\n }\n \n private async _fadeHTMLAudio(audio: HTMLAudioElement, targetVolume: number, durationMs: number): Promise<void> {\n const startVolume = audio.volume;\n const startTime = performance.now();\n \n return new Promise(resolve => {\n const updateVolume = () => {\n const elapsed = performance.now() - startTime;\n const progress = Math.min(elapsed / durationMs, 1);\n \n audio.volume = startVolume + (targetVolume - startVolume) * progress;\n \n if (progress < 1) {\n requestAnimationFrame(updateVolume);\n } else {\n resolve();\n }\n };\n \n updateVolume();\n });\n }\n \n private _setupUserInteractionDetection(): void {\n const events = ['click', 'touchstart', 'keydown'];\n \n const handleInteraction = () => {\n this._userInteracted = true;\n \n // Remove listeners after first interaction\n events.forEach(event => {\n document.removeEventListener(event, handleInteraction);\n });\n \n // Try to resume audio context if suspended\n if (this._audioContext && this._audioContext.state === 'suspended') {\n this._audioContext.resume();\n }\n };\n \n events.forEach(event => {\n document.addEventListener(event, handleInteraction, { once: true, passive: true });\n });\n }\n \n private _emit<K extends keyof AudioSystemEvents>(event: K, ...args: Parameters<AudioSystemEvents[K]>): void {\n const listeners = this._eventListeners.get(event);\n if (listeners) {\n listeners.forEach(callback => {\n try {\n (callback as any)(...args);\n } catch (error) {\n console.error(`Error in audio system event listener for \"${event}\":`, error);\n }\n });\n }\n }\n}","/**\n * Debug overlay system for cinematicRenderer2D\n * \n * Provides real-time debugging information including FPS counter,\n * timeline info, layer status, and performance metrics.\n */\n\nimport type { CinematicRenderer2D } from '../core/CinematicRenderer2D';\nimport type { QualityLevel } from '../types/QualityTypes';\n\nexport interface DebugInfo {\n fps: number;\n currentTime: number;\n duration: number;\n currentEvent: string | null;\n currentScene: string | null;\n quality: QualityLevel;\n activeLayers: number;\n activeParticles: number;\n domNodes: number;\n drawCalls: number;\n memoryUsage?: number;\n isPlaying: boolean;\n isPaused: boolean;\n}\n\nexport interface DebugOverlayOptions {\n position?: 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right';\n opacity?: number;\n fontSize?: number;\n updateInterval?: number;\n showPerformanceGraph?: boolean;\n maxGraphPoints?: number;\n}\n\nexport class DebugOverlay {\n private renderer: CinematicRenderer2D;\n private container: HTMLElement;\n private overlayElement: HTMLElement | null = null;\n private options: Required<DebugOverlayOptions>;\n private updateTimer: number | null = null;\n private isVisible: boolean = false;\n \n // Performance graph data\n private fpsHistory: number[] = [];\n private frameTimeHistory: number[] = [];\n private lastUpdateTime: number = 0;\n \n constructor(renderer: CinematicRenderer2D, container: HTMLElement, options: DebugOverlayOptions = {}) {\n this.renderer = renderer;\n this.container = container;\n \n // Set default options\n this.options = {\n position: options.position || 'top-left',\n opacity: options.opacity || 0.9,\n fontSize: options.fontSize || 12,\n updateInterval: options.updateInterval || 100, // Update every 100ms\n showPerformanceGraph: options.showPerformanceGraph || true,\n maxGraphPoints: options.maxGraphPoints || 60, // 6 seconds at 10fps update rate\n };\n \n this.createOverlay();\n this.setupEventListeners();\n }\n \n show(): void {\n if (this.isVisible) return;\n \n this.isVisible = true;\n if (this.overlayElement) {\n this.overlayElement.style.display = 'block';\n }\n \n this.startUpdating();\n }\n \n hide(): void {\n if (!this.isVisible) return;\n \n this.isVisible = false;\n if (this.overlayElement) {\n this.overlayElement.style.display = 'none';\n }\n \n this.stopUpdating();\n }\n \n toggle(): void {\n if (this.isVisible) {\n this.hide();\n } else {\n this.show();\n }\n }\n \n destroy(): void {\n this.stopUpdating();\n \n if (this.overlayElement && this.overlayElement.parentNode) {\n this.overlayElement.parentNode.removeChild(this.overlayElement);\n }\n \n this.overlayElement = null;\n }\n \n private createOverlay(): void {\n this.overlayElement = document.createElement('div');\n this.overlayElement.className = 'cinematic-debug-overlay';\n \n // Apply styles\n const styles = this.getOverlayStyles();\n Object.assign(this.overlayElement.style, styles);\n \n // Initially hidden\n this.overlayElement.style.display = 'none';\n \n // Add to container\n this.container.appendChild(this.overlayElement);\n }\n \n private getOverlayStyles(): Partial<CSSStyleDeclaration> {\n const baseStyles: Partial<CSSStyleDeclaration> = {\n position: 'fixed', // Changed from absolute to fixed to ensure it's above everything\n zIndex: '10000', // Increased z-index to be above control panel (2000)\n backgroundColor: 'rgba(0, 0, 0, 0.8)',\n color: '#ffffff',\n fontFamily: 'Monaco, Menlo, \"Courier New\", monospace',\n fontSize: `${this.options.fontSize}px`,\n lineHeight: '1.4',\n padding: '12px',\n borderRadius: '4px',\n opacity: this.options.opacity.toString(),\n pointerEvents: 'none',\n userSelect: 'none',\n minWidth: '200px',\n maxWidth: '300px',\n border: '1px solid rgba(255, 255, 255, 0.2)',\n backdropFilter: 'blur(4px)',\n };\n \n // Position-specific styles\n switch (this.options.position) {\n case 'top-left':\n baseStyles.top = '10px';\n baseStyles.left = '10px';\n break;\n case 'top-right':\n baseStyles.top = '10px';\n baseStyles.right = '10px';\n break;\n case 'bottom-left':\n baseStyles.bottom = '10px';\n baseStyles.left = '10px';\n break;\n case 'bottom-right':\n baseStyles.bottom = '10px';\n baseStyles.right = '10px';\n break;\n }\n \n return baseStyles;\n }\n \n private setupEventListeners(): void {\n // Listen for renderer events to update debug info\n this.renderer.on('frame', (frameData: any) => {\n this.updatePerformanceHistory(frameData.fps, frameData.deltaMs);\n });\n \n // Listen for keyboard shortcuts (D key to toggle debug)\n document.addEventListener('keydown', (event) => {\n if (event.key === 'd' || event.key === 'D') {\n if (event.ctrlKey || event.metaKey) {\n event.preventDefault();\n this.toggle();\n }\n }\n });\n }\n \n private startUpdating(): void {\n if (this.updateTimer) return;\n \n const update = () => {\n if (this.isVisible) {\n this.updateDisplay();\n this.updateTimer = window.setTimeout(update, this.options.updateInterval);\n }\n };\n \n update();\n }\n \n private stopUpdating(): void {\n if (this.updateTimer) {\n clearTimeout(this.updateTimer);\n this.updateTimer = null;\n }\n }\n \n private updateDisplay(): void {\n if (!this.overlayElement) return;\n \n const debugInfo = this.gatherDebugInfo();\n const html = this.generateDebugHTML(debugInfo);\n \n this.overlayElement.innerHTML = html;\n }\n \n private gatherDebugInfo(): DebugInfo {\n const currentTime = this.renderer.getCurrentTime();\n const duration = this.renderer.getDuration();\n const fps = this.renderer.getCurrentFps();\n const metrics = this.renderer.getPerformanceMetrics();\n \n return {\n fps: Math.round(fps * 10) / 10,\n currentTime,\n duration,\n currentEvent: this.renderer.getCurrentEvent(),\n currentScene: this.renderer.getCurrentScene(),\n quality: this.renderer.getQuality(),\n activeLayers: metrics.activeLayers || 0,\n activeParticles: metrics.activeParticles || 0,\n domNodes: metrics.domNodes || 0,\n drawCalls: metrics.drawCalls || 0,\n memoryUsage: this.getMemoryUsage(),\n isPlaying: this.renderer.isPlaying(),\n isPaused: this.renderer.isPaused(),\n };\n }\n \n private generateDebugHTML(info: DebugInfo): string {\n const formatTime = (ms: number) => {\n const seconds = Math.floor(ms / 1000);\n const minutes = Math.floor(seconds / 60);\n const remainingSeconds = seconds % 60;\n const remainingMs = Math.floor(ms % 1000);\n \n if (minutes > 0) {\n return `${minutes}:${remainingSeconds.toString().padStart(2, '0')}.${remainingMs.toString().padStart(3, '0')}`;\n } else {\n return `${remainingSeconds}.${remainingMs.toString().padStart(3, '0')}s`;\n }\n };\n \n const formatPercent = (current: number, total: number) => {\n if (total === 0) return '0%';\n return `${Math.round((current / total) * 100)}%`;\n };\n \n const playbackIcon = info.isPlaying ? '▶️' : info.isPaused ? '⏸️' : '⏹️';\n const qualityColor = this.getQualityColor(info.quality);\n \n let html = `\n <div style=\"margin-bottom: 8px; font-weight: bold; color: #00ff88;\">\n 🎬 cinematicRenderer2D Debug\n </div>\n \n <div style=\"margin-bottom: 6px;\">\n <span style=\"color: #888;\">FPS:</span> \n <span style=\"color: ${this.getFpsColor(info.fps)}; font-weight: bold;\">\n ${info.fps}\n </span>\n <span style=\"color: #888;\"> / Target: ${this.getTargetFps()}</span>\n </div>\n \n <div style=\"margin-bottom: 6px;\">\n <span style=\"color: #888;\">Quality:</span> \n <span style=\"color: ${qualityColor}; font-weight: bold;\">\n ${info.quality.toUpperCase()}\n </span>\n </div>\n \n <div style=\"margin-bottom: 8px;\">\n <span style=\"color: #888;\">Timeline:</span> ${playbackIcon}\n <div style=\"margin-left: 10px; font-size: ${this.options.fontSize - 1}px;\">\n ${formatTime(info.currentTime)} / ${formatTime(info.duration)}\n <div style=\"color: #666;\">\n ${formatPercent(info.currentTime, info.duration)} complete\n </div>\n </div>\n </div>\n \n <div style=\"margin-bottom: 8px;\">\n <span style=\"color: #888;\">Current:</span>\n <div style=\"margin-left: 10px; font-size: ${this.options.fontSize - 1}px;\">\n <div>Event: <span style=\"color: #88ccff;\">${info.currentEvent || 'None'}</span></div>\n <div>Scene: <span style=\"color: #ffcc88;\">${info.currentScene || 'None'}</span></div>\n </div>\n </div>\n \n <div style=\"margin-bottom: 8px;\">\n <span style=\"color: #888;\">Rendering:</span>\n <div style=\"margin-left: 10px; font-size: ${this.options.fontSize - 1}px;\">\n <div>Layers: <span style=\"color: #88ff88;\">${info.activeLayers}</span></div>\n <div>Particles: <span style=\"color: #ff8888;\">${info.activeParticles}</span></div>\n <div>DOM Nodes: <span style=\"color: #8888ff;\">${info.domNodes}</span></div>\n <div>Draw Calls: <span style=\"color: #ffff88;\">${info.drawCalls}</span></div>\n </div>\n </div>\n `;\n \n // Add memory usage if available\n if (info.memoryUsage !== undefined) {\n html += `\n <div style=\"margin-bottom: 8px;\">\n <span style=\"color: #888;\">Memory:</span> \n <span style=\"color: #ff88ff;\">${(info.memoryUsage / 1024 / 1024).toFixed(1)} MB</span>\n </div>\n `;\n }\n \n // Add performance graph if enabled\n if (this.options.showPerformanceGraph && this.fpsHistory.length > 1) {\n html += this.generatePerformanceGraph();\n }\n \n // Add keyboard shortcut hint\n html += `\n <div style=\"margin-top: 8px; font-size: ${this.options.fontSize - 2}px; color: #666; border-top: 1px solid #333; padding-top: 4px;\">\n Press Ctrl+D to toggle debug overlay\n </div>\n `;\n \n return html;\n }\n \n private generatePerformanceGraph(): string {\n const width = 180;\n const height = 40;\n const maxFps = Math.max(60, Math.max(...this.fpsHistory));\n const minFps = Math.min(0, Math.min(...this.fpsHistory));\n const fpsRange = maxFps - minFps;\n \n if (fpsRange === 0) return '';\n \n const points = this.fpsHistory.map((fps, index) => {\n const x = (index / (this.fpsHistory.length - 1)) * width;\n const y = height - ((fps - minFps) / fpsRange) * height;\n return `${x},${y}`;\n }).join(' ');\n \n return `\n <div style=\"margin-top: 8px;\">\n <div style=\"color: #888; font-size: ${this.options.fontSize - 2}px; margin-bottom: 2px;\">\n FPS Graph (${minFps.toFixed(1)} - ${maxFps.toFixed(1)})\n </div>\n <svg width=\"${width}\" height=\"${height}\" style=\"background: rgba(255,255,255,0.1); border-radius: 2px;\">\n <polyline \n points=\"${points}\" \n fill=\"none\" \n stroke=\"#00ff88\" \n stroke-width=\"1.5\"\n opacity=\"0.8\"\n />\n <line \n x1=\"0\" y1=\"${height - ((60 - minFps) / fpsRange) * height}\" \n x2=\"${width}\" y2=\"${height - ((60 - minFps) / fpsRange) * height}\" \n stroke=\"#ffff00\" \n stroke-width=\"1\" \n opacity=\"0.5\"\n stroke-dasharray=\"2,2\"\n />\n </svg>\n </div>\n `;\n }\n \n private updatePerformanceHistory(fps: number, deltaMs: number): void {\n const now = performance.now();\n \n // Only update history at a reasonable rate (10fps)\n if (now - this.lastUpdateTime < 100) return;\n \n this.lastUpdateTime = now;\n \n this.fpsHistory.push(fps);\n this.frameTimeHistory.push(deltaMs);\n \n // Keep history within limits\n if (this.fpsHistory.length > this.options.maxGraphPoints) {\n this.fpsHistory.shift();\n this.frameTimeHistory.shift();\n }\n }\n \n private getFpsColor(fps: number): string {\n if (fps >= 55) return '#00ff88'; // Green - good\n if (fps >= 45) return '#ffff00'; // Yellow - okay\n if (fps >= 30) return '#ff8800'; // Orange - poor\n return '#ff4444'; // Red - bad\n }\n \n private getQualityColor(quality: QualityLevel): string {\n switch (quality) {\n case 'ultra': return '#ff00ff';\n case 'high': return '#00ff88';\n case 'medium': return '#ffff00';\n case 'low': return '#ff8800';\n case 'auto': return '#88ccff';\n default: return '#ffffff';\n }\n }\n \n private getTargetFps(): number {\n // Get target FPS from renderer spec\n return 60; // Default, could be made configurable\n }\n \n private getMemoryUsage(): number | undefined {\n // Use Performance API if available\n if ('memory' in performance) {\n return (performance as any).memory.usedJSHeapSize;\n }\n return undefined;\n }\n}","/**\n * Built-in layer type implementations\n * DOM layers fully implemented for Task 7.1\n * Canvas2D layers will be completed in Task 8.1\n */\n\nimport type { ICinematicLayer } from '../interfaces/ICinematicLayer';\nimport type { LayerMountContext, FrameContext } from '../interfaces/LayerContext';\n\n/**\n * Utility function to convert position values (pixels or percentages) to pixels\n */\nfunction resolvePosition(value: number | string, containerSize: number): number {\n if (typeof value === 'string' && value.endsWith('%')) {\n const percentage = parseFloat(value) / 100;\n return containerSize * percentage;\n }\n return typeof value === 'number' ? value : parseFloat(value) || 0;\n}\n\n/**\n * Base class for built-in layers with common functionality\n */\nabstract class BaseLayer implements ICinematicLayer {\n public readonly id: string;\n public readonly type: string;\n public readonly zIndex: number;\n protected config: Record<string, any>;\n protected mounted: boolean = false;\n\n constructor(id: string, type: string, config: Record<string, any>) {\n this.id = id;\n this.type = type;\n this.zIndex = config['zIndex'] || 0;\n this.config = config;\n }\n\n abstract mount(ctx: LayerMountContext): void;\n abstract update(ctx: FrameContext): void;\n \n destroy(): void {\n this.mounted = false;\n }\n\n setVisible(_visible: boolean): void {\n // Default implementation - can be overridden\n if (this.mounted) {\n // Will be implemented in specific renderers\n }\n }\n\n setOpacity(_opacity: number): void {\n // Default implementation - can be overridden\n if (this.mounted) {\n // Will be implemented in specific renderers\n }\n }\n\n resize(_width: number, _height: number): void {\n // Default implementation - can be overridden\n if (this.mounted) {\n // Will be implemented in specific renderers\n }\n }\n}\n\n// DOM Layer Types (fully implemented for Task 7.1)\n\nexport class GradientLayer extends BaseLayer {\n private element?: HTMLElement;\n\n constructor(id: string, config: Record<string, any>) {\n super(id, 'gradient', config);\n }\n\n mount(ctx: LayerMountContext): void {\n if (this.mounted) return;\n\n // Create DOM element through the renderer\n const domRenderer = ctx.renderer as any; // Type assertion for DOMRenderer methods\n if (domRenderer.createLayerElement) {\n this.element = domRenderer.createLayerElement(this.id, this.zIndex);\n \n // Apply gradient styles\n const { \n colors = ['#000000', '#ffffff'], \n direction = 'to bottom', \n opacity = 1,\n width = '100%',\n height = '100%'\n } = this.config;\n const gradientColors = colors.join(', ');\n \n if (this.element) {\n this.element.style.cssText += `\n background: linear-gradient(${direction}, ${gradientColors});\n opacity: ${opacity};\n width: ${typeof width === 'number' ? width + 'px' : width};\n height: ${typeof height === 'number' ? height + 'px' : height};\n position: absolute;\n `;\n }\n }\n\n this.mounted = true;\n }\n\n update(ctx: FrameContext): void {\n if (!this.mounted || !this.element) return;\n\n // Resolve position values to pixels\n const { x = 0, y = 0, scale = 1, rotation = 0, opacity = 1 } = this.config;\n const resolvedX = resolvePosition(x, ctx.viewport.width);\n const resolvedY = resolvePosition(y, ctx.viewport.height);\n \n this.element.style.transform = `translate3d(${resolvedX}px, ${resolvedY}px, 0) scale(${scale}) rotate(${rotation}deg)`;\n this.element.style.opacity = opacity.toString();\n }\n\n override destroy(): void {\n if (this.element) {\n const domRenderer = this.element.parentElement?.parentElement as any;\n if (domRenderer && domRenderer.removeLayerElement) {\n domRenderer.removeLayerElement(this.id);\n }\n }\n super.destroy();\n }\n}\n\nexport class ImageLayer extends BaseLayer {\n private element?: HTMLElement;\n private img?: HTMLImageElement;\n\n constructor(id: string, config: Record<string, any>) {\n super(id, 'image', config);\n }\n\n mount(ctx: LayerMountContext): void {\n if (this.mounted) return;\n\n // Create DOM element through the renderer\n const domRenderer = ctx.renderer as any;\n if (domRenderer.createLayerElement) {\n this.element = domRenderer.createLayerElement(this.id, this.zIndex);\n \n // Create image element\n this.img = document.createElement('img');\n const { src, alt = '', objectFit = 'cover', opacity = 1 } = this.config;\n \n if (this.img && this.element) {\n this.img.src = src;\n this.img.alt = alt;\n this.img.style.cssText = `\n width: 100%;\n height: 100%;\n object-fit: ${objectFit};\n opacity: ${opacity};\n display: block;\n `;\n \n this.element.appendChild(this.img);\n }\n }\n\n this.mounted = true;\n }\n\n update(ctx: FrameContext): void {\n if (!this.mounted || !this.element) return;\n\n // Resolve position values to pixels\n const { x = 0, y = 0, scale = 1, rotation = 0, opacity = 1 } = this.config;\n const resolvedX = resolvePosition(x, ctx.viewport.width);\n const resolvedY = resolvePosition(y, ctx.viewport.height);\n \n this.element.style.transform = `translate3d(${resolvedX}px, ${resolvedY}px, 0) scale(${scale}) rotate(${rotation}deg)`;\n this.element.style.opacity = opacity.toString();\n }\n\n override destroy(): void {\n if (this.element) {\n const domRenderer = this.element.parentElement?.parentElement as any;\n if (domRenderer && domRenderer.removeLayerElement) {\n domRenderer.removeLayerElement(this.id);\n }\n }\n super.destroy();\n }\n}\n\nexport class TextBlockLayer extends BaseLayer {\n private element?: HTMLElement;\n\n constructor(id: string, config: Record<string, any>) {\n super(id, 'textBlock', config);\n }\n\n mount(ctx: LayerMountContext): void {\n if (this.mounted) return;\n\n // Create DOM element through the renderer\n const domRenderer = ctx.renderer as any;\n if (domRenderer.createLayerElement) {\n this.element = domRenderer.createLayerElement(this.id, this.zIndex);\n \n // Apply text styles\n const { \n text = '', \n fontSize = '16px', \n fontFamily = 'Arial, sans-serif',\n color = '#ffffff',\n textAlign = 'center',\n opacity = 1,\n textShadow = 'none',\n fontWeight = 'normal',\n letterSpacing = 'normal'\n } = this.config;\n \n if (this.element) {\n this.element.innerHTML = text;\n this.element.style.cssText += `\n font-size: ${typeof fontSize === 'number' ? fontSize + 'px' : fontSize};\n font-family: ${fontFamily};\n color: ${color};\n text-align: ${textAlign};\n opacity: ${opacity};\n text-shadow: ${textShadow};\n font-weight: ${fontWeight};\n letter-spacing: ${letterSpacing};\n display: flex;\n align-items: center;\n justify-content: ${textAlign === 'left' ? 'flex-start' : textAlign === 'right' ? 'flex-end' : 'center'};\n white-space: pre-wrap;\n position: absolute;\n width: auto;\n height: auto;\n min-width: max-content;\n `;\n }\n }\n\n this.mounted = true;\n }\n\n update(ctx: FrameContext): void {\n if (!this.mounted || !this.element) return;\n\n // Resolve position values to pixels\n const { x = 0, y = 0, scale = 1, rotation = 0, opacity = 1, textAlign = 'center' } = this.config;\n const resolvedX = resolvePosition(x, ctx.viewport.width);\n const resolvedY = resolvePosition(y, ctx.viewport.height);\n \n // Adjust positioning based on text alignment to center the text at the specified position\n let transformOrigin = 'center center';\n let translateX = '-50%';\n let translateY = '-50%';\n \n if (textAlign === 'left') {\n transformOrigin = 'left center';\n translateX = '0%';\n } else if (textAlign === 'right') {\n transformOrigin = 'right center';\n translateX = '-100%';\n }\n \n this.element.style.transformOrigin = transformOrigin;\n this.element.style.transform = `translate3d(${resolvedX}px, ${resolvedY}px, 0) translate(${translateX}, ${translateY}) scale(${scale}) rotate(${rotation}deg)`;\n this.element.style.opacity = opacity.toString();\n }\n\n override destroy(): void {\n if (this.element) {\n const domRenderer = this.element.parentElement?.parentElement as any;\n if (domRenderer && domRenderer.removeLayerElement) {\n domRenderer.removeLayerElement(this.id);\n }\n }\n super.destroy();\n }\n}\n\nexport class VignetteLayer extends BaseLayer {\n private element?: HTMLElement;\n\n constructor(id: string, config: Record<string, any>) {\n super(id, 'vignette', config);\n }\n\n mount(ctx: LayerMountContext): void {\n if (this.mounted) return;\n\n // Create DOM element through the renderer\n const domRenderer = ctx.renderer as any;\n if (domRenderer.createLayerElement) {\n this.element = domRenderer.createLayerElement(this.id, this.zIndex);\n \n // Apply vignette styles\n const { \n color = '#000000', \n intensity = 0.5, \n size = '50%',\n opacity = 1 \n } = this.config;\n \n if (this.element) {\n this.element.style.cssText += `\n background: radial-gradient(ellipse ${size} ${size} at center, transparent 0%, ${color} 100%);\n opacity: ${opacity * intensity};\n pointer-events: none;\n `;\n }\n }\n\n this.mounted = true;\n }\n\n update(ctx: FrameContext): void {\n if (!this.mounted || !this.element) return;\n\n // Resolve position values to pixels\n const { x = 0, y = 0, scale = 1, rotation = 0, opacity = 1 } = this.config;\n const resolvedX = resolvePosition(x, ctx.viewport.width);\n const resolvedY = resolvePosition(y, ctx.viewport.height);\n \n this.element.style.transform = `translate3d(${resolvedX}px, ${resolvedY}px, 0) scale(${scale}) rotate(${rotation}deg)`;\n this.element.style.opacity = opacity.toString();\n }\n\n override destroy(): void {\n if (this.element) {\n const domRenderer = this.element.parentElement?.parentElement as any;\n if (domRenderer && domRenderer.removeLayerElement) {\n domRenderer.removeLayerElement(this.id);\n }\n }\n super.destroy();\n }\n}\n\nexport class GlowOrbLayer extends BaseLayer {\n private element?: HTMLElement;\n\n constructor(id: string, config: Record<string, any>) {\n super(id, 'glowOrb', config);\n }\n\n mount(ctx: LayerMountContext): void {\n if (this.mounted) return;\n\n // Create DOM element through the renderer\n const domRenderer = ctx.renderer as any;\n if (domRenderer.createLayerElement) {\n this.element = domRenderer.createLayerElement(this.id, this.zIndex);\n \n // Apply glow orb styles\n const { \n color = '#ffffff', \n radius = 50,\n blur = 20,\n intensity = 0.8\n } = this.config;\n \n if (this.element) {\n this.element.style.cssText += `\n background: radial-gradient(circle, ${color} 0%, transparent 70%);\n width: ${radius * 2}px;\n height: ${radius * 2}px;\n border-radius: 50%;\n filter: blur(${blur}px);\n opacity: ${intensity};\n pointer-events: none;\n position: absolute;\n `;\n }\n }\n\n this.mounted = true;\n }\n\n update(ctx: FrameContext): void {\n if (!this.mounted || !this.element) return;\n\n // Resolve position values to pixels and center the orb\n const { x = 0, y = 0, scale = 1, rotation = 0, intensity = 0.8, radius = 50 } = this.config;\n const resolvedX = resolvePosition(x, ctx.viewport.width) - radius;\n const resolvedY = resolvePosition(y, ctx.viewport.height) - radius;\n \n this.element.style.transform = `translate3d(${resolvedX}px, ${resolvedY}px, 0) scale(${scale}) rotate(${rotation}deg)`;\n this.element.style.opacity = intensity.toString();\n }\n\n override destroy(): void {\n if (this.element) {\n const domRenderer = this.element.parentElement?.parentElement as any;\n if (domRenderer && domRenderer.removeLayerElement) {\n domRenderer.removeLayerElement(this.id);\n }\n }\n super.destroy();\n }\n}\n\nexport class NoiseOverlayLayer extends BaseLayer {\n private element?: HTMLElement;\n private canvas?: HTMLCanvasElement;\n private ctx?: CanvasRenderingContext2D;\n\n constructor(id: string, config: Record<string, any>) {\n super(id, 'noiseOverlay', config);\n }\n\n mount(ctx: LayerMountContext): void {\n if (this.mounted) return;\n\n // Create DOM element through the renderer\n const domRenderer = ctx.renderer as any;\n if (domRenderer.createLayerElement) {\n this.element = domRenderer.createLayerElement(this.id, this.zIndex);\n \n // Create canvas for noise generation\n this.canvas = document.createElement('canvas');\n const canvasContext = this.canvas.getContext('2d');\n if (canvasContext) {\n this.ctx = canvasContext;\n }\n \n const { opacity = 0.1 } = this.config;\n \n if (this.canvas && this.element) {\n this.canvas.style.cssText = `\n width: 100%;\n height: 100%;\n opacity: ${opacity};\n mix-blend-mode: overlay;\n pointer-events: none;\n `;\n \n this.element.appendChild(this.canvas);\n this.generateNoise();\n }\n }\n\n this.mounted = true;\n }\n\n update(ctx: FrameContext): void {\n if (!this.mounted || !this.element) return;\n\n // Resolve position values to pixels\n const { x = 0, y = 0, scale = 1, rotation = 0, opacity = 0.1 } = this.config;\n const resolvedX = resolvePosition(x, ctx.viewport.width);\n const resolvedY = resolvePosition(y, ctx.viewport.height);\n \n this.element.style.transform = `translate3d(${resolvedX}px, ${resolvedY}px, 0) scale(${scale}) rotate(${rotation}deg)`;\n this.element.style.opacity = opacity.toString();\n\n // Optionally regenerate noise for animated effect\n const { animated = false, animationSpeed = 100 } = this.config;\n if (animated && ctx.timeMs % animationSpeed < ctx.deltaMs) {\n this.generateNoise();\n }\n }\n\n private generateNoise(): void {\n if (!this.canvas || !this.ctx) return;\n\n const { width = 256, height = 256, intensity = 0.5 } = this.config;\n \n this.canvas.width = width;\n this.canvas.height = height;\n \n const imageData = this.ctx.createImageData(width, height);\n const data = imageData.data;\n \n for (let i = 0; i < data.length; i += 4) {\n const noise = Math.random() * 255 * intensity;\n data[i] = noise; // Red\n data[i + 1] = noise; // Green\n data[i + 2] = noise; // Blue\n data[i + 3] = 255; // Alpha\n }\n \n this.ctx.putImageData(imageData, 0, 0);\n }\n\n override resize(_width: number, _height: number): void {\n if (this.canvas) {\n // Update canvas size and regenerate noise\n this.generateNoise();\n }\n }\n\n override destroy(): void {\n if (this.element) {\n const domRenderer = this.element.parentElement?.parentElement as any;\n if (domRenderer && domRenderer.removeLayerElement) {\n domRenderer.removeLayerElement(this.id);\n }\n }\n super.destroy();\n }\n}\n\n// Canvas2D Layer Types (will be fully implemented in Task 8.1)\n\nexport class ParticlesLayer extends BaseLayer {\n private canvas?: HTMLCanvasElement;\n private ctx?: CanvasRenderingContext2D;\n private particles: any[] = [];\n private canvas2DRenderer?: any;\n\n constructor(id: string, config: Record<string, any>) {\n super(id, 'particles', config);\n }\n\n mount(ctx: LayerMountContext): void {\n if (this.mounted) return;\n\n // Get Canvas2D renderer\n this.canvas2DRenderer = ctx.renderer;\n \n // Create dedicated canvas for this layer if needed\n if (this.canvas2DRenderer && this.canvas2DRenderer.createLayerCanvas) {\n const { width = ctx.container.clientWidth, height = ctx.container.clientHeight } = this.config;\n this.canvas = this.canvas2DRenderer.createLayerCanvas(width, height);\n if (this.canvas) {\n const context = this.canvas.getContext('2d');\n this.ctx = context || undefined;\n \n // Style the canvas\n this.canvas.style.cssText += `\n position: absolute;\n top: 0;\n left: 0;\n pointer-events: none;\n z-index: ${this.zIndex};\n `;\n \n // Add to container\n ctx.container.appendChild(this.canvas);\n }\n }\n\n this.mounted = true;\n }\n\n update(ctx: FrameContext): void {\n if (!this.mounted || !this.canvas || !this.ctx) return;\n\n // Clear canvas\n this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);\n \n // Get configuration\n const {\n count = 100,\n color = '#ffffff',\n size = 2,\n speed = 1,\n opacity = 0.8,\n type = 'circle',\n x = 0,\n y = 0,\n scale = 1,\n rotation = 0\n } = this.config;\n \n // Resolve position values to pixels\n const resolvedX = resolvePosition(x, ctx.viewport.width);\n const resolvedY = resolvePosition(y, ctx.viewport.height);\n \n // Apply layer transforms\n this.ctx.save();\n this.ctx.translate(resolvedX, resolvedY);\n this.ctx.scale(scale, scale);\n this.ctx.rotate(rotation * Math.PI / 180);\n this.ctx.globalAlpha = opacity;\n \n // Initialize particles if needed\n if (this.particles.length === 0) {\n for (let i = 0; i < count; i++) {\n this.particles.push({\n x: Math.random() * ctx.viewport.width,\n y: Math.random() * ctx.viewport.height,\n vx: (Math.random() - 0.5) * speed,\n vy: (Math.random() - 0.5) * speed,\n size: size * (0.5 + Math.random() * 0.5),\n opacity: 0.5 + Math.random() * 0.5,\n life: 0,\n maxLife: 5000 + Math.random() * 10000\n });\n }\n }\n \n // Update and render particles\n this.ctx.fillStyle = color;\n for (const particle of this.particles) {\n // Update position\n particle.x += particle.vx * ctx.deltaMs / 16.67;\n particle.y += particle.vy * ctx.deltaMs / 16.67;\n particle.life += ctx.deltaMs;\n \n // Wrap around screen\n if (particle.x < 0) particle.x = ctx.viewport.width;\n if (particle.x > ctx.viewport.width) particle.x = 0;\n if (particle.y < 0) particle.y = ctx.viewport.height;\n if (particle.y > ctx.viewport.height) particle.y = 0;\n \n // Reset if lifetime exceeded\n if (particle.life >= particle.maxLife) {\n particle.x = Math.random() * ctx.viewport.width;\n particle.y = Math.random() * ctx.viewport.height;\n particle.life = 0;\n }\n \n // Render particle\n this.ctx.save();\n this.ctx.globalAlpha = particle.opacity * opacity;\n \n if (type === 'circle') {\n this.ctx.beginPath();\n this.ctx.arc(particle.x, particle.y, particle.size, 0, Math.PI * 2);\n this.ctx.fill();\n } else if (type === 'square') {\n this.ctx.fillRect(particle.x - particle.size/2, particle.y - particle.size/2, particle.size, particle.size);\n }\n \n this.ctx.restore();\n }\n \n this.ctx.restore();\n }\n\n override destroy(): void {\n if (this.canvas && this.canvas.parentNode) {\n this.canvas.parentNode.removeChild(this.canvas);\n }\n this.particles = [];\n super.destroy();\n }\n}\n\nexport class StarfieldLayer extends BaseLayer {\n private canvas?: HTMLCanvasElement;\n private ctx?: CanvasRenderingContext2D;\n private stars: any[] = [];\n private canvas2DRenderer?: any;\n\n constructor(id: string, config: Record<string, any>) {\n super(id, 'starfield', config);\n }\n\n mount(ctx: LayerMountContext): void {\n if (this.mounted) return;\n\n // Get Canvas2D renderer\n this.canvas2DRenderer = ctx.renderer;\n \n // Create dedicated canvas for this layer\n if (this.canvas2DRenderer && this.canvas2DRenderer.createLayerCanvas) {\n const { width = ctx.container.clientWidth, height = ctx.container.clientHeight } = this.config;\n this.canvas = this.canvas2DRenderer.createLayerCanvas(width, height);\n if (this.canvas) {\n const context = this.canvas.getContext('2d');\n this.ctx = context || undefined;\n \n // Style the canvas\n this.canvas.style.cssText += `\n position: absolute;\n top: 0;\n left: 0;\n pointer-events: none;\n z-index: ${this.zIndex};\n `;\n \n // Add to container\n ctx.container.appendChild(this.canvas);\n }\n }\n\n this.mounted = true;\n }\n\n update(ctx: FrameContext): void {\n if (!this.mounted || !this.canvas || !this.ctx) return;\n\n // Clear canvas\n this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);\n \n // Get configuration\n const {\n count = 200,\n color = '#ffffff',\n minSize = 0.5,\n maxSize = 2,\n speed = 0.5,\n opacity = 0.8,\n twinkle = true,\n x = 0,\n y = 0,\n scale = 1,\n rotation = 0\n } = this.config;\n \n // Resolve position values to pixels\n const resolvedX = resolvePosition(x, ctx.viewport.width);\n const resolvedY = resolvePosition(y, ctx.viewport.height);\n \n // Apply layer transforms\n this.ctx.save();\n this.ctx.translate(resolvedX, resolvedY);\n this.ctx.scale(scale, scale);\n this.ctx.rotate(rotation * Math.PI / 180);\n this.ctx.globalAlpha = opacity;\n \n // Initialize stars if needed\n if (this.stars.length === 0) {\n for (let i = 0; i < count; i++) {\n this.stars.push({\n x: Math.random() * ctx.viewport.width,\n y: Math.random() * ctx.viewport.height,\n z: Math.random() * 1000,\n size: minSize + Math.random() * (maxSize - minSize),\n baseOpacity: 0.3 + Math.random() * 0.7,\n twinklePhase: Math.random() * Math.PI * 2,\n twinkleSpeed: 0.5 + Math.random() * 1.5\n });\n }\n }\n \n // Update and render stars\n this.ctx.fillStyle = color;\n for (const star of this.stars) {\n // Update z position for parallax effect\n star.z -= speed * ctx.deltaMs / 16.67;\n \n // Reset star when it goes behind camera\n if (star.z <= 0) {\n star.z = 1000;\n star.x = Math.random() * ctx.viewport.width;\n star.y = Math.random() * ctx.viewport.height;\n }\n \n // Calculate screen position with perspective\n const perspective = 500;\n const screenX = (star.x - ctx.viewport.width / 2) * (perspective / star.z) + ctx.viewport.width / 2;\n const screenY = (star.y - ctx.viewport.height / 2) * (perspective / star.z) + ctx.viewport.height / 2;\n \n // Calculate size based on distance\n const starSize = star.size * (perspective / star.z);\n \n // Skip if star is off screen\n if (screenX < -starSize || screenX > ctx.viewport.width + starSize ||\n screenY < -starSize || screenY > ctx.viewport.height + starSize) {\n continue;\n }\n \n // Calculate opacity with twinkling effect\n let starOpacity = star.baseOpacity;\n if (twinkle) {\n star.twinklePhase += star.twinkleSpeed * ctx.deltaMs / 1000;\n starOpacity *= 0.5 + 0.5 * Math.sin(star.twinklePhase);\n }\n \n // Render star\n this.ctx.save();\n this.ctx.globalAlpha = starOpacity * opacity;\n this.ctx.beginPath();\n this.ctx.arc(screenX, screenY, Math.max(0.5, starSize), 0, Math.PI * 2);\n this.ctx.fill();\n this.ctx.restore();\n }\n \n this.ctx.restore();\n }\n\n override destroy(): void {\n if (this.canvas && this.canvas.parentNode) {\n this.canvas.parentNode.removeChild(this.canvas);\n }\n this.stars = [];\n super.destroy();\n }\n}\n\nexport class DustLayer extends BaseLayer {\n private canvas?: HTMLCanvasElement;\n private ctx?: CanvasRenderingContext2D;\n private dustParticles: any[] = [];\n private canvas2DRenderer?: any;\n\n constructor(id: string, config: Record<string, any>) {\n super(id, 'dust', config);\n }\n\n mount(ctx: LayerMountContext): void {\n if (this.mounted) return;\n\n // Get Canvas2D renderer\n this.canvas2DRenderer = ctx.renderer;\n \n // Create dedicated canvas for this layer\n if (this.canvas2DRenderer && this.canvas2DRenderer.createLayerCanvas) {\n const { width = ctx.container.clientWidth, height = ctx.container.clientHeight } = this.config;\n this.canvas = this.canvas2DRenderer.createLayerCanvas(width, height);\n if (this.canvas) {\n const context = this.canvas.getContext('2d');\n this.ctx = context || undefined;\n \n // Style the canvas\n this.canvas.style.cssText += `\n position: absolute;\n top: 0;\n left: 0;\n pointer-events: none;\n z-index: ${this.zIndex};\n `;\n \n // Add to container\n ctx.container.appendChild(this.canvas);\n }\n }\n\n this.mounted = true;\n }\n\n update(ctx: FrameContext): void {\n if (!this.mounted || !this.canvas || !this.ctx) return;\n\n // Clear canvas\n this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);\n \n // Get configuration\n const {\n count = 50,\n color = '#cccccc',\n minSize = 1,\n maxSize = 3,\n speed = 0.2,\n opacity = 0.4,\n drift = true,\n x = 0,\n y = 0,\n scale = 1,\n rotation = 0\n } = this.config;\n \n // Apply layer transforms\n this.ctx.save();\n this.ctx.translate(x, y);\n this.ctx.scale(scale, scale);\n this.ctx.rotate(rotation * Math.PI / 180);\n this.ctx.globalAlpha = opacity;\n \n // Initialize dust particles if needed\n if (this.dustParticles.length === 0) {\n for (let i = 0; i < count; i++) {\n this.dustParticles.push({\n x: Math.random() * ctx.viewport.width,\n y: Math.random() * ctx.viewport.height,\n vx: (Math.random() - 0.5) * speed,\n vy: (Math.random() - 0.5) * speed,\n size: minSize + Math.random() * (maxSize - minSize),\n baseOpacity: 0.2 + Math.random() * 0.6,\n driftPhase: Math.random() * Math.PI * 2,\n driftSpeed: 0.3 + Math.random() * 0.7,\n life: 0,\n maxLife: 10000 + Math.random() * 20000\n });\n }\n }\n \n // Update and render dust particles\n this.ctx.fillStyle = color;\n for (const particle of this.dustParticles) {\n // Update position\n let vx = particle.vx;\n let vy = particle.vy;\n \n // Add drift effect\n if (drift) {\n particle.driftPhase += particle.driftSpeed * ctx.deltaMs / 1000;\n vx += Math.sin(particle.driftPhase) * 0.1;\n vy += Math.cos(particle.driftPhase * 0.7) * 0.1;\n }\n \n particle.x += vx * ctx.deltaMs / 16.67;\n particle.y += vy * ctx.deltaMs / 16.67;\n particle.life += ctx.deltaMs;\n \n // Wrap around screen\n if (particle.x < -particle.size) particle.x = ctx.viewport.width + particle.size;\n if (particle.x > ctx.viewport.width + particle.size) particle.x = -particle.size;\n if (particle.y < -particle.size) particle.y = ctx.viewport.height + particle.size;\n if (particle.y > ctx.viewport.height + particle.size) particle.y = -particle.size;\n \n // Reset if lifetime exceeded\n if (particle.life >= particle.maxLife) {\n particle.x = Math.random() * ctx.viewport.width;\n particle.y = Math.random() * ctx.viewport.height;\n particle.life = 0;\n }\n \n // Calculate opacity with subtle fading\n const lifeRatio = particle.life / particle.maxLife;\n const fadeOpacity = lifeRatio < 0.1 ? lifeRatio / 0.1 : \n lifeRatio > 0.9 ? (1 - lifeRatio) / 0.1 : 1;\n \n // Render dust particle\n this.ctx.save();\n this.ctx.globalAlpha = particle.baseOpacity * fadeOpacity * opacity;\n this.ctx.beginPath();\n this.ctx.arc(particle.x, particle.y, particle.size, 0, Math.PI * 2);\n this.ctx.fill();\n this.ctx.restore();\n }\n \n this.ctx.restore();\n }\n\n override destroy(): void {\n if (this.canvas && this.canvas.parentNode) {\n this.canvas.parentNode.removeChild(this.canvas);\n }\n this.dustParticles = [];\n super.destroy();\n }\n}\n\nexport class NebulaNoiseLayer extends BaseLayer {\n private canvas?: HTMLCanvasElement;\n private ctx?: CanvasRenderingContext2D;\n private noiseData?: ImageData;\n private canvas2DRenderer?: any;\n\n constructor(id: string, config: Record<string, any>) {\n super(id, 'nebulaNoise', config);\n }\n\n mount(ctx: LayerMountContext): void {\n if (this.mounted) return;\n\n // Get Canvas2D renderer\n this.canvas2DRenderer = ctx.renderer;\n \n // Create dedicated canvas for this layer\n if (this.canvas2DRenderer && this.canvas2DRenderer.createLayerCanvas) {\n const { width = ctx.container.clientWidth, height = ctx.container.clientHeight } = this.config;\n this.canvas = this.canvas2DRenderer.createLayerCanvas(width, height);\n if (this.canvas) {\n const context = this.canvas.getContext('2d');\n this.ctx = context || undefined;\n \n // Style the canvas\n this.canvas.style.cssText += `\n position: absolute;\n top: 0;\n left: 0;\n pointer-events: none;\n z-index: ${this.zIndex};\n mix-blend-mode: screen;\n `;\n \n // Add to container\n ctx.container.appendChild(this.canvas);\n }\n }\n\n this.mounted = true;\n }\n\n update(ctx: FrameContext): void {\n if (!this.mounted || !this.canvas || !this.ctx) return;\n\n // Clear canvas\n this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);\n \n // Get configuration\n const {\n colors = ['#ff0080', '#0080ff', '#8000ff'],\n intensity = 0.3,\n scale = 0.01,\n opacity = 0.6,\n animated = true,\n speed = 0.001,\n octaves = 3,\n x = 0,\n y = 0,\n scaleTransform = 1,\n rotation = 0\n } = this.config;\n \n // Apply layer transforms\n this.ctx.save();\n this.ctx.translate(x, y);\n this.ctx.scale(scaleTransform, scaleTransform);\n this.ctx.rotate(rotation * Math.PI / 180);\n this.ctx.globalAlpha = opacity;\n \n const width = Math.floor(ctx.viewport.width / 2); // Lower resolution for performance\n const height = Math.floor(ctx.viewport.height / 2);\n \n // Create or reuse image data\n if (!this.noiseData || this.noiseData.width !== width || this.noiseData.height !== height) {\n this.noiseData = this.ctx.createImageData(width, height);\n }\n \n const data = this.noiseData.data;\n const time = animated ? ctx.timeMs * speed : 0;\n \n // Generate multi-octave noise\n for (let py = 0; py < height; py++) {\n for (let px = 0; px < width; px++) {\n const index = (py * width + px) * 4;\n \n let noise = 0;\n let amplitude = 1;\n let frequency = scale;\n \n // Multi-octave noise\n for (let octave = 0; octave < octaves; octave++) {\n noise += this.perlinNoise(px * frequency + time, py * frequency + time) * amplitude;\n amplitude *= 0.5;\n frequency *= 2;\n }\n \n // Normalize noise to 0-1 range\n noise = (noise + 1) * 0.5;\n noise = Math.max(0, Math.min(1, noise * intensity));\n \n // Apply color based on noise value\n const colorIndex = Math.floor(noise * (colors.length - 1));\n const nextColorIndex = Math.min(colorIndex + 1, colors.length - 1);\n const t = (noise * (colors.length - 1)) - colorIndex;\n \n const color1 = this.hexToRgb(colors[colorIndex]);\n const color2 = this.hexToRgb(colors[nextColorIndex]);\n \n // Interpolate between colors\n const r = Math.floor(color1.r + (color2.r - color1.r) * t);\n const g = Math.floor(color1.g + (color2.g - color1.g) * t);\n const b = Math.floor(color1.b + (color2.b - color1.b) * t);\n const a = Math.floor(noise * 255);\n \n data[index] = r;\n data[index + 1] = g;\n data[index + 2] = b;\n data[index + 3] = a;\n }\n }\n \n // Render noise with scaling\n this.ctx.putImageData(this.noiseData, 0, 0);\n this.ctx.drawImage(this.canvas, 0, 0, width, height, 0, 0, ctx.viewport.width, ctx.viewport.height);\n \n this.ctx.restore();\n }\n\n private perlinNoise(x: number, y: number): number {\n // Simplified Perlin-like noise function\n const n1 = this.noise(Math.floor(x), Math.floor(y));\n const n2 = this.noise(Math.floor(x) + 1, Math.floor(y));\n const n3 = this.noise(Math.floor(x), Math.floor(y) + 1);\n const n4 = this.noise(Math.floor(x) + 1, Math.floor(y) + 1);\n \n const fx = x - Math.floor(x);\n const fy = y - Math.floor(y);\n \n // Smooth interpolation\n const sx = fx * fx * (3 - 2 * fx);\n const sy = fy * fy * (3 - 2 * fy);\n \n const i1 = n1 + sx * (n2 - n1);\n const i2 = n3 + sx * (n4 - n3);\n \n return i1 + sy * (i2 - i1);\n }\n\n private noise(x: number, y: number): number {\n // Simple pseudo-random noise function\n const n = Math.sin(x * 12.9898 + y * 78.233) * 43758.5453;\n return (n - Math.floor(n)) * 2 - 1; // Return value between -1 and 1\n }\n\n private hexToRgb(hex: string): { r: number; g: number; b: number } {\n const result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex);\n if (result && result[1] && result[2] && result[3]) {\n return {\n r: parseInt(result[1], 16),\n g: parseInt(result[2], 16),\n b: parseInt(result[3], 16)\n };\n }\n return { r: 255, g: 255, b: 255 };\n }\n\n override destroy(): void {\n if (this.canvas && this.canvas.parentNode) {\n this.canvas.parentNode.removeChild(this.canvas);\n }\n this.noiseData = undefined;\n super.destroy();\n }\n}","/**\n * Layer Registry for managing layer types and instances\n * Supports both built-in layer types and custom layer plugins\n */\n\nimport type { ICinematicLayer } from './interfaces/ICinematicLayer';\nimport {\n GradientLayer,\n ImageLayer,\n TextBlockLayer,\n VignetteLayer,\n GlowOrbLayer,\n NoiseOverlayLayer,\n ParticlesLayer,\n StarfieldLayer,\n DustLayer,\n NebulaNoiseLayer,\n} from './layers/BuiltInLayers';\n\nexport type LayerFactory = (id: string, config: Record<string, any>) => ICinematicLayer;\n\nexport class LayerRegistry {\n private layerTypes: Map<string, LayerFactory> = new Map();\n private static instance: LayerRegistry | null = null;\n \n constructor() {\n this.registerBuiltInLayers();\n }\n \n /**\n * Get the global layer registry instance\n */\n static getInstance(): LayerRegistry {\n if (!LayerRegistry.instance) {\n LayerRegistry.instance = new LayerRegistry();\n }\n return LayerRegistry.instance;\n }\n \n /**\n * Register a custom layer type with a factory function\n */\n registerLayerType(type: string, factory: LayerFactory): void {\n if (this.layerTypes.has(type)) {\n console.warn(`Layer type '${type}' is already registered. Overriding existing registration.`);\n }\n this.layerTypes.set(type, factory);\n }\n \n /**\n * Create a layer instance of the specified type\n */\n createLayer(type: string, id: string, config: Record<string, any>): ICinematicLayer {\n const factory = this.layerTypes.get(type);\n if (!factory) {\n throw new Error(`Unknown layer type: ${type}. Available types: ${this.getRegisteredTypes().join(', ')}`);\n }\n return factory(id, config);\n }\n \n /**\n * Check if a layer type is registered\n */\n hasLayerType(type: string): boolean {\n return this.layerTypes.has(type);\n }\n \n /**\n * Get all registered layer type names\n */\n getRegisteredTypes(): string[] {\n return Array.from(this.layerTypes.keys()).sort();\n }\n \n /**\n * Get built-in layer types (DOM and Canvas2D)\n */\n getBuiltInTypes(): { dom: string[]; canvas2d: string[] } {\n return {\n dom: ['gradient', 'image', 'textBlock', 'vignette', 'glowOrb', 'noiseOverlay'],\n canvas2d: ['particles', 'starfield', 'dust', 'nebulaNoise'],\n };\n }\n \n /**\n * Check if a layer type is a built-in type\n */\n isBuiltInType(type: string): boolean {\n const builtInTypes = this.getBuiltInTypes();\n return builtInTypes.dom.includes(type) || builtInTypes.canvas2d.includes(type);\n }\n \n /**\n * Get custom (non-built-in) layer types\n */\n getCustomTypes(): string[] {\n return this.getRegisteredTypes().filter(type => !this.isBuiltInType(type));\n }\n \n /**\n * Unregister a layer type (useful for testing or dynamic plugin management)\n */\n unregisterLayerType(type: string): boolean {\n if (this.isBuiltInType(type)) {\n console.warn(`Cannot unregister built-in layer type '${type}'`);\n return false;\n }\n return this.layerTypes.delete(type);\n }\n \n /**\n * Clear all custom layer types (keeps built-in types)\n */\n clearCustomTypes(): void {\n const customTypes = this.getCustomTypes();\n customTypes.forEach(type => this.layerTypes.delete(type));\n }\n \n /**\n * Register all built-in layer types\n */\n private registerBuiltInLayers(): void {\n // DOM layer types\n this.layerTypes.set('gradient', (id, config) => new GradientLayer(id, config));\n this.layerTypes.set('image', (id, config) => new ImageLayer(id, config));\n this.layerTypes.set('textBlock', (id, config) => new TextBlockLayer(id, config));\n this.layerTypes.set('vignette', (id, config) => new VignetteLayer(id, config));\n this.layerTypes.set('glowOrb', (id, config) => new GlowOrbLayer(id, config));\n this.layerTypes.set('noiseOverlay', (id, config) => new NoiseOverlayLayer(id, config));\n \n // Canvas2D layer types\n this.layerTypes.set('particles', (id, config) => new ParticlesLayer(id, config));\n this.layerTypes.set('starfield', (id, config) => new StarfieldLayer(id, config));\n this.layerTypes.set('dust', (id, config) => new DustLayer(id, config));\n this.layerTypes.set('nebulaNoise', (id, config) => new NebulaNoiseLayer(id, config));\n }\n}","/**\n * Abstract base class for rendering backends\n */\n\nimport type { ICinematicLayer } from '../core/interfaces/ICinematicLayer';\nimport type { FrameContext } from '../core/interfaces/LayerContext';\n\nexport abstract class RenderBackend {\n protected container: HTMLElement;\n \n constructor(container: HTMLElement) {\n this.container = container;\n }\n \n abstract initialize(): void;\n abstract render(layers: ICinematicLayer[], context: FrameContext): void;\n abstract resize(width: number, height: number): void;\n abstract destroy(): void;\n}","/**\n * DOM-based rendering backend\n * Optimized for 60-120fps performance using CSS transforms and will-change properties\n */\n\nimport { RenderBackend } from '../RenderBackend';\nimport type { ICinematicLayer } from '../../core/interfaces/ICinematicLayer';\nimport type { FrameContext } from '../../core/interfaces/LayerContext';\n\nexport class DOMRenderer extends RenderBackend {\n private domContainer!: HTMLElement;\n private layerElements: Map<string, HTMLElement> = new Map();\n private initialized: boolean = false;\n\n initialize(): void {\n if (this.initialized) return;\n\n // Create DOM container for layers\n this.domContainer = document.createElement('div');\n this.domContainer.style.cssText = `\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n overflow: hidden;\n pointer-events: none;\n `;\n \n this.container.appendChild(this.domContainer);\n this.initialized = true;\n }\n \n render(layers: ICinematicLayer[], context: FrameContext): void {\n if (!this.initialized) {\n this.initialize();\n }\n\n // Sort layers by zIndex for proper rendering order\n const sortedLayers = [...layers].sort((a, b) => a.zIndex - b.zIndex);\n \n // Update each layer\n for (const layer of sortedLayers) {\n layer.update(context);\n }\n }\n \n resize(width: number, height: number): void {\n if (!this.initialized) return;\n \n // Update container dimensions\n this.domContainer.style.width = `${width}px`;\n this.domContainer.style.height = `${height}px`;\n \n // Notify all layers about resize\n for (const element of this.layerElements.values()) {\n // Layers will handle their own resize logic\n }\n }\n \n destroy(): void {\n if (!this.initialized) return;\n \n // Clean up all layer elements\n this.layerElements.clear();\n \n // Remove DOM container\n if (this.domContainer && this.domContainer.parentNode) {\n this.domContainer.parentNode.removeChild(this.domContainer);\n }\n \n this.initialized = false;\n }\n\n /**\n * Create a DOM element for a layer with performance optimizations\n */\n createLayerElement(layerId: string, zIndex: number): HTMLElement {\n if (this.layerElements.has(layerId)) {\n return this.layerElements.get(layerId)!;\n }\n\n const element = document.createElement('div');\n element.id = `layer-${layerId}`;\n element.style.cssText = `\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n will-change: transform, opacity, filter;\n transform-style: preserve-3d;\n backface-visibility: hidden;\n z-index: ${zIndex};\n `;\n\n this.domContainer.appendChild(element);\n this.layerElements.set(layerId, element);\n \n return element;\n }\n\n /**\n * Remove a layer element from the DOM\n */\n removeLayerElement(layerId: string): void {\n const element = this.layerElements.get(layerId);\n if (element && element.parentNode) {\n element.parentNode.removeChild(element);\n this.layerElements.delete(layerId);\n }\n }\n\n /**\n * Get the DOM container for layers\n */\n getDOMContainer(): HTMLElement {\n return this.domContainer;\n }\n\n /**\n * Get a layer element by ID\n */\n getLayerElement(layerId: string): HTMLElement | undefined {\n return this.layerElements.get(layerId);\n }\n}","/**\n * Quality and Performance Types for cinematicRenderer2D\n * \n * These types define the adaptive quality system that monitors performance\n * and automatically adjusts rendering quality to maintain target frame rates.\n * \n * Requirements: 8.1, 8.2, 8.3, 8.4, 8.5 - Adaptive quality system\n */\n\nexport type QualityLevel = 'low' | 'medium' | 'high' | 'ultra' | 'auto';\n\nexport interface QualitySettings {\n /** Maximum number of particles to render */\n particleCount: number;\n /** Canvas resolution multiplier (0.5 = half resolution) */\n canvasResolution: number;\n /** Animation interpolation precision (higher = smoother) */\n animationPrecision: number;\n /** Whether to enable blur effects */\n enableBlur: boolean;\n /** Whether to enable shadow effects */\n enableShadows: boolean;\n /** Target frame rate for this quality level */\n targetFps: number;\n /** Whether to enable advanced visual effects */\n enableAdvancedEffects: boolean;\n /** Texture quality multiplier */\n textureQuality: number;\n /** Whether to use hardware acceleration */\n useHardwareAcceleration: boolean;\n}\n\nexport interface PerformanceMetrics {\n /** Current frames per second */\n fps: number;\n /** Frame time in milliseconds */\n frameTime: number;\n /** Memory usage in MB */\n memoryUsage?: number;\n /** GPU memory usage in MB */\n gpuMemory?: number;\n /** Number of active particles */\n activeParticles: number;\n /** Number of active layers */\n activeLayers: number;\n /** Number of DOM nodes created */\n domNodes: number;\n /** Canvas draw calls per frame */\n drawCalls: number;\n /** Asset loading time in milliseconds */\n assetLoadTime?: number;\n /** Compilation time in milliseconds */\n compilationTime?: number;\n}\n\nexport interface DeviceCapabilities {\n /** Device memory in GB */\n memory?: number;\n /** Number of CPU cores */\n cores?: number;\n /** GPU information */\n gpu?: string;\n /** User prefers reduced motion */\n prefersReducedMotion: boolean;\n /** Device power mode */\n powerMode?: 'high-performance' | 'balanced' | 'power-saver';\n /** Screen refresh rate */\n refreshRate?: number;\n /** Device pixel ratio */\n devicePixelRatio: number;\n /** Whether device supports hardware acceleration */\n supportsHardwareAcceleration: boolean;\n /** Maximum texture size supported */\n maxTextureSize?: number;\n /** Whether device is mobile */\n isMobile: boolean;\n /** Network connection type */\n connectionType?: 'slow-2g' | '2g' | '3g' | '4g' | '5g' | 'wifi' | 'ethernet';\n}\n\n/** Quality system configuration */\nexport interface QualitySystemConfig {\n /** How often to check performance (milliseconds) */\n monitoringInterval: number;\n /** FPS threshold for quality reduction */\n fpsThreshold: number;\n /** Number of consecutive bad frames before reducing quality */\n badFrameThreshold: number;\n /** Number of consecutive good frames before increasing quality */\n goodFrameThreshold: number;\n /** Whether to respect user preferences */\n respectUserPreferences: boolean;\n /** Whether to use device capability detection */\n useDeviceDetection: boolean;\n /** Custom quality level mappings */\n customLevels?: Record<string, QualitySettings>;\n}\n\n/** Performance monitoring event data */\nexport interface PerformanceEvent {\n /** Event type */\n type: 'fps-drop' | 'memory-warning' | 'quality-change' | 'performance-good';\n /** Current performance metrics */\n metrics: PerformanceMetrics;\n /** Previous quality level (for quality-change events) */\n previousQuality?: QualityLevel;\n /** New quality level (for quality-change events) */\n newQuality?: QualityLevel;\n /** Timestamp of the event */\n timestamp: number;\n /** Additional context data */\n context?: Record<string, any>;\n}\n\n/** Quality preset configurations */\nexport const QUALITY_PRESETS: Record<QualityLevel, QualitySettings> = {\n low: {\n particleCount: 50,\n canvasResolution: 0.5,\n animationPrecision: 30,\n enableBlur: false,\n enableShadows: false,\n targetFps: 30,\n enableAdvancedEffects: false,\n textureQuality: 0.5,\n useHardwareAcceleration: false,\n },\n medium: {\n particleCount: 200,\n canvasResolution: 0.75,\n animationPrecision: 60,\n enableBlur: true,\n enableShadows: false,\n targetFps: 60,\n enableAdvancedEffects: false,\n textureQuality: 0.75,\n useHardwareAcceleration: true,\n },\n high: {\n particleCount: 500,\n canvasResolution: 1.0,\n animationPrecision: 60,\n enableBlur: true,\n enableShadows: true,\n targetFps: 60,\n enableAdvancedEffects: true,\n textureQuality: 1.0,\n useHardwareAcceleration: true,\n },\n ultra: {\n particleCount: 1000,\n canvasResolution: 1.5,\n animationPrecision: 120,\n enableBlur: true,\n enableShadows: true,\n targetFps: 120,\n enableAdvancedEffects: true,\n textureQuality: 1.5,\n useHardwareAcceleration: true,\n },\n auto: {\n // Auto mode uses dynamic settings based on device capabilities\n particleCount: 200,\n canvasResolution: 1.0,\n animationPrecision: 60,\n enableBlur: true,\n enableShadows: true,\n targetFps: 60,\n enableAdvancedEffects: true,\n textureQuality: 1.0,\n useHardwareAcceleration: true,\n },\n};","/**\n * Canvas2D-based rendering backend with devicePixelRatio scaling and object pooling\n * \n * This renderer handles particles, noise, and starfields with high performance\n * through object pooling and efficient canvas operations.\n * \n * Requirements: 4.2, 4.4 - Canvas2D rendering with devicePixelRatio and object pooling\n */\n\nimport { RenderBackend } from '../RenderBackend';\nimport type { ICinematicLayer } from '../../core/interfaces/ICinematicLayer';\nimport type { FrameContext } from '../../core/interfaces/LayerContext';\nimport type { QualityLevel, PerformanceMetrics } from '../../types/QualityTypes';\nimport { QUALITY_PRESETS } from '../../types/QualityTypes';\n\n/**\n * Object pool for reusing particle objects to avoid garbage collection\n */\nexport class ObjectPool<T> {\n private pool: T[] = [];\n private createFn: () => T;\n private resetFn: (obj: T) => void;\n\n constructor(createFn: () => T, resetFn: (obj: T) => void, initialSize: number = 100) {\n this.createFn = createFn;\n this.resetFn = resetFn;\n \n // Pre-populate pool\n for (let i = 0; i < initialSize; i++) {\n this.pool.push(this.createFn());\n }\n }\n\n get(): T {\n if (this.pool.length > 0) {\n return this.pool.pop()!;\n }\n // Pool exhausted, create new object\n return this.createFn();\n }\n\n release(obj: T): void {\n this.resetFn(obj);\n this.pool.push(obj);\n }\n\n clear(): void {\n this.pool.length = 0;\n }\n\n get poolSize(): number {\n return this.pool.length;\n }\n}\n\n/**\n * Particle object for object pooling\n */\nexport interface Particle {\n x: number;\n y: number;\n vx: number;\n vy: number;\n size: number;\n opacity: number;\n color: string;\n life: number;\n maxLife: number;\n rotation: number;\n rotationSpeed: number;\n active: boolean;\n}\n\n/**\n * Canvas2D renderer with devicePixelRatio scaling and performance monitoring\n */\nexport class Canvas2DRenderer extends RenderBackend {\n private canvas: HTMLCanvasElement;\n private ctx: CanvasRenderingContext2D;\n private devicePixelRatio: number;\n private width: number = 0;\n private height: number = 0;\n private canvasWidth: number = 0;\n private canvasHeight: number = 0;\n \n // Object pools for performance\n private particlePool: ObjectPool<Particle>;\n private activeParticles: Particle[] = [];\n \n // Performance monitoring\n private performanceMetrics: PerformanceMetrics = {\n fps: 60,\n frameTime: 16.67,\n activeParticles: 0,\n activeLayers: 0,\n domNodes: 0,\n drawCalls: 0,\n };\n \n private lastFrameTime: number = 0;\n private frameCount: number = 0;\n private fpsUpdateTime: number = 0;\n\n constructor(container: HTMLElement) {\n super(container);\n \n // Create canvas element\n this.canvas = document.createElement('canvas');\n this.canvas.style.cssText = `\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n pointer-events: none;\n z-index: 1000;\n `;\n \n const context = this.canvas.getContext('2d');\n if (!context) {\n throw new Error('Canvas2D context not available');\n }\n this.ctx = context;\n \n // Get device pixel ratio for crisp rendering\n this.devicePixelRatio = window.devicePixelRatio || 1;\n \n // Initialize object pool\n this.particlePool = new ObjectPool<Particle>(\n () => ({\n x: 0, y: 0, vx: 0, vy: 0, size: 1, opacity: 1, color: '#ffffff',\n life: 0, maxLife: 1000, rotation: 0, rotationSpeed: 0, active: false\n }),\n (particle) => {\n particle.active = false;\n particle.life = 0;\n particle.opacity = 1;\n },\n 500 // Initial pool size\n );\n }\n\n initialize(): void {\n // Add canvas to container\n this.container.appendChild(this.canvas);\n \n // Set initial size\n const rect = this.container.getBoundingClientRect();\n this.resize(rect.width, rect.height);\n \n // Configure canvas for optimal performance\n this.ctx.imageSmoothingEnabled = true;\n this.ctx.imageSmoothingQuality = 'high';\n }\n \n render(layers: ICinematicLayer[], context: FrameContext): void {\n const startTime = performance.now();\n \n // Update performance metrics\n this.updatePerformanceMetrics(context);\n \n // Clear canvas with devicePixelRatio scaling\n this.ctx.clearRect(0, 0, this.canvasWidth, this.canvasHeight);\n \n // Save context state\n this.ctx.save();\n \n // Apply devicePixelRatio scaling\n this.ctx.scale(this.devicePixelRatio, this.devicePixelRatio);\n \n let drawCalls = 0;\n \n // Render Canvas2D layers only\n const canvas2DLayers = layers.filter(layer => \n ['particles', 'starfield', 'dust', 'nebulaNoise'].includes(layer.type)\n );\n \n for (const layer of canvas2DLayers) {\n this.ctx.save();\n \n // Let the layer render itself\n if (layer.type === 'particles' || layer.type === 'starfield' || layer.type === 'dust') {\n drawCalls += this.renderParticleLayer(layer, context);\n } else if (layer.type === 'nebulaNoise') {\n drawCalls += this.renderNoiseLayer(layer, context);\n }\n \n this.ctx.restore();\n }\n \n // Restore context state\n this.ctx.restore();\n \n // Update performance metrics\n this.performanceMetrics.drawCalls = drawCalls;\n this.performanceMetrics.activeLayers = canvas2DLayers.length;\n this.performanceMetrics.frameTime = performance.now() - startTime;\n }\n \n private renderParticleLayer(layer: ICinematicLayer, context: FrameContext): number {\n // Cast to access config (this is safe as we control the layer types)\n const particleLayer = layer as any;\n const config = particleLayer.config || {};\n \n const {\n count = 100,\n color = '#ffffff',\n size = 2,\n speed = 1,\n opacity = 0.8,\n type = 'circle'\n } = config;\n \n // Get quality settings\n const qualitySettings = QUALITY_PRESETS[context.quality] || QUALITY_PRESETS.medium;\n const maxParticles = Math.min(count, qualitySettings.particleCount);\n \n // Ensure we have enough active particles\n while (this.activeParticles.length < maxParticles) {\n const particle = this.particlePool.get();\n this.initializeParticle(particle, context.viewport);\n particle.color = color;\n particle.size = size;\n particle.active = true;\n this.activeParticles.push(particle);\n }\n \n // Remove excess particles\n while (this.activeParticles.length > maxParticles) {\n const particle = this.activeParticles.pop();\n if (particle) {\n this.particlePool.release(particle);\n }\n }\n \n let drawCalls = 0;\n \n // Update and render particles\n for (let i = this.activeParticles.length - 1; i >= 0; i--) {\n const particle = this.activeParticles[i];\n \n if (!particle || !particle.active) {\n this.activeParticles.splice(i, 1);\n if (particle) {\n this.particlePool.release(particle);\n }\n continue;\n }\n \n // Update particle\n particle.x += particle.vx * speed * context.deltaMs / 16.67;\n particle.y += particle.vy * speed * context.deltaMs / 16.67;\n particle.rotation += particle.rotationSpeed * context.deltaMs / 16.67;\n particle.life += context.deltaMs;\n \n // Check bounds and lifetime\n if (particle.x < -particle.size || particle.x > context.viewport.width + particle.size ||\n particle.y < -particle.size || particle.y > context.viewport.height + particle.size ||\n particle.life >= particle.maxLife) {\n // Respawn particle\n this.initializeParticle(particle, context.viewport);\n particle.color = color;\n particle.size = size;\n }\n \n // Render particle\n this.ctx.save();\n this.ctx.globalAlpha = particle.opacity * opacity;\n this.ctx.fillStyle = particle.color;\n \n if (type === 'circle') {\n this.ctx.beginPath();\n this.ctx.arc(particle.x, particle.y, particle.size, 0, Math.PI * 2);\n this.ctx.fill();\n } else if (type === 'star') {\n this.drawStar(particle.x, particle.y, particle.size, particle.rotation);\n }\n \n this.ctx.restore();\n drawCalls++;\n }\n \n this.performanceMetrics.activeParticles = this.activeParticles.length;\n return drawCalls;\n }\n \n private renderNoiseLayer(layer: ICinematicLayer, context: FrameContext): number {\n // Cast to access config\n const noiseLayer = layer as any;\n const config = noiseLayer.config || {};\n \n const {\n intensity = 0.5,\n scale = 1,\n opacity = 0.3,\n animated = true,\n speed = 0.01\n } = config;\n \n // Get quality settings\n const qualitySettings = QUALITY_PRESETS[context.quality] || QUALITY_PRESETS.medium;\n const resolution = qualitySettings.canvasResolution;\n \n const width = Math.floor(context.viewport.width * resolution);\n const height = Math.floor(context.viewport.height * resolution);\n \n // Create noise texture\n const imageData = this.ctx.createImageData(width, height);\n const data = imageData.data;\n \n const time = animated ? context.timeMs * speed : 0;\n \n for (let y = 0; y < height; y++) {\n for (let x = 0; x < width; x++) {\n const index = (y * width + x) * 4;\n \n // Simple noise generation (could be replaced with Perlin noise)\n const noise = this.simpleNoise(x * scale + time, y * scale + time) * intensity;\n const value = Math.floor(noise * 255);\n \n data[index] = value; // Red\n data[index + 1] = value; // Green\n data[index + 2] = value; // Blue\n data[index + 3] = Math.floor(opacity * 255); // Alpha\n }\n }\n \n // Render noise\n this.ctx.save();\n this.ctx.putImageData(imageData, 0, 0);\n this.ctx.restore();\n \n return 1; // One draw call\n }\n \n private initializeParticle(particle: Particle, viewport: { width: number; height: number }): void {\n particle.x = Math.random() * viewport.width;\n particle.y = Math.random() * viewport.height;\n particle.vx = (Math.random() - 0.5) * 2;\n particle.vy = (Math.random() - 0.5) * 2;\n particle.size = 1 + Math.random() * 3;\n particle.opacity = 0.5 + Math.random() * 0.5;\n particle.life = 0;\n particle.maxLife = 5000 + Math.random() * 10000;\n particle.rotation = Math.random() * Math.PI * 2;\n particle.rotationSpeed = (Math.random() - 0.5) * 0.02;\n particle.active = true;\n }\n \n private drawStar(x: number, y: number, size: number, rotation: number): void {\n const spikes = 5;\n const outerRadius = size;\n const innerRadius = size * 0.4;\n \n this.ctx.save();\n this.ctx.translate(x, y);\n this.ctx.rotate(rotation);\n \n this.ctx.beginPath();\n for (let i = 0; i < spikes * 2; i++) {\n const angle = (i * Math.PI) / spikes;\n const radius = i % 2 === 0 ? outerRadius : innerRadius;\n const px = Math.cos(angle) * radius;\n const py = Math.sin(angle) * radius;\n \n if (i === 0) {\n this.ctx.moveTo(px, py);\n } else {\n this.ctx.lineTo(px, py);\n }\n }\n this.ctx.closePath();\n this.ctx.fill();\n \n this.ctx.restore();\n }\n \n private simpleNoise(x: number, y: number): number {\n // Simple pseudo-random noise function\n const n = Math.sin(x * 12.9898 + y * 78.233) * 43758.5453;\n return n - Math.floor(n);\n }\n \n private updatePerformanceMetrics(context: FrameContext): void {\n const currentTime = performance.now();\n \n if (this.lastFrameTime > 0) {\n const deltaTime = currentTime - this.lastFrameTime;\n this.frameCount++;\n \n // Update FPS every second\n if (currentTime - this.fpsUpdateTime >= 1000) {\n this.performanceMetrics.fps = Math.round(this.frameCount * 1000 / (currentTime - this.fpsUpdateTime));\n this.frameCount = 0;\n this.fpsUpdateTime = currentTime;\n }\n }\n \n this.lastFrameTime = currentTime;\n this.performanceMetrics.frameTime = context.deltaMs;\n }\n \n resize(width: number, height: number): void {\n this.width = width;\n this.height = height;\n \n // Set canvas size with devicePixelRatio scaling\n this.canvasWidth = Math.floor(width * this.devicePixelRatio);\n this.canvasHeight = Math.floor(height * this.devicePixelRatio);\n \n this.canvas.width = this.canvasWidth;\n this.canvas.height = this.canvasHeight;\n \n // Set CSS size\n this.canvas.style.width = width + 'px';\n this.canvas.style.height = height + 'px';\n \n // Reconfigure context after resize\n this.ctx.imageSmoothingEnabled = true;\n this.ctx.imageSmoothingQuality = 'high';\n }\n \n destroy(): void {\n // Clear object pools\n this.particlePool.clear();\n this.activeParticles.length = 0;\n \n // Remove canvas from DOM\n if (this.canvas.parentNode) {\n this.canvas.parentNode.removeChild(this.canvas);\n }\n }\n \n /**\n * Get current performance metrics\n */\n getPerformanceMetrics(): PerformanceMetrics {\n return { ...this.performanceMetrics };\n }\n \n /**\n * Create a canvas for a specific layer (used by layers that need their own canvas)\n */\n createLayerCanvas(width: number, height: number): HTMLCanvasElement {\n const canvas = document.createElement('canvas');\n canvas.width = Math.floor(width * this.devicePixelRatio);\n canvas.height = Math.floor(height * this.devicePixelRatio);\n canvas.style.width = width + 'px';\n canvas.style.height = height + 'px';\n \n const ctx = canvas.getContext('2d');\n if (ctx) {\n ctx.scale(this.devicePixelRatio, this.devicePixelRatio);\n ctx.imageSmoothingEnabled = true;\n ctx.imageSmoothingQuality = 'high';\n }\n \n return canvas;\n }\n}","/**\n * Main CinematicRenderer2D engine class\n * \n * This is the primary entry point for the cinematic rendering system.\n * It orchestrates all subsystems including parsing, rendering, animation, and audio.\n */\n\nimport type { ICinematicRenderer2D } from './interfaces/ICinematicRenderer2D';\nimport type { CinematicSpec } from '../types/CinematicSpec';\nimport type { CompiledSpec } from '../types/CompiledSpec';\nimport type { QualityLevel } from '../types/QualityTypes';\nimport { SpecParser } from '../parsing/SpecParser';\nimport { Scheduler, type FrameContext } from './Scheduler';\nimport { QualitySystem } from '../performance/QualitySystem';\nimport { AudioSystem } from '../audio/AudioSystem';\nimport { DebugOverlay } from '../debug/DebugOverlay';\nimport { LayerRegistry } from './LayerRegistry';\nimport { DOMRenderer } from '../rendering/dom/DOMRenderer';\nimport { Canvas2DRenderer } from '../rendering/canvas2d/Canvas2DRenderer';\nimport type { ICinematicLayer } from './interfaces/ICinematicLayer';\nimport type { LayerMountContext } from './interfaces/LayerContext';\n\nexport interface CinematicRenderer2DOptions {\n container: HTMLElement;\n spec: CinematicSpec;\n autoplay?: boolean;\n quality?: QualityLevel;\n debug?: boolean;\n}\n\nexport type PlaybackState = 'idle' | 'loading' | 'ready' | 'playing' | 'paused' | 'stopped' | 'destroyed';\n\nexport class CinematicRenderer2D implements ICinematicRenderer2D {\n private _container: HTMLElement;\n private _spec: CinematicSpec;\n private _compiledSpec: CompiledSpec;\n private _options: CinematicRenderer2DOptions;\n private eventListeners: Map<string, Function[]> = new Map();\n \n // State management\n private _state: PlaybackState = 'idle';\n private _currentTime: number = 0;\n private _duration: number = 0;\n private _currentEventId: string | null = null;\n private _currentSceneId: string | null = null;\n private _quality: QualityLevel;\n private _resizeListener: (() => void) | null = null;\n \n // Core subsystems\n private _scheduler: Scheduler;\n private _qualitySystem: QualitySystem;\n private _audioSystem: AudioSystem;\n private _debugOverlay: DebugOverlay | null = null;\n private _layerRegistry: LayerRegistry;\n private _domRenderer: DOMRenderer | null = null;\n private _canvas2DRenderer: Canvas2DRenderer | null = null;\n \n // Layer management\n private _layers: ICinematicLayer[] = [];\n private _currentSceneLayers: ICinematicLayer[] = [];\n \n // Resize observer for automatic container resizing\n private _resizeObserver: ResizeObserver | null = null;\n private _mounted: boolean = false;\n \n constructor(options: CinematicRenderer2DOptions) {\n // Validate required parameters\n if (!options.container) {\n throw new Error('CinematicRenderer2D: container element is required');\n }\n if (!options.spec) {\n throw new Error('CinematicRenderer2D: spec is required');\n }\n \n // Validate and compile the specification\n const validatedSpec = SpecParser.validate(options.spec);\n const compiledSpec = SpecParser.parse(validatedSpec);\n \n this._container = options.container;\n this._spec = validatedSpec;\n this._compiledSpec = compiledSpec;\n this._options = options;\n this._quality = options.quality || this._spec.engine.quality || 'auto';\n \n // Initialize core subsystems\n this._scheduler = new Scheduler({\n targetFps: this._spec.engine.targetFps || 60,\n enableAdaptiveQuality: this._quality === 'auto',\n });\n \n this._qualitySystem = new QualitySystem({\n respectUserPreferences: true,\n useDeviceDetection: true,\n });\n \n // Initialize layer registry\n this._layerRegistry = LayerRegistry.getInstance();\n \n // Initialize audio system\n this._audioSystem = new AudioSystem({\n preferWebAudio: true,\n masterVolume: 1.0,\n maxConcurrentTracks: 8,\n defaultFadeDuration: 1000,\n });\n \n // Set initial quality\n this._qualitySystem.setQuality(this._quality);\n \n // Connect scheduler to quality system\n this._scheduler.addQualityChangeCallback((metrics) => {\n this._qualitySystem.updatePerformanceMetrics(metrics);\n });\n \n // Listen for quality changes\n this._qualitySystem.addEventListener((event) => {\n if (event.type === 'quality-change') {\n this._quality = event.newQuality!;\n this.emit('qualityChange', {\n previousQuality: event.previousQuality,\n currentQuality: event.newQuality,\n metrics: event.metrics,\n });\n }\n });\n \n // Set up frame callback for animation updates\n this._scheduler.addFrameCallback((context) => {\n this._onFrame(context);\n });\n \n // Set up audio system event listeners\n this._audioSystem.on('track-error', (trackId, error) => {\n this.emit('audioError', { trackId, error });\n });\n \n this._audioSystem.on('autoplay-blocked', (trackId) => {\n this.emit('autoplayBlocked', { trackId });\n });\n \n // Calculate total duration from all events and scenes\n this._calculateDuration();\n \n // Set up automatic resize handling (Requirement 1.5)\n this._setupResizeObserver();\n \n // Initialize debug overlay if debug mode is enabled\n if (this._options.debug) {\n this._debugOverlay = new DebugOverlay(this, this._container, {\n position: 'top-right',\n showPerformanceGraph: true,\n });\n }\n \n // TODO: Initialize other subsystems in future tasks\n // - SpecParser for JSON validation and compilation\n // - AssetManager for resource loading\n }\n \n \n async mount(): Promise<void> {\n if (this._state === 'destroyed') {\n throw new Error('Cannot mount destroyed renderer');\n }\n \n if (this._mounted) {\n return; // Already mounted\n }\n \n try {\n this._setState('loading');\n this.emit('loading');\n \n // Validate container is in DOM\n if (!document.contains(this._container)) {\n throw new Error('Container element must be attached to the DOM');\n }\n \n // Set up container styles for cinematic rendering\n this._setupContainer();\n \n // Initialize rendering backends\n this._initializeRenderers();\n \n // Create and mount layers for the initial scene\n this._initializeLayers();\n \n // Initialize audio system\n await this._audioSystem.initialize();\n \n // Set up automatic resize detection\n this._setupResizeListener();\n \n // Show debug overlay if enabled\n if (this._debugOverlay) {\n this._debugOverlay.show();\n }\n \n this._mounted = true;\n this._setState('ready');\n this.emit('ready');\n \n // Auto-play if requested\n if (this._options.autoplay) {\n this.play();\n }\n \n } catch (error) {\n this._setState('idle');\n this.emit('error', error);\n throw error;\n }\n }\n \n play(): void {\n if (this._state === 'destroyed') {\n throw new Error('Cannot play destroyed renderer');\n }\n \n if (!this._mounted) {\n throw new Error('Must mount renderer before playing');\n }\n \n if (this._state === 'playing') {\n return; // Already playing\n }\n \n const previousState = this._state;\n this._setState('playing');\n \n // Start the scheduler frame loop\n this._scheduler.start();\n \n // Start audio system\n this._audioSystem.play();\n \n // Update layers for current scene\n this._updateCurrentSceneLayers();\n \n this.emit('play', { previousState, currentTime: this._currentTime });\n }\n \n pause(): void {\n if (this._state !== 'playing') {\n return; // Not playing, nothing to pause\n }\n \n const previousState = this._state;\n this._setState('paused');\n \n // Pause the scheduler frame loop\n this._scheduler.stop();\n \n // Pause audio system\n this._audioSystem.pause();\n \n this.emit('pause', { previousState, currentTime: this._currentTime });\n }\n \n stop(): void {\n if (this._state === 'destroyed' || this._state === 'idle') {\n return; // Already stopped or destroyed\n }\n \n const previousState = this._state;\n this._setState('stopped');\n \n // Stop the scheduler frame loop\n this._scheduler.stop();\n \n // Stop audio system\n this._audioSystem.stop();\n \n // Reset playback position\n this._currentTime = 0;\n this._currentEventId = null;\n this._currentSceneId = null;\n \n // Reset all layers to initial state\n this._resetLayersToInitialState();\n \n this.emit('stop', { previousState });\n }\n \n destroy(): void {\n if (this._state === 'destroyed') {\n return; // Already destroyed\n }\n \n const previousState = this._state;\n \n // Stop playback first\n this.stop();\n \n // Clean up resize observer\n if (this._resizeObserver) {\n this._resizeObserver.disconnect();\n this._resizeObserver = null;\n }\n \n // TODO: In future tasks:\n // - Destroy all subsystems\n // - Clean up DOM elements\n // - Release audio resources\n // - Clear asset cache\n \n // Destroy all layers\n this._destroyAllLayers();\n \n // Destroy renderers\n if (this._domRenderer) {\n this._domRenderer.destroy();\n this._domRenderer = null;\n }\n if (this._canvas2DRenderer) {\n this._canvas2DRenderer.destroy();\n this._canvas2DRenderer = null;\n }\n \n // Destroy audio system\n this._audioSystem.destroy();\n \n // Destroy debug overlay\n if (this._debugOverlay) {\n this._debugOverlay.destroy();\n this._debugOverlay = null;\n }\n \n // Clear container\n this._container.innerHTML = '';\n if (typeof this._container.removeAttribute === 'function') {\n this._container.removeAttribute('style');\n }\n \n // Clear all event listeners\n this.eventListeners.clear();\n \n // Remove resize listener\n if (this._resizeListener) {\n window.removeEventListener('resize', this._resizeListener);\n this._resizeListener = null;\n }\n \n this._mounted = false;\n this._setState('destroyed');\n \n this.emit('destroy', { previousState });\n }\n \n \n seek(timeMs: number): void {\n if (this._state === 'destroyed') {\n throw new Error('Cannot seek on destroyed renderer');\n }\n \n if (!this._mounted) {\n throw new Error('Must mount renderer before seeking');\n }\n \n // Clamp time to valid range\n const clampedTime = Math.max(0, Math.min(timeMs, this._duration));\n const previousTime = this._currentTime;\n \n this._currentTime = clampedTime;\n \n // Update current event and scene based on time\n this._updateCurrentEventAndScene();\n \n // Update layers for current scene if scene changed\n this._updateCurrentSceneLayers();\n \n // Seek audio system\n this._audioSystem.seek(clampedTime);\n \n this.emit('seek', this._currentTime);\n }\n \n goToEvent(eventId: string): void {\n if (this._state === 'destroyed') {\n throw new Error('Cannot navigate on destroyed renderer');\n }\n \n if (!this._mounted) {\n throw new Error('Must mount renderer before navigation');\n }\n \n // Find the event in the spec\n const event = this._spec.events.find(e => e.id === eventId);\n if (!event) {\n // Handle gracefully - emit error event but don't throw\n this.emit('error', new Error(`Event with id \"${eventId}\" not found`));\n return;\n }\n \n // Calculate the start time of this event\n const eventStartTime = this._calculateEventStartTime(eventId);\n \n // Seek to the event start time\n this.seek(eventStartTime);\n \n this.emit('eventChange', eventId);\n }\n \n goToScene(sceneId: string): void {\n if (this._state === 'destroyed') {\n throw new Error('Cannot navigate on destroyed renderer');\n }\n \n if (!this._mounted) {\n throw new Error('Must mount renderer before navigation');\n }\n \n // Find the scene in the spec\n const scene = this._spec.scenes.find(s => s.id === sceneId);\n if (!scene) {\n // Handle gracefully - emit error event but don't throw\n this.emit('error', new Error(`Scene with id \"${sceneId}\" not found`));\n return;\n }\n \n // Calculate the start time of this scene\n const sceneStartTime = this._calculateSceneStartTime(sceneId);\n \n // Seek to the scene start time\n this.seek(sceneStartTime);\n \n this.emit('sceneChange', sceneId);\n }\n \n setQuality(level: QualityLevel): void {\n if (this._quality === level) {\n return; // No change needed\n }\n \n const previousQuality = this._quality;\n this._quality = level;\n \n // Update quality system\n this._qualitySystem.setQuality(level);\n \n // TODO: In future tasks:\n // - Update rendering backend quality settings\n \n this.emit('qualityChange', level);\n }\n \n resize(width: number, height: number): void {\n if (this._state === 'destroyed') {\n return; // Cannot resize destroyed renderer\n }\n \n // Update container size\n this._container.style.width = `${width}px`;\n this._container.style.height = `${height}px`;\n \n // Notify all rendering backends of size change\n if (this._domRenderer) {\n this._domRenderer.resize(width, height);\n }\n if (this._canvas2DRenderer) {\n this._canvas2DRenderer.resize(width, height);\n }\n \n this.emit('resize', { width, height });\n }\n \n \n on(event: string, callback: Function): void {\n if (!this.eventListeners.has(event)) {\n this.eventListeners.set(event, []);\n }\n this.eventListeners.get(event)!.push(callback);\n }\n \n off(event: string, callback: Function): void {\n const listeners = this.eventListeners.get(event);\n if (listeners) {\n const index = listeners.indexOf(callback);\n if (index > -1) {\n listeners.splice(index, 1);\n }\n }\n }\n \n getCurrentTime(): number {\n return this._currentTime;\n }\n \n getDuration(): number {\n return this._duration;\n }\n \n isPlaying(): boolean {\n return this._state === 'playing';\n }\n \n isPaused(): boolean {\n return this._state === 'paused';\n }\n \n getCurrentEvent(): string | null {\n return this._currentEventId;\n }\n \n getCurrentScene(): string | null {\n return this._currentSceneId;\n }\n \n // Additional state getters for debugging and monitoring\n getState(): PlaybackState {\n return this._state;\n }\n \n getQuality(): QualityLevel {\n return this._quality;\n }\n \n isMounted(): boolean {\n return this._mounted;\n }\n \n // Performance monitoring methods\n getCurrentFps(): number {\n return this._scheduler.getCurrentFps();\n }\n \n getPerformanceMetrics() {\n return this._scheduler.getPerformanceMetrics();\n }\n \n getQualitySettings() {\n return this._qualitySystem.getCurrentSettings();\n }\n \n getDeviceCapabilities() {\n return this._qualitySystem.getDeviceCapabilities();\n }\n \n // Audio system methods\n setMasterVolume(volume: number): void {\n this._audioSystem.setMasterVolume(volume);\n }\n \n getMasterVolume(): number {\n return this._audioSystem.getMasterVolume();\n }\n \n isWebAudioAvailable(): boolean {\n return this._audioSystem.isWebAudioAvailable();\n }\n \n getActiveAudioTrackCount(): number {\n return this._audioSystem.getActiveTrackCount();\n }\n \n // Debug system methods\n isDebugEnabled(): boolean {\n return this._debugOverlay !== null;\n }\n \n toggleDebug(): void {\n if (this._debugOverlay) {\n this._debugOverlay.toggle();\n }\n }\n \n showDebug(): void {\n if (this._debugOverlay) {\n this._debugOverlay.show();\n }\n }\n \n hideDebug(): void {\n if (this._debugOverlay) {\n this._debugOverlay.hide();\n }\n }\n \n protected emit(event: string, ...args: any[]): void {\n const listeners = this.eventListeners.get(event);\n if (listeners) {\n listeners.forEach(callback => {\n try {\n callback(...args);\n } catch (error) {\n console.error(`Error in event listener for \"${event}\":`, error);\n }\n });\n }\n }\n \n // Frame callback for animation updates\n private _onFrame(context: FrameContext): void {\n if (this._state !== 'playing') {\n return;\n }\n \n // Update current time\n this._currentTime += context.deltaMs;\n \n // Clamp to duration\n if (this._currentTime >= this._duration) {\n this._currentTime = this._duration;\n this.stop(); // Auto-stop when reaching end\n this.emit('ended');\n return;\n }\n \n // Update current event and scene\n this._updateCurrentEventAndScene();\n \n // Update layers for current scene if scene changed\n this._updateCurrentSceneLayers();\n \n // Update performance metrics with current layer/particle counts\n this._scheduler.updateMetrics({\n activeLayers: this._currentSceneLayers.length,\n activeParticles: 0, // TODO: Get from particle systems\n domNodes: this._container.querySelectorAll('*').length,\n drawCalls: 0, // TODO: Get from canvas renderers\n });\n \n // Render current scene layers\n this._renderCurrentFrame(context);\n \n // Update audio system\n this._audioSystem.update(this._currentTime);\n \n // Emit frame update event\n this.emit('frame', {\n currentTime: this._currentTime,\n fps: context.fps,\n deltaMs: context.deltaMs,\n currentEvent: this._currentEventId,\n currentScene: this._currentSceneId,\n });\n }\n \n // Private helper methods\n \n private _setState(newState: PlaybackState): void {\n const previousState = this._state;\n this._state = newState;\n \n if (previousState !== newState) {\n this.emit('stateChange', { previousState, currentState: newState });\n }\n }\n \n private _calculateDuration(): void {\n // Calculate total duration by finding the maximum end time across all events\n let maxDuration = 0;\n \n for (const event of this._spec.events) {\n let eventDuration = 0;\n \n for (const sceneId of event.scenes) {\n const scene = this._spec.scenes.find(s => s.id === sceneId);\n if (scene) {\n eventDuration += scene.duration;\n }\n }\n \n maxDuration = Math.max(maxDuration, eventDuration);\n }\n \n this._duration = maxDuration;\n }\n \n private _calculateEventStartTime(eventId: string): number {\n // For now, assume events are sequential\n // TODO: In future tasks, implement proper event timing based on transitions\n let startTime = 0;\n \n for (const event of this._spec.events) {\n if (event.id === eventId) {\n return startTime;\n }\n \n // Add duration of this event's scenes\n for (const sceneId of event.scenes) {\n const scene = this._spec.scenes.find(s => s.id === sceneId);\n if (scene) {\n startTime += scene.duration;\n }\n }\n }\n \n return 0; // Event not found\n }\n \n private _calculateSceneStartTime(sceneId: string): number {\n // Find which event contains this scene and calculate its start time\n let totalTime = 0;\n \n for (const event of this._spec.events) {\n let eventTime = 0;\n \n for (const eventSceneId of event.scenes) {\n if (eventSceneId === sceneId) {\n return totalTime + eventTime;\n }\n \n const scene = this._spec.scenes.find(s => s.id === eventSceneId);\n if (scene) {\n eventTime += scene.duration;\n }\n }\n \n totalTime += eventTime;\n }\n \n return 0; // Scene not found\n }\n \n private _updateCurrentEventAndScene(): void {\n // Find current event and scene based on current time\n let accumulatedTime = 0;\n \n for (const event of this._spec.events) {\n let eventStartTime = accumulatedTime;\n let eventTime = 0;\n \n for (const sceneId of event.scenes) {\n const scene = this._spec.scenes.find(s => s.id === sceneId);\n if (scene) {\n const sceneStartTime = eventStartTime + eventTime;\n const sceneEndTime = sceneStartTime + scene.duration;\n \n if (this._currentTime >= sceneStartTime && this._currentTime < sceneEndTime) {\n this._currentEventId = event.id;\n this._currentSceneId = scene.id;\n return;\n }\n \n eventTime += scene.duration;\n }\n }\n \n accumulatedTime += eventTime;\n }\n \n // If we're past all content, stay on the last scene\n if (this._spec.events.length > 0) {\n const lastEvent = this._spec.events[this._spec.events.length - 1];\n if (lastEvent && lastEvent.scenes.length > 0) {\n const lastSceneId = lastEvent.scenes[lastEvent.scenes.length - 1];\n this._currentEventId = lastEvent.id;\n this._currentSceneId = lastSceneId || null;\n }\n }\n }\n \n private _setupContainer(): void {\n // Set up container for cinematic rendering\n const containerStyle = this._container.style;\n \n // Ensure container has position context for absolute positioning of layers\n if (!containerStyle.position || containerStyle.position === 'static') {\n containerStyle.position = 'relative';\n }\n \n // Ensure container has dimensions\n if (!containerStyle.width && !containerStyle.height) {\n containerStyle.width = '100%';\n containerStyle.height = '100%';\n }\n \n // Set overflow hidden to prevent content from spilling out\n containerStyle.overflow = 'hidden';\n \n // Add cinematic renderer class for styling\n this._container.classList.add('cinematic-renderer2d');\n \n // Set up CSS custom properties for theming\n containerStyle.setProperty('--cinematic-quality', this._quality);\n }\n \n private _setupResizeObserver(): void {\n // Set up automatic resize handling (Requirement 1.5)\n if (typeof ResizeObserver !== 'undefined') {\n this._resizeObserver = new ResizeObserver((entries) => {\n for (const entry of entries) {\n const { width, height } = entry.contentRect;\n this.resize(width, height);\n }\n });\n \n this._resizeObserver.observe(this._container);\n }\n }\n \n private _setupResizeListener(): void {\n // Set up window resize listener for automatic resize detection\n this._resizeListener = () => {\n const rect = this._container.getBoundingClientRect();\n this.resize(rect.width, rect.height);\n };\n \n window.addEventListener('resize', this._resizeListener);\n }\n \n // Layer management methods\n \n private _initializeRenderers(): void {\n // Initialize DOM renderer for DOM-based layers\n this._domRenderer = new DOMRenderer(this._container);\n this._domRenderer.initialize();\n \n // Initialize Canvas2D renderer for particle systems and effects\n this._canvas2DRenderer = new Canvas2DRenderer(this._container);\n this._canvas2DRenderer.initialize();\n }\n \n private _initializeLayers(): void {\n // Create layers for all scenes (they will be mounted/unmounted as needed)\n for (const scene of this._spec.scenes) {\n for (const layerSpec of scene.layers) {\n try {\n const layer = this._layerRegistry.createLayer(layerSpec.type, layerSpec.id, layerSpec.config);\n this._layers.push(layer);\n } catch (error) {\n console.error(`Failed to create layer ${layerSpec.id} of type ${layerSpec.type}:`, error);\n }\n }\n }\n \n // Mount layers for the initial scene\n this._updateCurrentSceneLayers();\n }\n \n private _updateCurrentSceneLayers(): void {\n const currentScene = this._getCurrentScene();\n if (!currentScene) return;\n \n // Get layers for current scene\n const newSceneLayers = this._layers.filter(layer => \n currentScene.layers.some(layerSpec => layerSpec.id === layer.id)\n );\n \n // Check if scene layers have changed\n const layersChanged = newSceneLayers.length !== this._currentSceneLayers.length ||\n newSceneLayers.some(layer => !this._currentSceneLayers.includes(layer));\n \n if (layersChanged) {\n // Unmount old layers\n for (const layer of this._currentSceneLayers) {\n if (!newSceneLayers.includes(layer)) {\n layer.destroy();\n }\n }\n \n // Mount new layers\n for (const layer of newSceneLayers) {\n if (!this._currentSceneLayers.includes(layer)) {\n this._mountLayer(layer);\n }\n }\n \n this._currentSceneLayers = newSceneLayers;\n }\n }\n \n private _mountLayer(layer: ICinematicLayer): void {\n try {\n // Determine which renderer to use based on layer type\n const builtInTypes = this._layerRegistry.getBuiltInTypes();\n let renderer: any = this._domRenderer; // Use any type to allow both renderer types\n \n if (builtInTypes.canvas2d.includes(layer.type)) {\n renderer = this._canvas2DRenderer;\n }\n \n if (!renderer) {\n console.error(`No suitable renderer found for layer type: ${layer.type}`);\n return;\n }\n \n // Create mount context\n const mountContext: LayerMountContext = {\n container: this._container,\n renderer,\n assetManager: null as any, // TODO: Implement asset manager\n layerConfig: this._getLayerConfig(layer.id),\n };\n \n // Mount the layer\n layer.mount(mountContext);\n } catch (error) {\n console.error(`Failed to mount layer ${layer.id}:`, error);\n }\n }\n \n private _renderCurrentFrame(context: FrameContext): void {\n // Create layer frame context\n const layerContext: import('./interfaces/LayerContext').FrameContext = {\n timeMs: this._currentTime,\n deltaMs: context.deltaMs,\n quality: this._quality,\n viewport: {\n width: this._container.clientWidth,\n height: this._container.clientHeight,\n },\n devicePixelRatio: window.devicePixelRatio || 1,\n };\n \n // Render DOM layers\n if (this._domRenderer && this._currentSceneLayers.length > 0) {\n const domLayers = this._currentSceneLayers.filter(layer => {\n const builtInTypes = this._layerRegistry.getBuiltInTypes();\n return builtInTypes.dom.includes(layer.type);\n });\n \n if (domLayers.length > 0) {\n this._domRenderer.render(domLayers, layerContext);\n }\n }\n \n // Render Canvas2D layers\n if (this._canvas2DRenderer && this._currentSceneLayers.length > 0) {\n const canvas2DLayers = this._currentSceneLayers.filter(layer => {\n const builtInTypes = this._layerRegistry.getBuiltInTypes();\n return builtInTypes.canvas2d.includes(layer.type);\n });\n \n if (canvas2DLayers.length > 0) {\n this._canvas2DRenderer.render(canvas2DLayers, layerContext);\n }\n }\n }\n \n private _getCurrentScene() {\n if (!this._currentSceneId) return null;\n return this._spec.scenes.find(scene => scene.id === this._currentSceneId);\n }\n \n private _getLayerConfig(layerId: string): Record<string, any> {\n for (const scene of this._spec.scenes) {\n const layerSpec = scene.layers.find(layer => layer.id === layerId);\n if (layerSpec) {\n return layerSpec.config || {};\n }\n }\n return {};\n }\n \n private _resetLayersToInitialState(): void {\n // Reset all layers to their initial state\n for (const layer of this._currentSceneLayers) {\n // TODO: Implement layer state reset\n // For now, just remount the layer\n layer.destroy();\n this._mountLayer(layer);\n }\n }\n \n private _destroyAllLayers(): void {\n // Destroy all layers\n for (const layer of this._layers) {\n try {\n layer.destroy();\n } catch (error) {\n console.error(`Error destroying layer ${layer.id}:`, error);\n }\n }\n \n this._layers = [];\n this._currentSceneLayers = [];\n }\n}"]}
|