@vidtreo/recorder-wc 1.6.0 → 1.6.1

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.
@@ -5791,7 +5791,7 @@ registerProcessor("${_v}", VidtreoAudioWorkletProcessor);
5791
5791
  if (track.source._codec === "webvtt") {
5792
5792
  trackData.cueQueue.push(cue);
5793
5793
  await this.processWebVTTCues(trackData, cue.timestamp);
5794
- } else {}
5794
+ }
5795
5795
  } finally {
5796
5796
  release();
5797
5797
  }
@@ -10348,8 +10348,8 @@ Mediabunny was loaded twice.\` + " This will likely cause Mediabunny not to work
10348
10348
  initializeRecorderWorker();
10349
10349
  }
10350
10350
  })();
10351
- `],{type:`application/javascript`})}let Yv=gv({createBlob:Jv,createObjectUrl:e=>URL.createObjectURL(e),revokeObjectUrl:e=>{URL.revokeObjectURL(e)}});function Xv(){return Yv.acquire()}function Zv(){Yv.release()}let Qv=1e3,$v=`format`,ey=new Map,ty=new Map;function ny(e){return e===void 0?`undefined`:String(e)}function ry(e){return e.join(`,`)}function iy(e,t){return`${e}=${t}`}function ay(e,t,n){if(e.has(t)&&e.delete(t),e.set(t,n),e.size<=50)return;let r=e.keys().next();r.done||e.delete(r.value)}var oy=class{constructor(e={}){this.worker=null,this.hasWorkerUrlLease=!1,this.chunks=[],this.totalSize=0,this.isActive=!1,this.audioTrackClone=null,this.audioTrackWarningTarget=null,this.isMuted=!1,this.currentVideoTrack=null,this.isPaused=!1,this.overlayConfig=null,this.readyPromiseResolve=null,this.readyPromiseReject=null,this.lastConfigFps=30,this.pendingFatalError=null,this.lastRecordingStats=null,this.audioWasExpected=!1,this.lastEncoderAcceleration=null,this.audioHealthMonitor=new pv,this.audioHealthIntervalId=null,this.emittedAudioWarnings=new Set,this.audioTrackEndedDuringSession=!1,this.recordingStartTimestampMs=null,this.noFrameWatchdogId=null,this.handleAudioTrackEnded=()=>{this.audioTrackEndedDuringSession=!0,this.emitAudioWarningOnce({code:`audio.track-ended`})},this.handleAudioTrackMuted=()=>{this.emitAudioWarningOnce({code:`audio.track-muted-by-browser`})},this.handleAudioTrackUnmuted=()=>{this.emittedAudioWarnings.delete(`audio.track-muted-by-browser`)&&this.onAudioRecovered&&this.onAudioRecovered()};let t=e=>new Worker(e,{type:`classic`});e.createWorker&&(t=e.createWorker);let n=e=>typeof MediaStreamTrackProcessor>`u`?null:new MediaStreamTrackProcessor({track:e}).readable;e.createVideoStreamFromTrack&&(n=e.createVideoStreamFromTrack);let r=()=>an();e.isLinuxPlatform&&(r=e.isLinuxPlatform),this.createVideoStreamFromTrackFn=n,this.isLinuxPlatformFn=r,e.videoFramePreflightDeps?this.videoFramePreflightDeps=e.videoFramePreflightDeps:this.videoFramePreflightDeps={},e.noFrameWatchdogDelayMs===void 0?this.watchdogDelayMs=5e3:this.watchdogDelayMs=e.noFrameWatchdogDelayMs;let i=!!e.createWorker;this.workerProbeManager=new qv({setTimeout:window.setTimeout.bind(window),clearTimeout:window.clearTimeout.bind(window),timeoutMilliseconds:2e3}),this.audioWorkletManager=new Ev({onChunk:this.handleAudioWorkletChunk.bind(this)});let a=e=>{let t=e.data;switch(t.type){case`ready`:this.readyPromiseResolve&&(this.readyPromiseResolve(),this.readyPromiseResolve=null,this.readyPromiseReject=null);break;case Gh:this.workerProbeManager.handleProbeResult(t);break;case`debugLog`:t.payload?$.debug(t.message,t.payload):$.debug(t.message);break;case`error`:if($.error(`[WorkerProcessor] Worker error:`,t.error),this.readyPromiseReject){let e=this.readyPromiseReject;this.readyPromiseReject=null,this.readyPromiseResolve=null,e(Error(t.error));break}this.onError&&this.onError(Error(t.error));break;case`chunk`:this.chunks.push({data:t.data,position:t.position}),this.totalSize=Math.max(this.totalSize,t.position+t.data.length);break;case`bufferUpdate`:this.onBufferUpdate&&this.onBufferUpdate(t.size,t.formatted);break;case`stateChange`:$.debug(`[WorkerProcessor] State changed:`,t.state),this.isPaused=t.state===`paused`;break;case`fatalError`:if(this.readyPromiseReject){let e=this.readyPromiseReject;this.readyPromiseReject=null,this.readyPromiseResolve=null,e(Error(`${t.message} [${t.code}]`));break}this.pendingFatalError=t;break;case`recordingStats`:this.lastRecordingStats=t,this.handleNoFrameWatchdogStats(t);break;case`encoderAcceleration`:this.lastEncoderAcceleration=t.acceleration,$.info(`[WorkerProcessor] Encoder acceleration resolved`,{acceleration:t.acceleration});break;default:$.warn(`[WorkerProcessor] Unknown response type:`,t)}},o=e=>{if($.error(`[WorkerProcessor] Worker error event:`,{message:e.message,filename:e.filename,lineno:e.lineno,colno:e.colno,error:e.error}),this.readyPromiseReject){let t=this.readyPromiseReject;this.readyPromiseReject=null,this.readyPromiseResolve=null,t(Error(e.message||`Unknown worker error`));return}if(this.onError){let t=e.message;t||=`Unknown worker error`,this.onError(Error(t))}},s=typeof Worker<`u`,c=!1;if(s&&(c=!0),i&&(c=!0),!c)throw $.error(`[WorkerProcessor] Web Workers are not supported`),Error(`Web Workers are not supported`);let l=Xv();this.hasWorkerUrlLease=!0;try{this.worker=Uv({createWorker:t,workerUrl:l,onMessage:a,onError:o,logger:$})}catch(e){throw this.releaseWorkerUrlLease(),e}}prewarm(){this.worker&&this.workerProbeManager.getProbeResult(this.worker).catch(()=>void 0)}getWorkerProbeResult(){let e=this.getWorkerOrThrow();return this.workerProbeManager.getProbeResult(e)}async startProcessing(e,t,n){this.getWorkerOrThrow(),this.ensureProcessingInactive(),this.resetProcessingState(n),this.stopAudioWorklet(),this.audioWorkletManager=new Ev({onChunk:this.handleAudioWorkletChunk.bind(this)});let r=this.resolveRecordingFormat(t),i=Vt(r,{isLinuxPlatform:this.isLinuxPlatformFn()}),a=this.resolveAudioBitrate(t,r),o=await this.resolveAudioCodecWithCache(t,r,i,a),s=await this.resolveVideoCodecWithCache(t,r,i),c=mv(e);$.debug(`[WorkerProcessor] Starting processing`,{isScreenCapture:c,fps:t.fps,codec:s,bitrate:t.bitrate});let l=this.buildWorkerTranscodeConfig(t,o,a,s,r);typeof t.fps==`number`&&t.fps>0&&(this.lastConfigFps=t.fps);let u=e.getVideoTracks(),d=e.getAudioTracks();$.debug(`[WorkerProcessor] Preparing to start processing`,{videoTracksCount:u.length,audioTracksCount:d.length,hasWorker:!!this.worker});let f=this.getVideoInputSelectorDependencies(),p=Nv(u,f),m=Pv(d,f),h=await this.getWorkerProbeResult();p&&($.debug(`[WorkerProcessor] Running video first-frame preflight`),await kv(p,3e3,this.videoFramePreflightDeps),$.debug(`[WorkerProcessor] Video first-frame preflight passed`));let g=Fv(p,h,f),_=Lv(f),v=Iv(p);zv(p,f),Bv(f),Rv(p,m,g.videoStream,f);let y=f.getViewportMetadata(),b;y&&(b={orientationAngle:y.orientationAngle,windowOrientation:y.windowOrientation});let{audioConfig:x,audioStream:S,shouldStartAudioWorklet:C}=await this.prepareAudioPipeline(m,h),ee=this.buildOverlayConfigToSend(),w=Wv({videoTrack:g.videoTrack,videoStream:g.videoStream,audioStream:S,isMobileDevice:_,videoSettings:v,viewportMetadata:b,audioConfig:x,workerConfig:l,overlayConfig:ee}),te=Kv(g.videoStream,S,g.videoTrack);$.debug(`[WorkerProcessor] Posting message to worker`,{transferablesCount:te.length,messageType:w.type}),await this.postStartMessage(w,te,C),this.startNoFrameWatchdog(),C&&this.startAudioHealthMonitoring()}getWorkerOrThrow(){if(!this.worker)throw Error(`Worker not initialized`);return this.worker}ensureProcessingInactive(){if(this.isActive)throw Error(`Processing already active`)}handleAudioWorkletChunk(e){if(!(this.isWorkerActive()&&this.worker))return;this.recordAudioHealthChunk(e);let t={type:`audioChunk`,data:e.data,frames:e.frames,numberOfChannels:e.numberOfChannels,sampleRate:e.sampleRate,timestamp:e.timestamp},n=[];e.data.buffer instanceof ArrayBuffer&&n.push(e.data.buffer),this.worker.postMessage(t,n)}resetProcessingState(e){this.isActive=!0,this.isMuted=!1,this.isPaused=!1,this.chunks=[],this.totalSize=0,this.audioWasExpected=!1,this.audioHealthMonitor.reset(),this.emittedAudioWarnings=new Set,this.audioTrackEndedDuringSession=!1,this.recordingStartTimestampMs=performance.now(),this.pendingFatalError=null,this.lastRecordingStats=null,this.lastEncoderAcceleration=null,this.stopAudioHealthMonitoring(),this.stopNoFrameWatchdog(),e?this.overlayConfig=e:this.overlayConfig=null}recordAudioHealthChunk(e){let t=this.audioHealthMonitor.recordChunk({samples:e.data,timestampMs:performance.now(),isMuted:this.isMuted});this.emitAudioWarning(t.classification,{durationMs:t.consecutiveSilentDurationMs,peak:t.peak,rms:t.rms})}startAudioHealthMonitoring(){this.stopAudioHealthMonitoring(),this.audioHealthIntervalId=window.setInterval(()=>{if(!this.isActive)return;let e=this.audioHealthMonitor.inspect(performance.now(),this.isMuted);this.emitAudioWarning(e.classification,{durationMs:Math.max(e.noChunkDurationMs,e.consecutiveSilentDurationMs),peak:e.peak,rms:e.rms})},1e3)}stopAudioHealthMonitoring(){this.audioHealthIntervalId!==null&&(window.clearInterval(this.audioHealthIntervalId),this.audioHealthIntervalId=null)}startNoFrameWatchdog(){this.stopNoFrameWatchdog(),this.noFrameWatchdogId=window.setTimeout(()=>{this.noFrameWatchdogId=null,this.isWorkerActive()&&this.worker&&this.worker.postMessage({type:`requestStats`})},this.watchdogDelayMs)}stopNoFrameWatchdog(){this.noFrameWatchdogId!==null&&(window.clearTimeout(this.noFrameWatchdogId),this.noFrameWatchdogId=null)}handleNoFrameWatchdogStats(e){if(!this.isActive||e.videoFrameCount>0)return;$.error(`[WorkerProcessor] No video frames received after watchdog delay`,{videoFrameCount:e.videoFrameCount,totalFrameErrors:e.totalFrameErrors,totalFramesProcessed:e.totalFramesProcessed});let t=Error(`No video frames received after ${this.watchdogDelayMs/Qv}s — video stream may be unresponsive [${Dv}]`);this.onError&&this.onError(t),this.cancel()}emitAudioWarning(e,t){if(e===`healthy`){let e=this.emittedAudioWarnings.size>0;this.emittedAudioWarnings.clear(),e&&this.onAudioRecovered&&this.onAudioRecovered();return}if(e===`muted-silence-expected`){(this.emittedAudioWarnings.delete(`audio.no-signal`)||this.emittedAudioWarnings.delete(`audio.no-chunks`))&&this.onAudioRecovered&&this.onAudioRecovered();return}let n=this.createAudioWarning(e,t);n&&this.emitAudioWarningOnce(n)}emitAudioWarningOnce(e){this.onAudioWarning&&(this.emittedAudioWarnings.has(e.code)||(this.emittedAudioWarnings.add(e.code),this.onAudioWarning(e)))}createAudioWarning(e,t){return e===`no-chunks`?{code:`audio.no-chunks`,durationMs:t.durationMs}:e===`silent-while-unmuted`?{code:`audio.no-signal`,durationMs:t.durationMs}:e===`low-signal`?{code:`audio.low-signal`,peak:t.peak,rms:t.rms}:null}assertRuntimeAudioHealth(){let e=performance.now(),t=this.recordingStartTimestampMs??e,n=Math.max(0,e-t),r=this.audioHealthMonitor.getFinalSnapshot(e,this.isMuted),i=Tg({totalChunks:r.totalChunks,nonSilentChunks:r.nonSilentChunks,mutedDurationMs:r.mutedDurationMs,durationMs:n,hadTrackEndedWarning:this.audioTrackEndedDuringSession});if(!i.ok)throw Sg(i.code,{totalChunks:r.totalChunks,nonSilentChunks:r.nonSilentChunks,mutedDurationMs:r.mutedDurationMs,durationMs:n,hadTrackEndedWarning:this.audioTrackEndedDuringSession})}resolveRecordingFormat(e){let t=e.format;return t||=`mp4`,t}resolveAudioBitrate(e,t){return e.audioBitrate===void 0?Gt(t):e.audioBitrate}async resolveAudioCodec(e,t,n,r){return await lh({format:t,overrideCodec:e.audioCodec,policy:n,bitrate:r})}async resolveVideoCodec(e,t,n){return await ch({format:t,overrideCodec:e.codec,policy:n,width:e.width,height:e.height,bitrate:e.bitrate})}async resolveAudioCodecWithCache(e,t,n,r){let i=this.buildAudioCodecCacheKey(e,t,n,r),a=ey.get(i);if(a)return a;let o=await this.resolveAudioCodec(e,t,n,r);return ay(ey,i,o),o}async resolveVideoCodecWithCache(e,t,n){let r=this.buildVideoCodecCacheKey(e,t,n),i=ty.get(r);if(i)return i;let a=await this.resolveVideoCodec(e,t,n);return ay(ty,r,a),a}buildAudioCodecCacheKey(e,t,n,r){let i=ny(e.audioCodec),a=ny(n.preferredAudioCodec),o=ry(n.audioCodecFallbackOrder),s=ny(r);return[iy($v,ny(t)),iy(`audioOverride`,i),iy(`audioBitrate`,s),iy(`policyPreferredAudio`,a),iy(`policyAudioFallback`,o)].join(`|`)}buildVideoCodecCacheKey(e,t,n){let r=ny(e.codec),i=ny(e.width),a=ny(e.height),o=ny(e.bitrate),s=ny(n.preferredVideoCodec),c=ry(n.videoCodecFallbackOrder);return[iy($v,ny(t)),iy(`videoOverride`,r),iy(`width`,i),iy(`height`,a),iy(`videoBitrate`,o),iy(`policyPreferredVideo`,s),iy(`policyVideoFallback`,c)].join(`|`)}buildWorkerTranscodeConfig(e,t,n,r,i){return{width:e.width,height:e.height,fps:e.fps,bitrate:hv(e.bitrate),audioCodec:t,audioBitrate:n,codec:r,keyFrameInterval:5,latencyMode:e.latencyMode,format:i,watermark:e.watermark}}async prepareAudioPipeline(e,t){if(!e)return $.debug(`[WorkerProcessor] Audio pipeline disabled (no track)`),{audioConfig:null,audioStream:null,shouldStartAudioWorklet:!1};let n=await this.prepareAudioConfig(e);if(!n)throw this.createBrowserUnsupportedError();return $.debug(`[WorkerProcessor] Audio pipeline selected`,{path:`audio-worklet-chunks`,sampleRate:n.sampleRate,numberOfChannels:n.numberOfChannels}),{audioConfig:n,audioStream:null,shouldStartAudioWorklet:!0}}buildOverlayConfigToSend(){if(this.overlayConfig)return this.overlayConfig}async postStartMessage(e,t,n){let r=this.getWorkerOrThrow(),i=new Promise((e,t)=>{this.readyPromiseResolve=e,this.readyPromiseReject=t});try{r.postMessage(e,t),$.debug(`[WorkerProcessor] Message posted successfully`),await i,$.debug(`[WorkerProcessor] Worker confirmed ready`),n&&(this.audioWasExpected=!0,await this.startAudioWorkletProcessing())}catch(e){throw $.error(`[WorkerProcessor] Failed to post message:`,e),this.readyPromiseResolve=null,this.readyPromiseReject=null,this.stopNoFrameWatchdog(),this.stopAudioWorklet(),this.worker&&this.isActive&&this.worker.postMessage({type:`stop`}),this.isActive=!1,e}}pause(){this.worker&&this.isActive&&(this.worker.postMessage({type:`pause`}),this.setAudioWorkletPaused(!0))}resume(){this.isWorkerActive()&&this.worker&&(this.worker.postMessage({type:`resume`}),this.setAudioWorkletPaused(!1))}isWorkerActive(){return!!(this.worker&&this.isActive)}toggleMute(){this.isMuted=!this.isMuted,this.onMuteStateChange&&this.onMuteStateChange(this.isMuted),this.isWorkerActive()&&this.worker&&this.worker.postMessage({type:`toggleMute`}),this.setAudioWorkletMuted(this.isMuted)}async switchVideoSource(e){if(!(this.isWorkerActive()&&this.worker))return $.debug(`[WorkerProcessor] Cannot switch source - worker not active`,{hasWorker:!!this.worker,isActive:this.isActive}),Promise.resolve();let t=e.getVideoTracks();if($.debug(`[WorkerProcessor] Switching video source`,{videoTracksCount:t.length}),t.length===0)return $.warn(`[WorkerProcessor] No video tracks in new stream`),Promise.resolve();let n=mv(e),r=this.lastConfigFps;$.debug(`[WorkerProcessor] Source type detected`,{isScreenCapture:n,targetFps:r});let i={type:`updateFps`,fps:r};this.worker.postMessage(i);let a={type:`updateSourceType`,isScreenCapture:n};this.worker.postMessage(a);let o=this.getVideoInputSelectorDependencies(),s=Nv(t,o);if(!s)return $.warn(`[WorkerProcessor] Unable to prepare video track`),Promise.resolve();$.debug(`[WorkerProcessor] New video track details`,{trackId:s.id,trackKind:s.kind,trackReadyState:s.readyState});let c=Fv(s,await this.getWorkerProbeResult(),o),l=Gv(c.videoTrack,c.videoStream),u=Kv(c.videoStream,null,c.videoTrack);try{return $.debug(`[WorkerProcessor] Posting switch source message`),this.worker.postMessage(l,u),$.debug(`[WorkerProcessor] Switch source message posted`),new Promise(e=>{setTimeout(()=>{e()},0)})}catch(e){throw $.error(`[WorkerProcessor] Failed to switch source:`,e),e}}finalize(){if(!this.isWorkerActive())throw Error(`Processing not active`);let e=performance.now();return new Promise((t,n)=>{let r=this.worker;if(!r){n(Error(`Worker not initialized`));return}let i=null,a=()=>{i!==null&&(clearTimeout(i),i=null)},o=()=>{r.removeEventListener(`message`,l)},s=!1,c=()=>s?!1:(s=!0,a(),o(),!0),l=r=>{if(s)return;let i=r.data;if(i.type===`fatalError`){this.pendingFatalError=i;return}if(i.type===`recordingStats`){this.lastRecordingStats=i;return}if(i.type===`stateChange`&&i.state===`stopped`){this.handleFinalizeStopped(c,t,n,e);return}i.type===`error`&&this.handleFinalizeError(c,n,i.error,e)};i=setTimeout(()=>{c()&&($.error(`[WorkerProcessor] Finalize timeout reached`,{elapsedSeconds:(performance.now()-e)/Qv}),this.resetFinalizeRuntimeState(),n(Error(`Finalize timeout`)))},3e4),r.addEventListener(`message`,l),r.postMessage({type:`stop`})})}handleFinalizeStopped(e,t,n,r){let i=this.lastRecordingStats,a=this.lastEncoderAcceleration;if(this.pendingFatalError!==null){let t=this.pendingFatalError;if(!e())return;this.resetFinalizeRuntimeState(),n(Error(this.buildFatalFinalizeErrorMessage(t,i)));return}e()&&(this.resetFinalizeRuntimeState(),Promise.resolve().then(()=>this.createBlobFromChunks(i,a)).then(e=>{t(e)},e=>{this.rejectFinalizeBlobCreationError(n,e,r)}))}handleFinalizeError(e,t,n,r){e()&&(this.resetFinalizeRuntimeState(),$.error(`[WorkerProcessor] Finalize failed`,{elapsedSeconds:(performance.now()-r)/Qv,error:n}),t(Error(n)))}buildFatalFinalizeErrorMessage(e,t){return t===null?`${e.message} [${e.code}]`:`${e.message} [${e.code}] frames=${t.videoFrameCount} errors=${t.totalFrameErrors}`}resetFinalizeRuntimeState(){this.isActive=!1,this.stopAudioHealthMonitoring(),this.stopNoFrameWatchdog(),this.stopAudioWorklet(),this.detachAudioTrackWarnings(),this.pendingFatalError=null,this.lastRecordingStats=null,this.lastEncoderAcceleration=null}createBlobFromChunks(e,t){let n=[...this.chunks].sort((e,t)=>e.position-t.position),r=new ArrayBuffer(this.totalSize),i=new Uint8Array(r);for(let e of n)i.set(e.data,e.position);Rh(r),zh(r),this.audioWasExpected&&(this.assertRuntimeAudioHealth(),Bh(r));let a={blob:new Blob([r],{type:`video/mp4`}),totalSize:this.totalSize};return e!==null&&(a.recordingStats={totalFrameErrors:e.totalFrameErrors,totalFramesProcessed:e.totalFramesProcessed,videoFrameCount:e.videoFrameCount}),t!==null&&(a.encoderAcceleration=t),a}rejectFinalizeBlobCreationError(e,t,n){if($.error(`[WorkerProcessor] Finalize failed while creating blob`,{elapsedSeconds:(performance.now()-n)/Qv,error:i(t)}),t instanceof Error){e(t);return}e(Error(i(t)))}cancel(){return this.worker&&this.isActive&&this.worker.postMessage({type:`stop`}),this.stopAudioHealthMonitoring(),this.stopNoFrameWatchdog(),this.stopAudioWorklet(),this.detachAudioTrackWarnings(),this.isActive=!1,this.isPaused=!1,this.chunks=[],this.totalSize=0,this.audioWasExpected=!1,this.emittedAudioWarnings=new Set,this.audioTrackEndedDuringSession=!1,this.recordingStartTimestampMs=null,this.pendingFatalError=null,this.lastRecordingStats=null,this.lastEncoderAcceleration=null,Promise.resolve()}destroy(){this.worker&&=(this.worker.terminate(),null),this.releaseWorkerUrlLease(),this.stopAudioHealthMonitoring(),this.stopNoFrameWatchdog(),this.stopAudioWorklet(),this.detachAudioTrackWarnings(),this.isActive=!1,this.isPaused=!1,this.chunks=[],this.totalSize=0}cleanup(){this.destroy()}warmupEncoder(e){if(!this.worker)return;let t=e.format||`mp4`,n=Vt(t),r=e.codec||n.preferredVideoCodec,i=e.audioBitrate===void 0?n.audioBitrate:e.audioBitrate,a=Vt(t,{isLinuxPlatform:this.isLinuxPlatformFn()}),o=this.resolveAudioBitrate(e,t);this.resolveAudioCodecWithCache(e,t,a,o).catch(this.handleWarmupCacheError),this.resolveVideoCodecWithCache(e,t,a).catch(this.handleWarmupCacheError);let s={type:`warmup`,config:this.buildWorkerTranscodeConfig(e,n.preferredAudioCodec,i,r,t)};this.worker.postMessage(s)}getBufferSize(){return this.totalSize}getMutedState(){return this.isMuted}updateTabVisibility(e,t){if(!(this.isWorkerActive()&&this.worker)){$.warn(`[WorkerProcessor] Cannot update visibility - worker not active`,{isActive:this.isActive,hasWorker:!!this.worker});return}$.debug(`[WorkerProcessor] Sending visibility update to worker`,{isHidden:e,timestamp:t,timestampSeconds:t/Qv});let n={type:`updateVisibility`,isHidden:e,timestamp:t};this.worker.postMessage(n)}updateSourceType(e){if(!(this.isWorkerActive()&&this.worker)){$.warn(`[WorkerProcessor] Cannot update source type - worker not active`,{isActive:this.isActive,hasWorker:!!this.worker});return}$.debug(`[WorkerProcessor] Sending source type update to worker`,{isScreenCapture:e});let t={type:`updateSourceType`,isScreenCapture:e};this.worker.postMessage(t)}async startAudioWorkletProcessing(){await this.audioWorkletManager.startProcessing()}stopAudioWorklet(){this.audioWorkletManager.stop()}setAudioWorkletMuted(e){this.audioWorkletManager.setMuted(e)}setAudioWorkletPaused(e){this.audioWorkletManager.setPaused(e)}prepareAudioConfig(e){return this.audioWorkletManager.prepareAudioConfig(e)}handleWarmupCacheError(){}createBrowserUnsupportedError(){return Mt({resolutionStage:`feature-preflight`})}getVideoInputSelectorDependencies(){return{stopCurrentVideoTrack:()=>this.stopCurrentVideoTrack(),cloneVideoTrack:e=>this.cloneVideoTrack(e),cloneAudioTrack:e=>this.cloneAudioTrack(e),setCurrentVideoTrack:e=>{this.currentVideoTrack=e},createVideoStreamFromTrack:e=>this.createVideoStreamFromTrackFn(e),createBrowserUnsupportedError:()=>this.createBrowserUnsupportedError(),getViewportMetadata:()=>{if(typeof window>`u`)return null;let e=window.screen,t,n,r,i;return e&&(i=e.orientation),i?.type&&(t=i.type),i&&typeof i.angle==`number`&&(n=i.angle),typeof window.orientation==`number`&&(r=window.orientation),{innerWidth:window.innerWidth,innerHeight:window.innerHeight,orientation:t,orientationAngle:n,windowOrientation:r}},logger:{debug:(e,t)=>$.debug(e,t),warn:(e,t)=>$.warn(e,t)},isMobileDevice:()=>Zt()}}isPausedState(){return this.isPaused}getClonedAudioTrack(){return this.audioTrackClone}getAudioStreamForAnalysis(){return this.audioTrackClone?new MediaStream([this.audioTrackClone]):null}setOnBufferUpdate(e){this.onBufferUpdate=e}setOnError(e){this.onError=e}setOnMuteStateChange(e){this.onMuteStateChange=e}setOnAudioWarning(e){this.onAudioWarning=e}setOnAudioRecovered(e){this.onAudioRecovered=e}cloneVideoTrack(e){if($.debug(`[WorkerProcessor] Original video track:`,{id:e.id,kind:e.kind,readyState:e.readyState,hasClone:typeof e.clone==`function`}),typeof e.clone==`function`)try{let t=e.clone();return $.debug(`[WorkerProcessor] Video track cloned successfully:`,{id:t.id,kind:t.kind,readyState:t.readyState}),t}catch(e){$.error(`[WorkerProcessor] Failed to clone video track:`,e);let t=i(e);throw Error(`Failed to clone video track: ${t}`)}return $.warn(`[WorkerProcessor] Video track clone() not available, using original`),e}attachAudioTrackWarnings(e){this.detachAudioTrackWarnings(),e.addEventListener(`ended`,this.handleAudioTrackEnded),e.addEventListener(`mute`,this.handleAudioTrackMuted),e.addEventListener(`unmute`,this.handleAudioTrackUnmuted),this.audioTrackWarningTarget=e}detachAudioTrackWarnings(){this.audioTrackWarningTarget&&=(this.audioTrackWarningTarget.removeEventListener(`ended`,this.handleAudioTrackEnded),this.audioTrackWarningTarget.removeEventListener(`mute`,this.handleAudioTrackMuted),this.audioTrackWarningTarget.removeEventListener(`unmute`,this.handleAudioTrackUnmuted),null)}cloneAudioTrack(e){if($.debug(`[WorkerProcessor] Original audio track:`,{id:e.id,kind:e.kind,readyState:e.readyState,hasClone:typeof e.clone==`function`}),typeof e.clone==`function`)try{let t=e.clone();return this.audioTrackClone=t,this.attachAudioTrackWarnings(t),$.debug(`[WorkerProcessor] Audio track cloned successfully:`,{id:t.id,kind:t.kind,readyState:t.readyState}),t}catch(e){$.error(`[WorkerProcessor] Failed to clone audio track:`,e);let t=i(e);throw Error(`Failed to clone audio track: ${t}`)}return $.warn(`[WorkerProcessor] Audio track clone() not available, using original`),this.audioTrackClone=e,this.attachAudioTrackWarnings(e),e}stopCurrentVideoTrack(){this.currentVideoTrack&&this.currentVideoTrack.readyState===`live`&&this.currentVideoTrack.stop(),this.currentVideoTrack=null}releaseWorkerUrlLease(){this.hasWorkerUrlLease&&=(Zv(),!1)}},sy=class{constructor(e={}){this.currentVideoStream=null;let t=()=>new oy;e.workerProcessorFactory&&(t=e.workerProcessorFactory);try{this.workerProcessor=t(),$.debug(`[StreamProcessor] Using worker-based processing`)}catch(e){let t=i(e);throw Error(`Failed to initialize worker: ${t}`)}}async startProcessing(e,t,n){this.workerProcessor.setOnBufferUpdate((e,t)=>{$.debug(`[StreamProcessor] Buffer update:`,{size:e,formatted:t}),this.onBufferUpdate&&this.onBufferUpdate(e,t)}),this.workerProcessor.setOnError(e=>{$.error(`[StreamProcessor] Worker error:`,e),this.onError&&this.onError(e)}),this.currentVideoStream=e,await this.workerProcessor.startProcessing(e,t,n)}updateTabVisibility(e,t){this.workerProcessor.updateTabVisibility(e,t)}updateSourceType(e){this.workerProcessor.updateSourceType(e)}pause(){this.workerProcessor.pause()}resume(){this.workerProcessor.resume()}isPausedState(){return this.workerProcessor.isPausedState()}async finalize(){return $.debug(`[StreamProcessor] finalize called`),await this.workerProcessor.finalize()}toggleMute(){this.workerProcessor.toggleMute()}isMutedState(){return this.workerProcessor.getMutedState()}getClonedAudioTrack(){return this.workerProcessor.getClonedAudioTrack()}getAudioStreamForAnalysis(){return this.workerProcessor.getAudioStreamForAnalysis()}async switchVideoSource(e){await this.workerProcessor.switchVideoSource(e),this.currentVideoStream=e,this.onSourceChange&&this.onSourceChange(e)}getCurrentVideoSource(){return this.currentVideoStream}getBufferSize(){return this.workerProcessor.getBufferSize()}setOnMuteStateChange(e){this.workerProcessor.setOnMuteStateChange(e)}setOnSourceChange(e){this.onSourceChange=e}setOnBufferUpdate(e){this.onBufferUpdate=e}setOnError(e){this.onError=e}setOnAudioWarning(e){this.workerProcessor.setOnAudioWarning(e)}setOnAudioRecovered(e){this.workerProcessor.setOnAudioRecovered(e)}warmupEncoder(e){this.workerProcessor.warmupEncoder(e)}prewarm(){this.workerProcessor.prewarm()}async cancel(){await this.workerProcessor.cancel(),this.currentVideoStream=null}destroy(){this.workerProcessor.destroy(),this.currentVideoStream=null}};let cy=1e3,ly=`recording`,uy=`idle`;var dy=class{constructor(e,t){this.recordingState=uy,this.countdownDuration=5e3,this.countdownRemaining=0,this.countdownTimeoutId=null,this.countdownIntervalId=null,this.countdownStartTime=null,this.isPaused=!1,this.maxRecordingTime=null,this.maxTimeTimer=null,this.recordingStartTime=null,this.maxTimeRemaining=null,this.recordingSeconds=0,this.recordingIntervalId=null,this.pauseStartTime=null,this.totalPausedTime=0,this.streamProcessor=null,this.originalCameraStream=null,this.enableTabVisibilityOverlay=!1,this.startupAborted=!1,this.streamManager=e,this.callbacks=t}setCountdownDuration(e){this.countdownDuration=e}setMaxRecordingTime(e){this.maxRecordingTime=e}setTabVisibilityOverlayConfig(e,t){this.enableTabVisibilityOverlay=e,this.tabVisibilityOverlayText=t}getRecordingState(){return this.recordingState}isPausedState(){return this.isPaused}getRecordingSeconds(){return this.recordingSeconds}getStreamProcessor(){return this.streamProcessor}updateSourceType(e){this.recordingState!==ly||!this.streamProcessor||this.streamProcessor.updateSourceType(e)}setOriginalCameraStream(e){this.originalCameraStream=e}getOriginalCameraStream(){return this.originalCameraStream}prewarmStreamProcessor(e){let t=this.getOrCreateStreamProcessor();t.prewarm(),e&&t.warmupEncoder(e)}async startRecording(){try{this.callbacks.onClearUploadStatus(),this.countdownDuration>0?this.startCountdown():await this.doStartRecording()}catch(e){this.handleError(e),this.recordingState=uy,this.cancelCountdown()}}startCountdown(){this.recordingState=`countdown`,this.countdownRemaining=Math.ceil(this.countdownDuration/cy),this.countdownStartTime=Date.now(),this.callbacks.onCountdownUpdate(this.recordingState,this.countdownRemaining),this.countdownIntervalId=window.setInterval(()=>{if(!this.countdownStartTime)return;let e=Date.now()-this.countdownStartTime,t=Math.max(0,Math.ceil((this.countdownDuration-e)/cy)),n=this.countdownRemaining;this.countdownRemaining=t,n!==t&&this.callbacks.onCountdownUpdate(this.recordingState,this.countdownRemaining)},100),this.countdownTimeoutId=window.setTimeout(async()=>{await this.doStartRecording().catch(()=>void 0)},this.countdownDuration)}async doStartRecording(){$.debug(`[RecordingManager] doStartRecording called`),this.cancelCountdown(),this.resetRecordingState(),this.startupAborted=!1;let e=this.streamManager.getStream();if($.debug(`[RecordingManager] Current stream:`,{hasStream:!!e,audioTracks:e?.getAudioTracks().length||0,videoTracks:e?.getVideoTracks().length||0}),!e){$.warn(`[RecordingManager] No stream available`),this.handleError(Error(`No stream available for recording`)),this.recordingState=uy,this.callbacks.onStateChange(this.recordingState);return}this.originalCameraStream=e,$.debug(`[RecordingManager] Ensuring stream processor`);let t=this.getOrCreateStreamProcessor();$.debug(`[RecordingManager] StreamProcessor ready:`,!!t);let n=null,r=await this.callbacks.onGetConfig().then(e=>(n=e,null)).catch(e=>e);if(r){this.handleError(r),this.recordingState=uy,this.callbacks.onStateChange(this.recordingState);return}if(!n){this.handleError(Error(`Failed to get recording config`)),this.recordingState=uy,this.callbacks.onStateChange(this.recordingState);return}this.callbacks.onAudioWarning&&t.setOnAudioWarning(this.callbacks.onAudioWarning),this.callbacks.onAudioRecovered&&t.setOnAudioRecovered(this.callbacks.onAudioRecovered),t.setOnError(e=>{this.handleFatalProcessorError(e)}),$.debug(`[RecordingManager] Starting recording with stream manager`);let i=await this.streamManager.startRecording(t,n,this.enableTabVisibilityOverlay,this.tabVisibilityOverlayText).then(()=>null).catch(e=>($.error(`[RecordingManager] Error starting recording:`,e),e));if(i){this.handleError(i),this.recordingState=uy,this.callbacks.onStateChange(this.recordingState);return}if(this.startupAborted){this.startupAborted=!1;return}$.info(`[RecordingManager] Recording started successfully`),this.recordingState=ly,this.callbacks.onStateChange(this.recordingState),this.startRecordingTimer(),this.recordingStartTime=Date.now(),this.maxRecordingTime&&this.maxRecordingTime>0&&(this.maxTimeRemaining=this.maxRecordingTime,this.startMaxTimeTimer())}async stopRecording(){$.debug(`[RecordingManager] stopRecording called`);try{this.cancelCountdown(),this.clearTimer(this.recordingIntervalId,clearInterval),this.recordingIntervalId=null,this.clearTimer(this.maxTimeTimer,clearTimeout),this.maxTimeTimer=null,this.resetPauseState(),this.callbacks.onStopAudioTracking(),$.debug(`[RecordingManager] Stopping recording in stream manager`);let e=await this.streamManager.stopRecording(),t=e.blob;$.info(`[RecordingManager] Recording stopped, blob size:`,t.size),this.recordingState=uy,this.callbacks.onStateChange(this.recordingState),this.recordingSeconds=0,this.streamProcessor&&=(this.streamProcessor.destroy(),null),this.callbacks.onRecordingComplete(t);let n={};return e.recordingStats!==void 0&&(n.videoFrameCount=e.recordingStats.videoFrameCount,n.totalFrameErrors=e.recordingStats.totalFrameErrors,n.totalFramesProcessed=e.recordingStats.totalFramesProcessed),e.encoderAcceleration!==void 0&&(n.encoderAcceleration=e.encoderAcceleration),{blob:t,telemetryProperties:n}}catch(e){throw this.handleError(e),this.recordingState=uy,this.callbacks.onStateChange(this.recordingState),e}}pauseRecording(){if(!(this.recordingState!==ly||this.isPaused)&&(this.streamManager.pauseRecording(),this.isPaused=!0,this.clearTimer(this.recordingIntervalId,clearInterval),this.recordingIntervalId=null,this.pauseStartTime=Date.now(),this.maxTimeTimer!==null&&this.recordingStartTime!==null&&this.maxRecordingTime!==null)){let e=Date.now()-this.recordingStartTime-this.totalPausedTime;this.maxTimeRemaining=Math.max(0,this.maxRecordingTime-e),this.clearTimer(this.maxTimeTimer,clearTimeout),this.maxTimeTimer=null}}resumeRecording(){this.recordingState!==ly||!this.isPaused||(this.streamManager.resumeRecording(),this.isPaused=!1,this.updatePausedDuration(),this.startRecordingTimer(),this.maxTimeRemaining!==null&&this.maxTimeRemaining>0&&this.startMaxTimeTimer())}cancelCountdown(){this.clearTimer(this.countdownTimeoutId,clearTimeout),this.countdownTimeoutId=null,this.clearTimer(this.countdownIntervalId,clearInterval),this.countdownIntervalId=null,this.recordingState=uy,this.countdownRemaining=0,this.countdownStartTime=null,this.callbacks.onCountdownUpdate(this.recordingState,this.countdownRemaining)}cleanup(){this.cancelCountdown(),this.clearTimer(this.recordingIntervalId,clearInterval),this.recordingIntervalId=null,this.clearTimer(this.maxTimeTimer,clearTimeout),this.maxTimeTimer=null,this.streamProcessor&&=(this.streamProcessor.destroy(),null)}resetRecordingState(){this.isPaused=!1,this.recordingSeconds=0,this.totalPausedTime=0,this.pauseStartTime=null,this.recordingStartTime=null,this.maxTimeRemaining=null}resetPauseState(){this.isPaused=!1,this.pauseStartTime=null,this.totalPausedTime=0}getOrCreateStreamProcessor(){if(this.streamProcessor)return this.streamProcessor;let e=new sy;return this.streamProcessor=e,e}updatePausedDuration(){if(this.pauseStartTime===null)throw Error(`Pause start time not set`);let e=Date.now()-this.pauseStartTime;this.totalPausedTime+=e,this.pauseStartTime=null}startRecordingTimer(){if(this.recordingIntervalId!==null)return;let e=O_(this.recordingSeconds);this.callbacks.onTimerUpdate(e),this.recordingIntervalId=window.setInterval(()=>{this.recordingSeconds+=1;let e=O_(this.recordingSeconds);this.callbacks.onTimerUpdate(e)},1e3)}startMaxTimeTimer(){this.maxTimeRemaining===null||this.maxTimeRemaining<=0||(this.clearTimer(this.maxTimeTimer,clearTimeout),this.maxTimeTimer=window.setTimeout(async()=>{this.recordingState===ly&&!this.isPaused&&await this.stopRecording()},this.maxTimeRemaining))}clearTimer(e,t){e!==null&&t(e)}handleError(e){let t=e instanceof Error?e:Error(i(e));this.callbacks.onError(t)}handleFatalProcessorError(e){this.recordingState===ly&&(this.clearTimer(this.recordingIntervalId,clearInterval),this.recordingIntervalId=null,this.clearTimer(this.maxTimeTimer,clearTimeout),this.maxTimeTimer=null,this.resetPauseState()),!(!this.streamProcessor&&this.recordingState!==ly)&&($.error(`[RecordingManager] Fatal processor error, stopping recording`,e),this.startupAborted=!0,this.streamProcessor&&=(this.streamProcessor.destroy(),null),this.recordingState=uy,this.callbacks.onStateChange(this.recordingState),this.recordingSeconds=0,this.callbacks.onError(e))}},fy=class{constructor(e){this.client=null,this.createTelemetryClient=e.createTelemetryClient}initialize(e,t){typeof e==`string`&&e.length>0&&typeof t==`string`&&t.length>0&&(this.client=this.createTelemetryClient(e,t))}sendEvent(e,t,n){if(!this.client)return;let r={name:e};t&&(r={...r,properties:t}),n&&(r={...r,error:n}),this.client.triggerTelemetryEvent(r)}async executeAction(e){e.requestedEvent&&this.sendEvent(e.requestedEvent,e.properties);let t=null;if(await e.action().catch(e=>{t=e}),t)throw this.sendEvent(e.failedEvent,e.properties,t),t;this.sendEvent(e.succeededEvent,e.properties)}async executeActionWithResult(e){e.requestedEvent&&this.sendEvent(e.requestedEvent,e.properties);let t=null,n=null;if(await e.action().then(e=>{n=e}).catch(e=>{t=e}),t)throw this.sendEvent(e.failedEvent,e.properties,t),t;if(n===null)throw Error(`Telemetry action failed to return result`);let r=this.resolveResultTelemetryProperties(n,e.getPropertiesFromResult),i=this.mergeTelemetryProperties(e.properties,r);return this.sendEvent(e.succeededEvent,i),n}resolveResultTelemetryProperties(e,t){if(t!==void 0)return t(e)}mergeTelemetryProperties(e,t){if(!(e===void 0&&t===void 0))return e===void 0?t:t===void 0?e:{...e,...t}}},py=class{constructor(){this.metadataById=new Map}getMetadata(e){return this.metadataById.get(e)}setMetadata(e,t){let n=new Map(this.metadataById);n.set(e,t),this.metadataById=n}clearMetadata(e){let t=new Map(this.metadataById);t.delete(e),this.metadataById=t}};let my=`[RecorderController]`;var hy=class{constructor(e={}){this.uploadService=null,this.uploadQueueManager=null,this.isInitialized=!1,this.isDemo=!1,this.isDestroyed=!1,this.enableTabVisibilityOverlay=!1,this.recordingWarmupTimeoutId=null,this.audioTelemetryUnsub=null,this.callbacks=e,this.streamManager=new F_,this.configManager=new un,this.storageManager=new Pg,this.deviceManager=new dn(this.streamManager,e.device),this.audioLevelAnalyzer=new o,this.uploadService=new Y_,this.uploadCallbacks=sv(e),this.telemetryManager=new fy({createTelemetryClient:q_}),this.uploadMetadataManager=new py;let t=dv(e,{stopAudioTracking:()=>this.audioLevelAnalyzer.stopTracking(),getConfig:()=>Promise.resolve(this.configManager.getConfigForRecording()),onAudioWarning:e.recording?.onAudioWarning?t=>{this.sendAudioWarningTelemetry(t),e.recording?.onAudioWarning?.(t)}:e=>{this.sendAudioWarningTelemetry(e)},...e.recording?.onAudioRecovered&&{onAudioRecovered:e.recording.onAudioRecovered}});this.recordingManager=new dy(this.streamManager,t);let n=fv(e,{isRecording:()=>this.isRecording(),updateSourceType:e=>{this.recordingManager.updateSourceType(e)},getSelectedCameraDeviceId:()=>this.deviceManager.getSelectedCameraDeviceId(),getSelectedMicDeviceId:()=>this.deviceManager.getSelectedMicDeviceId()});this.sourceSwitchManager=new f_(this.streamManager,n);let r=e.stream;r&&(this.streamManager.on(`streamstart`,({stream:e})=>{$.debug(`${my} streamstart event received, calling callback`),r.onStreamStart&&r.onStreamStart(e)}),this.streamManager.on(`streamstop`,()=>{$.debug(`${my} streamstop event received, calling callback`),r.onStreamStop&&r.onStreamStop()}),this.streamManager.on(`error`,({error:e})=>{$.error(`${my} stream error event received, calling callback`,e),this.telemetryManager.sendEvent(`stream.error`,{sourceType:this.getCurrentSourceType()},e),r.onError&&r.onError(e)})),this.audioTelemetryUnsub=this.streamManager.on(`audiotelemetry`,({event:e})=>{let t=this.getBrowserNameForTelemetry();this.telemetryManager.sendEvent(e.name,{...e.properties,browserName:t,sourceType:this.getCurrentSourceType()},e.error)})}async initialize(e){if(this.isInitialized)return;await this.validateRecorderSupport();let t=!1;typeof e.demo==`boolean`&&(t=e.demo),this.isDemo=t;let n=null;typeof e.apiKey==`string`&&e.apiKey.length>0&&(n=e.apiKey);let r=null;typeof e.backendUrl==`string`&&e.backendUrl.length>0&&(r=e.backendUrl),this.telemetryManager.initialize(n,r),await this.telemetryManager.executeAction({requestedEvent:`sdk.init.started`,succeededEvent:`sdk.init.succeeded`,failedEvent:`sdk.init.failed`,action:async()=>{await this.initializeConfig(n,r),this.applyRecordingConfig(e),await this.initializeStorage(),this.isInitialized=!0,this.scheduleRecordingWarmup()}})}async startStream(){let e=this.getCurrentSourceType();await this.telemetryManager.executeAction({succeededEvent:`preview.start.succeeded`,failedEvent:`preview.start.failed`,action:async()=>{$.debug(`${my} startStream called`),await this.streamManager.startStream(),this.ignorePromiseRejection(this.ensureConfigReady()),this.ignorePromiseRejection(this.configManager.getConfig().then(e=>{this.recordingManager.prewarmStreamProcessor(e)})),this.prewarmSupportCheck(),$.debug(`${my} startStream completed`)},properties:{sourceType:e}})}async stopStream(){await this.streamManager.stopStream()}switchVideoDevice(e){return this.streamManager.switchVideoDevice(e)}switchAudioDevice(e){return this.streamManager.switchAudioDevice(e)}async startRecording(){let e=this.getCurrentSourceType();await this.telemetryManager.executeAction({requestedEvent:`recording.start.requested`,succeededEvent:`recording.start.succeeded`,failedEvent:`recording.start.failed`,action:async()=>{await this.ensureConfigReady(),await this.streamManager.waitForAudio(),await this.recordingManager.startRecording()},properties:{sourceType:e}})}async stopRecording(){let e=this.getCurrentSourceType();try{return(await this.telemetryManager.executeActionWithResult({requestedEvent:`recording.stop.requested`,succeededEvent:`recording.stop.succeeded`,failedEvent:`recording.stop.failed`,action:async()=>{let e=await this.recordingManager.stopRecording();return await this.sourceSwitchManager.handleRecordingStop().catch(()=>{throw Error(`Source switch cleanup failed`)}),this.streamManager.stopStream(),e},properties:{sourceType:e},getPropertiesFromResult:e=>e.telemetryProperties})).blob}catch(e){throw wg(e)&&this.sendAudioMissingTelemetry(e),e}}sendAudioMissingTelemetry(e){let t={code:e.code,sourceType:this.getCurrentSourceType(),browserName:this.getBrowserNameForTelemetry()};e.details&&(t.durationMs=e.details.durationMs,t.totalChunks=e.details.totalChunks,t.nonSilentChunks=e.details.nonSilentChunks,t.mutedDurationMs=e.details.mutedDurationMs,t.silenceRatio=e.details.durationMs>0?e.details.mutedDurationMs/e.details.durationMs:0,t.hadTrackEndedWarning=e.details.hadTrackEndedWarning),this.telemetryManager.sendEvent(`recording.audio-missing`,t)}getTabVisibilityOverlayConfig(){return{enabled:this.enableTabVisibilityOverlay,text:this.tabVisibilityOverlayText}}pauseRecording(){this.recordingManager.pauseRecording()}resumeRecording(){this.recordingManager.resumeRecording()}async switchSource(e){await this.telemetryManager.executeAction({requestedEvent:`source.switch.requested`,succeededEvent:`source.switch.succeeded`,failedEvent:`source.switch.failed`,action:async()=>{await this.sourceSwitchManager.toggleSource()},properties:{sourceType:e}})}setCameraDevice(e){this.deviceManager.setCameraDevice(e)}setMicDevice(e){this.deviceManager.setMicDevice(e)}getAvailableDevices(){return this.deviceManager.getAvailableDevices()}muteAudio(){this.streamManager.muteAudio()}unmuteAudio(){this.streamManager.unmuteAudio()}toggleMute(){this.streamManager.toggleMute()}getIsMuted(){return this.streamManager.isMuted()}startAudioLevelTracking(e,t){if(!t)throw Error(`Audio level callbacks are required`);return this.audioLevelAnalyzer.startTracking(e,t,()=>this.streamManager.isMuted()),Promise.resolve()}stopAudioLevelTracking(){this.audioLevelAnalyzer.stopTracking()}getAudioLevel(){return this.audioLevelAnalyzer.getAudioLevel()}async uploadVideo(e,t,n,r){if(!this.uploadQueueManager)throw Error(`Upload queue manager not initialized`);this.uploadCallbacks.onClearStatus();let i=await Qm(e),a=`recording-${Date.now()}.mp4`,o=this.getCurrentSourceType(),s;Object.keys(r).length>0&&(s=r),this.telemetryManager.sendEvent(`upload.started`,{filename:a,duration:i,sourceType:o});let c=await this.uploadQueueManager.queueUpload({blob:e,apiKey:t,backendUrl:n,filename:a,duration:i,metadata:void 0,userMetadata:s});this.uploadMetadataManager.setMetadata(c,{filename:a,duration:i,sourceType:o})}getStream(){return this.streamManager.getStream()}isConfigReady(){return this.configManager.isConfigReady()}ensureConfigReady(){return this.isDemo||this.configManager.isConfigReady()?Promise.resolve():this.configManager.fetchConfig().then(()=>void 0).catch(()=>void 0)}cleanup(){this.isDestroyed=!0,this.recordingWarmupTimeoutId!==null&&(clearTimeout(this.recordingWarmupTimeoutId),this.recordingWarmupTimeoutId=null),this.audioTelemetryUnsub&&=(this.audioTelemetryUnsub(),null),this.uploadQueueManager?.destroy(),this.storageManager.destroy(),this.recordingManager.cleanup(),this.audioLevelAnalyzer.stopTracking(),this.sourceSwitchManager.cleanup()}getRecordingState(){return this.recordingManager.getRecordingState()}isPaused(){return this.recordingManager.isPausedState()}getCurrentSourceType(){return this.sourceSwitchManager.getCurrentSourceType()}getOriginalCameraStream(){return this.sourceSwitchManager.getOriginalCameraStream()}getStreamManager(){return this.streamManager}getAudioStreamForAnalysis(){return this.streamManager.getAudioStreamForAnalysis()}getDeviceManager(){return this.deviceManager}getConfig(){return this.configManager.getConfig()}getUploadService(){return this.uploadService}isRecording(){return this.streamManager.isRecording()}isActive(){return this.streamManager.isActive()}isAudioReady(){return this.streamManager.isAudioReady()}getAudioStatus(){return this.streamManager.getAudioStatus()}sendAudioWarningTelemetry(e){let t={code:e.code,sourceType:this.getCurrentSourceType(),browserName:this.getBrowserNameForTelemetry()};`durationMs`in e&&(t.durationMs=e.durationMs),`peak`in e&&(t.peak=e.peak),`rms`in e&&(t.rms=e.rms),this.telemetryManager.sendEvent(`audio.warning`,t)}getBrowserNameForTelemetry(){try{return jt()}catch{return`unknown`}}async initializeConfig(e,t){let n=!0;e===null&&(n=!1),t===null&&(n=!1),n&&e!==null&&t!==null&&await this.configManager.initialize(e,t)}applyRecordingConfig(e){e.countdownDuration!==void 0&&this.recordingManager.setCountdownDuration(e.countdownDuration),e.maxRecordingTime!==void 0&&this.recordingManager.setMaxRecordingTime(e.maxRecordingTime),e.enableTabVisibilityOverlay!==void 0&&(this.enableTabVisibilityOverlay=e.enableTabVisibilityOverlay),e.tabVisibilityOverlayText!==void 0&&(this.tabVisibilityOverlayText=e.tabVisibilityOverlayText),this.recordingManager.setTabVisibilityOverlayConfig(this.enableTabVisibilityOverlay,this.tabVisibilityOverlayText)}async initializeStorage(){if(this.isDestroyed)return;let e=lv(this.callbacks);if(await this.storageManager.initialize(e),this.isDestroyed)return;let t=this.storageManager.getWriteProbeResult();if(!t?.ok){let e=t?.reason??`Storage write probe did not complete`;this.telemetryManager.sendEvent(`storage.write.probe.failed`,{reason:e}),uv(this.callbacks)(e);return}let n=this.storageManager.getStorageService();n&&this.uploadService&&(this.uploadQueueManager=new J_(n,this.uploadService),this.uploadQueueManager.setCallbacks({onUploadProgress:(e,t)=>{this.uploadCallbacks.onProgress(t)},onUploadComplete:(e,t)=>{this.uploadCallbacks.onSuccess(t);let n=this.uploadMetadataManager.getMetadata(e);n&&(this.telemetryManager.sendEvent(`upload.succeeded`,{filename:n.filename,duration:n.duration,sourceType:n.sourceType,recordingId:t.id}),this.uploadMetadataManager.clearMetadata(e))},onUploadError:(e,t)=>{this.uploadCallbacks.onError(t);let n=this.uploadMetadataManager.getMetadata(e);n&&(this.telemetryManager.sendEvent(`upload.failed`,{filename:n.filename,duration:n.duration,sourceType:n.sourceType},t),this.uploadMetadataManager.clearMetadata(e))}}))}async validateRecorderSupport(){Pt();let e=await pg({requiresAudio:!1,requiresWatermark:!1});if(!e.isSupported)throw Mt({missingCapabilities:e.missing,resolutionStage:`feature-preflight`})}scheduleRecordingWarmup(){this.recordingWarmupTimeoutId!==null&&(clearTimeout(this.recordingWarmupTimeoutId),this.recordingWarmupTimeoutId=null),!this.isDestroyed&&(this.recordingWarmupTimeoutId=setTimeout(()=>{this.recordingWarmupTimeoutId=null,!this.isDestroyed&&(this.ignorePromiseRejection(this.ensureConfigReady()),this.ignorePromiseRejection(this.configManager.getConfig().then(e=>{this.recordingManager.prewarmStreamProcessor(e)})))},0))}ignorePromiseRejection(e){e.catch(()=>void 0)}prewarmSupportCheck(){this.ignorePromiseRejection(pg({requiresAudio:!0,requiresWatermark:!0}).then(e=>{this.streamManager.setPreResolvedSupportReport(e)}))}};let gy=/<a\s[^>]*href="(?<href>[^"]+)"[^>]*>(?<text>[^<]+)<\/a>/,_y=/\starget=["'](?<target>[^"']+)["']/,vy=/^[a-zA-Z][a-zA-Z\d+\-.]*:/,yy=`{version}`;function by(e,t){return e?e.toLowerCase().includes(t):!1}function xy(e){let t=e.trim();if(!t)return null;let n=t.toLowerCase();return!vy.test(n)||n.startsWith(`http:`)||n.startsWith(`https:`)?t:null}function Sy(e,t,n,r){return e===`browser.unsupported`?r.browserUnsupportedDynamic?Ty(r.browserUnsupportedDynamic,t,n):by(t,`safari`)?r.browserUnsupportedSafari:by(t,`firefox`)?r.browserUnsupportedFirefox:r.browserUnsupported:r.browserUnsupported}function Cy(e,t){return e===`camera.in-use`?t.cameraInUse:e===`camera.not-found`?t.cameraNotFound:e===`camera.permission-denied`?t.cameraPermissionDenied:t.failedToStartCamera}function wy(e,t){return e===`audio.in-use`?t.audioInUse:e===`audio.not-found`?t.audioNotFound:e===`audio.permission-denied`?t.audioPermissionDenied:t.failedToStartAudio}function Ty(e,t,n){let r=`This browser`;t&&t.trim().length>0&&(r=t);let i=e.replace(`{browser}`,r);return n&&n.trim().length>0&&n?(i=i.replace(yy,n),i):(i=i.replace(` ({version})`,``),i=i.replace(yy,``),i)}function Ey(e){let t=gy.exec(e);if(!t?.groups)return{prefix:e,linkText:null,linkHref:null,linkTarget:null,suffix:``};let n=t.index,r=n+t[0].length,i=e.slice(0,n),a=e.slice(r),o=xy(t.groups.href);if(!o)return{prefix:i+t.groups.text+a,linkText:null,linkHref:null,linkTarget:null,suffix:``};let s=_y.exec(t[0])?.groups?.target??null;return{prefix:i,linkText:t.groups.text,linkHref:o,linkTarget:s,suffix:a}}let Dy=new Set([`recording.audio-no-chunks`,`recording.audio-silent`,`recording.audio-track-ended`,`recording.no-audio-track`,`recording.no-audio-frames`,`recording.audio-zero-channels`,`recording.audio-invalid-sample-rate`]);function Oy(e){return e.startsWith(`recording.`)?Dy.has(e):!1}let ky=Object.freeze({visible:!1,variant:`generic`,canRetry:!1,isCameraError:!1,isAudioError:!1,isBrowserUnsupported:!1,isPermissionDenied:!1});function Ay(e){let{errorCode:t,hasAudioFailed:n,error:r}=e;if(t===`browser.unsupported`)return{visible:!0,variant:`browser`,canRetry:!1,isCameraError:!1,isAudioError:!1,isBrowserUnsupported:!0,isPermissionDenied:!1};if(t&&Oy(t))return{visible:!0,variant:`audio`,canRetry:!0,isCameraError:!1,isAudioError:!0,isBrowserUnsupported:!1,isPermissionDenied:!1};if(t?.startsWith(`camera.`)){let e=t===`camera.permission-denied`;return{visible:!0,variant:`camera`,canRetry:!e,isCameraError:!0,isAudioError:!1,isBrowserUnsupported:!1,isPermissionDenied:e}}if(n)return{visible:!0,variant:`audio`,canRetry:!0,isCameraError:!1,isAudioError:!0,isBrowserUnsupported:!1,isPermissionDenied:!1};if(t?.startsWith(`audio.`)){let e=t===`audio.permission-denied`;return{visible:!0,variant:`audio`,canRetry:!e,isCameraError:!1,isAudioError:!0,isBrowserUnsupported:!1,isPermissionDenied:e}}return r?{visible:!0,variant:`generic`,canRetry:!0,isCameraError:!1,isAudioError:!1,isBrowserUnsupported:!1,isPermissionDenied:!1}:ky}function jy(){let e=At(),t=null;e.name.length>0&&(t=e.name);let n=null;return e.version.length>0&&(n=e.version),{browserName:t,browserVersion:n}}function My(e){let t=t=>{if(!(`code`in t))return;let n=t;if(n.code!==`browser.unsupported`){(n.code?.startsWith(`camera.`)||n.code?.startsWith(`audio.`)||n.code?.startsWith(`recording.`))&&e.updateState({errorCode:n.code,canRetry:!0,browserName:null,browserVersion:null});return}let r=jy(),i=r.browserName;n.browserName&&n.browserName.length>0&&(i=n.browserName);let a=r.browserVersion;n.browserVersion&&n.browserVersion.length>0&&(a=n.browserVersion),e.updateState({errorCode:`browser.unsupported`,canRetry:!1,browserName:i,browserVersion:a})};return{recording:{onStateChange:t=>{e.updateState({recordingState:t}),t===`idle`&&(e.isProcessingBlob=!1)},onCountdownUpdate:(t,n)=>{e.updateState({recordingState:t,countdown:n})},onTimerUpdate:t=>{e.updateState({timer:t})},onError:n=>{t(n),e.updateState({error:i(n)})},onRecordingComplete:t=>{e.updateState({countdown:null}),e.processRecordingBlob(t).catch(t=>{e.updateState({error:i(t)})})},onClearUploadStatus:()=>{e.updateState({uploadProgress:null})},onAudioWarning:t=>{e.updateState({audioWarning:t}),e.dispatchEvent(new CustomEvent(`vidtreo:audio-warning`,{detail:t}))},onAudioRecovered:()=>{e.updateState({audioWarning:null}),e.dispatchEvent(new CustomEvent(`vidtreo:audio-recovered`))},onStopAudioTracking:()=>void 0,onGetConfig:()=>{if(!e.controller)throw Error(`Controller not initialized`);return e.isDemo?Promise.resolve(Xt(`mp4`)):e.controller.getConfig()}},sourceSwitch:{onSourceChange:e=>Promise.resolve(),onPreviewUpdate:t=>(e.updateState({stream:t}),Promise.resolve()),onError:n=>{t(n),e.updateState({error:i(n)})},onTransitionStart:t=>{e.updateState({transitionMessage:t})},onTransitionEnd:()=>{e.updateState({transitionMessage:null})}},storage:{onUploadProgress:()=>void 0,onUploadComplete:()=>void 0,onUploadError:()=>void 0},onStorageCleanupError:t=>{e.updateState({error:t})}}}function Ny(e,t){let n=(e=>e===``||e===`default`?null:e)(t);return e.setCameraDevice(n),e.switchVideoDevice(n)}function Py(e,t){let n=(e=>e===``||e===`default`?null:e)(t);return e.setMicDevice(n),e.switchAudioDevice(n)}async function Fy(e,t=`camera`){e.isActive()||await e.startStream(),t!==e.getCurrentSourceType()&&await e.switchSource(t),await e.startRecording()}async function Iy(e,t,n,r){return await e.stopRecording()}function Ly(e){e.pauseRecording()}function Ry(e){e.resumeRecording()}async function zy(e,t){await e.switchSource(t)}let By=`camera`,Vy=`screen`,Hy=`recording`,Uy=`browser.unsupported`,Wy=[.8,1.2,.9];function Gy(e,t){let{uploadProgress:n,uploadingLabel:r}=e,{overlay:i,fill:a,text:o}=t;if(!i)return;if(n===null){i.style.display=`none`;return}i.style.display=`block`;let s=Math.round(n*100);a&&(a.style.width=`${s}%`),o&&(o.textContent=`${r} ${s}%`)}function Ky(e,t){let{transitionMessage:n}=e,{overlay:r,message:i}=t;if(r){if(!n){r.classList.remove(`vidtreo-active`);return}r.classList.add(`vidtreo-active`),i&&(i.textContent=n)}}let qy=`none`,Jy=`flex`,Yy=`inline-flex`,Xy=`checking`,Zy=`blocked`,Qy=`ready`,$y=`vidtreo-active`,eb=`vidtreo-permission-flow--fading`,tb=`vidtreo-permission-flow-action--requesting`;function nb(e){return{container:e.querySelector(`#permissionFlow`),spinner:e.querySelector(`#permissionFlowSpinner`),title:e.querySelector(`#permissionFlowTitle`),subtitle:e.querySelector(`#permissionFlowSubtitle`),actionButton:e.querySelector(`#btnAllowPermission`),buttonIcon:e.querySelector(`#permissionFlowBtnIcon`),buttonSpinner:e.querySelector(`#permissionFlowBtnSpinner`),buttonText:e.querySelector(`#permissionFlowBtnText`),recovery:e.querySelector(`#permissionFlowRecovery`),recoveryTitle:e.querySelector(`#permissionFlowRecoveryTitle`),recoveryText:e.querySelector(`#permissionFlowRecoveryText`),retryButton:e.querySelector(`#btnRetryPermission`),recoveryGuideUrl:e.querySelector(`#recoveryGuideUrl`),recoveryGuidePopoverUrl:e.querySelector(`#recoveryGuidePopoverUrl`)}}function rb(e){return e.permissions.camera===`granted`?`microphone`:`camera`}function ib(e,t){return t.cameraTitle}function ab(e,t){return t.cameraLabel}function ob(e,t){return t.allowCamera}function sb(e,t,n){let r=e.step,i=!1;(r===Xy||r===`awaiting-user`||r===Zy||r===Qy)&&(i=!0);let a=r===Qy,o=r===Zy,s=r===Xy,c=rb(e),l=ib(c,t),u=ab(c,t),d=ob(c,t),f=t.recoveryInstructions;return e.recoveryData?.resetInstructions&&(f=e.recoveryData.resetInstructions),{isVisible:i,isFadingOut:n,isSpinnerOnly:a,isBlocked:o,isRequesting:s,titleText:l,subtitleText:u,actionLabel:d,requestingText:t.statusRequesting,recoveryTitleText:t.recoveryTitle,recoveryInstructionsText:f}}function cb(e,t,n){if(e){if(t){e.style.display=n;return}e.style.display=qy}}function lb(e,t){if(t.isVisible)e.classList.add($y);else return e.classList.remove($y),e.classList.remove(eb),!1;return t.isFadingOut?e.classList.add(eb):e.classList.remove(eb),!0}function ub(e,t,n){cb(e.actionButton,n,Yy),e.actionButton&&(t.isRequesting?(e.actionButton.classList.add(tb),e.actionButton.disabled=!0):(e.actionButton.classList.remove(tb),e.actionButton.disabled=!1)),cb(e.buttonIcon,n&&!t.isRequesting,Yy),cb(e.buttonSpinner,n&&t.isRequesting,Yy),e.buttonText&&(t.isRequesting?e.buttonText.textContent=t.requestingText:e.buttonText.textContent=t.actionLabel)}function db(){if(globalThis.window===void 0)return`vidtreo.com`;let e=globalThis.window.location.hostname||`vidtreo.com`;return e.length>20?`${e.slice(0,20)}...`:e}function fb(e,t){if(cb(e.recovery,t.isBlocked,Jy),e.recoveryTitle&&(e.recoveryTitle.textContent=t.recoveryTitleText),cb(e.recoveryText,!1,qy),cb(e.retryButton,!1,qy),t.isBlocked){let t=db();e.recoveryGuideUrl&&(e.recoveryGuideUrl.textContent=t),e.recoveryGuidePopoverUrl&&(e.recoveryGuidePopoverUrl.textContent=t)}}function pb(e,t){t&&(e.actionButton&&t.onAllow&&(e.actionButton.onclick=t.onAllow),e.retryButton&&t.onRetry&&(e.retryButton.onclick=t.onRetry))}function mb(e,t,n){let{container:r}=t;if(!r||!lb(r,e))return;let i=!e.isSpinnerOnly;cb(t.spinner,e.isSpinnerOnly,Yy),cb(t.title,i&&!e.isBlocked,Jy),cb(t.subtitle,i&&!e.isBlocked,Jy),t.title&&(t.title.textContent=e.titleText),t.subtitle&&(t.subtitle.textContent=e.subtitleText),ub(t,e,i&&!e.isBlocked),fb(t,e),pb(t,n)}function hb(e,t){e.textContent=``;let n=document.createTextNode(t.prefix);if(e.append(n),t.linkText&&t.linkHref){let n=document.createElement(`a`),r=t.linkTarget;n.href=t.linkHref,r&&(n.target=r),r===`_blank`&&(n.rel=`noopener noreferrer`),n.textContent=t.linkText,e.append(n)}let r=document.createTextNode(t.suffix);e.append(r)}function gb(e){let{stream:t,transitionMessage:n,isVideoLoaded:r}=e;return{showPreviewSkeleton:!!t&&!r&&!n,showVideoPreview:!!t}}function _b(e,t){let{previewSkeleton:n,videoPreview:r}=t;n&&(e.showPreviewSkeleton?n.style.display=`block`:n.style.display=`none`),r&&(e.showVideoPreview?r.style.display=`block`:r.style.display=`none`)}function vb(e,t,n){let{videoPreview:r}=t,{onVideoLoaded:a,onError:o,startAudioAnalysis:s,stopAudioAnalysis:c}=n;if(r){if(!e){r.srcObject=null,c();return}r.srcObject=e,r.onloadeddata=()=>{a()},r.play().catch(e=>o(i(e))),s(e)}}function yb(e){return{startCameraArea:e.querySelector(`#startCameraArea`),startCameraButton:e.querySelector(`#startCameraButton`),cameraIcon:e.querySelector(`#startCameraArea .vidtreo-camera-icon`),cameraText:e.querySelector(`#startCameraArea .vidtreo-camera-text`),cameraHint:e.querySelector(`#startCameraArea .vidtreo-camera-hint`),previewSkeleton:e.querySelector(`#previewSkeleton`),previewSkeletonText:e.querySelector(`#previewSkeleton .vidtreo-skeleton-text`),videoPreview:e.querySelector(`#videoPreview`),countdownOverlay:e.querySelector(`#countdownOverlay`),countdownNumber:e.querySelector(`#countdownNumber`),recordingTimerRow:e.querySelector(`#recordingTimerRow`),recordingTimer:e.querySelector(`#recordingTimer`),recIndicatorTop:e.querySelector(`#recIndicatorTop`),audioLevelBars:e.querySelector(`#audioLevelBars`)}}function bb(e,t,n,r,i,a){if(e.stream)return{shouldShow:!1,iconClassName:``,browserErrorContent:null,textContent:null,hintText:null,retryButtonLabel:null};let o=Ay({errorCode:e.errorCode,hasAudioFailed:!1,error:null}),s=o.isCameraError||o.isAudioError,c=!(o.isBrowserUnsupported||s),l=o.isBrowserUnsupported||s?`ph-fill ph-warning-circle`:`ph-fill ph-camera`,u=null,d=null;o.isBrowserUnsupported&&(u=Ey(n)),o.isAudioError&&(d=i),o.isCameraError&&(d=r),c&&(d=t.initializingCamera);let f=c?t.grantPermissions:null,p=s&&!o.isPermissionDenied?a:null;return{shouldShow:!0,iconClassName:l,browserErrorContent:u,textContent:d,hintText:f,retryButtonLabel:p}}function xb(e,t){let n=!1;return e&&(n=!0),{shouldShow:n,text:t.switchingDevice}}function Sb(e,t,n){let r=!1;return e===`countdown`&&t!==null&&(r=!0),{shouldShow:r,countdown:t,text:n.recordingStartsIn}}function Cb(e,t){return{shouldShow:e,text:t.rec}}function wb(e,t){return{shouldShow:e,timer:t}}function Tb(e){return{shouldShow:e}}function Eb(e,t){let{state:n,isVideoLoaded:r,isRecording:i,translations:a}=e;Db(bb(n,a,Sy(n.errorCode,n.browserName,n.browserVersion,{browserUnsupported:a.browserUnsupported,browserUnsupportedDynamic:a.browserUnsupportedDynamic,browserUnsupportedSafari:a.browserUnsupportedSafari,browserUnsupportedFirefox:a.browserUnsupportedFirefox}),Cy(n.errorCode??``,{cameraInUse:a.cameraInUse,cameraNotFound:a.cameraNotFound,cameraPermissionDenied:a.cameraPermissionDenied,failedToStartCamera:a.failedToStartCamera}),wy(n.errorCode??``,{audioInUse:a.audioInUse,audioNotFound:a.audioNotFound,audioPermissionDenied:a.audioPermissionDenied,failedToStartAudio:a.failedToStartAudio}),a.retryCamera),t,e.onRetryCamera),Ob(xb(n.transitionMessage,a),t),_b(gb({stream:n.stream,transitionMessage:n.transitionMessage,isVideoLoaded:r}),{previewSkeleton:t.previewSkeleton,videoPreview:t.videoPreview}),kb(Sb(n.recordingState,n.countdown,a),t),Ab(Cb(i,a),t),jb(wb(i,n.timer),t),Mb(Tb(i),t)}function Db(e,t,n){let{startCameraArea:r,startCameraButton:i,cameraIcon:a,cameraText:o,cameraHint:s}=t;if(r){if(!e.shouldShow){r.style.display=`none`;return}r.style.display=`block`,a&&(a.innerHTML=`<i class="${e.iconClassName}" style="font-size: 48px;"></i>`),o&&(e.browserErrorContent&&hb(o,e.browserErrorContent),e.textContent&&(o.textContent=e.textContent)),s&&(e.hintText?(s.textContent=e.hintText,s.style.display=`block`):s.style.display=`none`),i&&(e.retryButtonLabel?(i.textContent=e.retryButtonLabel,i.hidden=!1,i.className=`vidtreo-error-retry`,i.onclick=e=>{e.preventDefault(),e.stopPropagation(),n&&n()}):(i.hidden=!0,i.onclick=null))}}function Ob(e,t){let{previewSkeleton:n,previewSkeletonText:r}=t;n&&(e.shouldShow?n.style.display=`block`:n.style.display=`none`,r&&(r.textContent=e.text))}function kb(e,t){let{countdownOverlay:n,countdownNumber:r}=t;n&&(e.shouldShow?n.classList.add(`vidtreo-active`):n.classList.remove(`vidtreo-active`),r&&e.countdown!==null&&(r.textContent=e.countdown.toString()))}function Ab(e,t){let{recIndicatorTop:n}=t;n&&(e.shouldShow?n.style.display=`block`:n.style.display=`none`)}function jb(e,t){let{recordingTimerRow:n,recordingTimer:r}=t;n&&(e.shouldShow?n.style.display=`flex`:n.style.display=`none`,r&&(r.textContent=e.timer))}function Mb(e,t){let{audioLevelBars:n}=t;n&&(e.shouldShow?n.style.display=`flex`:n.style.display=`none`)}let Nb=`inline-flex`;function Pb(e){let{stream:t,buttonVisibility:n,currentSourceType:r,isMuted:i,isAudioReady:a,isStopLocked:o,stopLockedTooltip:s,recordingState:c,buttonTranslations:l}=e,u=!!t,d=c===`idle`&&u,f=d&&!a,p=f?l.microphoneConnecting:``,m=!1;(n.showPauseButton||n.showResumeButton)&&(m=!0);let h=l.pause,g=`ph-fill ph-pause`;n.showResumeButton&&(h=l.resume,g=`ph-fill ph-play`);let _=l.mute,v=`ph-fill ph-microphone`;i&&(_=l.unmute,v=`ph-fill ph-microphone-slash`);let y=`ph-fill ph-monitor`;r!==By&&(y=`ph-fill ph-camera`);let b=!1;return n.showDownloadButton&&(b=!0),{showRecordingControls:u,showSettingsButton:n.showSettingsButton,showRecordButton:d,isRecordDisabled:f,recordTooltip:p,showMuteButton:n.showMuteButton,showPauseButton:m,showStopButton:n.showStopButton,showSwitchSourceButton:n.showSwitchSourceButton,showDownloadButton:b,pauseTitle:h,pauseIconClassName:g,muteTitle:_,muteIconClassName:v,switchSourceIconClassName:y,isMuted:i,isStopLocked:o,stopLockedTooltip:s,settingsTitle:l.settings,switchSourceTitle:l.switchSource,downloadTitle:l.download,buttonTranslations:l}}function Fb(e){return{recordingControls:e.querySelector(`#recordingControls`),settingsButton:e.querySelector(`#btnSettings`),recordButton:e.querySelector(`#btnRecord`),muteButton:e.querySelector(`#btnMute`),muteIcon:e.querySelector(`#iconMute`),pauseButton:e.querySelector(`#btnPause`),pauseIcon:e.querySelector(`#iconPause`),stopButton:e.querySelector(`#btnStop`),switchSourceButton:e.querySelector(`#btnSwitchSource`),switchSourceIcon:e.querySelector(`#iconSwitchSource`),downloadButton:e.querySelector(`#btnDownload`)}}function Ib(e,t){let{recordingControls:n,settingsButton:r,recordButton:i,muteButton:a,muteIcon:o,pauseButton:s,pauseIcon:c,stopButton:l,switchSourceButton:u,switchSourceIcon:d,downloadButton:f}=t;Rb(n,e),zb(r,e),Bb(i,e),Vb(a,e),Hb(o,e),Ub(s,e),Wb(c,e),Gb(l,e),Kb(u,e),qb(d,e),Jb(f,e)}function Lb(e,t,n){e&&(t?e.style.display=n:e.style.display=`none`)}function Rb(e,t){Lb(e,t.showRecordingControls,`block`)}function zb(e,t){Lb(e,t.showSettingsButton,Nb),e&&(e.title=t.settingsTitle)}function Bb(e,t){if(Lb(e,t.showRecordButton,Nb),!e)return;e.disabled=t.isRecordDisabled,e.classList.toggle(`vidtreo-record-button-disabled`,t.isRecordDisabled),e.title=t.recordTooltip,e.setAttribute(`aria-disabled`,String(t.isRecordDisabled));let n=e.querySelector(`i`),r=e.querySelector(`span`);t.isRecordDisabled?(n&&(n.className=`ph-fill ph-microphone vidtreo-mic-connecting-indicator`,n.style.fontSize=`18px`),r&&(r.textContent=t.recordTooltip)):(n&&(n.className=`ph-fill ph-circle`,n.style.fontSize=`24px`),r&&(r.textContent=t.buttonTranslations?.record??`Record`))}function Vb(e,t){Lb(e,t.showMuteButton,Nb),e&&(e.title=t.muteTitle,e.classList.toggle(`vidtreo-muted`,t.isMuted))}function Hb(e,t){e&&(e.className=t.muteIconClassName)}function Ub(e,t){Lb(e,t.showPauseButton,Nb),e&&(e.title=t.pauseTitle)}function Wb(e,t){e&&(e.className=t.pauseIconClassName)}function Gb(e,t){if(Lb(e,t.showStopButton,Nb),e){if(e.classList.toggle(`vidtreo-stop-button-locked`,t.isStopLocked),e.setAttribute(`aria-disabled`,String(t.isStopLocked)),t.isStopLocked){e.title=t.stopLockedTooltip;return}e.title=``}}function Kb(e,t){Lb(e,t.showSwitchSourceButton,Nb),e&&(e.title=t.switchSourceTitle)}function qb(e,t){e&&(e.className=t.switchSourceIconClassName)}function Jb(e,t){Lb(e,t.showDownloadButton,Nb),e&&(e.title=t.downloadTitle)}function Yb(e){let{stream:t,showSettings:n}=e,r=!1;return t&&n&&(r=!0),{shouldShow:r}}function Xb(e,t,n){if(t){if(!e.shouldShow){t.classList.remove(`vidtreo-active`);return}t.classList.add(`vidtreo-active`),n()}}function Zb(e){return e.toggleMute(),e.getIsMuted()}function Qb(e){if(!e)return;let t=URL.createObjectURL(e),n=document.createElement(`a`);n.href=t,n.download=`recording-${Date.now()}.mp4`,document.body.appendChild(n),n.click(),document.body.removeChild(n),URL.revokeObjectURL(t)}let $b={en:{initializingCamera:`Initializing camera...`,grantPermissions:`Grant camera and microphone permissions when prompted`,browserUnsupported:`This browser is not supported`,browserUnsupportedDynamic:`{browser} ({version}) is not supported, please use <a href="https://www.google.com/chrome/" target="_blank">Chrome</a>`,browserUnsupportedSafari:`Safari is not supported, please use <a href="https://www.google.com/chrome/" target="_blank">Chrome</a>`,browserUnsupportedFirefox:`Firefox is not supported, please use <a href="https://www.google.com/chrome/" target="_blank">Chrome</a>`,retryCamera:`Retry Camera`,cameraInUse:`Your camera is being used by another application. Close other apps using the camera (Zoom, Teams, Discord) and try again.`,cameraNotFound:`No camera detected. Connect a camera or check your device settings.`,cameraPermissionDenied:`Camera access was denied. Allow camera access in your browser settings and try again.`,audioInUse:`Your microphone is being used by another application. Close other apps using the microphone (Zoom, Teams, Discord) and try again.`,audioNotFound:`No microphone detected. Connect a microphone or check your device settings.`,audioPermissionDenied:`Microphone access was denied. Allow microphone access in your browser settings and try again.`,failedToStartAudio:`Failed to start microphone`,audioErrorTitle:`Microphone unavailable`,audioErrorMessage:`We couldn't access your microphone. It may be in use by another app like Zoom, Teams, or Discord. Please close it and try again.`,audioErrorRetry:`Try again`,audioMissingTitle:`Recording has no audio`,audioMissingMessage:`We couldn't capture audio in this recording. Your microphone may have been disconnected or blocked by the browser. Check your microphone and record again.`,audioSilentTitle:`Recording is silent`,audioSilentMessage:`We didn't detect any sound during the recording. Make sure your microphone is working and not muted by your operating system, then record again.`,audioProcessingErrorTitle:`Audio processing error`,audioProcessingErrorMessage:`We couldn't process the audio in this recording. Please record again.`,audioMissingRetry:`Record again`,audioWarningNoSignalTitle:`No microphone signal`,audioWarningNoSignalMessage:`We're not detecting any sound. Check that your microphone is active.`,audioWarningLowSignalTitle:`Audio is very quiet`,audioWarningLowSignalMessage:`Move closer to the microphone or turn up the input volume.`,audioWarningTrackEndedTitle:`Microphone disconnected`,audioWarningTrackEndedMessage:`The microphone was disconnected. Reconnect it before continuing.`,audioWarningNoChunksTitle:`No microphone input`,audioWarningNoChunksMessage:`We're not receiving audio from the microphone. Check browser permissions.`,audioWarningTrackMutedTitle:`Microphone muted by browser`,audioWarningTrackMutedMessage:`The browser muted your microphone. Check site settings.`,audioWarningDismiss:`Dismiss`,cameraErrorTitle:`Camera unavailable`,cameraErrorMessage:`We couldn't access your camera. It may be in use by another app or permissions may be denied.`,browserErrorTitle:`Browser not supported`,browserErrorMessage:`This browser is not supported. Please use Chrome for the best experience.`,genericErrorTitle:`Something went wrong`,genericErrorMessage:`An unexpected error occurred. Please try again.`,errorRetry:`Try again`,switchingDevice:`Switching device...`,recordingStartsIn:`Recording starts in...`,switchingSource:`Switching source...`,rec:`REC`,settings:`Settings`,record:`Record`,stop:`Stop`,pause:`Pause`,resume:`Resume`,mute:`Mute`,unmute:`Unmute`,switchSource:`Switch Source`,camera:`Camera`,microphone:`Microphone`,microphoneConnecting:`Connecting microphone...`,minimumRecordingTimeNotReached:`You have not met the minimum recording time yet`,processVideo:`Process Video`,processing:`Processing...`,finishing:`Finishing...`,uploading:`Uploading...`,switchingCamera:`Switching camera...`,switchingMicrophone:`Switching microphone...`,failedToStartCamera:`Failed to start camera`,userInAnotherTab:`User in another tab`,download:`Download`,nativeCameraSelectVideo:`Select Video from Gallery`,nativeCameraRecordVideo:`Record with Camera`,errorTitle:`Configuration Error`,errorGeneric:`An error occurred while loading the configuration`,mobileOpenCamera:`Open Camera`,mobileOpenCameraTitle:`Record a Video`,mobileOpenCameraDescription:`Tap the button below to start recording`,mobileCloseCamera:`Close`,mobilePermissionDenied:`Camera Access Denied`,mobilePermissionDeniedDescription:`Please allow camera access in your browser settings to record video.`,permissionFlowTitle:`Set Up Your Camera`,permissionFlowCameraTitle:`Camera & Microphone`,permissionFlowMicrophoneTitle:`Camera & Microphone`,permissionFlowCameraLabel:`We need access to your camera and microphone to start recording`,permissionFlowMicrophoneLabel:`We need access to your camera and microphone to start recording`,permissionFlowStatusPending:`Pending`,permissionFlowStatusGranted:`Ready`,permissionFlowStatusDenied:`Blocked`,permissionFlowStatusRequesting:`Click "Allow" in the browser popup above`,permissionFlowAllowCamera:`Allow Access`,permissionFlowAllowMicrophone:`Allow Access`,permissionFlowRetry:`Try Again`,permissionFlowRecoveryTitle:`Allow access to continue`,permissionFlowRecoveryInstructions:`Open your browser settings and allow camera and microphone access, then try again.`,permissionFlowConnecting:`Setting up...`},es:{initializingCamera:`Inicializando cámara...`,grantPermissions:`Otorga permisos de cámara y micrófono cuando se solicite`,browserUnsupported:`Este navegador no es compatible`,browserUnsupportedDynamic:`{browser} ({version}) no es compatible, por favor usa <a href="https://www.google.com/chrome/" target="_blank">Chrome</a>`,browserUnsupportedSafari:`Safari no es compatible, usa <a href="https://www.google.com/chrome/" target="_blank">Chrome</a>`,browserUnsupportedFirefox:`Firefox no es compatible, usa <a href="https://www.google.com/chrome/" target="_blank">Chrome</a>`,retryCamera:`Reintentar Cámara`,cameraInUse:`Tu cámara está siendo usada por otra aplicación. Cierra otras apps que usen la cámara (Zoom, Teams, Discord) e intenta de nuevo.`,cameraNotFound:`No se detectó ninguna cámara. Conecta una cámara o revisa la configuración de tu dispositivo.`,cameraPermissionDenied:`Se denegó el acceso a la cámara. Permite el acceso a la cámara en la configuración de tu navegador e intenta de nuevo.`,audioInUse:`Tu micrófono está siendo usado por otra aplicación. Cierra otras apps que usen el micrófono (Zoom, Teams, Discord) e intenta de nuevo.`,audioNotFound:`No se detectó ningún micrófono. Conecta un micrófono o revisa la configuración de tu dispositivo.`,audioPermissionDenied:`Se denegó el acceso al micrófono. Permite el acceso al micrófono en la configuración de tu navegador e intenta de nuevo.`,failedToStartAudio:`Error al iniciar el micrófono`,audioErrorTitle:`Micrófono no disponible`,audioErrorMessage:`No pudimos acceder a tu micrófono. Puede estar en uso por otra app como Zoom, Teams o Discord. Ciérrala e inténtalo de nuevo.`,audioErrorRetry:`Intentar de nuevo`,audioMissingTitle:`La grabación no tiene audio`,audioMissingMessage:`No pudimos capturar audio en esta grabación. Es posible que el micrófono se haya desconectado o que el navegador lo haya bloqueado. Verifica tu micrófono y vuelve a grabar.`,audioSilentTitle:`La grabación quedó en silencio`,audioSilentMessage:`No detectamos sonido durante la grabación. Verifica que tu micrófono esté funcionando y no esté silenciado por el sistema, luego vuelve a grabar.`,audioProcessingErrorTitle:`Error al procesar el audio`,audioProcessingErrorMessage:`No pudimos procesar el audio de esta grabación. Por favor vuelve a grabar.`,audioMissingRetry:`Grabar de nuevo`,audioWarningNoSignalTitle:`Sin señal del micrófono`,audioWarningNoSignalMessage:`No estamos detectando sonido. Verifica que tu micrófono esté activo.`,audioWarningLowSignalTitle:`Audio muy bajo`,audioWarningLowSignalMessage:`Acércate al micrófono o sube el volumen de entrada.`,audioWarningTrackEndedTitle:`Micrófono desconectado`,audioWarningTrackEndedMessage:`Se desconectó el micrófono. Reconéctalo antes de continuar.`,audioWarningNoChunksTitle:`Sin entrada del micrófono`,audioWarningNoChunksMessage:`No estamos recibiendo audio del micrófono. Revisa los permisos del navegador.`,audioWarningTrackMutedTitle:`Micrófono silenciado por el navegador`,audioWarningTrackMutedMessage:`El navegador silenció tu micrófono. Revisa la configuración del sitio.`,audioWarningDismiss:`Cerrar`,cameraErrorTitle:`Cámara no disponible`,cameraErrorMessage:`No pudimos acceder a tu cámara. Puede estar en uso por otra app o los permisos pueden estar denegados.`,browserErrorTitle:`Navegador no compatible`,browserErrorMessage:`Este navegador no es compatible. Por favor usa Chrome para la mejor experiencia.`,genericErrorTitle:`Algo salió mal`,genericErrorMessage:`Ocurrió un error inesperado. Por favor intenta de nuevo.`,errorRetry:`Intentar de nuevo`,switchingDevice:`Cambiando dispositivo...`,recordingStartsIn:`La grabación comienza en...`,switchingSource:`Cambiando fuente...`,rec:`GRAB`,settings:`Configuración`,record:`Grabar`,stop:`Detener`,pause:`Pausar`,resume:`Reanudar`,mute:`Silenciar`,unmute:`Activar sonido`,switchSource:`Cambiar Fuente`,camera:`Cámara`,microphone:`Micrófono`,microphoneConnecting:`Conectando micrófono...`,minimumRecordingTimeNotReached:`Aun no cumples el tiempo minimo de grabacion`,processVideo:`Procesar Video`,processing:`Procesando...`,finishing:`Finalizando...`,uploading:`Subiendo...`,switchingCamera:`Cambiando cámara...`,switchingMicrophone:`Cambiando micrófono...`,failedToStartCamera:`Error al iniciar la cámara`,userInAnotherTab:`Usuario en otra pestaña`,download:`Descargar`,nativeCameraSelectVideo:`Seleccionar Video de la Galería`,nativeCameraRecordVideo:`Grabar con Cámara`,errorTitle:`Error de Configuración`,errorGeneric:`Ocurrió un error al cargar la configuración`,mobileOpenCamera:`Abrir Cámara`,mobileOpenCameraTitle:`Grabar un Video`,mobileOpenCameraDescription:`Toca el botón para comenzar a grabar`,mobileCloseCamera:`Cerrar`,mobilePermissionDenied:`Acceso a Cámara Denegado`,mobilePermissionDeniedDescription:`Por favor permite el acceso a la cámara en la configuración de tu navegador para grabar video.`,permissionFlowTitle:`Configurar tu Cámara`,permissionFlowCameraTitle:`Cámara y Micrófono`,permissionFlowMicrophoneTitle:`Cámara y Micrófono`,permissionFlowCameraLabel:`Necesitamos acceso a tu cámara y micrófono para comenzar a grabar`,permissionFlowMicrophoneLabel:`Necesitamos acceso a tu cámara y micrófono para comenzar a grabar`,permissionFlowStatusPending:`Pendiente`,permissionFlowStatusGranted:`Listo`,permissionFlowStatusDenied:`Bloqueado`,permissionFlowStatusRequesting:`Haz clic en "Permitir" en el aviso del navegador`,permissionFlowAllowCamera:`Permitir Acceso`,permissionFlowAllowMicrophone:`Permitir Acceso`,permissionFlowRetry:`Reintentar`,permissionFlowRecoveryTitle:`Permite el acceso para continuar`,permissionFlowRecoveryInstructions:`Abre la configuración de tu navegador y permite el acceso a la cámara y micrófono, luego intenta de nuevo.`,permissionFlowConnecting:`Preparando...`}};var ex=class{constructor(e=`en`,t={}){this.lang=e,this.customTexts=t}setLang(e){this.lang=e}setCustomTexts(e){this.customTexts=e}t(e){return this.customTexts[e]?this.customTexts[e]:($b[this.lang]||$b.en)[e]}getAll(){return{...$b[this.lang]||$b.en,...this.customTexts}}};let tx=new Map;function nx(e){e.style.position=`fixed`,e.style.top=`0`,e.style.left=`0`,e.style.width=`100vw`,e.style.height=`100vh`,e.style.height=`100dvh`,e.style.zIndex=`9999`,e.style.pointerEvents=`none`}function rx(e){e.style.pointerEvents=`auto`}function ix(e){e.style.pointerEvents=`none`}var ax=class{constructor(e=`vidtreo-portal-root`){this.portalContainer=null,this.contentWrapper=null,this.isRegistered=!1,this.containerId=e,this.instanceId=`portal-${Date.now()}-${Math.random().toString(36).slice(2,9)}`}get container(){return this.contentWrapper}get isActive(){return this.contentWrapper!==null&&this.portalContainer!==null}open(){let e=document.getElementById(this.containerId);return e||(e=document.createElement(`div`),e.id=this.containerId,nx(e),document.body.appendChild(e)),this.portalContainer=e,this.contentWrapper=document.createElement(`div`),this.contentWrapper.setAttribute(`data-portal-instance`,this.instanceId),this.contentWrapper.style.width=`100%`,this.contentWrapper.style.height=`100%`,this.portalContainer.appendChild(this.contentWrapper),this.registerInstance(),rx(e),this.contentWrapper}render(e){this.contentWrapper&&(this.contentWrapper.innerHTML=e)}querySelector(e){return this.contentWrapper?this.contentWrapper.querySelector(e):null}close(){this.contentWrapper&&=(this.contentWrapper.innerHTML=``,this.contentWrapper.remove(),null),this.unregisterInstance(),this.updatePortalContainerState()}destroy(){this.close(),this.portalContainer=null}registerInstance(){if(this.isRegistered)return;let e=tx.get(this.containerId);e||(e=new Set,tx.set(this.containerId,e)),e.add(this),this.isRegistered=!0}unregisterInstance(){if(!this.isRegistered)return;let e=tx.get(this.containerId);e&&(e.delete(this),e.size===0&&tx.delete(this.containerId)),this.isRegistered=!1}updatePortalContainerState(){if(!this.portalContainer)return;let e=tx.get(this.containerId);e&&e.size>0?rx(this.portalContainer):(ix(this.portalContainer),this.portalContainer.childNodes.length===0&&this.portalContainer.remove())}},ox=class{constructor(e){this.state={isModalOpen:!1,permissionRequested:!1,prevUploading:!1},this.escapeHandler=null,this.initCheckInterval=null,this.callbacks=e,this.portalManager=new ax}get canCloseModal(){let{recordingState:e}=this.callbacks.getState();return!(e===`recording`||e===`countdown`)}get isModalOpen(){return this.state.isModalOpen}get portal(){return this.portalManager}openModal(){this.state.isModalOpen=!0,this.state.permissionRequested=!1,this.portalManager.open(),document.body.style.overflow=`hidden`,this.setupEscapeHandler(),this.callbacks.renderMobile(),this.requestCameraPreview()}closeModal(){this.canCloseModal&&(this.callbacks.stopPreview(),this.state.isModalOpen=!1,this.state.permissionRequested=!1,document.body.style.overflow=``,this.removeEscapeHandler(),this.portalManager.close(),this.callbacks.renderMobile())}checkUploadCompletion(e){let t=this.state.prevUploading,n=e!==null;this.state.prevUploading=n,t&&!n&&this.state.isModalOpen&&this.closeModal()}requestCameraPreview(){if(this.state.permissionRequested)return;let e=()=>{this.callbacks.isInitialized()?(this.state.permissionRequested=!0,this.callbacks.startPreview().catch(()=>{})):this.initCheckInterval=setTimeout(e,100)};e()}setupEscapeHandler(){this.escapeHandler=e=>{e.key===`Escape`&&this.canCloseModal&&this.closeModal()},document.addEventListener(`keydown`,this.escapeHandler)}removeEscapeHandler(){this.escapeHandler&&=(document.removeEventListener(`keydown`,this.escapeHandler),null)}destroy(){this.removeEscapeHandler(),this.portalManager.destroy(),document.body.style.overflow=``,this.initCheckInterval&&=(clearTimeout(this.initCheckInterval),null)}},sx=class{constructor(e,t){this.state={file:null,transcodingProgress:null,uploadProgress:null,isTranscoding:!1,isConfigLoading:!0,error:null,transcodedBlob:null},this.handler=null,this.config=e,this.callbacks=t;let n=e.backendUrl||`https://core.vidtreo.com`,r=null;e.apiKey&&!e.demo&&(r=ln.getInstance({apiKey:e.apiKey,backendUrl:n}));let i=new Y_;this.handler=new hh({apiKey:e.apiKey,backendUrl:n,maxRecordingTime:e.maxRecordingTime,maxFileSize:e.maxFileSize,userMetadata:e.userMetadata},r,i),e.apiKey&&!e.demo?(this.updateState({isConfigLoading:!0}),this.handler.preloadConfig().then(()=>this.updateState({isConfigLoading:!1})).catch(()=>{this.updateState({isConfigLoading:!1,error:`Failed to load settings`})})):this.updateState({isConfigLoading:!1})}updateState(e){this.state={...this.state,...e},this.callbacks.onStateChange()}getState(){return this.state}async handleFileSelect(e){if(this.updateState({error:null}),!this.handler)throw Error(`Handler not initialized`);try{let t=await this.handler.handleFileSelection(e);return this.updateState({file:t}),t}catch(e){let t=i(e),n=e instanceof Error?e:Error(t);throw this.updateState({error:t}),this.callbacks.onError?.(n),n}}async processAndUpload(e){let t=e||this.state.file;if(!(t&&this.handler))return;let n=this.config.demo;try{if(this.updateState({isTranscoding:!0,transcodingProgress:0,error:null}),n){let e=await ph(t.file,Yt,e=>{this.updateState({transcodingProgress:e}),this.callbacks.onTranscodingProgress?.(e)});this.updateState({transcodedBlob:e.blob,isTranscoding:!1,transcodingProgress:null})}else{let e=await this.handler.processAndUpload(e=>{this.updateState({transcodingProgress:e}),this.callbacks.onTranscodingProgress?.(e)},e=>{this.updateState({uploadProgress:e}),this.callbacks.onUploadProgress?.(e)});this.updateState({file:null,transcodingProgress:null,uploadProgress:null,isTranscoding:!1}),this.callbacks.onUploadComplete?.({recordingId:e.recordingId||``,uploadUrl:e.uploadUrl||``})}}catch(e){let t=i(e),r=e instanceof Error?e:Error(t);this.updateState({error:t,isTranscoding:!1,transcodingProgress:null,uploadProgress:null,transcodedBlob:null}),this.callbacks.onError?.(r),n||this.callbacks.onUploadError?.(r)}}downloadVideo(){if(!this.state.transcodedBlob)return;let e=URL.createObjectURL(this.state.transcodedBlob),t=document.createElement(`a`);t.href=e,t.download=`recording-${Date.now()}.mp4`,document.body.appendChild(t),t.click(),document.body.removeChild(t),URL.revokeObjectURL(e)}reset(){this.updateState({file:null,transcodingProgress:null,uploadProgress:null,error:null,isTranscoding:!1,transcodedBlob:null})}destroy(){this.handler&&this.handler.cancel(),this.handler=null}};function cx(e){return{preview:{initializingCamera:e.initializingCamera,grantPermissions:e.grantPermissions,browserUnsupported:e.browserUnsupported,browserUnsupportedDynamic:e.browserUnsupportedDynamic,browserUnsupportedSafari:e.browserUnsupportedSafari,browserUnsupportedFirefox:e.browserUnsupportedFirefox,retryCamera:e.retryCamera,cameraInUse:e.cameraInUse,cameraNotFound:e.cameraNotFound,cameraPermissionDenied:e.cameraPermissionDenied,failedToStartCamera:e.failedToStartCamera,audioInUse:e.audioInUse,audioNotFound:e.audioNotFound,audioPermissionDenied:e.audioPermissionDenied,failedToStartAudio:e.failedToStartAudio,switchingDevice:e.switchingDevice,recordingStartsIn:e.recordingStartsIn,rec:e.rec},buttons:{settings:e.settings,record:e.record,stop:e.stop,minimumRecordingTimeNotReached:e.minimumRecordingTimeNotReached,pause:e.pause,resume:e.resume,mute:e.mute,unmute:e.unmute,switchSource:e.switchSource,download:e.download,microphoneConnecting:e.microphoneConnecting},settings:{settings:e.settings,camera:e.camera,microphone:e.microphone}}}var lx=class{constructor(e){if(this.proxyEndpoint=e.proxyEndpoint,this.proxyEndpoint)throw Error(`Proxy mode not yet implemented`);this.service=new Y_}uploadVideo(e,t){if(this.proxyEndpoint)throw Error(`Proxy mode not yet implemented`);return this.service.uploadVideo(e,t)}},ux=`:root{--vidtreo-background:0 0% 100%;--vidtreo-foreground:0 0% 3.9%;--vidtreo-card:0 0% 100%;--vidtreo-card-foreground:0 0% 3.9%;--vidtreo-primary:0 0% 9%;--vidtreo-primary-foreground:0 0% 98%;--vidtreo-secondary:0 0% 96.1%;--vidtreo-secondary-foreground:0 0% 9%;--vidtreo-muted:0 0% 96.1%;--vidtreo-muted-foreground:0 0% 45.1%;--vidtreo-accent:0 0% 96.1%;--vidtreo-accent-foreground:0 0% 9%;--vidtreo-destructive:0 84.2% 60.2%;--vidtreo-destructive-foreground:0 0% 98%;--vidtreo-border:0 0% 89.8%;--vidtreo-input:0 0% 89.8%;--vidtreo-ring:0 0% 3.9%;--vidtreo-radius:.5rem;--vidtreo-preview-bg:0 0% 0%;--vidtreo-z-modal-overlay:9999;--vidtreo-z-settings-panel:200;--vidtreo-z-error-overlay:100;--vidtreo-z-countdown-overlay:20;--vidtreo-z-progress-overlay:20;--vidtreo-z-controls:10}.vidtreo-preview-container{aspect-ratio:9/16;background:hsl(var(--vidtreo-preview-bg));contain:layout style;will-change:auto;backface-visibility:hidden;isolation:isolate;border:none;border-radius:0;justify-content:center;align-items:center;width:100%;display:flex;position:relative;overflow:visible;transform:translateZ(0)}.vidtreo-preview-container:before{display:none}@media (width>=768px){.vidtreo-preview-container{aspect-ratio:16/9}}.vidtreo-camera-area{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;contain:layout style paint;backface-visibility:hidden;isolation:isolate;will-change:auto;width:100%;height:100%;font-family:-apple-system,BlinkMacSystemFont,SF Pro Display,SF Pro Text,system-ui,sans-serif;display:none;position:relative;transform:translateZ(0)}.vidtreo-source-transition-overlay{z-index:var(--vidtreo-z-error-overlay);backdrop-filter:blur(4px);contain:layout style paint;backface-visibility:hidden;will-change:opacity;background:#000000b3;border-radius:0;flex-direction:column;justify-content:center;align-items:center;transition:opacity .3s;display:none;position:absolute;inset:0;transform:translateZ(0)}.vidtreo-source-transition-overlay.vidtreo-active{animation:.2s vidtreo-fadeIn;display:flex}@keyframes vidtreo-fadeIn{0%{opacity:0}to{opacity:1}}.vidtreo-transition-spinner{border:4px solid #ffffff4d;border-top-color:#667eea;border-radius:50%;width:40px;height:40px;margin-bottom:12px;animation:.8s linear infinite vidtreo-spin}@keyframes vidtreo-spin{to{transform:rotate(360deg)}}.vidtreo-transition-message{color:#fff;text-align:center;font-size:14px;font-weight:500}.vidtreo-camera-area.vidtreo-active{display:block}.vidtreo-preview-skeleton{z-index:var(--vidtreo-z-controls);contain:layout style paint;backface-visibility:hidden;will-change:auto;background:#000;border-radius:0;flex-direction:column;justify-content:center;align-items:center;gap:1rem;display:flex;position:absolute;inset:0;transform:translateZ(0)}.vidtreo-skeleton-spinner{border:4px solid #ffffff4d;border-top-color:#fff;border-radius:50%;width:40px;height:40px;animation:.8s linear infinite vidtreo-spin}.vidtreo-skeleton-text{color:#fff;font-size:.875rem;font-weight:500}.vidtreo-video-preview{object-fit:cover;will-change:auto;backface-visibility:hidden;background:#000;border-radius:0;width:100%;height:100%;transition:opacity .3s,transform .3s;display:block;position:absolute;inset:0;transform:translateZ(0)}.vidtreo-video-preview-skeleton{z-index:2;contain:layout style paint;backface-visibility:hidden;will-change:auto;background:#000;border-radius:0;width:100%;height:100%;position:absolute;inset:0;overflow:hidden;transform:translateZ(0)}.vidtreo-skeleton-shimmer{background:linear-gradient(90deg, hsl(var(--vidtreo-muted)) 0%, hsl(var(--vidtreo-muted) / .5) 50%, hsl(var(--vidtreo-muted)) 100%);background-size:200% 100%;animation:1.5s ease-in-out infinite vidtreo-shimmer;position:absolute;inset:0}@keyframes vidtreo-shimmer{0%{background-position:-200% 0}to{background-position:200% 0}}.vidtreo-video-preview-skeleton.vidtreo-hidden{opacity:0;pointer-events:none;transition:opacity .3s}.vidtreo-video-preview.vidtreo-screen-share{object-fit:cover}.vidtreo-video-preview.vidtreo-transitioning{opacity:.5;transform:scale(.98)}.vidtreo-countdown-overlay{z-index:var(--vidtreo-z-countdown-overlay);contain:layout style paint;backface-visibility:hidden;will-change:auto;background:#000000f2;border-radius:0;justify-content:center;align-items:center;display:none;position:absolute;inset:0;transform:translateZ(0)}.vidtreo-countdown-overlay.vidtreo-active{display:flex}.vidtreo-countdown-content{flex-direction:column;align-items:center;gap:1rem;display:flex}.vidtreo-countdown-number{color:#fff;font-size:9rem;font-weight:700;animation:.3s vidtreo-zoomIn}@keyframes vidtreo-zoomIn{0%{opacity:0;transform:scale(.5)}to{opacity:1;transform:scale(1)}}.vidtreo-countdown-text{color:#fff;margin-top:1rem;font-size:.875rem;font-weight:500}.vidtreo-settings-panel{z-index:var(--vidtreo-z-settings-panel);contain:layout style paint;backface-visibility:hidden;background:#0006;border:none;border-radius:.75rem;flex-direction:column;width:90%;margin-left:-47%;padding:.625rem;display:none;overflow:hidden;transform:translateZ(0);position:absolute!important;bottom:4rem!important;left:50%!important}.vidtreo-settings-panel.vidtreo-active{display:flex}.vidtreo-settings-content{will-change:transform;backface-visibility:hidden;flex-direction:column;width:100%;display:flex;transform:translateZ(0)}.vidtreo-settings-content.vidtreo-slide-right{animation:.3s vidtreo-slideRight}.vidtreo-settings-content.vidtreo-slide-left{animation:.3s vidtreo-slideLeft}.vidtreo-settings-content.vidtreo-slide-none{will-change:auto;animation:none}@keyframes vidtreo-slideIn{0%{opacity:0;transform:translateY(1rem)}to{opacity:1;transform:translateY(0)}}@keyframes vidtreo-slideRight{0%{opacity:0;transform:translate(-100%)}to{opacity:1;transform:translate(0)}}@keyframes vidtreo-slideLeft{0%{opacity:0;transform:translate(100%)}to{opacity:1;transform:translate(0)}}.vidtreo-settings-header{color:#fff;cursor:pointer;text-align:left;background:0 0;border:none;align-items:center;gap:.75rem;width:100%;margin-bottom:1rem;padding:0;display:flex}.vidtreo-settings-back-icon{color:#fff;flex-shrink:0}.vidtreo-settings-title{color:#fff;margin:0;font-size:.875rem;font-weight:600}.vidtreo-device-options-container{flex-direction:column;gap:.375rem;display:flex}.vidtreo-device-option-nav{cursor:pointer;color:#fff;background:0 0;border:none;border-radius:.5rem;align-items:center;gap:1rem;width:100%;padding:.5rem .75rem;transition:background-color .2s;display:flex}.vidtreo-device-option-nav:hover{background:#fff3}.vidtreo-device-option-nav-content{flex-shrink:0;align-items:center;gap:.75rem;display:flex}.vidtreo-device-option-nav-label{color:#fff;font-size:.875rem;font-weight:500}.vidtreo-device-option-nav-value{flex:1;justify-content:flex-end;align-items:center;gap:.5rem;min-width:0;display:flex}.vidtreo-device-option-nav-value-text{color:#fffc;text-overflow:ellipsis;white-space:nowrap;text-align:right;flex:1;font-size:.875rem;overflow:hidden}.vidtreo-device-option-nav-chevron{color:#fff;font-size:1.25rem;line-height:1}.vidtreo-device-list{flex-direction:column;gap:0;max-height:200px;display:flex;overflow-y:auto}.vidtreo-device-list::-webkit-scrollbar{width:4px}.vidtreo-device-list::-webkit-scrollbar-track{background:0 0}.vidtreo-device-list::-webkit-scrollbar-thumb{background:#fff3;border-radius:2px}.vidtreo-device-list::-webkit-scrollbar-thumb:hover{background:#ffffff4d}.vidtreo-device-option{cursor:pointer;color:#fff;text-align:left;background:0 0;border:none;border-radius:.5rem;align-items:center;gap:.75rem;width:100%;padding:.5rem .75rem;transition:background-color .2s;display:flex}.vidtreo-device-option:hover{background:#fff3}.vidtreo-device-option-check-container{flex-shrink:0;justify-content:center;align-items:center;width:20px;height:20px;display:flex}.vidtreo-device-checkmark-placeholder{flex-shrink:0;width:20px;height:20px}.vidtreo-device-checkmark{color:#fff;flex-shrink:0}.vidtreo-device-option-label{color:#fff;flex:1;font-size:.875rem}.vidtreo-device-empty{color:#fff9;text-align:center;padding:1rem 0;font-size:.875rem}.vidtreo-audio-level-bars{height:1rem;z-index:var(--vidtreo-z-controls);contain:layout style paint;will-change:auto;backface-visibility:hidden;align-items:center;gap:.125rem;transform:translateZ(0);display:flex!important;position:absolute!important;bottom:.75rem!important;right:.75rem!important}@media (width>=768px){.vidtreo-audio-level-bars{height:1.25rem}}.vidtreo-audio-level-bar{background:#ffffff80;border-radius:9999px;align-self:flex-end;width:.125rem;transition:all .1s}.vidtreo-recording-controls{z-index:var(--vidtreo-z-controls);contain:layout style;will-change:auto;backface-visibility:hidden;position:absolute!important;bottom:12px!important;left:50%!important;transform:translate(-50%)translateZ(0)!important}.vidtreo-recording-controls-row{will-change:auto;justify-content:center;align-items:center;gap:.5rem;display:flex;transform:translateZ(0)}.vidtreo-recording-timer-row{justify-content:space-between;align-items:center;gap:.5rem;display:flex}.vidtreo-recording-timer-badge{z-index:var(--vidtreo-z-controls);contain:layout style paint;will-change:auto;backface-visibility:hidden;background:#0000004d;border:none;border-radius:9999px;align-items:center;gap:.375rem;padding:.25rem .5rem;transform:translateZ(0);box-shadow:0 1px 3px #0000001a,0 1px 2px -1px #0000001a;display:flex!important;position:absolute!important;top:.75rem!important;right:.75rem!important}.vidtreo-recording-dot-small{background:hsl(var(--vidtreo-destructive));border-radius:50%;width:.375rem;height:.375rem;animation:1.5s ease-in-out infinite vidtreo-pulse}.vidtreo-recording-timer-text{color:#fff;font-family:monospace;font-size:.75rem;font-weight:500}.vidtreo-control-buttons-row{will-change:auto;justify-content:center;align-items:center;gap:.375rem;height:auto;min-height:2rem;display:flex;transform:translateZ(0)}@media (width>=768px){.vidtreo-control-buttons-row{min-height:2.25rem}}.vidtreo-control-button{cursor:pointer;color:#fff;box-sizing:border-box;vertical-align:top;contain:layout style paint;will-change:auto;backface-visibility:hidden;background:#0000004d;border:none;border-radius:9999px;flex-shrink:0;justify-content:center;align-items:center;width:2rem;height:2rem;min-height:2rem;max-height:2rem;margin:0;padding:.25rem;transition:background-color .2s;display:inline-flex;position:relative;transform:translateZ(0)}.vidtreo-control-button:before{content:"";z-index:0;border-radius:9999px;transition:background-color .2s;position:absolute;inset:.25rem}.vidtreo-control-button svg{color:inherit;z-index:1;flex-shrink:0;position:relative;width:22px!important;height:22px!important}@media (width>=768px){.vidtreo-control-button svg{width:24px!important;height:24px!important}.vidtreo-control-button{width:2.25rem;height:2.25rem;min-height:2.25rem;max-height:2.25rem}}.vidtreo-control-button:hover:not(:disabled):before{background:#fff3}.vidtreo-control-button:disabled{opacity:.5;cursor:not-allowed}.vidtreo-control-button.vidtreo-muted:before{background:#0000004d}.vidtreo-control-button.vidtreo-muted:hover:not(:disabled):before{background:#fff3}.vidtreo-record-button{background:hsl(var(--vidtreo-destructive));height:2rem;min-height:2rem;max-height:2rem;color:hsl(var(--vidtreo-destructive-foreground));box-sizing:border-box;vertical-align:top;cursor:pointer;border:none;border-radius:9999px;flex-shrink:0;justify-content:center;align-items:center;gap:.375rem;width:auto;margin:0;padding:0 .75rem;font-size:.75rem;font-weight:500;line-height:1;transition:background-color .2s,filter .2s;display:inline-flex}@media (width>=768px){.vidtreo-record-button{height:2.25rem;min-height:2.25rem;max-height:2.25rem;font-size:.875rem}}.vidtreo-record-button:hover:not(:disabled){filter:brightness(.85)}.vidtreo-record-button.vidtreo-stop-button-locked{opacity:.5;cursor:not-allowed;filter:none}.vidtreo-record-button.vidtreo-stop-button-locked:hover{filter:none}#startButton.vidtreo-record-button{animation:2s ease-in-out infinite vidtreo-record-glow-pulse}@keyframes vidtreo-record-glow-pulse{0%,to{box-shadow:0 0 8px 2px #ef444466,0 0 16px 4px #ef444433}50%{box-shadow:0 0 16px 4px #ef444499,0 0 32px 8px #ef44444d}}#startButton.vidtreo-record-button:hover:not(:disabled){animation-play-state:paused;box-shadow:0 0 20px 6px #ef4444b3,0 0 40px 10px #ef444459}.vidtreo-rec-indicator-top{contain:layout style paint;will-change:auto;backface-visibility:hidden;background:#0000004d;border:none;border-radius:9999px;align-items:center;gap:.375rem;padding:.25rem .5rem;transform:translateZ(0);box-shadow:0 1px 3px #0000001a,0 1px 2px -1px #0000001a;display:flex!important;position:absolute!important;top:.75rem!important;left:.75rem!important}.vidtreo-rec-indicator-top span{color:#fff;font-size:.75rem;font-weight:500}.vidtreo-start-camera-area{text-align:center;cursor:pointer;z-index:1;contain:layout style paint;backface-visibility:hidden;will-change:auto;background:#000;border:none;border-radius:0;flex-direction:column;justify-content:center;align-items:center;padding:40px;transition:all .3s;display:flex;position:absolute;inset:0;transform:translateZ(0)}.vidtreo-start-camera-area:hover:not(.vidtreo-loading){background:#000}.vidtreo-start-camera-area.vidtreo-loading{cursor:wait;opacity:.7}.vidtreo-start-camera-area.vidtreo-loading .vidtreo-camera-text{color:#fff;opacity:.7}.vidtreo-camera-icon{color:#fff;justify-content:center;margin-bottom:16px;font-size:48px;display:flex}.vidtreo-camera-text{color:#fff;margin-bottom:8px;font-weight:600}.vidtreo-camera-text a{color:#3b82f6;text-decoration:underline}.vidtreo-camera-text a:hover{color:#2563eb}.vidtreo-camera-hint{color:#fff;opacity:.8;font-size:12px}@keyframes vidtreo-pulse{0%,to{opacity:1}50%{opacity:.3}}.vidtreo-progress{margin-top:20px;display:none}.vidtreo-progress.vidtreo-active{display:block}.vidtreo-progress-bar{background:#e0e0e0;border-radius:4px;width:100%;height:8px;margin-bottom:8px;overflow:hidden}.vidtreo-progress-fill{background:linear-gradient(90deg,#667eea 0%,#764ba2 100%);width:0%;height:100%;transition:width .3s}.vidtreo-progress-text{text-align:center;color:#fff;font-size:14px}.vidtreo-error{color:#fff;text-align:center;z-index:var(--vidtreo-z-error-overlay);word-wrap:break-word;background:#dc2626;border:none;border-radius:.5rem;max-width:90%;padding:1rem 1.25rem;font-size:.875rem;font-weight:500;display:none;position:absolute;top:.75rem;left:50%;transform:translate(-50%);box-shadow:0 4px 6px -1px #0000001a,0 2px 4px -2px #0000001a}.vidtreo-error.vidtreo-active{animation:.3s ease-out vidtreo-error-fade-in-slide-down;display:block}@keyframes vidtreo-error-fade-in-slide-down{0%{opacity:0;transform:translate(-50%)translateY(-1rem)}to{opacity:1;transform:translate(-50%)translateY(0)}}.vidtreo-upload-progress{margin-top:20px;display:none}.vidtreo-upload-progress.vidtreo-active{display:block}.vidtreo-preview-container .vidtreo-upload-progress{margin-top:0}.vidtreo-upload-status{border-radius:8px;margin-top:20px;padding:16px;display:none}.vidtreo-upload-status.vidtreo-active{display:block}.vidtreo-upload-status.vidtreo-success{color:#22543d;background:#f0f9ff;border:2px solid #48bb78}.vidtreo-upload-status.vidtreo-error{color:#c33;background:#fee;border:2px solid #fcc}.vidtreo-upload-status-text{font-size:14px;font-weight:500}.vidtreo-preview-error{aspect-ratio:9/16;background:hsl(var(--vidtreo-preview-bg));contain:strict;will-change:auto;backface-visibility:hidden;isolation:isolate;border:none;border-radius:0;justify-content:center;align-items:center;width:100%;display:flex;position:relative;overflow:hidden;transform:translateZ(0)}@media (width>=768px){.vidtreo-preview-error{aspect-ratio:16/9}}.vidtreo-error-content{text-align:center;color:#fff;flex-direction:column;justify-content:center;align-items:center;gap:1rem;max-width:400px;padding:2rem;display:flex}.vidtreo-error-icon{font-size:3rem;line-height:1}.vidtreo-error-title{font-size:1.25rem;font-weight:600;line-height:1.2}.vidtreo-error-message{opacity:.9;word-break:break-word;font-size:.875rem;line-height:1.5}.vidtreo-error-config{text-align:left;border-top:1px solid #fff3;width:100%;margin-top:1.5rem;padding-top:1.5rem}.vidtreo-error-config-title{color:#fff;margin-bottom:.75rem;font-size:.875rem;font-weight:600}.vidtreo-error-config-item{color:#ffffffd9;margin-bottom:.5rem;font-size:.8125rem;line-height:1.6}.vidtreo-error-config-item code{color:#fff;background:#ffffff26;border-radius:.25rem;padding:.125rem .375rem;font-family:monospace;font-size:.75rem}.vidtreo-error-retry{background:hsl(var(--vidtreo-destructive));color:hsl(var(--vidtreo-destructive-foreground));cursor:pointer;border:none;border-radius:.375rem;margin-top:.5rem;padding:.5rem 1rem;font-size:.875rem;font-weight:500;transition:filter .2s}.vidtreo-error-retry:hover:not(:disabled){filter:brightness(.85)}.vidtreo-error-retry:disabled{opacity:.5;cursor:not-allowed}.vidtreo-error-overlay{background:hsl(var(--vidtreo-preview-bg));z-index:var(--vidtreo-z-error-overlay);justify-content:center;align-items:center;display:flex;position:absolute;inset:0}.vidtreo-native-camera-container{aspect-ratio:9/16;background:hsl(var(--vidtreo-preview-bg));border-radius:0;justify-content:center;align-items:center;width:100%;display:flex;position:relative;overflow:hidden}@media (width>=768px){.vidtreo-native-camera-container{aspect-ratio:16/9}}.vidtreo-native-camera-container:has(.vidtreo-native-camera-preview-container){background:0 0}.vidtreo-config-loading-indicator{z-index:var(--vidtreo-z-controls);position:absolute;top:8px;right:8px}.vidtreo-spinner-small{border:2px solid #ffffff4d;border-top-color:#fff;border-radius:50%;width:16px;height:16px;animation:.6s linear infinite spin}.vidtreo-native-camera-empty-state{flex-direction:column;justify-content:center;align-items:center;gap:16px;width:100%;height:100%;padding:24px;display:flex;position:relative}.vidtreo-native-camera-buttons{flex-direction:column;gap:12px;width:100%;max-width:300px;display:flex}.vidtreo-native-camera-process-button,.vidtreo-native-camera-download-button{z-index:30;position:absolute;bottom:24px;left:50%;transform:translate(-50%)}.vidtreo-native-camera-process-button .vidtreo-btn,.vidtreo-native-camera-download-button .vidtreo-btn{min-width:200px}.vidtreo-btn{border-radius:var(--vidtreo-radius);cursor:pointer;border:none;padding:12px 24px;font-size:1rem;font-weight:500;transition:all .2s}.vidtreo-btn:disabled{opacity:.5;cursor:not-allowed}.vidtreo-btn-primary{background:hsl(var(--vidtreo-primary));color:hsl(var(--vidtreo-primary-foreground))}.vidtreo-btn-primary:hover:not(:disabled){filter:brightness(.9)}.vidtreo-btn-secondary{background:hsl(var(--vidtreo-secondary));color:hsl(var(--vidtreo-secondary-foreground));border:1px solid hsl(var(--vidtreo-border))}.vidtreo-btn-secondary:hover:not(:disabled){background:hsl(var(--vidtreo-accent))}.vidtreo-transcoding-progress{width:100%;max-width:400px;padding:16px}.vidtreo-progress-bar{background:#fff3;border-radius:4px;width:100%;height:8px;overflow:hidden}.vidtreo-progress-fill{background:hsl(var(--vidtreo-primary));height:100%;transition:width .3s}.vidtreo-progress-text{text-align:center;color:hsl(var(--vidtreo-foreground));margin-top:8px;font-size:.875rem}.vidtreo-native-camera-preview-container{background:0 0;justify-content:center;align-items:center;width:100%;height:100%;display:flex;position:relative}.vidtreo-native-camera-preview-image{object-fit:contain;width:100%;height:100%;display:block}.vidtreo-progress-overlay{backdrop-filter:blur(4px);width:100%;height:100%;z-index:var(--vidtreo-z-progress-overlay);pointer-events:none;background:#000000b3;flex-direction:column;justify-content:center;align-items:center;display:flex;position:absolute;inset:0}.vidtreo-progress-overlay .vidtreo-transcoding-progress,.vidtreo-progress-overlay .vidtreo-upload-progress{pointer-events:auto;background:0 0;flex-direction:column;align-items:center;gap:12px;width:90%;max-width:400px;padding:0;display:flex;position:relative}.vidtreo-progress-overlay .vidtreo-progress-bar,.vidtreo-progress-overlay .vidtreo-upload-progress-bar{background:#fff3;border-radius:4px;width:100%;height:8px;overflow:hidden}.vidtreo-progress-overlay .vidtreo-progress-fill{background:#fff;height:100%;transition:width .3s}.vidtreo-progress-overlay .vidtreo-progress-text,.vidtreo-progress-overlay .vidtreo-upload-progress-text{text-align:center;color:#fff;margin-top:0;font-size:.875rem;font-weight:500}.vidtreo-progress-overlay .vidtreo-upload-progress-bar{background:#fff3;border-radius:4px;width:100%;height:8px;overflow:hidden}.vidtreo-progress-overlay .vidtreo-upload-progress-fill{background:#fff;height:100%;transition:width .3s}.vidtreo-progress-overlay .vidtreo-progress-indeterminate{background:linear-gradient(90deg,#0000 0%,#fff 50%,#0000 100%) 0 0/200% 100%;width:100%;animation:1.5s ease-in-out infinite vidtreo-progress-indeterminate}@keyframes vidtreo-progress-indeterminate{0%{background-position:200% 0}to{background-position:-200% 0}}.vidtreo-mobile-web-recorder{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;width:100%;height:100%;font-family:-apple-system,BlinkMacSystemFont,SF Pro Display,SF Pro Text,system-ui,sans-serif}.vidtreo-camera-area button,.vidtreo-camera-area input,.vidtreo-camera-area select,.vidtreo-camera-area textarea,.vidtreo-mobile-web-recorder button,.vidtreo-mobile-web-recorder input,.vidtreo-mobile-web-recorder select,.vidtreo-mobile-web-recorder textarea,.vidtreo-permission-flow button{font-family:inherit}.vidtreo-mobile-landing-container{aspect-ratio:4/3;background:hsl(var(--vidtreo-preview-bg));border-radius:0;justify-content:center;align-items:center;width:100%;max-height:100%;display:flex;position:relative;overflow:hidden}.vidtreo-mobile-landing-content{text-align:center;flex-direction:column;justify-content:center;align-items:center;gap:1.25rem;padding:2rem;display:flex}.vidtreo-mobile-landing-title{color:#fff;margin:0;font-size:1.25rem;font-weight:600;line-height:1.3}.vidtreo-mobile-landing-description{color:#ffffffbf;max-width:280px;margin:0;font-size:.875rem;line-height:1.5}.vidtreo-mobile-open-camera-btn{border-radius:9999px;justify-content:center;align-items:center;gap:.625rem;min-width:200px;margin-top:.5rem;padding:.875rem 1.75rem;font-size:1rem;font-weight:600;transition:all .2s;animation:2s ease-in-out infinite vidtreo-btn-glow-pulse;display:inline-flex}@keyframes vidtreo-btn-glow-pulse{0%,to{box-shadow:0 0 8px 2px #ffffff4d,0 0 16px 4px #ffffff26}50%{box-shadow:0 0 16px 4px #ffffff80,0 0 32px 8px #ffffff40}}.vidtreo-mobile-open-camera-btn:hover:not(:disabled){animation-play-state:paused;transform:scale(1.02);box-shadow:0 0 20px 6px #fff9,0 0 40px 10px #ffffff4d}.vidtreo-mobile-open-camera-btn:active:not(:disabled){transform:scale(.98)}.vidtreo-mobile-open-camera-btn:disabled{box-shadow:none;animation:none}#vidtreo-portal-root{z-index:9999;pointer-events:none;width:100vw;height:100dvh;position:fixed;top:0;left:0}#vidtreo-portal-root>*{pointer-events:auto}.vidtreo-mobile-modal-overlay{--vidtreo-safe-top:0px;--vidtreo-safe-bottom:0px;--vidtreo-safe-left:0px;--vidtreo-safe-right:0px;width:100vw;height:100dvh;z-index:var(--vidtreo-z-modal-overlay);background:#000;flex-direction:column;height:-webkit-fill-available;animation:.3s ease-out vidtreo-modal-fade-in;display:flex;position:fixed;inset:0}@keyframes vidtreo-modal-fade-in{0%{opacity:0}to{opacity:1}}.vidtreo-mobile-modal-header{padding:.75rem;padding-top:calc(.75rem + var(--vidtreo-safe-top,0px));z-index:var(--vidtreo-z-error-overlay);pointer-events:none;justify-content:center;display:flex;position:absolute;top:0;left:0;right:0}.vidtreo-mobile-modal-close-btn{color:#ffffffe6;cursor:pointer;pointer-events:auto;backdrop-filter:blur(4px);background:#00000080;border:none;border-radius:9999px;justify-content:center;align-items:center;gap:.375rem;height:2rem;padding:0 .75rem;font-size:.75rem;font-weight:500;transition:all .2s;display:flex}.vidtreo-mobile-modal-close-btn:hover:not(:disabled){background:#000000b3}.vidtreo-mobile-modal-close-btn:disabled{opacity:.3;cursor:not-allowed}.vidtreo-mobile-modal-content{width:100%;height:100%;padding-top:var(--vidtreo-safe-top,0px);padding-bottom:var(--vidtreo-safe-bottom,0px);padding-left:var(--vidtreo-safe-left,0px);padding-right:var(--vidtreo-safe-right,0px);flex-direction:column;flex:1;display:flex;position:relative}.vidtreo-mobile-recorder-content{--vidtreo-safe-top:0px;--vidtreo-safe-bottom:0px;--vidtreo-safe-left:0px;--vidtreo-safe-right:0px;flex-direction:column;width:100%;height:100%;display:flex;position:relative}.vidtreo-mobile-recorder-content .vidtreo-preview-container{aspect-ratio:unset;flex:1;width:100%;height:100%}.vidtreo-mobile-recorder-content .vidtreo-video-preview{object-fit:cover}.vidtreo-mobile-preview{flex:1;aspect-ratio:unset!important;height:100%!important}.vidtreo-mobile-recorder-content .vidtreo-recording-controls{bottom:calc(24px + var(--vidtreo-safe-bottom,0px))!important}.vidtreo-mobile-recorder-content .vidtreo-audio-level-bars{bottom:calc(12px + var(--vidtreo-safe-bottom,0px))!important}.vidtreo-mobile-recorder-content .vidtreo-settings-panel{bottom:calc(7rem + var(--vidtreo-safe-bottom,0px))!important}.vidtreo-mobile-recorder-content .vidtreo-rec-indicator-top,.vidtreo-mobile-recorder-content .vidtreo-recording-timer-badge{contain:layout style;height:2rem;padding:0 .75rem;top:calc(.75rem + var(--vidtreo-safe-top,0px))!important}.vidtreo-mobile-recorder-content .vidtreo-recording-timer-text{white-space:nowrap;color:#fff;min-width:3rem;font-size:.875rem;display:inline-block}.vidtreo-mobile-recorder-content .vidtreo-error{top:calc(3.5rem + var(--vidtreo-safe-top,0px))!important}.vidtreo-mobile-recorder-content .vidtreo-control-buttons-row{gap:.75rem;min-height:4rem}.vidtreo-mobile-recorder-content .vidtreo-control-button{width:4rem;height:4rem;min-height:4rem;max-height:4rem}.vidtreo-mobile-recorder-content .vidtreo-control-button svg{width:1.5rem;height:1.5rem}.vidtreo-mobile-recorder-content .vidtreo-record-button{gap:.5rem;height:4rem;min-height:4rem;max-height:4rem;padding:0 1.5rem;font-size:1rem}.vidtreo-mobile-recorder-content .vidtreo-record-button svg{width:1.5rem;height:1.5rem}.vidtreo-permission-flow{z-index:var(--vidtreo-z-modal-overlay);contain:layout style paint;backface-visibility:hidden;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;background:#000;flex-direction:column;justify-content:center;align-items:center;gap:1.25rem;font-family:-apple-system,BlinkMacSystemFont,SF Pro Display,SF Pro Text,system-ui,sans-serif;display:none;position:absolute;inset:0;transform:translateZ(0)}.vidtreo-permission-flow.vidtreo-active{animation:.4s cubic-bezier(.2,0,0,1) vidtreo-fadeIn;display:flex}.vidtreo-permission-flow-title{color:#fff;text-align:center;margin:0;font-size:1.25rem;font-weight:600;line-height:1.3}.vidtreo-permission-flow-subtitle{color:#ffffffbf;text-align:center;letter-spacing:-.005em;max-width:280px;margin:0;font-size:.875rem;line-height:1.5}.vidtreo-permission-flow-action{background:hsl(var(--vidtreo-primary));color:hsl(var(--vidtreo-primary-foreground));cursor:pointer;letter-spacing:-.01em;border:none;border-radius:9999px;justify-content:center;align-items:center;gap:.625rem;min-width:200px;margin-top:.5rem;padding:.875rem 1.75rem;font-size:1rem;font-weight:600;transition:all .2s;animation:2s ease-in-out infinite vidtreo-btn-glow-pulse;display:inline-flex}.vidtreo-permission-flow-action:hover:not(:disabled){animation-play-state:paused;transform:scale(1.02);box-shadow:0 0 20px 6px #fff9,0 0 40px 10px #ffffff4d}.vidtreo-permission-flow-action:active:not(:disabled){transform:scale(.98)}.vidtreo-permission-flow-action:disabled{opacity:.5;cursor:not-allowed;box-shadow:none;animation:none}.vidtreo-permission-flow-action--requesting{opacity:.55;cursor:wait;box-shadow:none;animation:none}@keyframes vidtreo-spinner-rotate{to{transform:rotate(360deg)}}.vidtreo-permission-flow-spinner{border:2px solid #ffffff4d;border-top-color:hsl(var(--vidtreo-primary-foreground));border-radius:50%;flex-shrink:0;width:1.125rem;height:1.125rem;animation:.8s linear infinite vidtreo-spinner-rotate;display:inline-block}.vidtreo-permission-flow-spinner--large{border-width:3px;width:2.5rem;height:2.5rem}.vidtreo-permission-flow-recovery{text-align:center;flex-direction:column;align-items:center;gap:1.25rem;max-width:280px;display:flex}.vidtreo-permission-flow-recovery-text{color:#fff6;letter-spacing:-.005em;margin:0;font-size:.75rem;line-height:1.6}.vidtreo-permission-flow-retry{background:hsl(var(--vidtreo-primary));color:hsl(var(--vidtreo-primary-foreground));cursor:pointer;letter-spacing:-.01em;border:none;border-radius:9999px;justify-content:center;align-items:center;gap:.625rem;min-width:200px;padding:.875rem 1.75rem;font-size:1rem;font-weight:600;transition:all .2s;animation:2s ease-in-out infinite vidtreo-btn-glow-pulse;display:inline-flex}.vidtreo-permission-flow-retry:hover:not(:disabled){animation-play-state:paused;transform:scale(1.02);box-shadow:0 0 20px 6px #fff9,0 0 40px 10px #ffffff4d}.vidtreo-permission-flow-retry:active:not(:disabled){transform:scale(.98)}@keyframes vidtreo-fadeOut{0%{opacity:1}to{opacity:0}}.vidtreo-permission-flow.vidtreo-permission-flow--fading{pointer-events:none;animation:.6s ease-out forwards vidtreo-fadeOut}.vidtreo-recovery-guide{width:100%;max-width:280px;margin:0 auto;position:relative}.vidtreo-recovery-guide:after{content:"";z-index:20;pointer-events:none;background:linear-gradient(#0000 0%,#000 100%);height:60px;position:absolute;bottom:0;left:0;right:0}.vidtreo-recovery-guide:before{content:"";z-index:20;pointer-events:none;background:linear-gradient(90deg,#0000 0%,#000 100%);width:50px;position:absolute;top:0;bottom:0;right:0}.vidtreo-recovery-guide-browser{background:#161616;border-top:1px solid #ffffff1a;border-left:1px solid #ffffff1a;border-radius:10px 0 0;animation:.5s vidtreo-fadeIn;position:relative;overflow:hidden}.vidtreo-recovery-guide-titlebar{z-index:3;background:#1e1e1e;border-bottom:1px solid #ffffff0f;align-items:center;gap:8px;padding:8px 10px;display:flex;position:relative}.vidtreo-recovery-guide-dots{flex-shrink:0;gap:5px;display:flex}.vidtreo-recovery-guide-dot{border-radius:50%;width:8px;height:8px}.vidtreo-recovery-guide-dot--close{background:#ff5f57}.vidtreo-recovery-guide-dot--min{background:#febc2e}.vidtreo-recovery-guide-dot--max{background:#28c840}.vidtreo-recovery-guide-addressbar{background:#2a2a2a;border-radius:5px;flex:1;align-items:center;gap:5px;min-width:0;padding:4px 8px;display:flex}.vidtreo-recovery-guide-lock{color:#ffffff80;flex-shrink:0;align-items:center;animation:7s ease-in-out infinite vidtreo-lock-pulse;display:flex}.vidtreo-recovery-guide-lock-svg{display:block}.vidtreo-recovery-guide-url{color:#ffffff80;white-space:nowrap;text-overflow:ellipsis;font-family:-apple-system,BlinkMacSystemFont,system-ui,sans-serif;font-size:.65rem;overflow:hidden}.vidtreo-recovery-guide-cursor{z-index:40;pointer-events:none;filter:drop-shadow(0 2px 4px #0009);animation:7s ease-in-out infinite vidtreo-cursor-move;position:absolute;top:12px;left:62px}.vidtreo-recovery-guide-cursor-svg{display:block}.vidtreo-recovery-guide-browser-bg{background:#161616;height:110px}.vidtreo-recovery-guide-popover{z-index:30;background:#252525;border:1px solid #ffffff1a;border-radius:10px;padding:8px 12px 12px;animation:7s ease-in-out infinite vidtreo-popover-reveal;position:absolute;top:34px;left:12px;right:12px;box-shadow:0 8px 30px #0009,0 2px 8px #0006,0 0 0 1px #ffffff0f}.vidtreo-recovery-guide-popover-header{color:#ffffffd9;white-space:nowrap;text-overflow:ellipsis;text-align:left;padding-bottom:6px;font-family:-apple-system,BlinkMacSystemFont,system-ui,sans-serif;font-size:.65rem;font-weight:600;overflow:hidden}.vidtreo-recovery-guide-popover-divider{background:#ffffff14;height:1px}.vidtreo-recovery-guide-perm-row{justify-content:space-between;align-items:center;padding:7px 0;display:flex}.vidtreo-recovery-guide-perm-row+.vidtreo-recovery-guide-perm-row{border-top:1px solid #ffffff0f}.vidtreo-recovery-guide-perm-group{align-items:center;gap:8px;display:flex}.vidtreo-recovery-guide-perm-icon{flex-shrink:0;width:14px;height:14px;position:relative}.vidtreo-recovery-guide-icon-off,.vidtreo-recovery-guide-icon-on{justify-content:center;align-items:center;display:flex;position:absolute;inset:0}.vidtreo-recovery-guide-icon-off{color:#fff6;animation:7s ease-in-out infinite vidtreo-icon-hide}.vidtreo-recovery-guide-icon-on{color:#34d399;animation:7s ease-in-out infinite vidtreo-icon-show}.vidtreo-recovery-guide-perm-label{color:#ffffffd9;font-family:-apple-system,BlinkMacSystemFont,system-ui,sans-serif;font-size:.7rem}.vidtreo-recovery-guide-switch{flex-shrink:0;width:32px;height:18px;position:relative}.vidtreo-recovery-guide-switch-track{background:#ffffff26;border-radius:9px;animation:7s ease-in-out infinite vidtreo-track-on;position:absolute;inset:0}.vidtreo-recovery-guide-switch-knob{background:#fff;border-radius:50%;width:14px;height:14px;animation:7s ease-in-out infinite vidtreo-knob-slide;position:absolute;top:2px;left:2px;box-shadow:0 1px 3px #0000004d}.vidtreo-recovery-guide-switch--delayed{animation-delay:.85s}@keyframes vidtreo-cursor-move{0%{opacity:0;transform:translate(100px,12px)}8%{opacity:1}22%{transform:translate(0)}26%{transform:translate(0)scale(.75)}30%{opacity:1;transform:translate(0)scale(1)}33%{opacity:1;transform:translate(0)}38%{opacity:1;transform:translate(65px,63px)}42%{transform:translate(65px,63px)scale(.75)}45%{opacity:1;transform:translate(65px,63px)scale(1)}48%{opacity:1;transform:translate(65px,97px)}52%{transform:translate(65px,97px)scale(.75)}55%{opacity:1;transform:translate(65px,97px)scale(1)}60%{opacity:0}to{opacity:0;transform:translate(100px,12px)}}@keyframes vidtreo-popover-reveal{0%,27%{opacity:0;transform:translateY(-6px)scale(.96)}33%,82%{opacity:1;transform:translateY(0)scale(1)}88%,to{opacity:0;transform:translateY(-6px)scale(.96)}}@keyframes vidtreo-track-on{0%,34%{background:#ffffff26}40%,92%{background:#34d399}96%,to{background:#ffffff26}}@keyframes vidtreo-knob-slide{0%,34%{transform:translate(0)}40%,92%{transform:translate(14px)}96%,to{transform:translate(0)}}@keyframes vidtreo-icon-hide{0%,34%{opacity:1}40%,92%{opacity:0}96%,to{opacity:1}}@keyframes vidtreo-icon-show{0%,34%{opacity:0}40%,92%{opacity:1}96%,to{opacity:0}}@keyframes vidtreo-lock-pulse{0%,15%{color:#ffffff80}22%,30%{color:#34d399}38%,to{color:#ffffff80}}.vidtreo-record-button.vidtreo-record-button-disabled,.vidtreo-record-button-disabled{opacity:.6;cursor:not-allowed;pointer-events:none;filter:grayscale(.3)}.vidtreo-mic-connecting-indicator{justify-content:center;align-items:center;animation:1.4s ease-in-out infinite vidtreo-mic-pulse;display:inline-flex}@keyframes vidtreo-mic-pulse{0%,to{opacity:.4}50%{opacity:1}}.vidtreo-audio-error-overlay{z-index:var(--vidtreo-z-error-overlay);text-align:center;background:#000000d9;flex-direction:column;justify-content:center;align-items:center;padding:2rem 1.5rem;animation:.3s ease-out vidtreo-audio-overlay-fade-in;display:flex;position:absolute;inset:0}@supports (backdrop-filter:blur(8px)){.vidtreo-audio-error-overlay{-webkit-backdrop-filter:blur(8px);background:#000000bf}}@keyframes vidtreo-audio-overlay-fade-in{0%{opacity:0}to{opacity:1}}.vidtreo-audio-error-icon{background:#ef444426;border-radius:50%;justify-content:center;align-items:center;width:56px;height:56px;margin-bottom:1rem;display:flex}.vidtreo-audio-error-icon svg{color:#ef4444;width:28px;height:28px}.vidtreo-audio-error-title{color:#fff;margin:0 0 .5rem;font-size:1.125rem;font-weight:600;line-height:1.4}.vidtreo-audio-error-message{color:#ffffffb3;max-width:320px;margin:0 0 1.5rem;font-size:.875rem;line-height:1.6}.vidtreo-audio-error-retry{color:#111;cursor:pointer;background:#fff;border:none;border-radius:9999px;align-items:center;gap:.5rem;padding:.75rem 1.5rem;font-family:inherit;font-size:.875rem;font-weight:600;transition:background .15s,transform .1s;display:inline-flex}.vidtreo-audio-error-retry:hover{background:#f0f0f0}.vidtreo-audio-error-retry:active{transform:scale(.97)}.vidtreo-audio-error-retry svg{width:16px;height:16px}.vidtreo-audio-warning-toast{z-index:var(--vidtreo-z-error-overlay);color:#ffffffeb;pointer-events:auto;background:#1111118c;border:1px solid #ffffff14;border-radius:12px;align-items:flex-start;gap:.625rem;max-width:min(420px,100% - 2rem);padding:.625rem .875rem;font-family:inherit;animation:.2s ease-out vidtreo-audio-warning-toast-fade-in;display:flex;position:absolute;top:1rem;left:50%;transform:translate(-50%);box-shadow:0 4px 16px #00000040}@supports (backdrop-filter:blur(10px)){.vidtreo-audio-warning-toast{-webkit-backdrop-filter:blur(10px)saturate(140%);background:#11111173}}.vidtreo-audio-warning-toast--critical{border-color:#ef444473}.vidtreo-audio-warning-toast--critical .vidtreo-audio-warning-toast__icon{color:#ef4444}.vidtreo-audio-warning-toast--soft{border-color:#f59e0b73}.vidtreo-audio-warning-toast--soft .vidtreo-audio-warning-toast__icon{color:#f59e0b}.vidtreo-audio-warning-toast__icon{flex:none;justify-content:center;align-items:center;width:20px;height:20px;margin-top:1px;display:inline-flex}.vidtreo-audio-warning-toast__content{flex-direction:column;flex:auto;gap:2px;min-width:0;display:flex}.vidtreo-audio-warning-toast__title{color:#fff;font-size:.8125rem;font-weight:600;line-height:1.3}.vidtreo-audio-warning-toast__message{color:#ffffffb8;font-size:.75rem;font-weight:400;line-height:1.4}.vidtreo-audio-warning-toast__dismiss{color:#ffffffa6;cursor:pointer;background:0 0;border:none;border-radius:6px;flex:none;justify-content:center;align-items:center;width:22px;height:22px;margin-left:.25rem;padding:0;font-family:inherit;transition:background .15s,color .15s;display:inline-flex}.vidtreo-audio-warning-toast__dismiss:hover{color:#fffffff2;background:#ffffff1a}@keyframes vidtreo-audio-warning-toast-fade-in{0%{opacity:0;transform:translate(-50%,-8px)}to{opacity:1;transform:translate(-50%)}}`;function dx(e){return`
10352
- <style>${ux}</style>
10351
+ `],{type:`application/javascript`})}let Yv=gv({createBlob:Jv,createObjectUrl:e=>URL.createObjectURL(e),revokeObjectUrl:e=>{URL.revokeObjectURL(e)}});function Xv(){return Yv.acquire()}function Zv(){Yv.release()}let Qv=1e3,$v=`format`,ey=new Map,ty=new Map;function ny(e){return e===void 0?`undefined`:String(e)}function ry(e){return e.join(`,`)}function iy(e,t){return`${e}=${t}`}function ay(e,t,n){if(e.has(t)&&e.delete(t),e.set(t,n),e.size<=50)return;let r=e.keys().next();r.done||e.delete(r.value)}var oy=class{constructor(e={}){this.worker=null,this.hasWorkerUrlLease=!1,this.chunks=[],this.totalSize=0,this.isActive=!1,this.audioTrackClone=null,this.audioTrackWarningTarget=null,this.isMuted=!1,this.currentVideoTrack=null,this.isPaused=!1,this.overlayConfig=null,this.readyPromiseResolve=null,this.readyPromiseReject=null,this.lastConfigFps=30,this.pendingFatalError=null,this.lastRecordingStats=null,this.audioWasExpected=!1,this.lastEncoderAcceleration=null,this.audioHealthMonitor=new pv,this.audioHealthIntervalId=null,this.emittedAudioWarnings=new Set,this.audioTrackEndedDuringSession=!1,this.recordingStartTimestampMs=null,this.noFrameWatchdogId=null,this.handleAudioTrackEnded=()=>{this.audioTrackEndedDuringSession=!0,this.emitAudioWarningOnce({code:`audio.track-ended`})},this.handleAudioTrackMuted=()=>{this.emitAudioWarningOnce({code:`audio.track-muted-by-browser`})},this.handleAudioTrackUnmuted=()=>{this.emittedAudioWarnings.delete(`audio.track-muted-by-browser`)&&this.onAudioRecovered&&this.onAudioRecovered()};let t=e=>new Worker(e,{type:`classic`});e.createWorker&&(t=e.createWorker);let n=e=>typeof MediaStreamTrackProcessor>`u`?null:new MediaStreamTrackProcessor({track:e}).readable;e.createVideoStreamFromTrack&&(n=e.createVideoStreamFromTrack);let r=()=>an();e.isLinuxPlatform&&(r=e.isLinuxPlatform),this.createVideoStreamFromTrackFn=n,this.isLinuxPlatformFn=r,e.videoFramePreflightDeps?this.videoFramePreflightDeps=e.videoFramePreflightDeps:this.videoFramePreflightDeps={},e.noFrameWatchdogDelayMs===void 0?this.watchdogDelayMs=5e3:this.watchdogDelayMs=e.noFrameWatchdogDelayMs;let i=!!e.createWorker;this.workerProbeManager=new qv({setTimeout:window.setTimeout.bind(window),clearTimeout:window.clearTimeout.bind(window),timeoutMilliseconds:2e3}),this.audioWorkletManager=new Ev({onChunk:this.handleAudioWorkletChunk.bind(this)});let a=e=>{let t=e.data;switch(t.type){case`ready`:this.readyPromiseResolve&&(this.readyPromiseResolve(),this.readyPromiseResolve=null,this.readyPromiseReject=null);break;case Gh:this.workerProbeManager.handleProbeResult(t);break;case`debugLog`:t.payload?$.debug(t.message,t.payload):$.debug(t.message);break;case`error`:if($.error(`[WorkerProcessor] Worker error:`,t.error),this.readyPromiseReject){let e=this.readyPromiseReject;this.readyPromiseReject=null,this.readyPromiseResolve=null,e(Error(t.error));break}this.onError&&this.onError(Error(t.error));break;case`chunk`:this.chunks.push({data:t.data,position:t.position}),this.totalSize=Math.max(this.totalSize,t.position+t.data.length);break;case`bufferUpdate`:this.onBufferUpdate&&this.onBufferUpdate(t.size,t.formatted);break;case`stateChange`:$.debug(`[WorkerProcessor] State changed:`,t.state),this.isPaused=t.state===`paused`;break;case`fatalError`:if(this.readyPromiseReject){let e=this.readyPromiseReject;this.readyPromiseReject=null,this.readyPromiseResolve=null,e(Error(`${t.message} [${t.code}]`));break}this.pendingFatalError=t;break;case`recordingStats`:this.lastRecordingStats=t,this.handleNoFrameWatchdogStats(t);break;case`encoderAcceleration`:this.lastEncoderAcceleration=t.acceleration,$.info(`[WorkerProcessor] Encoder acceleration resolved`,{acceleration:t.acceleration});break;default:$.warn(`[WorkerProcessor] Unknown response type:`,t)}},o=e=>{if($.error(`[WorkerProcessor] Worker error event:`,{message:e.message,filename:e.filename,lineno:e.lineno,colno:e.colno,error:e.error}),this.readyPromiseReject){let t=this.readyPromiseReject;this.readyPromiseReject=null,this.readyPromiseResolve=null,t(Error(e.message||`Unknown worker error`));return}if(this.onError){let t=e.message;t||=`Unknown worker error`,this.onError(Error(t))}},s=typeof Worker<`u`,c=!1;if(s&&(c=!0),i&&(c=!0),!c)throw $.error(`[WorkerProcessor] Web Workers are not supported`),Error(`Web Workers are not supported`);let l=Xv();this.hasWorkerUrlLease=!0;try{this.worker=Uv({createWorker:t,workerUrl:l,onMessage:a,onError:o,logger:$})}catch(e){throw this.releaseWorkerUrlLease(),e}}prewarm(){this.worker&&this.workerProbeManager.getProbeResult(this.worker).catch(()=>void 0)}getWorkerProbeResult(){let e=this.getWorkerOrThrow();return this.workerProbeManager.getProbeResult(e)}async startProcessing(e,t,n){this.getWorkerOrThrow(),this.ensureProcessingInactive(),this.resetProcessingState(n),this.stopAudioWorklet(),this.audioWorkletManager=new Ev({onChunk:this.handleAudioWorkletChunk.bind(this)});let r=this.resolveRecordingFormat(t),i=Vt(r,{isLinuxPlatform:this.isLinuxPlatformFn()}),a=this.resolveAudioBitrate(t,r),o=await this.resolveAudioCodecWithCache(t,r,i,a),s=await this.resolveVideoCodecWithCache(t,r,i),c=mv(e);$.debug(`[WorkerProcessor] Starting processing`,{isScreenCapture:c,fps:t.fps,codec:s,bitrate:t.bitrate});let l=this.buildWorkerTranscodeConfig(t,o,a,s,r);typeof t.fps==`number`&&t.fps>0&&(this.lastConfigFps=t.fps);let u=e.getVideoTracks(),d=e.getAudioTracks();$.debug(`[WorkerProcessor] Preparing to start processing`,{videoTracksCount:u.length,audioTracksCount:d.length,hasWorker:!!this.worker});let f=this.getVideoInputSelectorDependencies(),p=Nv(u,f),m=Pv(d,f),h=await this.getWorkerProbeResult();p&&($.debug(`[WorkerProcessor] Running video first-frame preflight`),await kv(p,3e3,this.videoFramePreflightDeps),$.debug(`[WorkerProcessor] Video first-frame preflight passed`));let g=Fv(p,h,f),_=Lv(f),v=Iv(p);zv(p,f),Bv(f),Rv(p,m,g.videoStream,f);let y=f.getViewportMetadata(),b;y&&(b={orientationAngle:y.orientationAngle,windowOrientation:y.windowOrientation});let{audioConfig:x,audioStream:S,shouldStartAudioWorklet:C}=await this.prepareAudioPipeline(m,h),ee=this.buildOverlayConfigToSend(),w=Wv({videoTrack:g.videoTrack,videoStream:g.videoStream,audioStream:S,isMobileDevice:_,videoSettings:v,viewportMetadata:b,audioConfig:x,workerConfig:l,overlayConfig:ee}),te=Kv(g.videoStream,S,g.videoTrack);$.debug(`[WorkerProcessor] Posting message to worker`,{transferablesCount:te.length,messageType:w.type}),await this.postStartMessage(w,te,C),this.startNoFrameWatchdog(),C&&this.startAudioHealthMonitoring()}getWorkerOrThrow(){if(!this.worker)throw Error(`Worker not initialized`);return this.worker}ensureProcessingInactive(){if(this.isActive)throw Error(`Processing already active`)}handleAudioWorkletChunk(e){if(!(this.isWorkerActive()&&this.worker))return;this.recordAudioHealthChunk(e);let t={type:`audioChunk`,data:e.data,frames:e.frames,numberOfChannels:e.numberOfChannels,sampleRate:e.sampleRate,timestamp:e.timestamp},n=[];e.data.buffer instanceof ArrayBuffer&&n.push(e.data.buffer),this.worker.postMessage(t,n)}resetProcessingState(e){this.isActive=!0,this.isMuted=!1,this.isPaused=!1,this.chunks=[],this.totalSize=0,this.audioWasExpected=!1,this.audioHealthMonitor.reset(),this.emittedAudioWarnings=new Set,this.audioTrackEndedDuringSession=!1,this.recordingStartTimestampMs=performance.now(),this.pendingFatalError=null,this.lastRecordingStats=null,this.lastEncoderAcceleration=null,this.stopAudioHealthMonitoring(),this.stopNoFrameWatchdog(),e?this.overlayConfig=e:this.overlayConfig=null}recordAudioHealthChunk(e){let t=this.audioHealthMonitor.recordChunk({samples:e.data,timestampMs:performance.now(),isMuted:this.isMuted});this.emitAudioWarning(t.classification,{durationMs:t.consecutiveSilentDurationMs,peak:t.peak,rms:t.rms})}startAudioHealthMonitoring(){this.stopAudioHealthMonitoring(),this.audioHealthIntervalId=window.setInterval(()=>{if(!this.isActive)return;let e=this.audioHealthMonitor.inspect(performance.now(),this.isMuted);this.emitAudioWarning(e.classification,{durationMs:Math.max(e.noChunkDurationMs,e.consecutiveSilentDurationMs),peak:e.peak,rms:e.rms})},1e3)}stopAudioHealthMonitoring(){this.audioHealthIntervalId!==null&&(window.clearInterval(this.audioHealthIntervalId),this.audioHealthIntervalId=null)}startNoFrameWatchdog(){this.stopNoFrameWatchdog(),this.noFrameWatchdogId=window.setTimeout(()=>{this.noFrameWatchdogId=null,this.isWorkerActive()&&this.worker&&this.worker.postMessage({type:`requestStats`})},this.watchdogDelayMs)}stopNoFrameWatchdog(){this.noFrameWatchdogId!==null&&(window.clearTimeout(this.noFrameWatchdogId),this.noFrameWatchdogId=null)}handleNoFrameWatchdogStats(e){if(!this.isActive||e.videoFrameCount>0)return;$.error(`[WorkerProcessor] No video frames received after watchdog delay`,{videoFrameCount:e.videoFrameCount,totalFrameErrors:e.totalFrameErrors,totalFramesProcessed:e.totalFramesProcessed});let t=Error(`No video frames received after ${this.watchdogDelayMs/Qv}s — video stream may be unresponsive [${Dv}]`);this.onError&&this.onError(t),this.cancel()}emitAudioWarning(e,t){if(e===`healthy`){let e=this.emittedAudioWarnings.size>0;this.emittedAudioWarnings.clear(),e&&this.onAudioRecovered&&this.onAudioRecovered();return}if(e===`muted-silence-expected`){(this.emittedAudioWarnings.delete(`audio.no-signal`)||this.emittedAudioWarnings.delete(`audio.no-chunks`))&&this.onAudioRecovered&&this.onAudioRecovered();return}let n=this.createAudioWarning(e,t);n&&this.emitAudioWarningOnce(n)}emitAudioWarningOnce(e){this.onAudioWarning&&(this.emittedAudioWarnings.has(e.code)||(this.emittedAudioWarnings.add(e.code),this.onAudioWarning(e)))}createAudioWarning(e,t){return e===`no-chunks`?{code:`audio.no-chunks`,durationMs:t.durationMs}:e===`silent-while-unmuted`?{code:`audio.no-signal`,durationMs:t.durationMs}:e===`low-signal`?{code:`audio.low-signal`,peak:t.peak,rms:t.rms}:null}assertRuntimeAudioHealth(){let e=performance.now(),t=this.recordingStartTimestampMs??e,n=Math.max(0,e-t),r=this.audioHealthMonitor.getFinalSnapshot(e,this.isMuted),i=Tg({totalChunks:r.totalChunks,nonSilentChunks:r.nonSilentChunks,mutedDurationMs:r.mutedDurationMs,durationMs:n,hadTrackEndedWarning:this.audioTrackEndedDuringSession});if(!i.ok)throw Sg(i.code,{totalChunks:r.totalChunks,nonSilentChunks:r.nonSilentChunks,mutedDurationMs:r.mutedDurationMs,durationMs:n,hadTrackEndedWarning:this.audioTrackEndedDuringSession})}resolveRecordingFormat(e){let t=e.format;return t||=`mp4`,t}resolveAudioBitrate(e,t){return e.audioBitrate===void 0?Gt(t):e.audioBitrate}async resolveAudioCodec(e,t,n,r){return await lh({format:t,overrideCodec:e.audioCodec,policy:n,bitrate:r})}async resolveVideoCodec(e,t,n){return await ch({format:t,overrideCodec:e.codec,policy:n,width:e.width,height:e.height,bitrate:e.bitrate})}async resolveAudioCodecWithCache(e,t,n,r){let i=this.buildAudioCodecCacheKey(e,t,n,r),a=ey.get(i);if(a)return a;let o=await this.resolveAudioCodec(e,t,n,r);return ay(ey,i,o),o}async resolveVideoCodecWithCache(e,t,n){let r=this.buildVideoCodecCacheKey(e,t,n),i=ty.get(r);if(i)return i;let a=await this.resolveVideoCodec(e,t,n);return ay(ty,r,a),a}buildAudioCodecCacheKey(e,t,n,r){let i=ny(e.audioCodec),a=ny(n.preferredAudioCodec),o=ry(n.audioCodecFallbackOrder),s=ny(r);return[iy($v,ny(t)),iy(`audioOverride`,i),iy(`audioBitrate`,s),iy(`policyPreferredAudio`,a),iy(`policyAudioFallback`,o)].join(`|`)}buildVideoCodecCacheKey(e,t,n){let r=ny(e.codec),i=ny(e.width),a=ny(e.height),o=ny(e.bitrate),s=ny(n.preferredVideoCodec),c=ry(n.videoCodecFallbackOrder);return[iy($v,ny(t)),iy(`videoOverride`,r),iy(`width`,i),iy(`height`,a),iy(`videoBitrate`,o),iy(`policyPreferredVideo`,s),iy(`policyVideoFallback`,c)].join(`|`)}buildWorkerTranscodeConfig(e,t,n,r,i){return{width:e.width,height:e.height,fps:e.fps,bitrate:hv(e.bitrate),audioCodec:t,audioBitrate:n,codec:r,keyFrameInterval:5,latencyMode:e.latencyMode,format:i,watermark:e.watermark}}async prepareAudioPipeline(e,t){if(!e)return $.debug(`[WorkerProcessor] Audio pipeline disabled (no track)`),{audioConfig:null,audioStream:null,shouldStartAudioWorklet:!1};let n=await this.prepareAudioConfig(e);if(!n)throw this.createBrowserUnsupportedError();return $.debug(`[WorkerProcessor] Audio pipeline selected`,{path:`audio-worklet-chunks`,sampleRate:n.sampleRate,numberOfChannels:n.numberOfChannels}),{audioConfig:n,audioStream:null,shouldStartAudioWorklet:!0}}buildOverlayConfigToSend(){if(this.overlayConfig)return this.overlayConfig}async postStartMessage(e,t,n){let r=this.getWorkerOrThrow(),i=new Promise((e,t)=>{this.readyPromiseResolve=e,this.readyPromiseReject=t});try{r.postMessage(e,t),$.debug(`[WorkerProcessor] Message posted successfully`),await i,$.debug(`[WorkerProcessor] Worker confirmed ready`),n&&(this.audioWasExpected=!0,await this.startAudioWorkletProcessing())}catch(e){throw $.error(`[WorkerProcessor] Failed to post message:`,e),this.readyPromiseResolve=null,this.readyPromiseReject=null,this.stopNoFrameWatchdog(),this.stopAudioWorklet(),this.worker&&this.isActive&&this.worker.postMessage({type:`stop`}),this.isActive=!1,e}}pause(){this.worker&&this.isActive&&(this.worker.postMessage({type:`pause`}),this.setAudioWorkletPaused(!0))}resume(){this.isWorkerActive()&&this.worker&&(this.worker.postMessage({type:`resume`}),this.setAudioWorkletPaused(!1))}isWorkerActive(){return!!(this.worker&&this.isActive)}toggleMute(){this.isMuted=!this.isMuted,this.onMuteStateChange&&this.onMuteStateChange(this.isMuted),this.isWorkerActive()&&this.worker&&this.worker.postMessage({type:`toggleMute`}),this.setAudioWorkletMuted(this.isMuted)}async switchVideoSource(e){if(!(this.isWorkerActive()&&this.worker))return $.debug(`[WorkerProcessor] Cannot switch source - worker not active`,{hasWorker:!!this.worker,isActive:this.isActive}),Promise.resolve();let t=e.getVideoTracks();if($.debug(`[WorkerProcessor] Switching video source`,{videoTracksCount:t.length}),t.length===0)return $.warn(`[WorkerProcessor] No video tracks in new stream`),Promise.resolve();let n=mv(e),r=this.lastConfigFps;$.debug(`[WorkerProcessor] Source type detected`,{isScreenCapture:n,targetFps:r});let i={type:`updateFps`,fps:r};this.worker.postMessage(i);let a={type:`updateSourceType`,isScreenCapture:n};this.worker.postMessage(a);let o=this.getVideoInputSelectorDependencies(),s=Nv(t,o);if(!s)return $.warn(`[WorkerProcessor] Unable to prepare video track`),Promise.resolve();$.debug(`[WorkerProcessor] New video track details`,{trackId:s.id,trackKind:s.kind,trackReadyState:s.readyState});let c=Fv(s,await this.getWorkerProbeResult(),o),l=Gv(c.videoTrack,c.videoStream),u=Kv(c.videoStream,null,c.videoTrack);try{return $.debug(`[WorkerProcessor] Posting switch source message`),this.worker.postMessage(l,u),$.debug(`[WorkerProcessor] Switch source message posted`),new Promise(e=>{setTimeout(()=>{e()},0)})}catch(e){throw $.error(`[WorkerProcessor] Failed to switch source:`,e),e}}finalize(){if(!this.isWorkerActive())throw Error(`Processing not active`);let e=performance.now();return new Promise((t,n)=>{let r=this.worker;if(!r){n(Error(`Worker not initialized`));return}let i=null,a=()=>{i!==null&&(clearTimeout(i),i=null)},o=()=>{r.removeEventListener(`message`,l)},s=!1,c=()=>s?!1:(s=!0,a(),o(),!0),l=r=>{if(s)return;let i=r.data;if(i.type===`fatalError`){this.pendingFatalError=i;return}if(i.type===`recordingStats`){this.lastRecordingStats=i;return}if(i.type===`stateChange`&&i.state===`stopped`){this.handleFinalizeStopped(c,t,n,e);return}i.type===`error`&&this.handleFinalizeError(c,n,i.error,e)};i=setTimeout(()=>{c()&&($.error(`[WorkerProcessor] Finalize timeout reached`,{elapsedSeconds:(performance.now()-e)/Qv}),this.resetFinalizeRuntimeState(),n(Error(`Finalize timeout`)))},3e4),r.addEventListener(`message`,l),r.postMessage({type:`stop`})})}handleFinalizeStopped(e,t,n,r){let i=this.lastRecordingStats,a=this.lastEncoderAcceleration;if(this.pendingFatalError!==null){let t=this.pendingFatalError;if(!e())return;this.resetFinalizeRuntimeState(),n(Error(this.buildFatalFinalizeErrorMessage(t,i)));return}e()&&(this.resetFinalizeRuntimeState(),Promise.resolve().then(()=>this.createBlobFromChunks(i,a)).then(e=>{t(e)},e=>{this.rejectFinalizeBlobCreationError(n,e,r)}))}handleFinalizeError(e,t,n,r){e()&&(this.resetFinalizeRuntimeState(),$.error(`[WorkerProcessor] Finalize failed`,{elapsedSeconds:(performance.now()-r)/Qv,error:n}),t(Error(n)))}buildFatalFinalizeErrorMessage(e,t){return t===null?`${e.message} [${e.code}]`:`${e.message} [${e.code}] frames=${t.videoFrameCount} errors=${t.totalFrameErrors}`}resetFinalizeRuntimeState(){this.isActive=!1,this.stopAudioHealthMonitoring(),this.stopNoFrameWatchdog(),this.stopAudioWorklet(),this.detachAudioTrackWarnings(),this.pendingFatalError=null,this.lastRecordingStats=null,this.lastEncoderAcceleration=null}createBlobFromChunks(e,t){let n=[...this.chunks].sort((e,t)=>e.position-t.position),r=new ArrayBuffer(this.totalSize),i=new Uint8Array(r);for(let e of n)i.set(e.data,e.position);Rh(r),zh(r),this.audioWasExpected&&(this.assertRuntimeAudioHealth(),Bh(r));let a={blob:new Blob([r],{type:`video/mp4`}),totalSize:this.totalSize};return e!==null&&(a.recordingStats={totalFrameErrors:e.totalFrameErrors,totalFramesProcessed:e.totalFramesProcessed,videoFrameCount:e.videoFrameCount}),t!==null&&(a.encoderAcceleration=t),a}rejectFinalizeBlobCreationError(e,t,n){if($.error(`[WorkerProcessor] Finalize failed while creating blob`,{elapsedSeconds:(performance.now()-n)/Qv,error:i(t)}),t instanceof Error){e(t);return}e(Error(i(t)))}cancel(){return this.worker&&this.isActive&&this.worker.postMessage({type:`stop`}),this.stopAudioHealthMonitoring(),this.stopNoFrameWatchdog(),this.stopAudioWorklet(),this.detachAudioTrackWarnings(),this.isActive=!1,this.isPaused=!1,this.chunks=[],this.totalSize=0,this.audioWasExpected=!1,this.emittedAudioWarnings=new Set,this.audioTrackEndedDuringSession=!1,this.recordingStartTimestampMs=null,this.pendingFatalError=null,this.lastRecordingStats=null,this.lastEncoderAcceleration=null,Promise.resolve()}destroy(){this.worker&&=(this.worker.terminate(),null),this.releaseWorkerUrlLease(),this.stopAudioHealthMonitoring(),this.stopNoFrameWatchdog(),this.stopAudioWorklet(),this.detachAudioTrackWarnings(),this.isActive=!1,this.isPaused=!1,this.chunks=[],this.totalSize=0}cleanup(){this.destroy()}warmupEncoder(e){if(!this.worker)return;let t=e.format||`mp4`,n=Vt(t),r=e.codec||n.preferredVideoCodec,i=e.audioBitrate===void 0?n.audioBitrate:e.audioBitrate,a=Vt(t,{isLinuxPlatform:this.isLinuxPlatformFn()}),o=this.resolveAudioBitrate(e,t);this.resolveAudioCodecWithCache(e,t,a,o).catch(this.handleWarmupCacheError),this.resolveVideoCodecWithCache(e,t,a).catch(this.handleWarmupCacheError);let s={type:`warmup`,config:this.buildWorkerTranscodeConfig(e,n.preferredAudioCodec,i,r,t)};this.worker.postMessage(s)}getBufferSize(){return this.totalSize}getMutedState(){return this.isMuted}updateTabVisibility(e,t){if(!(this.isWorkerActive()&&this.worker)){$.warn(`[WorkerProcessor] Cannot update visibility - worker not active`,{isActive:this.isActive,hasWorker:!!this.worker});return}$.debug(`[WorkerProcessor] Sending visibility update to worker`,{isHidden:e,timestamp:t,timestampSeconds:t/Qv});let n={type:`updateVisibility`,isHidden:e,timestamp:t};this.worker.postMessage(n)}updateSourceType(e){if(!(this.isWorkerActive()&&this.worker)){$.warn(`[WorkerProcessor] Cannot update source type - worker not active`,{isActive:this.isActive,hasWorker:!!this.worker});return}$.debug(`[WorkerProcessor] Sending source type update to worker`,{isScreenCapture:e});let t={type:`updateSourceType`,isScreenCapture:e};this.worker.postMessage(t)}async startAudioWorkletProcessing(){await this.audioWorkletManager.startProcessing()}stopAudioWorklet(){this.audioWorkletManager.stop()}setAudioWorkletMuted(e){this.audioWorkletManager.setMuted(e)}setAudioWorkletPaused(e){this.audioWorkletManager.setPaused(e)}prepareAudioConfig(e){return this.audioWorkletManager.prepareAudioConfig(e)}handleWarmupCacheError(){}createBrowserUnsupportedError(){return Mt({resolutionStage:`feature-preflight`})}getVideoInputSelectorDependencies(){return{stopCurrentVideoTrack:()=>this.stopCurrentVideoTrack(),cloneVideoTrack:e=>this.cloneVideoTrack(e),cloneAudioTrack:e=>this.cloneAudioTrack(e),setCurrentVideoTrack:e=>{this.currentVideoTrack=e},createVideoStreamFromTrack:e=>this.createVideoStreamFromTrackFn(e),createBrowserUnsupportedError:()=>this.createBrowserUnsupportedError(),getViewportMetadata:()=>{if(typeof window>`u`)return null;let e=window.screen,t,n,r,i;return e&&(i=e.orientation),i?.type&&(t=i.type),i&&typeof i.angle==`number`&&(n=i.angle),typeof window.orientation==`number`&&(r=window.orientation),{innerWidth:window.innerWidth,innerHeight:window.innerHeight,orientation:t,orientationAngle:n,windowOrientation:r}},logger:{debug:(e,t)=>$.debug(e,t),warn:(e,t)=>$.warn(e,t)},isMobileDevice:()=>Zt()}}isPausedState(){return this.isPaused}getClonedAudioTrack(){return this.audioTrackClone}getAudioStreamForAnalysis(){return this.audioTrackClone?new MediaStream([this.audioTrackClone]):null}setOnBufferUpdate(e){this.onBufferUpdate=e}setOnError(e){this.onError=e}setOnMuteStateChange(e){this.onMuteStateChange=e}setOnAudioWarning(e){this.onAudioWarning=e}setOnAudioRecovered(e){this.onAudioRecovered=e}cloneVideoTrack(e){if($.debug(`[WorkerProcessor] Original video track:`,{id:e.id,kind:e.kind,readyState:e.readyState,hasClone:typeof e.clone==`function`}),typeof e.clone==`function`)try{let t=e.clone();return $.debug(`[WorkerProcessor] Video track cloned successfully:`,{id:t.id,kind:t.kind,readyState:t.readyState}),t}catch(e){$.error(`[WorkerProcessor] Failed to clone video track:`,e);let t=i(e);throw Error(`Failed to clone video track: ${t}`)}return $.warn(`[WorkerProcessor] Video track clone() not available, using original`),e}attachAudioTrackWarnings(e){this.detachAudioTrackWarnings(),e.addEventListener(`ended`,this.handleAudioTrackEnded),e.addEventListener(`mute`,this.handleAudioTrackMuted),e.addEventListener(`unmute`,this.handleAudioTrackUnmuted),this.audioTrackWarningTarget=e}detachAudioTrackWarnings(){this.audioTrackWarningTarget&&=(this.audioTrackWarningTarget.removeEventListener(`ended`,this.handleAudioTrackEnded),this.audioTrackWarningTarget.removeEventListener(`mute`,this.handleAudioTrackMuted),this.audioTrackWarningTarget.removeEventListener(`unmute`,this.handleAudioTrackUnmuted),null)}cloneAudioTrack(e){if($.debug(`[WorkerProcessor] Original audio track:`,{id:e.id,kind:e.kind,readyState:e.readyState,hasClone:typeof e.clone==`function`}),typeof e.clone==`function`)try{let t=e.clone();return this.audioTrackClone=t,this.attachAudioTrackWarnings(t),$.debug(`[WorkerProcessor] Audio track cloned successfully:`,{id:t.id,kind:t.kind,readyState:t.readyState}),t}catch(e){$.error(`[WorkerProcessor] Failed to clone audio track:`,e);let t=i(e);throw Error(`Failed to clone audio track: ${t}`)}return $.warn(`[WorkerProcessor] Audio track clone() not available, using original`),this.audioTrackClone=e,this.attachAudioTrackWarnings(e),e}stopCurrentVideoTrack(){this.currentVideoTrack&&this.currentVideoTrack.readyState===`live`&&this.currentVideoTrack.stop(),this.currentVideoTrack=null}releaseWorkerUrlLease(){this.hasWorkerUrlLease&&=(Zv(),!1)}},sy=class{constructor(e={}){this.currentVideoStream=null;let t=()=>new oy;e.workerProcessorFactory&&(t=e.workerProcessorFactory);try{this.workerProcessor=t(),$.debug(`[StreamProcessor] Using worker-based processing`)}catch(e){let t=i(e);throw Error(`Failed to initialize worker: ${t}`)}}async startProcessing(e,t,n){this.workerProcessor.setOnBufferUpdate((e,t)=>{$.debug(`[StreamProcessor] Buffer update:`,{size:e,formatted:t}),this.onBufferUpdate&&this.onBufferUpdate(e,t)}),this.workerProcessor.setOnError(e=>{$.error(`[StreamProcessor] Worker error:`,e),this.onError&&this.onError(e)}),this.currentVideoStream=e,await this.workerProcessor.startProcessing(e,t,n)}updateTabVisibility(e,t){this.workerProcessor.updateTabVisibility(e,t)}updateSourceType(e){this.workerProcessor.updateSourceType(e)}pause(){this.workerProcessor.pause()}resume(){this.workerProcessor.resume()}isPausedState(){return this.workerProcessor.isPausedState()}async finalize(){return $.debug(`[StreamProcessor] finalize called`),await this.workerProcessor.finalize()}toggleMute(){this.workerProcessor.toggleMute()}isMutedState(){return this.workerProcessor.getMutedState()}getClonedAudioTrack(){return this.workerProcessor.getClonedAudioTrack()}getAudioStreamForAnalysis(){return this.workerProcessor.getAudioStreamForAnalysis()}async switchVideoSource(e){await this.workerProcessor.switchVideoSource(e),this.currentVideoStream=e,this.onSourceChange&&this.onSourceChange(e)}getCurrentVideoSource(){return this.currentVideoStream}getBufferSize(){return this.workerProcessor.getBufferSize()}setOnMuteStateChange(e){this.workerProcessor.setOnMuteStateChange(e)}setOnSourceChange(e){this.onSourceChange=e}setOnBufferUpdate(e){this.onBufferUpdate=e}setOnError(e){this.onError=e}setOnAudioWarning(e){this.workerProcessor.setOnAudioWarning(e)}setOnAudioRecovered(e){this.workerProcessor.setOnAudioRecovered(e)}warmupEncoder(e){this.workerProcessor.warmupEncoder(e)}prewarm(){this.workerProcessor.prewarm()}async cancel(){await this.workerProcessor.cancel(),this.currentVideoStream=null}destroy(){this.workerProcessor.destroy(),this.currentVideoStream=null}};let cy=1e3,ly=`recording`,uy=`idle`;var dy=class{constructor(e,t){this.recordingState=uy,this.countdownDuration=5e3,this.countdownRemaining=0,this.countdownTimeoutId=null,this.countdownIntervalId=null,this.countdownStartTime=null,this.isPaused=!1,this.maxRecordingTime=null,this.maxTimeTimer=null,this.recordingStartTime=null,this.maxTimeRemaining=null,this.recordingSeconds=0,this.recordingIntervalId=null,this.pauseStartTime=null,this.totalPausedTime=0,this.streamProcessor=null,this.originalCameraStream=null,this.enableTabVisibilityOverlay=!1,this.startupAborted=!1,this.streamManager=e,this.callbacks=t}setCountdownDuration(e){this.countdownDuration=e}setMaxRecordingTime(e){this.maxRecordingTime=e}setTabVisibilityOverlayConfig(e,t){this.enableTabVisibilityOverlay=e,this.tabVisibilityOverlayText=t}getRecordingState(){return this.recordingState}isPausedState(){return this.isPaused}getRecordingSeconds(){return this.recordingSeconds}getStreamProcessor(){return this.streamProcessor}updateSourceType(e){this.recordingState!==ly||!this.streamProcessor||this.streamProcessor.updateSourceType(e)}setOriginalCameraStream(e){this.originalCameraStream=e}getOriginalCameraStream(){return this.originalCameraStream}prewarmStreamProcessor(e){let t=this.getOrCreateStreamProcessor();t.prewarm(),e&&t.warmupEncoder(e)}async startRecording(){try{this.callbacks.onClearUploadStatus(),this.countdownDuration>0?this.startCountdown():await this.doStartRecording()}catch(e){this.handleError(e),this.recordingState=uy,this.cancelCountdown()}}startCountdown(){this.recordingState=`countdown`,this.countdownRemaining=Math.ceil(this.countdownDuration/cy),this.countdownStartTime=Date.now(),this.callbacks.onCountdownUpdate(this.recordingState,this.countdownRemaining),this.countdownIntervalId=window.setInterval(()=>{if(!this.countdownStartTime)return;let e=Date.now()-this.countdownStartTime,t=Math.max(0,Math.ceil((this.countdownDuration-e)/cy)),n=this.countdownRemaining;this.countdownRemaining=t,n!==t&&this.callbacks.onCountdownUpdate(this.recordingState,this.countdownRemaining)},100),this.countdownTimeoutId=window.setTimeout(async()=>{await this.doStartRecording().catch(()=>void 0)},this.countdownDuration)}async doStartRecording(){$.debug(`[RecordingManager] doStartRecording called`),this.cancelCountdown(),this.resetRecordingState(),this.startupAborted=!1;let e=this.streamManager.getStream();if($.debug(`[RecordingManager] Current stream:`,{hasStream:!!e,audioTracks:e?.getAudioTracks().length||0,videoTracks:e?.getVideoTracks().length||0}),!e){$.warn(`[RecordingManager] No stream available`),this.handleError(Error(`No stream available for recording`)),this.recordingState=uy,this.callbacks.onStateChange(this.recordingState);return}this.originalCameraStream=e,$.debug(`[RecordingManager] Ensuring stream processor`);let t=this.getOrCreateStreamProcessor();$.debug(`[RecordingManager] StreamProcessor ready:`,!!t);let n=null,r=await this.callbacks.onGetConfig().then(e=>(n=e,null)).catch(e=>e);if(r){this.handleError(r),this.recordingState=uy,this.callbacks.onStateChange(this.recordingState);return}if(!n){this.handleError(Error(`Failed to get recording config`)),this.recordingState=uy,this.callbacks.onStateChange(this.recordingState);return}this.callbacks.onAudioWarning&&t.setOnAudioWarning(this.callbacks.onAudioWarning),this.callbacks.onAudioRecovered&&t.setOnAudioRecovered(this.callbacks.onAudioRecovered),t.setOnError(e=>{this.handleFatalProcessorError(e)}),$.debug(`[RecordingManager] Starting recording with stream manager`);let i=await this.streamManager.startRecording(t,n,this.enableTabVisibilityOverlay,this.tabVisibilityOverlayText).then(()=>null).catch(e=>($.error(`[RecordingManager] Error starting recording:`,e),e));if(i){this.handleError(i),this.recordingState=uy,this.callbacks.onStateChange(this.recordingState);return}if(this.startupAborted){this.startupAborted=!1;return}$.info(`[RecordingManager] Recording started successfully`),this.recordingState=ly,this.callbacks.onStateChange(this.recordingState),this.startRecordingTimer(),this.recordingStartTime=Date.now(),this.maxRecordingTime&&this.maxRecordingTime>0&&(this.maxTimeRemaining=this.maxRecordingTime,this.startMaxTimeTimer())}async stopRecording(){$.debug(`[RecordingManager] stopRecording called`);try{this.cancelCountdown(),this.clearTimer(this.recordingIntervalId,clearInterval),this.recordingIntervalId=null,this.clearTimer(this.maxTimeTimer,clearTimeout),this.maxTimeTimer=null,this.resetPauseState(),this.callbacks.onStopAudioTracking(),$.debug(`[RecordingManager] Stopping recording in stream manager`);let e=await this.streamManager.stopRecording(),t=e.blob;$.info(`[RecordingManager] Recording stopped, blob size:`,t.size),this.recordingState=uy,this.callbacks.onStateChange(this.recordingState),this.recordingSeconds=0,this.streamProcessor&&=(this.streamProcessor.destroy(),null),this.callbacks.onRecordingComplete(t);let n={};return e.recordingStats!==void 0&&(n.videoFrameCount=e.recordingStats.videoFrameCount,n.totalFrameErrors=e.recordingStats.totalFrameErrors,n.totalFramesProcessed=e.recordingStats.totalFramesProcessed),e.encoderAcceleration!==void 0&&(n.encoderAcceleration=e.encoderAcceleration),{blob:t,telemetryProperties:n}}catch(e){throw this.handleError(e),this.recordingState=uy,this.callbacks.onStateChange(this.recordingState),e}}pauseRecording(){if(!(this.recordingState!==ly||this.isPaused)&&(this.streamManager.pauseRecording(),this.isPaused=!0,this.clearTimer(this.recordingIntervalId,clearInterval),this.recordingIntervalId=null,this.pauseStartTime=Date.now(),this.maxTimeTimer!==null&&this.recordingStartTime!==null&&this.maxRecordingTime!==null)){let e=Date.now()-this.recordingStartTime-this.totalPausedTime;this.maxTimeRemaining=Math.max(0,this.maxRecordingTime-e),this.clearTimer(this.maxTimeTimer,clearTimeout),this.maxTimeTimer=null}}resumeRecording(){this.recordingState!==ly||!this.isPaused||(this.streamManager.resumeRecording(),this.isPaused=!1,this.updatePausedDuration(),this.startRecordingTimer(),this.maxTimeRemaining!==null&&this.maxTimeRemaining>0&&this.startMaxTimeTimer())}cancelCountdown(){this.clearTimer(this.countdownTimeoutId,clearTimeout),this.countdownTimeoutId=null,this.clearTimer(this.countdownIntervalId,clearInterval),this.countdownIntervalId=null,this.recordingState=uy,this.countdownRemaining=0,this.countdownStartTime=null,this.callbacks.onCountdownUpdate(this.recordingState,this.countdownRemaining)}cleanup(){this.cancelCountdown(),this.clearTimer(this.recordingIntervalId,clearInterval),this.recordingIntervalId=null,this.clearTimer(this.maxTimeTimer,clearTimeout),this.maxTimeTimer=null,this.streamProcessor&&=(this.streamProcessor.destroy(),null)}resetRecordingState(){this.isPaused=!1,this.recordingSeconds=0,this.totalPausedTime=0,this.pauseStartTime=null,this.recordingStartTime=null,this.maxTimeRemaining=null}resetPauseState(){this.isPaused=!1,this.pauseStartTime=null,this.totalPausedTime=0}getOrCreateStreamProcessor(){if(this.streamProcessor)return this.streamProcessor;let e=new sy;return this.streamProcessor=e,e}updatePausedDuration(){if(this.pauseStartTime===null)throw Error(`Pause start time not set`);let e=Date.now()-this.pauseStartTime;this.totalPausedTime+=e,this.pauseStartTime=null}startRecordingTimer(){if(this.recordingIntervalId!==null)return;let e=O_(this.recordingSeconds);this.callbacks.onTimerUpdate(e),this.recordingIntervalId=window.setInterval(()=>{this.recordingSeconds+=1;let e=O_(this.recordingSeconds);this.callbacks.onTimerUpdate(e)},1e3)}startMaxTimeTimer(){this.maxTimeRemaining===null||this.maxTimeRemaining<=0||(this.clearTimer(this.maxTimeTimer,clearTimeout),this.maxTimeTimer=window.setTimeout(async()=>{this.recordingState===ly&&!this.isPaused&&await this.stopRecording()},this.maxTimeRemaining))}clearTimer(e,t){e!==null&&t(e)}handleError(e){let t=e instanceof Error?e:Error(i(e));this.callbacks.onError(t)}handleFatalProcessorError(e){this.recordingState===ly&&(this.clearTimer(this.recordingIntervalId,clearInterval),this.recordingIntervalId=null,this.clearTimer(this.maxTimeTimer,clearTimeout),this.maxTimeTimer=null,this.resetPauseState()),!(!this.streamProcessor&&this.recordingState!==ly)&&($.error(`[RecordingManager] Fatal processor error, stopping recording`,e),this.startupAborted=!0,this.streamProcessor&&=(this.streamProcessor.destroy(),null),this.recordingState=uy,this.callbacks.onStateChange(this.recordingState),this.recordingSeconds=0,this.callbacks.onError(e))}},fy=class{constructor(e){this.client=null,this.createTelemetryClient=e.createTelemetryClient}initialize(e,t){typeof e==`string`&&e.length>0&&typeof t==`string`&&t.length>0&&(this.client=this.createTelemetryClient(e,t))}sendEvent(e,t,n){if(!this.client)return;let r={name:e};t&&(r={...r,properties:t}),n&&(r={...r,error:n}),this.client.triggerTelemetryEvent(r)}async executeAction(e){e.requestedEvent&&this.sendEvent(e.requestedEvent,e.properties);let t=null;if(await e.action().catch(e=>{t=e}),t)throw this.sendEvent(e.failedEvent,e.properties,t),t;this.sendEvent(e.succeededEvent,e.properties)}async executeActionWithResult(e){e.requestedEvent&&this.sendEvent(e.requestedEvent,e.properties);let t=null,n=null;if(await e.action().then(e=>{n=e}).catch(e=>{t=e}),t)throw this.sendEvent(e.failedEvent,e.properties,t),t;if(n===null)throw Error(`Telemetry action failed to return result`);let r=this.resolveResultTelemetryProperties(n,e.getPropertiesFromResult),i=this.mergeTelemetryProperties(e.properties,r);return this.sendEvent(e.succeededEvent,i),n}resolveResultTelemetryProperties(e,t){if(t!==void 0)return t(e)}mergeTelemetryProperties(e,t){if(!(e===void 0&&t===void 0))return e===void 0?t:t===void 0?e:{...e,...t}}},py=class{constructor(){this.metadataById=new Map}getMetadata(e){return this.metadataById.get(e)}setMetadata(e,t){let n=new Map(this.metadataById);n.set(e,t),this.metadataById=n}clearMetadata(e){let t=new Map(this.metadataById);t.delete(e),this.metadataById=t}};let my=`[RecorderController]`;var hy=class{constructor(e={}){this.uploadService=null,this.uploadQueueManager=null,this.isInitialized=!1,this.isDemo=!1,this.isDestroyed=!1,this.enableTabVisibilityOverlay=!1,this.recordingWarmupTimeoutId=null,this.audioTelemetryUnsub=null,this.callbacks=e,this.streamManager=new F_,this.configManager=new un,this.storageManager=new Pg,this.deviceManager=new dn(this.streamManager,e.device),this.audioLevelAnalyzer=new o,this.uploadService=new Y_,this.uploadCallbacks=sv(e),this.telemetryManager=new fy({createTelemetryClient:q_}),this.uploadMetadataManager=new py;let t=dv(e,{stopAudioTracking:()=>this.audioLevelAnalyzer.stopTracking(),getConfig:()=>Promise.resolve(this.configManager.getConfigForRecording()),onAudioWarning:e.recording?.onAudioWarning?t=>{this.sendAudioWarningTelemetry(t),e.recording?.onAudioWarning?.(t)}:e=>{this.sendAudioWarningTelemetry(e)},...e.recording?.onAudioRecovered&&{onAudioRecovered:e.recording.onAudioRecovered}});this.recordingManager=new dy(this.streamManager,t);let n=fv(e,{isRecording:()=>this.isRecording(),updateSourceType:e=>{this.recordingManager.updateSourceType(e)},getSelectedCameraDeviceId:()=>this.deviceManager.getSelectedCameraDeviceId(),getSelectedMicDeviceId:()=>this.deviceManager.getSelectedMicDeviceId()});this.sourceSwitchManager=new f_(this.streamManager,n);let r=e.stream;r&&(this.streamManager.on(`streamstart`,({stream:e})=>{$.debug(`${my} streamstart event received, calling callback`),r.onStreamStart&&r.onStreamStart(e)}),this.streamManager.on(`streamstop`,()=>{$.debug(`${my} streamstop event received, calling callback`),r.onStreamStop&&r.onStreamStop()}),this.streamManager.on(`error`,({error:e})=>{$.error(`${my} stream error event received, calling callback`,e),this.telemetryManager.sendEvent(`stream.error`,{sourceType:this.getCurrentSourceType()},e),r.onError&&r.onError(e)})),this.audioTelemetryUnsub=this.streamManager.on(`audiotelemetry`,({event:e})=>{let t=this.getBrowserNameForTelemetry();this.telemetryManager.sendEvent(e.name,{...e.properties,browserName:t,sourceType:this.getCurrentSourceType()},e.error)})}async initialize(e){if(this.isInitialized)return;await this.validateRecorderSupport();let t=!1;typeof e.demo==`boolean`&&(t=e.demo),this.isDemo=t;let n=null;typeof e.apiKey==`string`&&e.apiKey.length>0&&(n=e.apiKey);let r=null;typeof e.backendUrl==`string`&&e.backendUrl.length>0&&(r=e.backendUrl),this.telemetryManager.initialize(n,r),await this.telemetryManager.executeAction({requestedEvent:`sdk.init.started`,succeededEvent:`sdk.init.succeeded`,failedEvent:`sdk.init.failed`,action:async()=>{await this.initializeConfig(n,r),this.applyRecordingConfig(e),await this.initializeStorage(),this.isInitialized=!0,this.scheduleRecordingWarmup()}})}async startStream(){let e=this.getCurrentSourceType();await this.telemetryManager.executeAction({succeededEvent:`preview.start.succeeded`,failedEvent:`preview.start.failed`,action:async()=>{$.debug(`${my} startStream called`),await this.streamManager.startStream(),this.ignorePromiseRejection(this.ensureConfigReady()),this.ignorePromiseRejection(this.configManager.getConfig().then(e=>{this.recordingManager.prewarmStreamProcessor(e)})),this.prewarmSupportCheck(),$.debug(`${my} startStream completed`)},properties:{sourceType:e}})}async stopStream(){await this.streamManager.stopStream()}switchVideoDevice(e){return this.streamManager.switchVideoDevice(e)}switchAudioDevice(e){return this.streamManager.switchAudioDevice(e)}async startRecording(){let e=this.getCurrentSourceType();await this.telemetryManager.executeAction({requestedEvent:`recording.start.requested`,succeededEvent:`recording.start.succeeded`,failedEvent:`recording.start.failed`,action:async()=>{await this.ensureConfigReady(),await this.streamManager.waitForAudio(),await this.recordingManager.startRecording()},properties:{sourceType:e}})}async stopRecording(){let e=this.getCurrentSourceType();try{return(await this.telemetryManager.executeActionWithResult({requestedEvent:`recording.stop.requested`,succeededEvent:`recording.stop.succeeded`,failedEvent:`recording.stop.failed`,action:async()=>{let e=await this.recordingManager.stopRecording();return await this.sourceSwitchManager.handleRecordingStop().catch(()=>{throw Error(`Source switch cleanup failed`)}),this.streamManager.stopStream(),e},properties:{sourceType:e},getPropertiesFromResult:e=>e.telemetryProperties})).blob}catch(e){throw wg(e)&&this.sendAudioMissingTelemetry(e),e}}sendAudioMissingTelemetry(e){let t={code:e.code,sourceType:this.getCurrentSourceType(),browserName:this.getBrowserNameForTelemetry()};e.details&&(t.durationMs=e.details.durationMs,t.totalChunks=e.details.totalChunks,t.nonSilentChunks=e.details.nonSilentChunks,t.mutedDurationMs=e.details.mutedDurationMs,t.silenceRatio=e.details.durationMs>0?e.details.mutedDurationMs/e.details.durationMs:0,t.hadTrackEndedWarning=e.details.hadTrackEndedWarning),this.telemetryManager.sendEvent(`recording.audio-missing`,t)}getTabVisibilityOverlayConfig(){return{enabled:this.enableTabVisibilityOverlay,text:this.tabVisibilityOverlayText}}pauseRecording(){this.recordingManager.pauseRecording()}resumeRecording(){this.recordingManager.resumeRecording()}async switchSource(e){await this.telemetryManager.executeAction({requestedEvent:`source.switch.requested`,succeededEvent:`source.switch.succeeded`,failedEvent:`source.switch.failed`,action:async()=>{await this.sourceSwitchManager.toggleSource()},properties:{sourceType:e}})}setCameraDevice(e){this.deviceManager.setCameraDevice(e)}setMicDevice(e){this.deviceManager.setMicDevice(e)}getAvailableDevices(){return this.deviceManager.getAvailableDevices()}muteAudio(){this.streamManager.muteAudio()}unmuteAudio(){this.streamManager.unmuteAudio()}toggleMute(){this.streamManager.toggleMute()}getIsMuted(){return this.streamManager.isMuted()}startAudioLevelTracking(e,t){if(!t)throw Error(`Audio level callbacks are required`);return this.audioLevelAnalyzer.startTracking(e,t,()=>this.streamManager.isMuted()),Promise.resolve()}stopAudioLevelTracking(){this.audioLevelAnalyzer.stopTracking()}getAudioLevel(){return this.audioLevelAnalyzer.getAudioLevel()}async uploadVideo(e,t,n,r){if(!this.uploadQueueManager)throw Error(`Upload queue manager not initialized`);this.uploadCallbacks.onClearStatus();let i=await Qm(e),a=`recording-${Date.now()}.mp4`,o=this.getCurrentSourceType(),s;Object.keys(r).length>0&&(s=r),this.telemetryManager.sendEvent(`upload.started`,{filename:a,duration:i,sourceType:o});let c=await this.uploadQueueManager.queueUpload({blob:e,apiKey:t,backendUrl:n,filename:a,duration:i,metadata:void 0,userMetadata:s});this.uploadMetadataManager.setMetadata(c,{filename:a,duration:i,sourceType:o})}getStream(){return this.streamManager.getStream()}isConfigReady(){return this.configManager.isConfigReady()}ensureConfigReady(){return this.isDemo||this.configManager.isConfigReady()?Promise.resolve():this.configManager.fetchConfig().then(()=>void 0).catch(()=>void 0)}cleanup(){this.isDestroyed=!0,this.recordingWarmupTimeoutId!==null&&(clearTimeout(this.recordingWarmupTimeoutId),this.recordingWarmupTimeoutId=null),this.audioTelemetryUnsub&&=(this.audioTelemetryUnsub(),null),this.uploadQueueManager?.destroy(),this.storageManager.destroy(),this.recordingManager.cleanup(),this.audioLevelAnalyzer.stopTracking(),this.sourceSwitchManager.cleanup()}getRecordingState(){return this.recordingManager.getRecordingState()}isPaused(){return this.recordingManager.isPausedState()}getCurrentSourceType(){return this.sourceSwitchManager.getCurrentSourceType()}getOriginalCameraStream(){return this.sourceSwitchManager.getOriginalCameraStream()}getStreamManager(){return this.streamManager}getAudioStreamForAnalysis(){return this.streamManager.getAudioStreamForAnalysis()}getDeviceManager(){return this.deviceManager}getConfig(){return this.configManager.getConfig()}getUploadService(){return this.uploadService}isRecording(){return this.streamManager.isRecording()}isActive(){return this.streamManager.isActive()}isAudioReady(){return this.streamManager.isAudioReady()}getAudioStatus(){return this.streamManager.getAudioStatus()}sendAudioWarningTelemetry(e){let t={code:e.code,sourceType:this.getCurrentSourceType(),browserName:this.getBrowserNameForTelemetry()};`durationMs`in e&&(t.durationMs=e.durationMs),`peak`in e&&(t.peak=e.peak),`rms`in e&&(t.rms=e.rms),this.telemetryManager.sendEvent(`audio.warning`,t)}getBrowserNameForTelemetry(){try{return jt()}catch{return`unknown`}}async initializeConfig(e,t){let n=!0;e===null&&(n=!1),t===null&&(n=!1),n&&e!==null&&t!==null&&await this.configManager.initialize(e,t)}applyRecordingConfig(e){e.countdownDuration!==void 0&&this.recordingManager.setCountdownDuration(e.countdownDuration),e.maxRecordingTime!==void 0&&this.recordingManager.setMaxRecordingTime(e.maxRecordingTime),e.enableTabVisibilityOverlay!==void 0&&(this.enableTabVisibilityOverlay=e.enableTabVisibilityOverlay),e.tabVisibilityOverlayText!==void 0&&(this.tabVisibilityOverlayText=e.tabVisibilityOverlayText),this.recordingManager.setTabVisibilityOverlayConfig(this.enableTabVisibilityOverlay,this.tabVisibilityOverlayText)}async initializeStorage(){if(this.isDestroyed)return;let e=lv(this.callbacks);if(await this.storageManager.initialize(e),this.isDestroyed)return;let t=this.storageManager.getWriteProbeResult();if(!t?.ok){let e=t?.reason??`Storage write probe did not complete`;this.telemetryManager.sendEvent(`storage.write.probe.failed`,{reason:e}),uv(this.callbacks)(e);return}let n=this.storageManager.getStorageService();n&&this.uploadService&&(this.uploadQueueManager=new J_(n,this.uploadService),this.uploadQueueManager.setCallbacks({onUploadProgress:(e,t)=>{this.uploadCallbacks.onProgress(t)},onUploadComplete:(e,t)=>{this.uploadCallbacks.onSuccess(t);let n=this.uploadMetadataManager.getMetadata(e);n&&(this.telemetryManager.sendEvent(`upload.succeeded`,{filename:n.filename,duration:n.duration,sourceType:n.sourceType,recordingId:t.id}),this.uploadMetadataManager.clearMetadata(e))},onUploadError:(e,t)=>{this.uploadCallbacks.onError(t);let n=this.uploadMetadataManager.getMetadata(e);n&&(this.telemetryManager.sendEvent(`upload.failed`,{filename:n.filename,duration:n.duration,sourceType:n.sourceType},t),this.uploadMetadataManager.clearMetadata(e))}}))}async validateRecorderSupport(){Pt();let e=await pg({requiresAudio:!1,requiresWatermark:!1});if(!e.isSupported)throw Mt({missingCapabilities:e.missing,resolutionStage:`feature-preflight`})}scheduleRecordingWarmup(){this.recordingWarmupTimeoutId!==null&&(clearTimeout(this.recordingWarmupTimeoutId),this.recordingWarmupTimeoutId=null),!this.isDestroyed&&(this.recordingWarmupTimeoutId=setTimeout(()=>{this.recordingWarmupTimeoutId=null,!this.isDestroyed&&(this.ignorePromiseRejection(this.ensureConfigReady()),this.ignorePromiseRejection(this.configManager.getConfig().then(e=>{this.recordingManager.prewarmStreamProcessor(e)})))},0))}ignorePromiseRejection(e){e.catch(()=>void 0)}prewarmSupportCheck(){this.ignorePromiseRejection(pg({requiresAudio:!0,requiresWatermark:!0}).then(e=>{this.streamManager.setPreResolvedSupportReport(e)}))}};let gy=/<a\s[^>]*href="(?<href>[^"]+)"[^>]*>(?<text>[^<]+)<\/a>/,_y=/\starget=["'](?<target>[^"']+)["']/,vy=/^[a-zA-Z][a-zA-Z\d+\-.]*:/,yy=`{version}`;function by(e,t){return e?e.toLowerCase().includes(t):!1}function xy(e){let t=e.trim();if(!t)return null;let n=t.toLowerCase();return!vy.test(n)||n.startsWith(`http:`)||n.startsWith(`https:`)?t:null}function Sy(e,t,n,r){return e===`browser.unsupported`?r.browserUnsupportedDynamic?Ty(r.browserUnsupportedDynamic,t,n):by(t,`safari`)?r.browserUnsupportedSafari:by(t,`firefox`)?r.browserUnsupportedFirefox:r.browserUnsupported:r.browserUnsupported}function Cy(e,t){return e===`camera.in-use`?t.cameraInUse:e===`camera.not-found`?t.cameraNotFound:e===`camera.permission-denied`?t.cameraPermissionDenied:t.failedToStartCamera}function wy(e,t){return e===`audio.in-use`?t.audioInUse:e===`audio.not-found`?t.audioNotFound:e===`audio.permission-denied`?t.audioPermissionDenied:t.failedToStartAudio}function Ty(e,t,n){let r=`This browser`;t&&t.trim().length>0&&(r=t);let i=e.replace(`{browser}`,r);return n&&n.trim().length>0&&n?(i=i.replace(yy,n),i):(i=i.replace(` ({version})`,``),i=i.replace(yy,``),i)}function Ey(e){let t=gy.exec(e);if(!t?.groups)return{prefix:e,linkText:null,linkHref:null,linkTarget:null,suffix:``};let n=t.index,r=n+t[0].length,i=e.slice(0,n),a=e.slice(r),o=xy(t.groups.href);if(!o)return{prefix:i+t.groups.text+a,linkText:null,linkHref:null,linkTarget:null,suffix:``};let s=_y.exec(t[0])?.groups?.target??null;return{prefix:i,linkText:t.groups.text,linkHref:o,linkTarget:s,suffix:a}}function Dy(){let e=globalThis.navigator&&typeof globalThis.navigator.userAgent==`string`?globalThis.navigator.userAgent:``,t=new Ct(e).getResult(),n=t.device.type,r=n===`mobile`||n===`tablet`;return $.debug(`Mobile detection result`,{userAgent:e,deviceType:n,isMobile:r,device:t.device,os:t.os,browser:t.browser}),r}let Oy=new Set([`recording.audio-no-chunks`,`recording.audio-silent`,`recording.audio-track-ended`,`recording.no-audio-track`,`recording.no-audio-frames`,`recording.audio-zero-channels`,`recording.audio-invalid-sample-rate`]);function ky(e){return e.startsWith(`recording.`)?Oy.has(e):!1}let Ay=Object.freeze({visible:!1,variant:`generic`,canRetry:!1,isCameraError:!1,isAudioError:!1,isBrowserUnsupported:!1,isPermissionDenied:!1});function jy(e){let{errorCode:t,hasAudioFailed:n,error:r}=e;if(t===`browser.unsupported`)return{visible:!0,variant:`browser`,canRetry:!1,isCameraError:!1,isAudioError:!1,isBrowserUnsupported:!0,isPermissionDenied:!1};if(t&&ky(t))return{visible:!0,variant:`audio`,canRetry:!0,isCameraError:!1,isAudioError:!0,isBrowserUnsupported:!1,isPermissionDenied:!1};if(t?.startsWith(`camera.`)){let e=t===`camera.permission-denied`;return{visible:!0,variant:`camera`,canRetry:!e,isCameraError:!0,isAudioError:!1,isBrowserUnsupported:!1,isPermissionDenied:e}}if(n)return{visible:!0,variant:`audio`,canRetry:!0,isCameraError:!1,isAudioError:!0,isBrowserUnsupported:!1,isPermissionDenied:!1};if(t?.startsWith(`audio.`)){let e=t===`audio.permission-denied`;return{visible:!0,variant:`audio`,canRetry:!e,isCameraError:!1,isAudioError:!0,isBrowserUnsupported:!1,isPermissionDenied:e}}return r?{visible:!0,variant:`generic`,canRetry:!0,isCameraError:!1,isAudioError:!1,isBrowserUnsupported:!1,isPermissionDenied:!1}:Ay}function My(){let e=At(),t=null;e.name.length>0&&(t=e.name);let n=null;return e.version.length>0&&(n=e.version),{browserName:t,browserVersion:n}}function Ny(e){let t=t=>{if(!(`code`in t))return;let n=t;if(n.code!==`browser.unsupported`){(n.code?.startsWith(`camera.`)||n.code?.startsWith(`audio.`)||n.code?.startsWith(`recording.`))&&e.updateState({errorCode:n.code,canRetry:!0,browserName:null,browserVersion:null});return}let r=My(),i=r.browserName;n.browserName&&n.browserName.length>0&&(i=n.browserName);let a=r.browserVersion;n.browserVersion&&n.browserVersion.length>0&&(a=n.browserVersion),e.updateState({errorCode:`browser.unsupported`,canRetry:!1,browserName:i,browserVersion:a})};return{recording:{onStateChange:t=>{e.updateState({recordingState:t}),t===`idle`&&(e.isProcessingBlob=!1)},onCountdownUpdate:(t,n)=>{e.updateState({recordingState:t,countdown:n})},onTimerUpdate:t=>{e.updateState({timer:t})},onError:n=>{t(n),e.updateState({error:i(n)})},onRecordingComplete:t=>{e.updateState({countdown:null}),e.processRecordingBlob(t).catch(t=>{e.updateState({error:i(t)})})},onClearUploadStatus:()=>{e.updateState({uploadProgress:null})},onAudioWarning:t=>{e.updateState({audioWarning:t}),e.dispatchEvent(new CustomEvent(`vidtreo:audio-warning`,{detail:t}))},onAudioRecovered:()=>{e.updateState({audioWarning:null}),e.dispatchEvent(new CustomEvent(`vidtreo:audio-recovered`))},onStopAudioTracking:()=>void 0,onGetConfig:()=>{if(!e.controller)throw Error(`Controller not initialized`);return e.isDemo?Promise.resolve(Xt(`mp4`)):e.controller.getConfig()}},sourceSwitch:{onSourceChange:e=>Promise.resolve(),onPreviewUpdate:t=>(e.updateState({stream:t}),Promise.resolve()),onError:n=>{t(n),e.updateState({error:i(n)})},onTransitionStart:t=>{e.updateState({transitionMessage:t})},onTransitionEnd:()=>{e.updateState({transitionMessage:null})}},storage:{onUploadProgress:()=>void 0,onUploadComplete:()=>void 0,onUploadError:()=>void 0},onStorageCleanupError:t=>{e.updateState({error:t})}}}function Py(e,t){let n=(e=>e===``||e===`default`?null:e)(t);return e.setCameraDevice(n),e.switchVideoDevice(n)}function Fy(e,t){let n=(e=>e===``||e===`default`?null:e)(t);return e.setMicDevice(n),e.switchAudioDevice(n)}async function Iy(e,t=`camera`){e.isActive()||await e.startStream(),t!==e.getCurrentSourceType()&&await e.switchSource(t),await e.startRecording()}async function Ly(e,t,n,r){return await e.stopRecording()}function Ry(e){e.pauseRecording()}function zy(e){e.resumeRecording()}async function By(e,t){await e.switchSource(t)}let Vy=`camera`,Hy=`screen`,Uy=`recording`,Wy=`browser.unsupported`,Gy=[.8,1.2,.9];function Ky(e,t){let{uploadProgress:n,uploadingLabel:r}=e,{overlay:i,fill:a,text:o}=t;if(!i)return;if(n===null){i.style.display=`none`;return}i.style.display=`block`;let s=Math.round(n*100);a&&(a.style.width=`${s}%`),o&&(o.textContent=`${r} ${s}%`)}function qy(e,t){let{transitionMessage:n}=e,{overlay:r,message:i}=t;if(r){if(!n){r.classList.remove(`vidtreo-active`);return}r.classList.add(`vidtreo-active`),i&&(i.textContent=n)}}let Jy=`none`,Yy=`flex`,Xy=`inline-flex`,Zy=`checking`,Qy=`blocked`,$y=`ready`,eb=`vidtreo-active`,tb=`vidtreo-permission-flow--fading`,nb=`vidtreo-permission-flow-action--requesting`;function rb(e){return{container:e.querySelector(`#permissionFlow`),spinner:e.querySelector(`#permissionFlowSpinner`),title:e.querySelector(`#permissionFlowTitle`),subtitle:e.querySelector(`#permissionFlowSubtitle`),actionButton:e.querySelector(`#btnAllowPermission`),buttonIcon:e.querySelector(`#permissionFlowBtnIcon`),buttonSpinner:e.querySelector(`#permissionFlowBtnSpinner`),buttonText:e.querySelector(`#permissionFlowBtnText`),recovery:e.querySelector(`#permissionFlowRecovery`),recoveryTitle:e.querySelector(`#permissionFlowRecoveryTitle`),recoveryText:e.querySelector(`#permissionFlowRecoveryText`),retryButton:e.querySelector(`#btnRetryPermission`),recoveryGuideUrl:e.querySelector(`#recoveryGuideUrl`),recoveryGuidePopoverUrl:e.querySelector(`#recoveryGuidePopoverUrl`)}}function ib(e){return e.permissions.camera===`granted`?`microphone`:`camera`}function ab(e,t){return t.cameraTitle}function ob(e,t){return t.cameraLabel}function sb(e,t){return t.allowCamera}function cb(e,t,n){let r=e.step,i=!1;(r===Zy||r===`awaiting-user`||r===Qy||r===$y)&&(i=!0);let a=r===$y,o=r===Qy,s=r===Zy,c=ib(e),l=ab(c,t),u=ob(c,t),d=sb(c,t),f=t.recoveryInstructions;return e.recoveryData?.resetInstructions&&(f=e.recoveryData.resetInstructions),{isVisible:i,isFadingOut:n,isSpinnerOnly:a,isBlocked:o,isRequesting:s,titleText:l,subtitleText:u,actionLabel:d,requestingText:t.statusRequesting,recoveryTitleText:t.recoveryTitle,recoveryInstructionsText:f}}function lb(e,t,n){if(e){if(t){e.style.display=n;return}e.style.display=Jy}}function ub(e,t){if(t.isVisible)e.classList.add(eb);else return e.classList.remove(eb),e.classList.remove(tb),!1;return t.isFadingOut?e.classList.add(tb):e.classList.remove(tb),!0}function db(e,t,n){lb(e.actionButton,n,Xy),e.actionButton&&(t.isRequesting?(e.actionButton.classList.add(nb),e.actionButton.disabled=!0):(e.actionButton.classList.remove(nb),e.actionButton.disabled=!1)),lb(e.buttonIcon,n&&!t.isRequesting,Xy),lb(e.buttonSpinner,n&&t.isRequesting,Xy),e.buttonText&&(t.isRequesting?e.buttonText.textContent=t.requestingText:e.buttonText.textContent=t.actionLabel)}function fb(){if(globalThis.window===void 0)return`vidtreo.com`;let e=globalThis.window.location.hostname||`vidtreo.com`;return e.length>20?`${e.slice(0,20)}...`:e}function pb(e,t){if(lb(e.recovery,t.isBlocked,Yy),e.recoveryTitle&&(e.recoveryTitle.textContent=t.recoveryTitleText),lb(e.recoveryText,!1,Jy),lb(e.retryButton,!1,Jy),t.isBlocked){let t=fb();e.recoveryGuideUrl&&(e.recoveryGuideUrl.textContent=t),e.recoveryGuidePopoverUrl&&(e.recoveryGuidePopoverUrl.textContent=t)}}function mb(e,t){t&&(e.actionButton&&t.onAllow&&(e.actionButton.onclick=t.onAllow),e.retryButton&&t.onRetry&&(e.retryButton.onclick=t.onRetry))}function hb(e,t,n){let{container:r}=t;if(!r||!ub(r,e))return;let i=!e.isSpinnerOnly;lb(t.spinner,e.isSpinnerOnly,Xy),lb(t.title,i&&!e.isBlocked,Yy),lb(t.subtitle,i&&!e.isBlocked,Yy),t.title&&(t.title.textContent=e.titleText),t.subtitle&&(t.subtitle.textContent=e.subtitleText),db(t,e,i&&!e.isBlocked),pb(t,e),mb(t,n)}function gb(e,t){e.textContent=``;let n=document.createTextNode(t.prefix);if(e.append(n),t.linkText&&t.linkHref){let n=document.createElement(`a`),r=t.linkTarget;n.href=t.linkHref,r&&(n.target=r),r===`_blank`&&(n.rel=`noopener noreferrer`),n.textContent=t.linkText,e.append(n)}let r=document.createTextNode(t.suffix);e.append(r)}function _b(e){let{stream:t,transitionMessage:n,isVideoLoaded:r}=e;return{showPreviewSkeleton:!!t&&!r&&!n,showVideoPreview:!!t}}function vb(e,t){let{previewSkeleton:n,videoPreview:r}=t;n&&(e.showPreviewSkeleton?n.style.display=`block`:n.style.display=`none`),r&&(e.showVideoPreview?r.style.display=`block`:r.style.display=`none`)}function yb(e,t,n){let{videoPreview:r}=t,{onVideoLoaded:a,onError:o,startAudioAnalysis:s,stopAudioAnalysis:c}=n;if(r){if(!e){r.srcObject=null,c();return}r.srcObject=e,r.onloadeddata=()=>{a()},r.play().catch(e=>o(i(e))),s(e)}}function bb(e){return{startCameraArea:e.querySelector(`#startCameraArea`),startCameraButton:e.querySelector(`#startCameraButton`),cameraIcon:e.querySelector(`#startCameraArea .vidtreo-camera-icon`),cameraText:e.querySelector(`#startCameraArea .vidtreo-camera-text`),cameraHint:e.querySelector(`#startCameraArea .vidtreo-camera-hint`),previewSkeleton:e.querySelector(`#previewSkeleton`),previewSkeletonText:e.querySelector(`#previewSkeleton .vidtreo-skeleton-text`),videoPreview:e.querySelector(`#videoPreview`),countdownOverlay:e.querySelector(`#countdownOverlay`),countdownNumber:e.querySelector(`#countdownNumber`),recordingTimerRow:e.querySelector(`#recordingTimerRow`),recordingTimer:e.querySelector(`#recordingTimer`),recIndicatorTop:e.querySelector(`#recIndicatorTop`),audioLevelBars:e.querySelector(`#audioLevelBars`)}}function xb(e,t,n,r,i,a){if(e.stream)return{shouldShow:!1,iconClassName:``,browserErrorContent:null,textContent:null,hintText:null,retryButtonLabel:null};let o=jy({errorCode:e.errorCode,hasAudioFailed:!1,error:null}),s=o.isCameraError||o.isAudioError,c=!(o.isBrowserUnsupported||s),l=o.isBrowserUnsupported||s?`ph-fill ph-warning-circle`:`ph-fill ph-camera`,u=null,d=null;o.isBrowserUnsupported&&(u=Ey(n)),o.isAudioError&&(d=i),o.isCameraError&&(d=r),c&&(d=t.initializingCamera);let f=c?t.grantPermissions:null,p=s&&!o.isPermissionDenied?a:null;return{shouldShow:!0,iconClassName:l,browserErrorContent:u,textContent:d,hintText:f,retryButtonLabel:p}}function Sb(e,t){let n=!1;return e&&(n=!0),{shouldShow:n,text:t.switchingDevice}}function Cb(e,t,n){let r=!1;return e===`countdown`&&t!==null&&(r=!0),{shouldShow:r,countdown:t,text:n.recordingStartsIn}}function wb(e,t){return{shouldShow:e,text:t.rec}}function Tb(e,t){return{shouldShow:e,timer:t}}function Eb(e){return{shouldShow:e}}function Db(e,t){let{state:n,isVideoLoaded:r,isRecording:i,translations:a}=e;Ob(xb(n,a,Sy(n.errorCode,n.browserName,n.browserVersion,{browserUnsupported:a.browserUnsupported,browserUnsupportedDynamic:a.browserUnsupportedDynamic,browserUnsupportedSafari:a.browserUnsupportedSafari,browserUnsupportedFirefox:a.browserUnsupportedFirefox}),Cy(n.errorCode??``,{cameraInUse:a.cameraInUse,cameraNotFound:a.cameraNotFound,cameraPermissionDenied:a.cameraPermissionDenied,failedToStartCamera:a.failedToStartCamera}),wy(n.errorCode??``,{audioInUse:a.audioInUse,audioNotFound:a.audioNotFound,audioPermissionDenied:a.audioPermissionDenied,failedToStartAudio:a.failedToStartAudio}),a.retryCamera),t,e.onRetryCamera),kb(Sb(n.transitionMessage,a),t),vb(_b({stream:n.stream,transitionMessage:n.transitionMessage,isVideoLoaded:r}),{previewSkeleton:t.previewSkeleton,videoPreview:t.videoPreview}),Ab(Cb(n.recordingState,n.countdown,a),t),jb(wb(i,a),t),Mb(Tb(i,n.timer),t),Nb(Eb(i),t)}function Ob(e,t,n){let{startCameraArea:r,startCameraButton:i,cameraIcon:a,cameraText:o,cameraHint:s}=t;if(r){if(!e.shouldShow){r.style.display=`none`;return}r.style.display=`block`,a&&(a.innerHTML=`<i class="${e.iconClassName}" style="font-size: 48px;"></i>`),o&&(e.browserErrorContent&&gb(o,e.browserErrorContent),e.textContent&&(o.textContent=e.textContent)),s&&(e.hintText?(s.textContent=e.hintText,s.style.display=`block`):s.style.display=`none`),i&&(e.retryButtonLabel?(i.textContent=e.retryButtonLabel,i.hidden=!1,i.className=`vidtreo-error-retry`,i.onclick=e=>{e.preventDefault(),e.stopPropagation(),n&&n()}):(i.hidden=!0,i.onclick=null))}}function kb(e,t){let{previewSkeleton:n,previewSkeletonText:r}=t;n&&(e.shouldShow?n.style.display=`block`:n.style.display=`none`,r&&(r.textContent=e.text))}function Ab(e,t){let{countdownOverlay:n,countdownNumber:r}=t;n&&(e.shouldShow?n.classList.add(`vidtreo-active`):n.classList.remove(`vidtreo-active`),r&&e.countdown!==null&&(r.textContent=e.countdown.toString()))}function jb(e,t){let{recIndicatorTop:n}=t;n&&(e.shouldShow?n.style.display=`block`:n.style.display=`none`)}function Mb(e,t){let{recordingTimerRow:n,recordingTimer:r}=t;n&&(e.shouldShow?n.style.display=`flex`:n.style.display=`none`,r&&(r.textContent=e.timer))}function Nb(e,t){let{audioLevelBars:n}=t;n&&(e.shouldShow?n.style.display=`flex`:n.style.display=`none`)}let Pb=`inline-flex`;function Fb(e){let{stream:t,buttonVisibility:n,currentSourceType:r,isMuted:i,isAudioReady:a,isStopLocked:o,stopLockedTooltip:s,recordingState:c,buttonTranslations:l}=e,u=!!t,d=c===`idle`&&u,f=d&&!a,p=f?l.microphoneConnecting:``,m=!1;(n.showPauseButton||n.showResumeButton)&&(m=!0);let h=l.pause,g=`ph-fill ph-pause`;n.showResumeButton&&(h=l.resume,g=`ph-fill ph-play`);let _=l.mute,v=`ph-fill ph-microphone`;i&&(_=l.unmute,v=`ph-fill ph-microphone-slash`);let y=`ph-fill ph-monitor`;r!==Vy&&(y=`ph-fill ph-camera`);let b=!1;return n.showDownloadButton&&(b=!0),{showRecordingControls:u,showSettingsButton:n.showSettingsButton,showRecordButton:d,isRecordDisabled:f,recordTooltip:p,showMuteButton:n.showMuteButton,showPauseButton:m,showStopButton:n.showStopButton,showSwitchSourceButton:n.showSwitchSourceButton,showDownloadButton:b,pauseTitle:h,pauseIconClassName:g,muteTitle:_,muteIconClassName:v,switchSourceIconClassName:y,isMuted:i,isStopLocked:o,stopLockedTooltip:s,settingsTitle:l.settings,switchSourceTitle:l.switchSource,downloadTitle:l.download,buttonTranslations:l}}function Ib(e){return{recordingControls:e.querySelector(`#recordingControls`),settingsButton:e.querySelector(`#btnSettings`),recordButton:e.querySelector(`#btnRecord`),muteButton:e.querySelector(`#btnMute`),muteIcon:e.querySelector(`#iconMute`),pauseButton:e.querySelector(`#btnPause`),pauseIcon:e.querySelector(`#iconPause`),stopButton:e.querySelector(`#btnStop`),switchSourceButton:e.querySelector(`#btnSwitchSource`),switchSourceIcon:e.querySelector(`#iconSwitchSource`),downloadButton:e.querySelector(`#btnDownload`)}}function Lb(e,t){let{recordingControls:n,settingsButton:r,recordButton:i,muteButton:a,muteIcon:o,pauseButton:s,pauseIcon:c,stopButton:l,switchSourceButton:u,switchSourceIcon:d,downloadButton:f}=t;zb(n,e),Bb(r,e),Vb(i,e),Hb(a,e),Ub(o,e),Wb(s,e),Gb(c,e),Kb(l,e),qb(u,e),Jb(d,e),Yb(f,e)}function Rb(e,t,n){e&&(t?e.style.display=n:e.style.display=`none`)}function zb(e,t){Rb(e,t.showRecordingControls,`block`)}function Bb(e,t){Rb(e,t.showSettingsButton,Pb),e&&(e.title=t.settingsTitle)}function Vb(e,t){if(Rb(e,t.showRecordButton,Pb),!e)return;e.disabled=t.isRecordDisabled,e.classList.toggle(`vidtreo-record-button-disabled`,t.isRecordDisabled),e.title=t.recordTooltip,e.setAttribute(`aria-disabled`,String(t.isRecordDisabled));let n=e.querySelector(`i`),r=e.querySelector(`span`);t.isRecordDisabled?(n&&(n.className=`ph-fill ph-microphone vidtreo-mic-connecting-indicator`,n.style.fontSize=`18px`),r&&(r.textContent=t.recordTooltip)):(n&&(n.className=`ph-fill ph-circle`,n.style.fontSize=`24px`),r&&(r.textContent=t.buttonTranslations?.record??`Record`))}function Hb(e,t){Rb(e,t.showMuteButton,Pb),e&&(e.title=t.muteTitle,e.classList.toggle(`vidtreo-muted`,t.isMuted))}function Ub(e,t){e&&(e.className=t.muteIconClassName)}function Wb(e,t){Rb(e,t.showPauseButton,Pb),e&&(e.title=t.pauseTitle)}function Gb(e,t){e&&(e.className=t.pauseIconClassName)}function Kb(e,t){if(Rb(e,t.showStopButton,Pb),e){if(e.classList.toggle(`vidtreo-stop-button-locked`,t.isStopLocked),e.setAttribute(`aria-disabled`,String(t.isStopLocked)),t.isStopLocked){e.title=t.stopLockedTooltip;return}e.title=``}}function qb(e,t){Rb(e,t.showSwitchSourceButton,Pb),e&&(e.title=t.switchSourceTitle)}function Jb(e,t){e&&(e.className=t.switchSourceIconClassName)}function Yb(e,t){Rb(e,t.showDownloadButton,Pb),e&&(e.title=t.downloadTitle)}function Xb(e){let{stream:t,showSettings:n}=e,r=!1;return t&&n&&(r=!0),{shouldShow:r}}function Zb(e,t,n){if(t){if(!e.shouldShow){t.classList.remove(`vidtreo-active`);return}t.classList.add(`vidtreo-active`),n()}}function Qb(e){return e.toggleMute(),e.getIsMuted()}function $b(e){if(!e)return;let t=URL.createObjectURL(e),n=document.createElement(`a`);n.href=t,n.download=`recording-${Date.now()}.mp4`,document.body.appendChild(n),n.click(),document.body.removeChild(n),URL.revokeObjectURL(t)}let ex={en:{initializingCamera:`Initializing camera...`,grantPermissions:`Grant camera and microphone permissions when prompted`,browserUnsupported:`This browser is not supported`,browserUnsupportedDynamic:`{browser} ({version}) is not supported, please use <a href="https://www.google.com/chrome/" target="_blank">Chrome</a>`,browserUnsupportedSafari:`Safari is not supported, please use <a href="https://www.google.com/chrome/" target="_blank">Chrome</a>`,browserUnsupportedFirefox:`Firefox is not supported, please use <a href="https://www.google.com/chrome/" target="_blank">Chrome</a>`,retryCamera:`Retry Camera`,cameraInUse:`Your camera is being used by another application. Close other apps using the camera (Zoom, Teams, Discord) and try again.`,cameraNotFound:`No camera detected. Connect a camera or check your device settings.`,cameraPermissionDenied:`Camera access was denied. Allow camera access in your browser settings and try again.`,audioInUse:`Your microphone is being used by another application. Close other apps using the microphone (Zoom, Teams, Discord) and try again.`,audioNotFound:`No microphone detected. Connect a microphone or check your device settings.`,audioPermissionDenied:`Microphone access was denied. Allow microphone access in your browser settings and try again.`,failedToStartAudio:`Failed to start microphone`,audioErrorTitle:`Microphone unavailable`,audioErrorMessage:`We couldn't access your microphone. It may be in use by another app like Zoom, Teams, or Discord. Please close it and try again.`,audioErrorRetry:`Try again`,audioMissingTitle:`Recording has no audio`,audioMissingMessage:`We couldn't capture audio in this recording. Your microphone may have been disconnected or blocked by the browser. Check your microphone and record again.`,audioSilentTitle:`Recording is silent`,audioSilentMessage:`We didn't detect any sound during the recording. Make sure your microphone is working and not muted by your operating system, then record again.`,audioProcessingErrorTitle:`Audio processing error`,audioProcessingErrorMessage:`We couldn't process the audio in this recording. Please record again.`,audioMissingRetry:`Record again`,audioWarningNoSignalTitle:`No microphone signal`,audioWarningNoSignalMessage:`We're not detecting any sound. Check that your microphone is active.`,audioWarningLowSignalTitle:`Audio is very quiet`,audioWarningLowSignalMessage:`Move closer to the microphone or turn up the input volume.`,audioWarningTrackEndedTitle:`Microphone disconnected`,audioWarningTrackEndedMessage:`The microphone was disconnected. Reconnect it before continuing.`,audioWarningNoChunksTitle:`No microphone input`,audioWarningNoChunksMessage:`We're not receiving audio from the microphone. Check browser permissions.`,audioWarningTrackMutedTitle:`Microphone muted by browser`,audioWarningTrackMutedMessage:`The browser muted your microphone. Check site settings.`,audioWarningDismiss:`Dismiss`,cameraErrorTitle:`Camera unavailable`,cameraErrorMessage:`We couldn't access your camera. It may be in use by another app or permissions may be denied.`,browserErrorTitle:`Browser not supported`,browserErrorMessage:`This browser is not supported. Please use Chrome for the best experience.`,genericErrorTitle:`Something went wrong`,genericErrorMessage:`An unexpected error occurred. Please try again.`,errorRetry:`Try again`,switchingDevice:`Switching device...`,recordingStartsIn:`Recording starts in...`,switchingSource:`Switching source...`,rec:`REC`,settings:`Settings`,record:`Record`,stop:`Stop`,pause:`Pause`,resume:`Resume`,mute:`Mute`,unmute:`Unmute`,switchSource:`Switch Source`,camera:`Camera`,microphone:`Microphone`,microphoneConnecting:`Connecting microphone...`,minimumRecordingTimeNotReached:`You have not met the minimum recording time yet`,processVideo:`Process Video`,processing:`Processing...`,finishing:`Finishing...`,uploading:`Uploading...`,switchingCamera:`Switching camera...`,switchingMicrophone:`Switching microphone...`,failedToStartCamera:`Failed to start camera`,userInAnotherTab:`User in another tab`,download:`Download`,nativeCameraSelectVideo:`Select Video from Gallery`,nativeCameraRecordVideo:`Record with Camera`,errorTitle:`Configuration Error`,errorGeneric:`An error occurred while loading the configuration`,mobileOpenCamera:`Open Camera`,mobileOpenCameraTitle:`Record a Video`,mobileOpenCameraDescription:`Tap the button below to start recording`,mobileCloseCamera:`Close`,mobilePermissionDenied:`Camera Access Denied`,mobilePermissionDeniedDescription:`Please allow camera access in your browser settings to record video.`,permissionFlowTitle:`Set Up Your Camera`,permissionFlowCameraTitle:`Camera & Microphone`,permissionFlowMicrophoneTitle:`Camera & Microphone`,permissionFlowCameraLabel:`We need access to your camera and microphone to start recording`,permissionFlowMicrophoneLabel:`We need access to your camera and microphone to start recording`,permissionFlowStatusPending:`Pending`,permissionFlowStatusGranted:`Ready`,permissionFlowStatusDenied:`Blocked`,permissionFlowStatusRequesting:`Click "Allow" in the browser popup above`,permissionFlowAllowCamera:`Allow Access`,permissionFlowAllowMicrophone:`Allow Access`,permissionFlowRetry:`Try Again`,permissionFlowRecoveryTitle:`Allow access to continue`,permissionFlowRecoveryInstructions:`Open your browser settings and allow camera and microphone access, then try again.`,permissionFlowConnecting:`Setting up...`},es:{initializingCamera:`Inicializando cámara...`,grantPermissions:`Otorga permisos de cámara y micrófono cuando se solicite`,browserUnsupported:`Este navegador no es compatible`,browserUnsupportedDynamic:`{browser} ({version}) no es compatible, por favor usa <a href="https://www.google.com/chrome/" target="_blank">Chrome</a>`,browserUnsupportedSafari:`Safari no es compatible, usa <a href="https://www.google.com/chrome/" target="_blank">Chrome</a>`,browserUnsupportedFirefox:`Firefox no es compatible, usa <a href="https://www.google.com/chrome/" target="_blank">Chrome</a>`,retryCamera:`Reintentar Cámara`,cameraInUse:`Tu cámara está siendo usada por otra aplicación. Cierra otras apps que usen la cámara (Zoom, Teams, Discord) e intenta de nuevo.`,cameraNotFound:`No se detectó ninguna cámara. Conecta una cámara o revisa la configuración de tu dispositivo.`,cameraPermissionDenied:`Se denegó el acceso a la cámara. Permite el acceso a la cámara en la configuración de tu navegador e intenta de nuevo.`,audioInUse:`Tu micrófono está siendo usado por otra aplicación. Cierra otras apps que usen el micrófono (Zoom, Teams, Discord) e intenta de nuevo.`,audioNotFound:`No se detectó ningún micrófono. Conecta un micrófono o revisa la configuración de tu dispositivo.`,audioPermissionDenied:`Se denegó el acceso al micrófono. Permite el acceso al micrófono en la configuración de tu navegador e intenta de nuevo.`,failedToStartAudio:`Error al iniciar el micrófono`,audioErrorTitle:`Micrófono no disponible`,audioErrorMessage:`No pudimos acceder a tu micrófono. Puede estar en uso por otra app como Zoom, Teams o Discord. Ciérrala e inténtalo de nuevo.`,audioErrorRetry:`Intentar de nuevo`,audioMissingTitle:`La grabación no tiene audio`,audioMissingMessage:`No pudimos capturar audio en esta grabación. Es posible que el micrófono se haya desconectado o que el navegador lo haya bloqueado. Verifica tu micrófono y vuelve a grabar.`,audioSilentTitle:`La grabación quedó en silencio`,audioSilentMessage:`No detectamos sonido durante la grabación. Verifica que tu micrófono esté funcionando y no esté silenciado por el sistema, luego vuelve a grabar.`,audioProcessingErrorTitle:`Error al procesar el audio`,audioProcessingErrorMessage:`No pudimos procesar el audio de esta grabación. Por favor vuelve a grabar.`,audioMissingRetry:`Grabar de nuevo`,audioWarningNoSignalTitle:`Sin señal del micrófono`,audioWarningNoSignalMessage:`No estamos detectando sonido. Verifica que tu micrófono esté activo.`,audioWarningLowSignalTitle:`Audio muy bajo`,audioWarningLowSignalMessage:`Acércate al micrófono o sube el volumen de entrada.`,audioWarningTrackEndedTitle:`Micrófono desconectado`,audioWarningTrackEndedMessage:`Se desconectó el micrófono. Reconéctalo antes de continuar.`,audioWarningNoChunksTitle:`Sin entrada del micrófono`,audioWarningNoChunksMessage:`No estamos recibiendo audio del micrófono. Revisa los permisos del navegador.`,audioWarningTrackMutedTitle:`Micrófono silenciado por el navegador`,audioWarningTrackMutedMessage:`El navegador silenció tu micrófono. Revisa la configuración del sitio.`,audioWarningDismiss:`Cerrar`,cameraErrorTitle:`Cámara no disponible`,cameraErrorMessage:`No pudimos acceder a tu cámara. Puede estar en uso por otra app o los permisos pueden estar denegados.`,browserErrorTitle:`Navegador no compatible`,browserErrorMessage:`Este navegador no es compatible. Por favor usa Chrome para la mejor experiencia.`,genericErrorTitle:`Algo salió mal`,genericErrorMessage:`Ocurrió un error inesperado. Por favor intenta de nuevo.`,errorRetry:`Intentar de nuevo`,switchingDevice:`Cambiando dispositivo...`,recordingStartsIn:`La grabación comienza en...`,switchingSource:`Cambiando fuente...`,rec:`GRAB`,settings:`Configuración`,record:`Grabar`,stop:`Detener`,pause:`Pausar`,resume:`Reanudar`,mute:`Silenciar`,unmute:`Activar sonido`,switchSource:`Cambiar Fuente`,camera:`Cámara`,microphone:`Micrófono`,microphoneConnecting:`Conectando micrófono...`,minimumRecordingTimeNotReached:`Aun no cumples el tiempo minimo de grabacion`,processVideo:`Procesar Video`,processing:`Procesando...`,finishing:`Finalizando...`,uploading:`Subiendo...`,switchingCamera:`Cambiando cámara...`,switchingMicrophone:`Cambiando micrófono...`,failedToStartCamera:`Error al iniciar la cámara`,userInAnotherTab:`Usuario en otra pestaña`,download:`Descargar`,nativeCameraSelectVideo:`Seleccionar Video de la Galería`,nativeCameraRecordVideo:`Grabar con Cámara`,errorTitle:`Error de Configuración`,errorGeneric:`Ocurrió un error al cargar la configuración`,mobileOpenCamera:`Abrir Cámara`,mobileOpenCameraTitle:`Grabar un Video`,mobileOpenCameraDescription:`Toca el botón para comenzar a grabar`,mobileCloseCamera:`Cerrar`,mobilePermissionDenied:`Acceso a Cámara Denegado`,mobilePermissionDeniedDescription:`Por favor permite el acceso a la cámara en la configuración de tu navegador para grabar video.`,permissionFlowTitle:`Configurar tu Cámara`,permissionFlowCameraTitle:`Cámara y Micrófono`,permissionFlowMicrophoneTitle:`Cámara y Micrófono`,permissionFlowCameraLabel:`Necesitamos acceso a tu cámara y micrófono para comenzar a grabar`,permissionFlowMicrophoneLabel:`Necesitamos acceso a tu cámara y micrófono para comenzar a grabar`,permissionFlowStatusPending:`Pendiente`,permissionFlowStatusGranted:`Listo`,permissionFlowStatusDenied:`Bloqueado`,permissionFlowStatusRequesting:`Haz clic en "Permitir" en el aviso del navegador`,permissionFlowAllowCamera:`Permitir Acceso`,permissionFlowAllowMicrophone:`Permitir Acceso`,permissionFlowRetry:`Reintentar`,permissionFlowRecoveryTitle:`Permite el acceso para continuar`,permissionFlowRecoveryInstructions:`Abre la configuración de tu navegador y permite el acceso a la cámara y micrófono, luego intenta de nuevo.`,permissionFlowConnecting:`Preparando...`}};var tx=class{constructor(e=`en`,t={}){this.lang=e,this.customTexts=t}setLang(e){this.lang=e}setCustomTexts(e){this.customTexts=e}t(e){return this.customTexts[e]?this.customTexts[e]:(ex[this.lang]||ex.en)[e]}getAll(){return{...ex[this.lang]||ex.en,...this.customTexts}}};let nx=new Map;function rx(e){e.style.position=`fixed`,e.style.top=`0`,e.style.left=`0`,e.style.width=`100vw`,e.style.height=`100vh`,e.style.height=`100dvh`,e.style.zIndex=`9999`,e.style.pointerEvents=`none`}function ix(e){e.style.pointerEvents=`auto`}function ax(e){e.style.pointerEvents=`none`}var ox=class{constructor(e=`vidtreo-portal-root`){this.portalContainer=null,this.contentWrapper=null,this.isRegistered=!1,this.containerId=e,this.instanceId=`portal-${Date.now()}-${Math.random().toString(36).slice(2,9)}`}get container(){return this.contentWrapper}get isActive(){return this.contentWrapper!==null&&this.portalContainer!==null}open(){let e=document.getElementById(this.containerId);return e||(e=document.createElement(`div`),e.id=this.containerId,rx(e),document.body.appendChild(e)),this.portalContainer=e,this.contentWrapper=document.createElement(`div`),this.contentWrapper.setAttribute(`data-portal-instance`,this.instanceId),this.contentWrapper.style.width=`100%`,this.contentWrapper.style.height=`100%`,this.portalContainer.appendChild(this.contentWrapper),this.registerInstance(),ix(e),this.contentWrapper}render(e){this.contentWrapper&&(this.contentWrapper.innerHTML=e)}querySelector(e){return this.contentWrapper?this.contentWrapper.querySelector(e):null}close(){this.contentWrapper&&=(this.contentWrapper.innerHTML=``,this.contentWrapper.remove(),null),this.unregisterInstance(),this.updatePortalContainerState()}destroy(){this.close(),this.portalContainer=null}registerInstance(){if(this.isRegistered)return;let e=nx.get(this.containerId);e||(e=new Set,nx.set(this.containerId,e)),e.add(this),this.isRegistered=!0}unregisterInstance(){if(!this.isRegistered)return;let e=nx.get(this.containerId);e&&(e.delete(this),e.size===0&&nx.delete(this.containerId)),this.isRegistered=!1}updatePortalContainerState(){if(!this.portalContainer)return;let e=nx.get(this.containerId);e&&e.size>0?ix(this.portalContainer):(ax(this.portalContainer),this.portalContainer.childNodes.length===0&&this.portalContainer.remove())}},sx=class{constructor(e){this.state={isModalOpen:!1,permissionRequested:!1,prevUploading:!1},this.escapeHandler=null,this.initCheckInterval=null,this.callbacks=e,this.portalManager=new ox}get canCloseModal(){let{recordingState:e}=this.callbacks.getState();return!(e===`recording`||e===`countdown`)}get isModalOpen(){return this.state.isModalOpen}get portal(){return this.portalManager}openModal(){this.state.isModalOpen=!0,this.state.permissionRequested=!1,this.portalManager.open(),document.body.style.overflow=`hidden`,this.setupEscapeHandler(),this.callbacks.renderMobile(),this.requestCameraPreview()}closeModal(){this.canCloseModal&&(this.callbacks.stopPreview(),this.state.isModalOpen=!1,this.state.permissionRequested=!1,document.body.style.overflow=``,this.removeEscapeHandler(),this.portalManager.close(),this.callbacks.renderMobile())}checkUploadCompletion(e){let t=this.state.prevUploading,n=e!==null;this.state.prevUploading=n,t&&!n&&this.state.isModalOpen&&this.closeModal()}requestCameraPreview(){if(this.state.permissionRequested)return;let e=()=>{this.callbacks.isInitialized()?(this.state.permissionRequested=!0,this.callbacks.startPreview().catch(()=>{})):this.initCheckInterval=setTimeout(e,100)};e()}setupEscapeHandler(){this.escapeHandler=e=>{e.key===`Escape`&&this.canCloseModal&&this.closeModal()},document.addEventListener(`keydown`,this.escapeHandler)}removeEscapeHandler(){this.escapeHandler&&=(document.removeEventListener(`keydown`,this.escapeHandler),null)}destroy(){this.removeEscapeHandler(),this.portalManager.destroy(),document.body.style.overflow=``,this.initCheckInterval&&=(clearTimeout(this.initCheckInterval),null)}},cx=class{constructor(e,t){this.state={file:null,transcodingProgress:null,uploadProgress:null,isTranscoding:!1,isConfigLoading:!0,error:null,transcodedBlob:null},this.handler=null,this.config=e,this.callbacks=t;let n=e.backendUrl||`https://core.vidtreo.com`,r=null;e.apiKey&&!e.demo&&(r=ln.getInstance({apiKey:e.apiKey,backendUrl:n}));let i=new Y_;this.handler=new hh({apiKey:e.apiKey,backendUrl:n,maxRecordingTime:e.maxRecordingTime,maxFileSize:e.maxFileSize,userMetadata:e.userMetadata},r,i),e.apiKey&&!e.demo?(this.updateState({isConfigLoading:!0}),this.handler.preloadConfig().then(()=>this.updateState({isConfigLoading:!1})).catch(()=>{this.updateState({isConfigLoading:!1,error:`Failed to load settings`})})):this.updateState({isConfigLoading:!1})}updateState(e){this.state={...this.state,...e},this.callbacks.onStateChange()}getState(){return this.state}async handleFileSelect(e){if(this.updateState({error:null}),!this.handler)throw Error(`Handler not initialized`);try{let t=await this.handler.handleFileSelection(e);return this.updateState({file:t}),t}catch(e){let t=i(e),n=e instanceof Error?e:Error(t);throw this.updateState({error:t}),this.callbacks.onError?.(n),n}}async processAndUpload(e){let t=e||this.state.file;if(!(t&&this.handler))return;let n=this.config.demo;try{if(this.updateState({isTranscoding:!0,transcodingProgress:0,error:null}),n){let e=await ph(t.file,Yt,e=>{this.updateState({transcodingProgress:e}),this.callbacks.onTranscodingProgress?.(e)});this.updateState({transcodedBlob:e.blob,isTranscoding:!1,transcodingProgress:null})}else{let e=await this.handler.processAndUpload(e=>{this.updateState({transcodingProgress:e}),this.callbacks.onTranscodingProgress?.(e)},e=>{this.updateState({uploadProgress:e}),this.callbacks.onUploadProgress?.(e)});this.updateState({file:null,transcodingProgress:null,uploadProgress:null,isTranscoding:!1}),this.callbacks.onUploadComplete?.({recordingId:e.recordingId||``,uploadUrl:e.uploadUrl||``})}}catch(e){let t=i(e),r=e instanceof Error?e:Error(t);this.updateState({error:t,isTranscoding:!1,transcodingProgress:null,uploadProgress:null,transcodedBlob:null}),this.callbacks.onError?.(r),n||this.callbacks.onUploadError?.(r)}}downloadVideo(){if(!this.state.transcodedBlob)return;let e=URL.createObjectURL(this.state.transcodedBlob),t=document.createElement(`a`);t.href=e,t.download=`recording-${Date.now()}.mp4`,document.body.appendChild(t),t.click(),document.body.removeChild(t),URL.revokeObjectURL(e)}reset(){this.updateState({file:null,transcodingProgress:null,uploadProgress:null,error:null,isTranscoding:!1,transcodedBlob:null})}destroy(){this.handler&&this.handler.cancel(),this.handler=null}};function lx(e){return{preview:{initializingCamera:e.initializingCamera,grantPermissions:e.grantPermissions,browserUnsupported:e.browserUnsupported,browserUnsupportedDynamic:e.browserUnsupportedDynamic,browserUnsupportedSafari:e.browserUnsupportedSafari,browserUnsupportedFirefox:e.browserUnsupportedFirefox,retryCamera:e.retryCamera,cameraInUse:e.cameraInUse,cameraNotFound:e.cameraNotFound,cameraPermissionDenied:e.cameraPermissionDenied,failedToStartCamera:e.failedToStartCamera,audioInUse:e.audioInUse,audioNotFound:e.audioNotFound,audioPermissionDenied:e.audioPermissionDenied,failedToStartAudio:e.failedToStartAudio,switchingDevice:e.switchingDevice,recordingStartsIn:e.recordingStartsIn,rec:e.rec},buttons:{settings:e.settings,record:e.record,stop:e.stop,minimumRecordingTimeNotReached:e.minimumRecordingTimeNotReached,pause:e.pause,resume:e.resume,mute:e.mute,unmute:e.unmute,switchSource:e.switchSource,download:e.download,microphoneConnecting:e.microphoneConnecting},settings:{settings:e.settings,camera:e.camera,microphone:e.microphone}}}var ux=class{constructor(e){if(this.proxyEndpoint=e.proxyEndpoint,this.proxyEndpoint)throw Error(`Proxy mode not yet implemented`);this.service=new Y_}uploadVideo(e,t){if(this.proxyEndpoint)throw Error(`Proxy mode not yet implemented`);return this.service.uploadVideo(e,t)}},dx=`:root{--vidtreo-background:0 0% 100%;--vidtreo-foreground:0 0% 3.9%;--vidtreo-card:0 0% 100%;--vidtreo-card-foreground:0 0% 3.9%;--vidtreo-primary:0 0% 9%;--vidtreo-primary-foreground:0 0% 98%;--vidtreo-secondary:0 0% 96.1%;--vidtreo-secondary-foreground:0 0% 9%;--vidtreo-muted:0 0% 96.1%;--vidtreo-muted-foreground:0 0% 45.1%;--vidtreo-accent:0 0% 96.1%;--vidtreo-accent-foreground:0 0% 9%;--vidtreo-destructive:0 84.2% 60.2%;--vidtreo-destructive-foreground:0 0% 98%;--vidtreo-border:0 0% 89.8%;--vidtreo-input:0 0% 89.8%;--vidtreo-ring:0 0% 3.9%;--vidtreo-radius:.5rem;--vidtreo-preview-bg:0 0% 0%;--vidtreo-z-modal-overlay:9999;--vidtreo-z-settings-panel:200;--vidtreo-z-error-overlay:100;--vidtreo-z-countdown-overlay:20;--vidtreo-z-progress-overlay:20;--vidtreo-z-controls:10}.vidtreo-preview-container{aspect-ratio:9/16;background:hsl(var(--vidtreo-preview-bg));contain:layout style;will-change:auto;backface-visibility:hidden;isolation:isolate;border:none;border-radius:0;justify-content:center;align-items:center;width:100%;display:flex;position:relative;overflow:visible;transform:translateZ(0)}.vidtreo-preview-container:before{display:none}@media (width>=768px){.vidtreo-preview-container{aspect-ratio:16/9}}.vidtreo-camera-area{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;contain:layout style paint;backface-visibility:hidden;isolation:isolate;will-change:auto;width:100%;height:100%;font-family:-apple-system,BlinkMacSystemFont,SF Pro Display,SF Pro Text,system-ui,sans-serif;display:none;position:relative;transform:translateZ(0)}.vidtreo-source-transition-overlay{z-index:var(--vidtreo-z-error-overlay);backdrop-filter:blur(4px);contain:layout style paint;backface-visibility:hidden;will-change:opacity;background:#000000b3;border-radius:0;flex-direction:column;justify-content:center;align-items:center;transition:opacity .3s;display:none;position:absolute;inset:0;transform:translateZ(0)}.vidtreo-source-transition-overlay.vidtreo-active{animation:.2s vidtreo-fadeIn;display:flex}@keyframes vidtreo-fadeIn{0%{opacity:0}to{opacity:1}}.vidtreo-transition-spinner{border:4px solid #ffffff4d;border-top-color:#667eea;border-radius:50%;width:40px;height:40px;margin-bottom:12px;animation:.8s linear infinite vidtreo-spin}@keyframes vidtreo-spin{to{transform:rotate(360deg)}}.vidtreo-transition-message{color:#fff;text-align:center;font-size:14px;font-weight:500}.vidtreo-camera-area.vidtreo-active{display:block}.vidtreo-preview-skeleton{z-index:var(--vidtreo-z-controls);contain:layout style paint;backface-visibility:hidden;will-change:auto;background:#000;border-radius:0;flex-direction:column;justify-content:center;align-items:center;gap:1rem;display:flex;position:absolute;inset:0;transform:translateZ(0)}.vidtreo-skeleton-spinner{border:4px solid #ffffff4d;border-top-color:#fff;border-radius:50%;width:40px;height:40px;animation:.8s linear infinite vidtreo-spin}.vidtreo-skeleton-text{color:#fff;font-size:.875rem;font-weight:500}.vidtreo-video-preview{object-fit:cover;will-change:auto;backface-visibility:hidden;background:#000;border-radius:0;width:100%;height:100%;transition:opacity .3s,transform .3s;display:block;position:absolute;inset:0;transform:translateZ(0)}.vidtreo-video-preview-skeleton{z-index:2;contain:layout style paint;backface-visibility:hidden;will-change:auto;background:#000;border-radius:0;width:100%;height:100%;position:absolute;inset:0;overflow:hidden;transform:translateZ(0)}.vidtreo-skeleton-shimmer{background:linear-gradient(90deg, hsl(var(--vidtreo-muted)) 0%, hsl(var(--vidtreo-muted) / .5) 50%, hsl(var(--vidtreo-muted)) 100%);background-size:200% 100%;animation:1.5s ease-in-out infinite vidtreo-shimmer;position:absolute;inset:0}@keyframes vidtreo-shimmer{0%{background-position:-200% 0}to{background-position:200% 0}}.vidtreo-video-preview-skeleton.vidtreo-hidden{opacity:0;pointer-events:none;transition:opacity .3s}.vidtreo-video-preview.vidtreo-screen-share{object-fit:cover}.vidtreo-video-preview.vidtreo-transitioning{opacity:.5;transform:scale(.98)}.vidtreo-countdown-overlay{z-index:var(--vidtreo-z-countdown-overlay);contain:layout style paint;backface-visibility:hidden;will-change:auto;background:#000000f2;border-radius:0;justify-content:center;align-items:center;display:none;position:absolute;inset:0;transform:translateZ(0)}.vidtreo-countdown-overlay.vidtreo-active{display:flex}.vidtreo-countdown-content{flex-direction:column;align-items:center;gap:1rem;display:flex}.vidtreo-countdown-number{color:#fff;font-size:9rem;font-weight:700;animation:.3s vidtreo-zoomIn}@keyframes vidtreo-zoomIn{0%{opacity:0;transform:scale(.5)}to{opacity:1;transform:scale(1)}}.vidtreo-countdown-text{color:#fff;margin-top:1rem;font-size:.875rem;font-weight:500}.vidtreo-settings-panel{z-index:var(--vidtreo-z-settings-panel);contain:layout style paint;backface-visibility:hidden;background:#0006;border:none;border-radius:.75rem;flex-direction:column;width:90%;margin-left:-47%;padding:.625rem;display:none;overflow:hidden;transform:translateZ(0);position:absolute!important;bottom:4rem!important;left:50%!important}.vidtreo-settings-panel.vidtreo-active{display:flex}.vidtreo-settings-content{will-change:transform;backface-visibility:hidden;flex-direction:column;width:100%;display:flex;transform:translateZ(0)}.vidtreo-settings-content.vidtreo-slide-right{animation:.3s vidtreo-slideRight}.vidtreo-settings-content.vidtreo-slide-left{animation:.3s vidtreo-slideLeft}.vidtreo-settings-content.vidtreo-slide-none{will-change:auto;animation:none}@keyframes vidtreo-slideIn{0%{opacity:0;transform:translateY(1rem)}to{opacity:1;transform:translateY(0)}}@keyframes vidtreo-slideRight{0%{opacity:0;transform:translate(-100%)}to{opacity:1;transform:translate(0)}}@keyframes vidtreo-slideLeft{0%{opacity:0;transform:translate(100%)}to{opacity:1;transform:translate(0)}}.vidtreo-settings-header{color:#fff;cursor:pointer;text-align:left;background:0 0;border:none;align-items:center;gap:.75rem;width:100%;margin-bottom:1rem;padding:0;display:flex}.vidtreo-settings-back-icon{color:#fff;flex-shrink:0}.vidtreo-settings-title{color:#fff;margin:0;font-size:.875rem;font-weight:600}.vidtreo-device-options-container{flex-direction:column;gap:.375rem;display:flex}.vidtreo-device-option-nav{cursor:pointer;color:#fff;background:0 0;border:none;border-radius:.5rem;align-items:center;gap:1rem;width:100%;padding:.5rem .75rem;transition:background-color .2s;display:flex}.vidtreo-device-option-nav:hover{background:#fff3}.vidtreo-device-option-nav-content{flex-shrink:0;align-items:center;gap:.75rem;display:flex}.vidtreo-device-option-nav-label{color:#fff;font-size:.875rem;font-weight:500}.vidtreo-device-option-nav-value{flex:1;justify-content:flex-end;align-items:center;gap:.5rem;min-width:0;display:flex}.vidtreo-device-option-nav-value-text{color:#fffc;text-overflow:ellipsis;white-space:nowrap;text-align:right;flex:1;font-size:.875rem;overflow:hidden}.vidtreo-device-option-nav-chevron{color:#fff;font-size:1.25rem;line-height:1}.vidtreo-device-list{flex-direction:column;gap:0;max-height:200px;display:flex;overflow-y:auto}.vidtreo-device-list::-webkit-scrollbar{width:4px}.vidtreo-device-list::-webkit-scrollbar-track{background:0 0}.vidtreo-device-list::-webkit-scrollbar-thumb{background:#fff3;border-radius:2px}.vidtreo-device-list::-webkit-scrollbar-thumb:hover{background:#ffffff4d}.vidtreo-device-option{cursor:pointer;color:#fff;text-align:left;background:0 0;border:none;border-radius:.5rem;align-items:center;gap:.75rem;width:100%;padding:.5rem .75rem;transition:background-color .2s;display:flex}.vidtreo-device-option:hover{background:#fff3}.vidtreo-device-option-check-container{flex-shrink:0;justify-content:center;align-items:center;width:20px;height:20px;display:flex}.vidtreo-device-checkmark-placeholder{flex-shrink:0;width:20px;height:20px}.vidtreo-device-checkmark{color:#fff;flex-shrink:0}.vidtreo-device-option-label{color:#fff;flex:1;font-size:.875rem}.vidtreo-device-empty{color:#fff9;text-align:center;padding:1rem 0;font-size:.875rem}.vidtreo-audio-level-bars{height:1rem;z-index:var(--vidtreo-z-controls);contain:layout style paint;will-change:auto;backface-visibility:hidden;align-items:center;gap:.125rem;transform:translateZ(0);display:flex!important;position:absolute!important;bottom:.75rem!important;right:.75rem!important}@media (width>=768px){.vidtreo-audio-level-bars{height:1.25rem}}.vidtreo-audio-level-bar{background:#ffffff80;border-radius:9999px;align-self:flex-end;width:.125rem;transition:all .1s}.vidtreo-recording-controls{z-index:var(--vidtreo-z-controls);contain:layout style;will-change:auto;backface-visibility:hidden;position:absolute!important;bottom:12px!important;left:50%!important;transform:translate(-50%)translateZ(0)!important}.vidtreo-recording-controls-row{will-change:auto;justify-content:center;align-items:center;gap:.5rem;display:flex;transform:translateZ(0)}.vidtreo-recording-timer-row{justify-content:space-between;align-items:center;gap:.5rem;display:flex}.vidtreo-recording-timer-badge{z-index:var(--vidtreo-z-controls);contain:layout style paint;will-change:auto;backface-visibility:hidden;background:#0000004d;border:none;border-radius:9999px;align-items:center;gap:.375rem;padding:.25rem .5rem;transform:translateZ(0);box-shadow:0 1px 3px #0000001a,0 1px 2px -1px #0000001a;display:flex!important;position:absolute!important;top:.75rem!important;right:.75rem!important}.vidtreo-recording-dot-small{background:hsl(var(--vidtreo-destructive));border-radius:50%;width:.375rem;height:.375rem;animation:1.5s ease-in-out infinite vidtreo-pulse}.vidtreo-recording-timer-text{color:#fff;font-family:monospace;font-size:.75rem;font-weight:500}.vidtreo-control-buttons-row{will-change:auto;justify-content:center;align-items:center;gap:.375rem;height:auto;min-height:2rem;display:flex;transform:translateZ(0)}@media (width>=768px){.vidtreo-control-buttons-row{min-height:2.25rem}}.vidtreo-control-button{cursor:pointer;color:#fff;box-sizing:border-box;vertical-align:top;contain:layout style paint;will-change:auto;backface-visibility:hidden;background:#0000004d;border:none;border-radius:9999px;flex-shrink:0;justify-content:center;align-items:center;width:2rem;height:2rem;min-height:2rem;max-height:2rem;margin:0;padding:.25rem;transition:background-color .2s;display:inline-flex;position:relative;transform:translateZ(0)}.vidtreo-control-button:before{content:"";z-index:0;border-radius:9999px;transition:background-color .2s;position:absolute;inset:.25rem}.vidtreo-control-button svg{color:inherit;z-index:1;flex-shrink:0;position:relative;width:22px!important;height:22px!important}@media (width>=768px){.vidtreo-control-button svg{width:24px!important;height:24px!important}.vidtreo-control-button{width:2.25rem;height:2.25rem;min-height:2.25rem;max-height:2.25rem}}.vidtreo-control-button:hover:not(:disabled):before{background:#fff3}.vidtreo-control-button:disabled{opacity:.5;cursor:not-allowed}.vidtreo-control-button.vidtreo-muted:before{background:#0000004d}.vidtreo-control-button.vidtreo-muted:hover:not(:disabled):before{background:#fff3}.vidtreo-record-button{background:hsl(var(--vidtreo-destructive));height:2rem;min-height:2rem;max-height:2rem;color:hsl(var(--vidtreo-destructive-foreground));box-sizing:border-box;vertical-align:top;cursor:pointer;border:none;border-radius:9999px;flex-shrink:0;justify-content:center;align-items:center;gap:.375rem;width:auto;margin:0;padding:0 .75rem;font-size:.75rem;font-weight:500;line-height:1;transition:background-color .2s,filter .2s;display:inline-flex}@media (width>=768px){.vidtreo-record-button{height:2.25rem;min-height:2.25rem;max-height:2.25rem;font-size:.875rem}}.vidtreo-record-button:hover:not(:disabled){filter:brightness(.85)}.vidtreo-record-button.vidtreo-stop-button-locked{opacity:.5;cursor:not-allowed;filter:none}.vidtreo-record-button.vidtreo-stop-button-locked:hover{filter:none}#startButton.vidtreo-record-button{animation:2s ease-in-out infinite vidtreo-record-glow-pulse}@keyframes vidtreo-record-glow-pulse{0%,to{box-shadow:0 0 8px 2px #ef444466,0 0 16px 4px #ef444433}50%{box-shadow:0 0 16px 4px #ef444499,0 0 32px 8px #ef44444d}}#startButton.vidtreo-record-button:hover:not(:disabled){animation-play-state:paused;box-shadow:0 0 20px 6px #ef4444b3,0 0 40px 10px #ef444459}.vidtreo-rec-indicator-top{contain:layout style paint;will-change:auto;backface-visibility:hidden;background:#0000004d;border:none;border-radius:9999px;align-items:center;gap:.375rem;padding:.25rem .5rem;transform:translateZ(0);box-shadow:0 1px 3px #0000001a,0 1px 2px -1px #0000001a;display:flex!important;position:absolute!important;top:.75rem!important;left:.75rem!important}.vidtreo-rec-indicator-top span{color:#fff;font-size:.75rem;font-weight:500}.vidtreo-start-camera-area{text-align:center;cursor:pointer;z-index:1;contain:layout style paint;backface-visibility:hidden;will-change:auto;background:#000;border:none;border-radius:0;flex-direction:column;justify-content:center;align-items:center;padding:40px;transition:all .3s;display:flex;position:absolute;inset:0;transform:translateZ(0)}.vidtreo-start-camera-area:hover:not(.vidtreo-loading){background:#000}.vidtreo-start-camera-area.vidtreo-loading{cursor:wait;opacity:.7}.vidtreo-start-camera-area.vidtreo-loading .vidtreo-camera-text{color:#fff;opacity:.7}.vidtreo-camera-icon{color:#fff;justify-content:center;margin-bottom:16px;font-size:48px;display:flex}.vidtreo-camera-text{color:#fff;margin-bottom:8px;font-weight:600}.vidtreo-camera-text a{color:#3b82f6;text-decoration:underline}.vidtreo-camera-text a:hover{color:#2563eb}.vidtreo-camera-hint{color:#fff;opacity:.8;font-size:12px}@keyframes vidtreo-pulse{0%,to{opacity:1}50%{opacity:.3}}.vidtreo-progress{margin-top:20px;display:none}.vidtreo-progress.vidtreo-active{display:block}.vidtreo-progress-bar{background:#e0e0e0;border-radius:4px;width:100%;height:8px;margin-bottom:8px;overflow:hidden}.vidtreo-progress-fill{background:linear-gradient(90deg,#667eea 0%,#764ba2 100%);width:0%;height:100%;transition:width .3s}.vidtreo-progress-text{text-align:center;color:#fff;font-size:14px}.vidtreo-error{color:#fff;text-align:center;z-index:var(--vidtreo-z-error-overlay);word-wrap:break-word;background:#dc2626;border:none;border-radius:.5rem;max-width:90%;padding:1rem 1.25rem;font-size:.875rem;font-weight:500;display:none;position:absolute;top:.75rem;left:50%;transform:translate(-50%);box-shadow:0 4px 6px -1px #0000001a,0 2px 4px -2px #0000001a}.vidtreo-error.vidtreo-active{animation:.3s ease-out vidtreo-error-fade-in-slide-down;display:block}@keyframes vidtreo-error-fade-in-slide-down{0%{opacity:0;transform:translate(-50%)translateY(-1rem)}to{opacity:1;transform:translate(-50%)translateY(0)}}.vidtreo-upload-progress{margin-top:20px;display:none}.vidtreo-upload-progress.vidtreo-active{display:block}.vidtreo-preview-container .vidtreo-upload-progress{margin-top:0}.vidtreo-upload-status{border-radius:8px;margin-top:20px;padding:16px;display:none}.vidtreo-upload-status.vidtreo-active{display:block}.vidtreo-upload-status.vidtreo-success{color:#22543d;background:#f0f9ff;border:2px solid #48bb78}.vidtreo-upload-status.vidtreo-error{color:#c33;background:#fee;border:2px solid #fcc}.vidtreo-upload-status-text{font-size:14px;font-weight:500}.vidtreo-preview-error{aspect-ratio:9/16;background:hsl(var(--vidtreo-preview-bg));contain:strict;will-change:auto;backface-visibility:hidden;isolation:isolate;border:none;border-radius:0;justify-content:center;align-items:center;width:100%;display:flex;position:relative;overflow:hidden;transform:translateZ(0)}@media (width>=768px){.vidtreo-preview-error{aspect-ratio:16/9}}.vidtreo-error-content{text-align:center;color:#fff;flex-direction:column;justify-content:center;align-items:center;gap:1rem;max-width:400px;padding:2rem;display:flex}.vidtreo-error-icon{font-size:3rem;line-height:1}.vidtreo-error-title{font-size:1.25rem;font-weight:600;line-height:1.2}.vidtreo-error-message{opacity:.9;word-break:break-word;font-size:.875rem;line-height:1.5}.vidtreo-error-config{text-align:left;border-top:1px solid #fff3;width:100%;margin-top:1.5rem;padding-top:1.5rem}.vidtreo-error-config-title{color:#fff;margin-bottom:.75rem;font-size:.875rem;font-weight:600}.vidtreo-error-config-item{color:#ffffffd9;margin-bottom:.5rem;font-size:.8125rem;line-height:1.6}.vidtreo-error-config-item code{color:#fff;background:#ffffff26;border-radius:.25rem;padding:.125rem .375rem;font-family:monospace;font-size:.75rem}.vidtreo-error-retry{background:hsl(var(--vidtreo-destructive));color:hsl(var(--vidtreo-destructive-foreground));cursor:pointer;border:none;border-radius:.375rem;margin-top:.5rem;padding:.5rem 1rem;font-size:.875rem;font-weight:500;transition:filter .2s}.vidtreo-error-retry:hover:not(:disabled){filter:brightness(.85)}.vidtreo-error-retry:disabled{opacity:.5;cursor:not-allowed}.vidtreo-error-overlay{background:hsl(var(--vidtreo-preview-bg));z-index:var(--vidtreo-z-error-overlay);justify-content:center;align-items:center;display:flex;position:absolute;inset:0}.vidtreo-native-camera-container{aspect-ratio:9/16;background:hsl(var(--vidtreo-preview-bg));border-radius:0;justify-content:center;align-items:center;width:100%;display:flex;position:relative;overflow:hidden}@media (width>=768px){.vidtreo-native-camera-container{aspect-ratio:16/9}}.vidtreo-native-camera-container:has(.vidtreo-native-camera-preview-container){background:0 0}.vidtreo-config-loading-indicator{z-index:var(--vidtreo-z-controls);position:absolute;top:8px;right:8px}.vidtreo-spinner-small{border:2px solid #ffffff4d;border-top-color:#fff;border-radius:50%;width:16px;height:16px;animation:.6s linear infinite spin}.vidtreo-native-camera-empty-state{flex-direction:column;justify-content:center;align-items:center;gap:16px;width:100%;height:100%;padding:24px;display:flex;position:relative}.vidtreo-native-camera-buttons{flex-direction:column;gap:12px;width:100%;max-width:300px;display:flex}.vidtreo-native-camera-process-button,.vidtreo-native-camera-download-button{z-index:30;position:absolute;bottom:24px;left:50%;transform:translate(-50%)}.vidtreo-native-camera-process-button .vidtreo-btn,.vidtreo-native-camera-download-button .vidtreo-btn{min-width:200px}.vidtreo-btn{border-radius:var(--vidtreo-radius);cursor:pointer;border:none;padding:12px 24px;font-size:1rem;font-weight:500;transition:all .2s}.vidtreo-btn:disabled{opacity:.5;cursor:not-allowed}.vidtreo-btn-primary{background:hsl(var(--vidtreo-primary));color:hsl(var(--vidtreo-primary-foreground))}.vidtreo-btn-primary:hover:not(:disabled){filter:brightness(.9)}.vidtreo-btn-secondary{background:hsl(var(--vidtreo-secondary));color:hsl(var(--vidtreo-secondary-foreground));border:1px solid hsl(var(--vidtreo-border))}.vidtreo-btn-secondary:hover:not(:disabled){background:hsl(var(--vidtreo-accent))}.vidtreo-transcoding-progress{width:100%;max-width:400px;padding:16px}.vidtreo-progress-bar{background:#fff3;border-radius:4px;width:100%;height:8px;overflow:hidden}.vidtreo-progress-fill{background:hsl(var(--vidtreo-primary));height:100%;transition:width .3s}.vidtreo-progress-text{text-align:center;color:hsl(var(--vidtreo-foreground));margin-top:8px;font-size:.875rem}.vidtreo-native-camera-preview-container{background:0 0;justify-content:center;align-items:center;width:100%;height:100%;display:flex;position:relative}.vidtreo-native-camera-preview-image{object-fit:contain;width:100%;height:100%;display:block}.vidtreo-progress-overlay{backdrop-filter:blur(4px);width:100%;height:100%;z-index:var(--vidtreo-z-progress-overlay);pointer-events:none;background:#000000b3;flex-direction:column;justify-content:center;align-items:center;display:flex;position:absolute;inset:0}.vidtreo-progress-overlay .vidtreo-transcoding-progress,.vidtreo-progress-overlay .vidtreo-upload-progress{pointer-events:auto;background:0 0;flex-direction:column;align-items:center;gap:12px;width:90%;max-width:400px;padding:0;display:flex;position:relative}.vidtreo-progress-overlay .vidtreo-progress-bar,.vidtreo-progress-overlay .vidtreo-upload-progress-bar{background:#fff3;border-radius:4px;width:100%;height:8px;overflow:hidden}.vidtreo-progress-overlay .vidtreo-progress-fill{background:#fff;height:100%;transition:width .3s}.vidtreo-progress-overlay .vidtreo-progress-text,.vidtreo-progress-overlay .vidtreo-upload-progress-text{text-align:center;color:#fff;margin-top:0;font-size:.875rem;font-weight:500}.vidtreo-progress-overlay .vidtreo-upload-progress-bar{background:#fff3;border-radius:4px;width:100%;height:8px;overflow:hidden}.vidtreo-progress-overlay .vidtreo-upload-progress-fill{background:#fff;height:100%;transition:width .3s}.vidtreo-progress-overlay .vidtreo-progress-indeterminate{background:linear-gradient(90deg,#0000 0%,#fff 50%,#0000 100%) 0 0/200% 100%;width:100%;animation:1.5s ease-in-out infinite vidtreo-progress-indeterminate}@keyframes vidtreo-progress-indeterminate{0%{background-position:200% 0}to{background-position:-200% 0}}.vidtreo-mobile-web-recorder{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;width:100%;height:100%;font-family:-apple-system,BlinkMacSystemFont,SF Pro Display,SF Pro Text,system-ui,sans-serif}.vidtreo-camera-area button,.vidtreo-camera-area input,.vidtreo-camera-area select,.vidtreo-camera-area textarea,.vidtreo-mobile-web-recorder button,.vidtreo-mobile-web-recorder input,.vidtreo-mobile-web-recorder select,.vidtreo-mobile-web-recorder textarea,.vidtreo-permission-flow button{font-family:inherit}.vidtreo-mobile-landing-container{aspect-ratio:4/3;background:hsl(var(--vidtreo-preview-bg));border-radius:0;justify-content:center;align-items:center;width:100%;max-height:100%;display:flex;position:relative;overflow:hidden}.vidtreo-mobile-landing-content{text-align:center;flex-direction:column;justify-content:center;align-items:center;gap:1.25rem;padding:2rem;display:flex}.vidtreo-mobile-landing-title{color:#fff;margin:0;font-size:1.25rem;font-weight:600;line-height:1.3}.vidtreo-mobile-landing-description{color:#ffffffbf;max-width:280px;margin:0;font-size:.875rem;line-height:1.5}.vidtreo-mobile-open-camera-btn{border-radius:9999px;justify-content:center;align-items:center;gap:.625rem;min-width:200px;margin-top:.5rem;padding:.875rem 1.75rem;font-size:1rem;font-weight:600;transition:all .2s;animation:2s ease-in-out infinite vidtreo-btn-glow-pulse;display:inline-flex}@keyframes vidtreo-btn-glow-pulse{0%,to{box-shadow:0 0 8px 2px #ffffff4d,0 0 16px 4px #ffffff26}50%{box-shadow:0 0 16px 4px #ffffff80,0 0 32px 8px #ffffff40}}.vidtreo-mobile-open-camera-btn:hover:not(:disabled){animation-play-state:paused;transform:scale(1.02);box-shadow:0 0 20px 6px #fff9,0 0 40px 10px #ffffff4d}.vidtreo-mobile-open-camera-btn:active:not(:disabled){transform:scale(.98)}.vidtreo-mobile-open-camera-btn:disabled{box-shadow:none;animation:none}#vidtreo-portal-root{z-index:9999;pointer-events:none;width:100vw;height:100dvh;position:fixed;top:0;left:0}#vidtreo-portal-root>*{pointer-events:auto}.vidtreo-mobile-modal-overlay{--vidtreo-safe-top:0px;--vidtreo-safe-bottom:0px;--vidtreo-safe-left:0px;--vidtreo-safe-right:0px;width:100vw;height:100dvh;z-index:var(--vidtreo-z-modal-overlay);background:#000;flex-direction:column;height:-webkit-fill-available;animation:.3s ease-out vidtreo-modal-fade-in;display:flex;position:fixed;inset:0}@keyframes vidtreo-modal-fade-in{0%{opacity:0}to{opacity:1}}.vidtreo-mobile-modal-header{padding:.75rem;padding-top:calc(.75rem + var(--vidtreo-safe-top,0px));z-index:var(--vidtreo-z-error-overlay);pointer-events:none;justify-content:center;display:flex;position:absolute;top:0;left:0;right:0}.vidtreo-mobile-modal-close-btn{color:#ffffffe6;cursor:pointer;pointer-events:auto;backdrop-filter:blur(4px);background:#00000080;border:none;border-radius:9999px;justify-content:center;align-items:center;gap:.375rem;height:2rem;padding:0 .75rem;font-size:.75rem;font-weight:500;transition:all .2s;display:flex}.vidtreo-mobile-modal-close-btn:hover:not(:disabled){background:#000000b3}.vidtreo-mobile-modal-close-btn:disabled{opacity:.3;cursor:not-allowed}.vidtreo-mobile-modal-content{width:100%;height:100%;padding-top:var(--vidtreo-safe-top,0px);padding-bottom:var(--vidtreo-safe-bottom,0px);padding-left:var(--vidtreo-safe-left,0px);padding-right:var(--vidtreo-safe-right,0px);flex-direction:column;flex:1;display:flex;position:relative}.vidtreo-mobile-recorder-content{--vidtreo-safe-top:0px;--vidtreo-safe-bottom:0px;--vidtreo-safe-left:0px;--vidtreo-safe-right:0px;flex-direction:column;width:100%;height:100%;display:flex;position:relative}.vidtreo-mobile-recorder-content .vidtreo-preview-container{aspect-ratio:unset;flex:1;width:100%;height:100%}.vidtreo-mobile-recorder-content .vidtreo-video-preview{object-fit:cover}.vidtreo-mobile-preview{flex:1;aspect-ratio:unset!important;height:100%!important}.vidtreo-mobile-recorder-content .vidtreo-recording-controls{bottom:calc(24px + var(--vidtreo-safe-bottom,0px))!important}.vidtreo-mobile-recorder-content .vidtreo-audio-level-bars{bottom:calc(12px + var(--vidtreo-safe-bottom,0px))!important}.vidtreo-mobile-recorder-content .vidtreo-settings-panel{bottom:calc(7rem + var(--vidtreo-safe-bottom,0px))!important}.vidtreo-mobile-recorder-content .vidtreo-rec-indicator-top,.vidtreo-mobile-recorder-content .vidtreo-recording-timer-badge{contain:layout style;height:2rem;padding:0 .75rem;top:calc(.75rem + var(--vidtreo-safe-top,0px))!important}.vidtreo-mobile-recorder-content .vidtreo-recording-timer-text{white-space:nowrap;color:#fff;min-width:3rem;font-size:.875rem;display:inline-block}.vidtreo-mobile-recorder-content .vidtreo-error{top:calc(3.5rem + var(--vidtreo-safe-top,0px))!important}.vidtreo-mobile-recorder-content .vidtreo-control-buttons-row{gap:.75rem;min-height:4rem}.vidtreo-mobile-recorder-content .vidtreo-control-button{width:4rem;height:4rem;min-height:4rem;max-height:4rem}.vidtreo-mobile-recorder-content .vidtreo-control-button svg{width:1.5rem;height:1.5rem}.vidtreo-mobile-recorder-content .vidtreo-record-button{gap:.5rem;height:4rem;min-height:4rem;max-height:4rem;padding:0 1.5rem;font-size:1rem}.vidtreo-mobile-recorder-content .vidtreo-record-button svg{width:1.5rem;height:1.5rem}.vidtreo-permission-flow{z-index:var(--vidtreo-z-modal-overlay);contain:layout style paint;backface-visibility:hidden;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;background:#000;flex-direction:column;justify-content:center;align-items:center;gap:1.25rem;font-family:-apple-system,BlinkMacSystemFont,SF Pro Display,SF Pro Text,system-ui,sans-serif;display:none;position:absolute;inset:0;transform:translateZ(0)}.vidtreo-permission-flow.vidtreo-active{animation:.4s cubic-bezier(.2,0,0,1) vidtreo-fadeIn;display:flex}.vidtreo-permission-flow-title{color:#fff;text-align:center;margin:0;font-size:1.25rem;font-weight:600;line-height:1.3}.vidtreo-permission-flow-subtitle{color:#ffffffbf;text-align:center;letter-spacing:-.005em;max-width:280px;margin:0;font-size:.875rem;line-height:1.5}.vidtreo-permission-flow-action{background:hsl(var(--vidtreo-primary));color:hsl(var(--vidtreo-primary-foreground));cursor:pointer;letter-spacing:-.01em;border:none;border-radius:9999px;justify-content:center;align-items:center;gap:.625rem;min-width:200px;margin-top:.5rem;padding:.875rem 1.75rem;font-size:1rem;font-weight:600;transition:all .2s;animation:2s ease-in-out infinite vidtreo-btn-glow-pulse;display:inline-flex}.vidtreo-permission-flow-action:hover:not(:disabled){animation-play-state:paused;transform:scale(1.02);box-shadow:0 0 20px 6px #fff9,0 0 40px 10px #ffffff4d}.vidtreo-permission-flow-action:active:not(:disabled){transform:scale(.98)}.vidtreo-permission-flow-action:disabled{opacity:.5;cursor:not-allowed;box-shadow:none;animation:none}.vidtreo-permission-flow-action--requesting{opacity:.55;cursor:wait;box-shadow:none;animation:none}@keyframes vidtreo-spinner-rotate{to{transform:rotate(360deg)}}.vidtreo-permission-flow-spinner{border:2px solid #ffffff4d;border-top-color:hsl(var(--vidtreo-primary-foreground));border-radius:50%;flex-shrink:0;width:1.125rem;height:1.125rem;animation:.8s linear infinite vidtreo-spinner-rotate;display:inline-block}.vidtreo-permission-flow-spinner--large{border-width:3px;width:2.5rem;height:2.5rem}.vidtreo-permission-flow-recovery{text-align:center;flex-direction:column;align-items:center;gap:1.25rem;max-width:280px;display:flex}.vidtreo-permission-flow-recovery-text{color:#fff6;letter-spacing:-.005em;margin:0;font-size:.75rem;line-height:1.6}.vidtreo-permission-flow-retry{background:hsl(var(--vidtreo-primary));color:hsl(var(--vidtreo-primary-foreground));cursor:pointer;letter-spacing:-.01em;border:none;border-radius:9999px;justify-content:center;align-items:center;gap:.625rem;min-width:200px;padding:.875rem 1.75rem;font-size:1rem;font-weight:600;transition:all .2s;animation:2s ease-in-out infinite vidtreo-btn-glow-pulse;display:inline-flex}.vidtreo-permission-flow-retry:hover:not(:disabled){animation-play-state:paused;transform:scale(1.02);box-shadow:0 0 20px 6px #fff9,0 0 40px 10px #ffffff4d}.vidtreo-permission-flow-retry:active:not(:disabled){transform:scale(.98)}@keyframes vidtreo-fadeOut{0%{opacity:1}to{opacity:0}}.vidtreo-permission-flow.vidtreo-permission-flow--fading{pointer-events:none;animation:.6s ease-out forwards vidtreo-fadeOut}.vidtreo-recovery-guide{width:100%;max-width:280px;margin:0 auto;position:relative}.vidtreo-recovery-guide:after{content:"";z-index:20;pointer-events:none;background:linear-gradient(#0000 0%,#000 100%);height:60px;position:absolute;bottom:0;left:0;right:0}.vidtreo-recovery-guide:before{content:"";z-index:20;pointer-events:none;background:linear-gradient(90deg,#0000 0%,#000 100%);width:50px;position:absolute;top:0;bottom:0;right:0}.vidtreo-recovery-guide-browser{background:#161616;border-top:1px solid #ffffff1a;border-left:1px solid #ffffff1a;border-radius:10px 0 0;animation:.5s vidtreo-fadeIn;position:relative;overflow:hidden}.vidtreo-recovery-guide-titlebar{z-index:3;background:#1e1e1e;border-bottom:1px solid #ffffff0f;align-items:center;gap:8px;padding:8px 10px;display:flex;position:relative}.vidtreo-recovery-guide-dots{flex-shrink:0;gap:5px;display:flex}.vidtreo-recovery-guide-dot{border-radius:50%;width:8px;height:8px}.vidtreo-recovery-guide-dot--close{background:#ff5f57}.vidtreo-recovery-guide-dot--min{background:#febc2e}.vidtreo-recovery-guide-dot--max{background:#28c840}.vidtreo-recovery-guide-addressbar{background:#2a2a2a;border-radius:5px;flex:1;align-items:center;gap:5px;min-width:0;padding:4px 8px;display:flex}.vidtreo-recovery-guide-lock{color:#ffffff80;flex-shrink:0;align-items:center;animation:7s ease-in-out infinite vidtreo-lock-pulse;display:flex}.vidtreo-recovery-guide-lock-svg{display:block}.vidtreo-recovery-guide-url{color:#ffffff80;white-space:nowrap;text-overflow:ellipsis;font-family:-apple-system,BlinkMacSystemFont,system-ui,sans-serif;font-size:.65rem;overflow:hidden}.vidtreo-recovery-guide-cursor{z-index:40;pointer-events:none;filter:drop-shadow(0 2px 4px #0009);animation:7s ease-in-out infinite vidtreo-cursor-move;position:absolute;top:12px;left:62px}.vidtreo-recovery-guide-cursor-svg{display:block}.vidtreo-recovery-guide-browser-bg{background:#161616;height:110px}.vidtreo-recovery-guide-popover{z-index:30;background:#252525;border:1px solid #ffffff1a;border-radius:10px;padding:8px 12px 12px;animation:7s ease-in-out infinite vidtreo-popover-reveal;position:absolute;top:34px;left:12px;right:12px;box-shadow:0 8px 30px #0009,0 2px 8px #0006,0 0 0 1px #ffffff0f}.vidtreo-recovery-guide-popover-header{color:#ffffffd9;white-space:nowrap;text-overflow:ellipsis;text-align:left;padding-bottom:6px;font-family:-apple-system,BlinkMacSystemFont,system-ui,sans-serif;font-size:.65rem;font-weight:600;overflow:hidden}.vidtreo-recovery-guide-popover-divider{background:#ffffff14;height:1px}.vidtreo-recovery-guide-perm-row{justify-content:space-between;align-items:center;padding:7px 0;display:flex}.vidtreo-recovery-guide-perm-row+.vidtreo-recovery-guide-perm-row{border-top:1px solid #ffffff0f}.vidtreo-recovery-guide-perm-group{align-items:center;gap:8px;display:flex}.vidtreo-recovery-guide-perm-icon{flex-shrink:0;width:14px;height:14px;position:relative}.vidtreo-recovery-guide-icon-off,.vidtreo-recovery-guide-icon-on{justify-content:center;align-items:center;display:flex;position:absolute;inset:0}.vidtreo-recovery-guide-icon-off{color:#fff6;animation:7s ease-in-out infinite vidtreo-icon-hide}.vidtreo-recovery-guide-icon-on{color:#34d399;animation:7s ease-in-out infinite vidtreo-icon-show}.vidtreo-recovery-guide-perm-label{color:#ffffffd9;font-family:-apple-system,BlinkMacSystemFont,system-ui,sans-serif;font-size:.7rem}.vidtreo-recovery-guide-switch{flex-shrink:0;width:32px;height:18px;position:relative}.vidtreo-recovery-guide-switch-track{background:#ffffff26;border-radius:9px;animation:7s ease-in-out infinite vidtreo-track-on;position:absolute;inset:0}.vidtreo-recovery-guide-switch-knob{background:#fff;border-radius:50%;width:14px;height:14px;animation:7s ease-in-out infinite vidtreo-knob-slide;position:absolute;top:2px;left:2px;box-shadow:0 1px 3px #0000004d}.vidtreo-recovery-guide-switch--delayed{animation-delay:.85s}@keyframes vidtreo-cursor-move{0%{opacity:0;transform:translate(100px,12px)}8%{opacity:1}22%{transform:translate(0)}26%{transform:translate(0)scale(.75)}30%{opacity:1;transform:translate(0)scale(1)}33%{opacity:1;transform:translate(0)}38%{opacity:1;transform:translate(65px,63px)}42%{transform:translate(65px,63px)scale(.75)}45%{opacity:1;transform:translate(65px,63px)scale(1)}48%{opacity:1;transform:translate(65px,97px)}52%{transform:translate(65px,97px)scale(.75)}55%{opacity:1;transform:translate(65px,97px)scale(1)}60%{opacity:0}to{opacity:0;transform:translate(100px,12px)}}@keyframes vidtreo-popover-reveal{0%,27%{opacity:0;transform:translateY(-6px)scale(.96)}33%,82%{opacity:1;transform:translateY(0)scale(1)}88%,to{opacity:0;transform:translateY(-6px)scale(.96)}}@keyframes vidtreo-track-on{0%,34%{background:#ffffff26}40%,92%{background:#34d399}96%,to{background:#ffffff26}}@keyframes vidtreo-knob-slide{0%,34%{transform:translate(0)}40%,92%{transform:translate(14px)}96%,to{transform:translate(0)}}@keyframes vidtreo-icon-hide{0%,34%{opacity:1}40%,92%{opacity:0}96%,to{opacity:1}}@keyframes vidtreo-icon-show{0%,34%{opacity:0}40%,92%{opacity:1}96%,to{opacity:0}}@keyframes vidtreo-lock-pulse{0%,15%{color:#ffffff80}22%,30%{color:#34d399}38%,to{color:#ffffff80}}.vidtreo-record-button.vidtreo-record-button-disabled,.vidtreo-record-button-disabled{opacity:.6;cursor:not-allowed;pointer-events:none;filter:grayscale(.3)}.vidtreo-mic-connecting-indicator{justify-content:center;align-items:center;animation:1.4s ease-in-out infinite vidtreo-mic-pulse;display:inline-flex}@keyframes vidtreo-mic-pulse{0%,to{opacity:.4}50%{opacity:1}}.vidtreo-audio-error-overlay{z-index:var(--vidtreo-z-error-overlay);text-align:center;background:#000000d9;flex-direction:column;justify-content:center;align-items:center;padding:2rem 1.5rem;animation:.3s ease-out vidtreo-audio-overlay-fade-in;display:flex;position:absolute;inset:0}@supports (backdrop-filter:blur(8px)){.vidtreo-audio-error-overlay{-webkit-backdrop-filter:blur(8px);background:#000000bf}}@keyframes vidtreo-audio-overlay-fade-in{0%{opacity:0}to{opacity:1}}.vidtreo-audio-error-icon{background:#ef444426;border-radius:50%;justify-content:center;align-items:center;width:56px;height:56px;margin-bottom:1rem;display:flex}.vidtreo-audio-error-icon svg{color:#ef4444;width:28px;height:28px}.vidtreo-audio-error-title{color:#fff;margin:0 0 .5rem;font-size:1.125rem;font-weight:600;line-height:1.4}.vidtreo-audio-error-message{color:#ffffffb3;max-width:320px;margin:0 0 1.5rem;font-size:.875rem;line-height:1.6}.vidtreo-audio-error-retry{color:#111;cursor:pointer;background:#fff;border:none;border-radius:9999px;align-items:center;gap:.5rem;padding:.75rem 1.5rem;font-family:inherit;font-size:.875rem;font-weight:600;transition:background .15s,transform .1s;display:inline-flex}.vidtreo-audio-error-retry:hover{background:#f0f0f0}.vidtreo-audio-error-retry:active{transform:scale(.97)}.vidtreo-audio-error-retry svg{width:16px;height:16px}.vidtreo-audio-warning-toast{z-index:var(--vidtreo-z-error-overlay);color:#ffffffeb;pointer-events:auto;background:#1111118c;border:1px solid #ffffff14;border-radius:12px;align-items:flex-start;gap:.625rem;max-width:min(420px,100% - 2rem);padding:.625rem .875rem;font-family:inherit;animation:.2s ease-out vidtreo-audio-warning-toast-fade-in;display:flex;position:absolute;top:1rem;left:50%;transform:translate(-50%);box-shadow:0 4px 16px #00000040}@supports (backdrop-filter:blur(10px)){.vidtreo-audio-warning-toast{-webkit-backdrop-filter:blur(10px)saturate(140%);background:#11111173}}.vidtreo-audio-warning-toast--critical{border-color:#ef444473}.vidtreo-audio-warning-toast--critical .vidtreo-audio-warning-toast__icon{color:#ef4444}.vidtreo-audio-warning-toast--soft{border-color:#f59e0b73}.vidtreo-audio-warning-toast--soft .vidtreo-audio-warning-toast__icon{color:#f59e0b}.vidtreo-audio-warning-toast__icon{flex:none;justify-content:center;align-items:center;width:20px;height:20px;margin-top:1px;display:inline-flex}.vidtreo-audio-warning-toast__content{flex-direction:column;flex:auto;gap:2px;min-width:0;display:flex}.vidtreo-audio-warning-toast__title{color:#fff;font-size:.8125rem;font-weight:600;line-height:1.3}.vidtreo-audio-warning-toast__message{color:#ffffffb8;font-size:.75rem;font-weight:400;line-height:1.4}.vidtreo-audio-warning-toast__dismiss{color:#ffffffa6;cursor:pointer;background:0 0;border:none;border-radius:6px;flex:none;justify-content:center;align-items:center;width:22px;height:22px;margin-left:.25rem;padding:0;font-family:inherit;transition:background .15s,color .15s;display:inline-flex}.vidtreo-audio-warning-toast__dismiss:hover{color:#fffffff2;background:#ffffff1a}@keyframes vidtreo-audio-warning-toast-fade-in{0%{opacity:0;transform:translate(-50%,-8px)}to{opacity:1;transform:translate(-50%)}}`;function fx(e){return`
10352
+ <style>${dx}</style>
10353
10353
  <div class="vidtreo-mobile-landing-container">
10354
10354
  <div class="vidtreo-mobile-landing-content">
10355
10355
  <h2 class="vidtreo-mobile-landing-title">
@@ -10367,8 +10367,8 @@ Mediabunny was loaded twice.\` + " This will likely cause Mediabunny not to work
10367
10367
  </button>
10368
10368
  </div>
10369
10369
  </div>
10370
- `}function fx(e,t,n){return`
10371
- <style>${ux}</style>
10370
+ `}function px(e,t,n){return`
10371
+ <style>${dx}</style>
10372
10372
  <div class="vidtreo-mobile-modal-overlay" role="dialog" aria-modal="true" aria-label="${e.t(`mobileOpenCameraTitle`)}">
10373
10373
  <div class="vidtreo-mobile-modal-header">
10374
10374
  <!-- Left: Recording Indicator -->
@@ -10403,8 +10403,8 @@ Mediabunny was loaded twice.\` + " This will likely cause Mediabunny not to work
10403
10403
  ${n}
10404
10404
  </div>
10405
10405
  </div>
10406
- `}function px(e){return`
10407
- <style>${ux}</style>
10406
+ `}function mx(e){return`
10407
+ <style>${dx}</style>
10408
10408
  <div class="vidtreo-native-camera-container">
10409
10409
  <input
10410
10410
  type="file"
@@ -10463,7 +10463,7 @@ Mediabunny was loaded twice.\` + " This will likely cause Mediabunny not to work
10463
10463
  </div>
10464
10464
 
10465
10465
  </div>
10466
- `}function mx(e){return`
10466
+ `}function hx(e){return`
10467
10467
  <div class="vidtreo-mobile-recorder-content">
10468
10468
  <div class="vidtreo-preview-container vidtreo-mobile-preview">
10469
10469
 
@@ -10622,8 +10622,8 @@ Mediabunny was loaded twice.\` + " This will likely cause Mediabunny not to work
10622
10622
 
10623
10623
  </div>
10624
10624
  </div>
10625
- `}let hx=()=>`
10626
- <style>${ux}</style>
10625
+ `}let gx=()=>`
10626
+ <style>${dx}</style>
10627
10627
  <div class="vidtreo-camera-area vidtreo-active" id="cameraArea">
10628
10628
  <!-- Error Boundary / Preview Container -->
10629
10629
  <div class="vidtreo-preview-container">
@@ -10903,9 +10903,9 @@ Mediabunny was loaded twice.\` + " This will likely cause Mediabunny not to work
10903
10903
  </div>
10904
10904
 
10905
10905
  </div>
10906
- `;function gx(e,t,n,r){return{showSettingsButton:!e&&r.enableDeviceChange!==!1,showMuteButton:e&&r.enableMute!==!1,showPauseButton:e&&r.enablePause!==!1&&t===`recording`&&!n,showResumeButton:e&&r.enablePause!==!1&&n,showStopButton:e,showSwitchSourceButton:e&&r.enableSourceSwitching!==!1}}let _x=/^https?:\/\//i;function vx(e){return e?_x.test(e)?e:`https://${e}`:`https://core.vidtreo.com`}function yx(e,t,n){let r=e.getAttribute(t);return r===null?n:r!==`false`}function bx(e,t){let n=e.getAttribute(t);if(!n)return;let r=Number.parseInt(n,10);if(!Number.isNaN(r))return r}function xx(e,t){let n=e.getAttribute(t);if(n!==null)return n}function Sx(e){return{apiKey:e.getAttribute(`api-key`)||``,backendUrl:vx(e.getAttribute(`backend-url`)),demo:yx(e,`demo`,!1),enableSourceSwitching:yx(e,`enable-source-switching`,!0),enableMute:yx(e,`enable-mute`,!0),enablePause:yx(e,`enable-pause`,!0),enableDeviceChange:yx(e,`enable-device-change`,!0),enableTabVisibilityOverlay:yx(e,`enable-tab-visibility-overlay`,!1)}}function Cx(e){let t={},n=bx(e,`countdown-duration`);n!==void 0&&(t.countdownDuration=n);let r=bx(e,`max-recording-time`);r!==void 0&&(t.maxRecordingTime=r);let i=bx(e,`min-time-record`);return i!==void 0&&(t.minTimeRecord=i),t}function wx(e,t,n){return e?t!==void 0&&t.trim().length>0?t:n!==void 0&&n.trim().length>0?n:void 0:t}function Tx(e,t){let n=e.getAttribute(`user-metadata`);if(n)try{let e=JSON.parse(n);return{...t,...e}}catch(e){throw Error(`Invalid user-metadata JSON: ${i(e)}`)}}function Ex(e,t,n){let r=Sx(e),i=Cx(e),a=xx(e,`tab-visibility-overlay-text`),o=wx(r.enableTabVisibilityOverlay===!0,a,n),s=Tx(e,t),c={...r,...i};return o!==void 0&&(c={...c,tabVisibilityOverlayText:o}),s!==void 0&&(c={...c,userMetadata:s}),c}function Dx(){if(typeof document>`u`||document.querySelector(`script[src*="@phosphor-icons/web"]`))return;let e=document.createElement(`script`);e.src=`https://unpkg.com/@phosphor-icons/web`,e.async=!0,document.head.appendChild(e)}let Ox=1e3,kx=/^\d+$/;function Ax(e){return kx.test(e)}function jx(e){let t=e.trim();if(t.length===0)return 0;let n=t.split(`:`);if(n.length!==2&&n.length!==3)return 0;for(let e of n)if(!Ax(e))return 0;if(n.length===2){let e=Number.parseInt(n[0],10),t=Number.parseInt(n[1],10);return(e*60+t)*Ox}let r=Number.parseInt(n[0],10),i=Number.parseInt(n[1],10),a=Number.parseInt(n[2],10);return((r*60+i)*60+a)*Ox}function Mx(e,t,n){return!n||e==null||Number.isFinite(e)===!1||e<=0?!1:jx(t)<e}function Nx(){let e=Error(`Minimum recording time has not been reached yet`);return e.code=`recording.minimum-time-not-reached`,e}let Px={requiresAudio:!1,requiresWatermark:!1},Fx={step:`idle`,permissions:{camera:`unknown`,microphone:`unknown`},denialType:`none`,isSecureContext:!0,isComplete:!1,canRetry:!0,shouldProbeUnknown:!0},Ix={recordingState:`idle`,stream:null,isVideoLoaded:!1,isMuted:!1,isPaused:!1,isAudioReady:!1,hasAudioFailed:!1,showSettings:!1,error:null,errorCode:null,canRetry:!1,browserName:null,browserVersion:null,countdown:null,timer:`00:00`,uploadProgress:null,transitionMessage:null,recordedBlob:null,audioWarning:null,devices:{cameras:[],microphones:[],selectedCamera:null,selectedMic:null},configError:null};var Lx=class extends HTMLElement{constructor(...e){super(...e),this.controller=null,this.audioStatusUnsub=null,this.uploadService=null,this.state={...Ix},this.config={},this.isMounted=!1,this.connectionGeneration=0,this.initialized=!1,this.isInitializing=!1,this.isProcessingBlob=!1,this.audioBarsContainer=null,this.previewContentElements=null,this.recordingControlsElements=null,this.videoPreviewElements=null,this.permissionFlowElements=null,this.overlayElements=null,this.settingsPanelElement=null,this.audioWarningAutoDismissId=null,this.audioContext=null,this.analyser=null,this.animationFrameId=null,this.mobileManager=null,this.nativeCameraManager=null,this.permissionFlowOrchestrator=null,this.permissionFlowSnapshot=Fx,this.overlayPhase=`hidden`,this.overlayFadeTimeoutId=null,this.isStartingPreview=!1,this.i18n=new ex,this.settingsView=`main`,this.slideDirection=`none`}static{this.observedAttributes=[`api-key`,`backend-url`,`countdown-duration`,`min-time-record`,`max-recording-time`,`user-metadata`,`enable-source-switching`,`enable-mute`,`enable-pause`,`enable-device-change`,`enable-tab-visibility-overlay`,`tab-visibility-overlay-text`,`demo`,`mobile-mode`,`lang`]}get isDemo(){return this.hasAttribute(`demo`)&&this.getAttribute(`demo`)!==`false`}get lang(){return this.getAttribute(`lang`)||`en`}async connectedCallback(){this.connectionGeneration+=1;let e=this.connectionGeneration;this.i18n.setLang(this.lang);let t=this.shouldProbeWebRecorderSupport();if(await this.probeWebRecorderSupport(t,e),this.shouldAbortConnection(e))return;let n=this.getEffectiveMobileMode();this.initializeRecorderForMobileMode(n)}disconnectedCallback(){this.connectionGeneration+=1,this.isMounted=!1,this.mobileManager?.destroy(),this.nativeCameraManager?.destroy(),this.cleanup()}async probeWebRecorderSupport(e,t){this.isMounted||(this.isMounted=!0,e&&await pg(Px).then(e=>{if(!this.shouldAbortConnection(t)){if(!e.isSupported){this.updateUnsupportedBrowserState();return}this.updateState({errorCode:null,canRetry:!1,browserName:null,browserVersion:null})}}).catch(()=>{this.shouldAbortConnection(t)||this.updateUnsupportedBrowserState()}))}updateUnsupportedBrowserState(){let e=jy();this.updateState({errorCode:Uy,canRetry:!1,browserName:e.browserName,browserVersion:e.browserVersion})}clearBrowserUnsupportedState(){this.updateState({errorCode:null,canRetry:!1,browserName:null,browserVersion:null})}applyBrowserUnsupportedStateFromError(e){if(!(e&&typeof e==`object`&&`code`in e))return;let t=e;if(t.code?.startsWith(`camera.`)||t.code?.startsWith(`audio.`)||t.code?.startsWith(`recording.`)){this.updateState({errorCode:t.code,canRetry:!0,browserName:null,browserVersion:null});return}if(t.code!==Uy)return;let n=jy(),r=n.browserName;t.browserName&&t.browserName.length>0&&(r=t.browserName);let i=n.browserVersion;t.browserVersion&&t.browserVersion.length>0&&(i=t.browserVersion),this.updateState({errorCode:Uy,canRetry:!1,browserName:r,browserVersion:i})}resolveBrowserErrorState(){let e=this.state.errorCode,t=this.state.browserName,n=this.state.browserVersion;if(e===Uy&&t===null){let e=jy();t=e.browserName,n===null&&(n=e.browserVersion)}return{errorCode:e,browserName:t,browserVersion:n}}shouldAbortConnection(e){return!this.isConnected||e!==this.connectionGeneration}initializeRecorderForMobileMode(e){if(e===`native`){this.initNativeCamera();return}if(e===`overlay`){this.mobileManager=new ox({getState:()=>({recordingState:this.state.recordingState,uploadProgress:this.state.uploadProgress}),isInitialized:()=>this.initialized,startPreview:()=>this.startPreview(),stopPreview:()=>this.stopPreview(),renderMobile:()=>this.renderMobile()}),this.renderMobile(),this.init();return}this.innerHTML=hx(),this.init()}getRequestedMobileMode(){let e=this.getAttribute(`mobile-mode`);return e===null?null:e===`embed`?`embed`:e===`native`?`native`:`overlay`}shouldProbeWebRecorderSupport(){return this.getRequestedMobileMode()!==`native`}getEffectiveMobileMode(){let e=this.getRequestedMobileMode();return e===null?`overlay`:e}initNativeCamera(){this.config=this.resolveRecorderComponentConfig({}),this.nativeCameraManager=new sx({apiKey:this.config.apiKey,backendUrl:this.config.backendUrl,maxRecordingTime:this.config.maxRecordingTime,userMetadata:this.config.userMetadata,demo:this.isDemo},{onStateChange:()=>this.renderNativeCamera(),onUploadComplete:e=>{this.dispatchEvent(new CustomEvent(`recording-complete`,{detail:e,bubbles:!0,composed:!0}))},onError:e=>{this.dispatchEvent(new CustomEvent(`error`,{detail:{error:e.message},bubbles:!0,composed:!0}))}}),this.renderNativeCamera(),Dx()}renderNativeCamera(){if(!this.nativeCameraManager)return;let e=this.nativeCameraManager.getState();this.innerHTML=px(this.i18n);let t=e.file!==null,n=!(t||e.isTranscoding)&&e.uploadProgress===null&&!e.transcodedBlob;this.setElementDisplay(`#nativeCameraEmptyState`,n),this.setElementDisplay(`#nativePreviewContainer`,t||!!e.transcodedBlob),this.setElementDisplay(`#nativeProgressOverlay`,e.isTranscoding||e.uploadProgress!==null),this.updateNativeCameraProgress(e),this.updateNativeCameraPreview(e,t);let r=this.isDemo&&!!e.transcodedBlob&&!e.isTranscoding&&e.uploadProgress===null;this.setElementDisplay(`#nativeActions`,r),this.updateNativeCameraError(e),this.setupNativeCameraListeners()}setElementDisplay(e,t){let n=this.querySelector(e);n instanceof HTMLElement&&(t&&(n.style.display=``),t||(n.style.display=`none`))}updateNativeCameraProgress(e){let t=this.querySelector(`#nativeUploadProgressFill`),n=this.querySelector(`#nativeUploadProgressText`),r=null;t instanceof HTMLElement&&(r=t);let i=e.uploadProgress!==null,a=e.isTranscoding&&!i,o=0;e.uploadProgress!==null&&(o=e.uploadProgress);let s=0;e.transcodingProgress!==null&&(s=e.transcodingProgress),i&&this.setElementDisplay(`#nativeUploadProgress`,!0),r&&i&&(r.style.width=`${o}%`),n&&i&&(n.textContent=`${this.i18n.t(`uploading`)} ${Math.round(o)}%`),a&&this.setElementDisplay(`#nativeUploadProgress`,!0),r&&a&&(r.style.width=`${s}%`),n&&a&&(n.textContent=`${this.i18n.t(`finishing`)} ${Math.round(s)}%`)}updateNativeCameraPreview(e,t){let n=this.querySelector(`#nativeVideoPreview`);if(n){if(t&&e.file){n.src=URL.createObjectURL(e.file.file);return}e.transcodedBlob&&(n.src=URL.createObjectURL(e.transcodedBlob))}}updateNativeCameraError(e){let t=this.querySelector(`.vidtreo-native-camera-container`);if(!t)return;let n=t.querySelector(`.vidtreo-audio-error-overlay`);if(!e.error){n&&n.remove();return}let r=`generic|${e.error}`;if(n&&n.dataset.signature===r)return;n&&n.remove();let i=this.getDeviceErrorIcon(`generic`),a=this.i18n.t(`genericErrorTitle`),o=this.i18n.t(`errorRetry`);n=document.createElement(`div`),n.className=`vidtreo-audio-error-overlay`,n.dataset.variant=`generic`,n.dataset.signature=r;let s=document.createElement(`div`);s.className=`vidtreo-audio-error-icon`,s.innerHTML=i,n.appendChild(s);let c=document.createElement(`h3`);c.className=`vidtreo-audio-error-title`,c.textContent=a,n.appendChild(c);let l=document.createElement(`p`);l.className=`vidtreo-audio-error-message`,l.textContent=e.error,n.appendChild(l);let u=document.createElement(`button`);u.className=`vidtreo-audio-error-retry`,u.type=`button`,u.innerHTML=`<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" viewBox="0 0 256 256">
10906
+ `;function _x(e,t,n,r){return{showSettingsButton:!e&&r.enableDeviceChange!==!1,showMuteButton:e&&r.enableMute!==!1,showPauseButton:e&&r.enablePause!==!1&&t===`recording`&&!n,showResumeButton:e&&r.enablePause!==!1&&n,showStopButton:e,showSwitchSourceButton:e&&r.enableSourceSwitching!==!1}}let vx=/^https?:\/\//i;function yx(e){return e?vx.test(e)?e:`https://${e}`:`https://core.vidtreo.com`}function bx(e,t,n){let r=e.getAttribute(t);return r===null?n:r!==`false`}function xx(e,t){let n=e.getAttribute(t);if(!n)return;let r=Number.parseInt(n,10);if(!Number.isNaN(r))return r}function Sx(e,t){let n=e.getAttribute(t);if(n!==null)return n}function Cx(e){return{apiKey:e.getAttribute(`api-key`)||``,backendUrl:yx(e.getAttribute(`backend-url`)),demo:bx(e,`demo`,!1),enableSourceSwitching:bx(e,`enable-source-switching`,!0),enableMute:bx(e,`enable-mute`,!0),enablePause:bx(e,`enable-pause`,!0),enableDeviceChange:bx(e,`enable-device-change`,!0),enableTabVisibilityOverlay:bx(e,`enable-tab-visibility-overlay`,!1)}}function wx(e){let t={},n=xx(e,`countdown-duration`);n!==void 0&&(t.countdownDuration=n);let r=xx(e,`max-recording-time`);r!==void 0&&(t.maxRecordingTime=r);let i=xx(e,`min-time-record`);return i!==void 0&&(t.minTimeRecord=i),t}function Tx(e,t,n){return e?t!==void 0&&t.trim().length>0?t:n!==void 0&&n.trim().length>0?n:void 0:t}function Ex(e,t){let n=e.getAttribute(`user-metadata`);if(n)try{let e=JSON.parse(n);return{...t,...e}}catch(e){throw Error(`Invalid user-metadata JSON: ${i(e)}`)}}function Dx(e,t,n){let r=Cx(e),i=wx(e),a=Sx(e,`tab-visibility-overlay-text`),o=Tx(r.enableTabVisibilityOverlay===!0,a,n),s=Ex(e,t),c={...r,...i};return o!==void 0&&(c={...c,tabVisibilityOverlayText:o}),s!==void 0&&(c={...c,userMetadata:s}),c}function Ox(){if(typeof document>`u`||document.querySelector(`script[src*="@phosphor-icons/web"]`))return;let e=document.createElement(`script`);e.src=`https://unpkg.com/@phosphor-icons/web`,e.async=!0,document.head.appendChild(e)}let kx=1e3,Ax=/^\d+$/;function jx(e){return Ax.test(e)}function Mx(e){let t=e.trim();if(t.length===0)return 0;let n=t.split(`:`);if(n.length!==2&&n.length!==3)return 0;for(let e of n)if(!jx(e))return 0;if(n.length===2){let e=Number.parseInt(n[0],10),t=Number.parseInt(n[1],10);return(e*60+t)*kx}let r=Number.parseInt(n[0],10),i=Number.parseInt(n[1],10),a=Number.parseInt(n[2],10);return((r*60+i)*60+a)*kx}function Nx(e,t,n){return!n||e==null||Number.isFinite(e)===!1||e<=0?!1:Mx(t)<e}function Px(){let e=Error(`Minimum recording time has not been reached yet`);return e.code=`recording.minimum-time-not-reached`,e}let Fx={requiresAudio:!1,requiresWatermark:!1},Ix={step:`idle`,permissions:{camera:`unknown`,microphone:`unknown`},denialType:`none`,isSecureContext:!0,isComplete:!1,canRetry:!0,shouldProbeUnknown:!0},Lx={recordingState:`idle`,stream:null,isVideoLoaded:!1,isMuted:!1,isPaused:!1,isAudioReady:!1,hasAudioFailed:!1,showSettings:!1,error:null,errorCode:null,canRetry:!1,browserName:null,browserVersion:null,countdown:null,timer:`00:00`,uploadProgress:null,transitionMessage:null,recordedBlob:null,audioWarning:null,devices:{cameras:[],microphones:[],selectedCamera:null,selectedMic:null},configError:null};var Rx=class extends HTMLElement{constructor(...e){super(...e),this.controller=null,this.audioStatusUnsub=null,this.uploadService=null,this.state={...Lx},this.config={},this.isMounted=!1,this.connectionGeneration=0,this.initialized=!1,this.isInitializing=!1,this.isProcessingBlob=!1,this.audioBarsContainer=null,this.previewContentElements=null,this.recordingControlsElements=null,this.videoPreviewElements=null,this.permissionFlowElements=null,this.overlayElements=null,this.settingsPanelElement=null,this.audioWarningAutoDismissId=null,this.audioContext=null,this.analyser=null,this.animationFrameId=null,this.mobileManager=null,this.nativeCameraManager=null,this.permissionFlowOrchestrator=null,this.permissionFlowSnapshot=Ix,this.overlayPhase=`hidden`,this.overlayFadeTimeoutId=null,this.isStartingPreview=!1,this.i18n=new tx,this.settingsView=`main`,this.slideDirection=`none`}static{this.observedAttributes=[`api-key`,`backend-url`,`countdown-duration`,`min-time-record`,`max-recording-time`,`user-metadata`,`enable-source-switching`,`enable-mute`,`enable-pause`,`enable-device-change`,`enable-tab-visibility-overlay`,`tab-visibility-overlay-text`,`demo`,`mobile-mode`,`lang`]}get isDemo(){return this.hasAttribute(`demo`)&&this.getAttribute(`demo`)!==`false`}get lang(){return this.getAttribute(`lang`)||`en`}async connectedCallback(){this.connectionGeneration+=1;let e=this.connectionGeneration;this.i18n.setLang(this.lang);let t=this.shouldProbeWebRecorderSupport();if(await this.probeWebRecorderSupport(t,e),this.shouldAbortConnection(e))return;let n=this.getEffectiveMobileMode();this.initializeRecorderForMobileMode(n)}disconnectedCallback(){this.connectionGeneration+=1,this.isMounted=!1,this.mobileManager?.destroy(),this.nativeCameraManager?.destroy(),this.cleanup()}async probeWebRecorderSupport(e,t){this.isMounted||(this.isMounted=!0,e&&await pg(Fx).then(e=>{if(!this.shouldAbortConnection(t)){if(!e.isSupported){this.updateUnsupportedBrowserState();return}this.updateState({errorCode:null,canRetry:!1,browserName:null,browserVersion:null})}}).catch(()=>{this.shouldAbortConnection(t)||this.updateUnsupportedBrowserState()}))}updateUnsupportedBrowserState(){let e=My();this.updateState({errorCode:Wy,canRetry:!1,browserName:e.browserName,browserVersion:e.browserVersion})}clearBrowserUnsupportedState(){this.updateState({errorCode:null,canRetry:!1,browserName:null,browserVersion:null})}applyBrowserUnsupportedStateFromError(e){if(!(e&&typeof e==`object`&&`code`in e))return;let t=e;if(t.code?.startsWith(`camera.`)||t.code?.startsWith(`audio.`)||t.code?.startsWith(`recording.`)){this.updateState({errorCode:t.code,canRetry:!0,browserName:null,browserVersion:null});return}if(t.code!==Wy)return;let n=My(),r=n.browserName;t.browserName&&t.browserName.length>0&&(r=t.browserName);let i=n.browserVersion;t.browserVersion&&t.browserVersion.length>0&&(i=t.browserVersion),this.updateState({errorCode:Wy,canRetry:!1,browserName:r,browserVersion:i})}resolveBrowserErrorState(){let e=this.state.errorCode,t=this.state.browserName,n=this.state.browserVersion;if(e===Wy&&t===null){let e=My();t=e.browserName,n===null&&(n=e.browserVersion)}return{errorCode:e,browserName:t,browserVersion:n}}shouldAbortConnection(e){return!this.isConnected||e!==this.connectionGeneration}initializeRecorderForMobileMode(e){if(!Dy()){this.innerHTML=gx(),this.init();return}if(e===`native`){this.initNativeCamera();return}if(e===`overlay`){this.mobileManager=new sx({getState:()=>({recordingState:this.state.recordingState,uploadProgress:this.state.uploadProgress}),isInitialized:()=>this.initialized,startPreview:()=>this.startPreview(),stopPreview:()=>this.stopPreview(),renderMobile:()=>this.renderMobile()}),this.renderMobile(),this.init();return}this.innerHTML=gx(),this.init()}getRequestedMobileMode(){let e=this.getAttribute(`mobile-mode`);return e===null?null:e===`embed`?`embed`:e===`native`?`native`:`overlay`}shouldProbeWebRecorderSupport(){return this.getRequestedMobileMode()!==`native`}getEffectiveMobileMode(){let e=this.getRequestedMobileMode();return e===null?`overlay`:e}initNativeCamera(){this.config=this.resolveRecorderComponentConfig({}),this.nativeCameraManager=new cx({apiKey:this.config.apiKey,backendUrl:this.config.backendUrl,maxRecordingTime:this.config.maxRecordingTime,userMetadata:this.config.userMetadata,demo:this.isDemo},{onStateChange:()=>this.renderNativeCamera(),onUploadComplete:e=>{this.dispatchEvent(new CustomEvent(`recording-complete`,{detail:e,bubbles:!0,composed:!0}))},onError:e=>{this.dispatchEvent(new CustomEvent(`error`,{detail:{error:e.message},bubbles:!0,composed:!0}))}}),this.renderNativeCamera(),Ox()}renderNativeCamera(){if(!this.nativeCameraManager)return;let e=this.nativeCameraManager.getState();this.innerHTML=mx(this.i18n);let t=e.file!==null,n=!(t||e.isTranscoding)&&e.uploadProgress===null&&!e.transcodedBlob;this.setElementDisplay(`#nativeCameraEmptyState`,n),this.setElementDisplay(`#nativePreviewContainer`,t||!!e.transcodedBlob),this.setElementDisplay(`#nativeProgressOverlay`,e.isTranscoding||e.uploadProgress!==null),this.updateNativeCameraProgress(e),this.updateNativeCameraPreview(e,t);let r=this.isDemo&&!!e.transcodedBlob&&!e.isTranscoding&&e.uploadProgress===null;this.setElementDisplay(`#nativeActions`,r),this.updateNativeCameraError(e),this.setupNativeCameraListeners()}setElementDisplay(e,t){let n=this.querySelector(e);n instanceof HTMLElement&&(t&&(n.style.display=``),t||(n.style.display=`none`))}updateNativeCameraProgress(e){let t=this.querySelector(`#nativeUploadProgressFill`),n=this.querySelector(`#nativeUploadProgressText`),r=null;t instanceof HTMLElement&&(r=t);let i=e.uploadProgress!==null,a=e.isTranscoding&&!i,o=0;e.uploadProgress!==null&&(o=e.uploadProgress);let s=0;e.transcodingProgress!==null&&(s=e.transcodingProgress),i&&this.setElementDisplay(`#nativeUploadProgress`,!0),r&&i&&(r.style.width=`${o}%`),n&&i&&(n.textContent=`${this.i18n.t(`uploading`)} ${Math.round(o)}%`),a&&this.setElementDisplay(`#nativeUploadProgress`,!0),r&&a&&(r.style.width=`${s}%`),n&&a&&(n.textContent=`${this.i18n.t(`finishing`)} ${Math.round(s)}%`)}updateNativeCameraPreview(e,t){let n=this.querySelector(`#nativeVideoPreview`);if(n){if(t&&e.file){n.src=URL.createObjectURL(e.file.file);return}e.transcodedBlob&&(n.src=URL.createObjectURL(e.transcodedBlob))}}updateNativeCameraError(e){let t=this.querySelector(`.vidtreo-native-camera-container`);if(!t)return;let n=t.querySelector(`.vidtreo-audio-error-overlay`);if(!e.error){n&&n.remove();return}let r=`generic|${e.error}`;if(n&&n.dataset.signature===r)return;n&&n.remove();let i=this.getDeviceErrorIcon(`generic`),a=this.i18n.t(`genericErrorTitle`),o=this.i18n.t(`errorRetry`);n=document.createElement(`div`),n.className=`vidtreo-audio-error-overlay`,n.dataset.variant=`generic`,n.dataset.signature=r;let s=document.createElement(`div`);s.className=`vidtreo-audio-error-icon`,s.innerHTML=i,n.appendChild(s);let c=document.createElement(`h3`);c.className=`vidtreo-audio-error-title`,c.textContent=a,n.appendChild(c);let l=document.createElement(`p`);l.className=`vidtreo-audio-error-message`,l.textContent=e.error,n.appendChild(l);let u=document.createElement(`button`);u.className=`vidtreo-audio-error-retry`,u.type=`button`,u.innerHTML=`<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" viewBox="0 0 256 256">
10907
10907
  <path d="M240,56v48a8,8,0,0,1-8,8H184a8,8,0,0,1,0-16h28.69L187.8,71.11A88,88,0,0,0,40.36,98.72,8,8,0,1,1,24.64,93.28,104,104,0,0,1,198.13,60.87L224,86.75V56a8,8,0,0,1,16,0ZM215.36,157.28a88,88,0,0,1-147.44,27.61L43.31,160H72a8,8,0,0,0,0-16H24a8,8,0,0,0-8,8v48a8,8,0,0,0,16,0V169.25l25.87,25.88A104,104,0,0,0,231.36,162.72a8,8,0,0,1-16,5.44Z"/>
10908
- </svg>`;let d=document.createElement(`span`);d.textContent=o,u.appendChild(d),u.addEventListener(`click`,e=>{e.preventDefault(),e.stopPropagation(),this.nativeCameraManager?.reset()}),n.appendChild(u),t.appendChild(n)}setupNativeCameraListeners(){let e=this.querySelector(`#btnSelectVideo`),t=this.querySelector(`#btnRecordVideo`),n=this.querySelector(`#btnNativeRetake`),r=this.querySelector(`#nativeCameraInput`);e?.addEventListener(`click`,()=>{r&&(r.accept=`video/*`,r.removeAttribute(`capture`),r.click())}),t?.addEventListener(`click`,()=>{r&&(r.accept=`video/*`,r.setAttribute(`capture`,`environment`),r.click())}),n?.addEventListener(`click`,()=>{this.nativeCameraManager?.reset()}),r?.addEventListener(`change`,async e=>{let t=e.target,n=t.files?.[0];if(n&&this.nativeCameraManager)try{let e=await this.nativeCameraManager.handleFileSelect(n);await this.nativeCameraManager.processAndUpload(e)}catch{}t.value=``})}attributeChangedCallback(e,t,n){if(t!==n){if(e===`min-time-record`){let e=Ex(this,{});this.config={...this.config,minTimeRecord:e.minTimeRecord},this.render();return}[`api-key`,`backend-url`,`demo`].includes(e)&&(this.initialized&&this.cleanup(),this.init())}}async init(){if(!this.isInitializing){this.isInitializing=!0;try{this.initialized&&this.cleanup(),this.config=this.resolveRecorderComponentConfig({});let e=this.config.apiKey||``,t=this.config.backendUrl||``;if(!(this.isDemo||e)){this.updateState({configError:Error(`apiKey is required. Provide it as an attribute or ensure demo mode is enabled.`)}),this.isInitializing=!1;return}this.isDemo||(this.uploadService=new lx({apiKey:e,backendUrl:t})),this.controller=new hy(My(this));let n={...this.config};if(await this.controller.initialize(n),await this.initializePermissionFlow(),this.initialized=!0,this.updateState({configError:null}),this.clearBrowserUnsupportedState(),this.mobileManager){Dx();return}this.cacheUiElements(),this.renderPermissionFlow(),this.setupEventListeners(),Dx(),this.getCanStartStreamFromPermissionFlow(this.permissionFlowSnapshot)&&setTimeout(()=>this.startPreview(),100)}catch(e){this.applyBrowserUnsupportedStateFromError(e),this.updateState({error:i(e)})}finally{this.isInitializing=!1}}}renderConfigError(){let e=this.state,t=!!e.configError;if(this.toggleDisplay(`#configErrorOverlay`,t),t&&e.configError){let t=e.configError.message.includes(`apiKey is required`);this.toggleDisplay(`#configErrorMessageDefault`,!t),this.toggleDisplay(`#configErrorDetails`,t),t||this.setText(`#configErrorMessageDefault`,e.configError.message)}}resolveRecorderComponentConfig(e){return Ex(this,e,this.i18n.t(`userInAnotherTab`))}cleanup(){this.audioStatusUnsub&&=(this.audioStatusUnsub(),null),this.cleanupPermissionFlow(),this.controller&&=(this.controller.cleanup(),null),this.stopAudioAnalysis(),this.initialized=!1,this.state={...Ix},this.permissionFlowElements=null}updateState(e){let t={...this.state,...e};e.stream!==void 0&&(t={...t,isVideoLoaded:!1}),e.recordingState!==void 0&&t.showSettings&&t.recordingState===Hy&&(t={...t,showSettings:!1}),this.state=t,this.mobileManager&&e.uploadProgress!==void 0&&this.mobileManager.checkUploadCompletion(this.state.uploadProgress),this.render(),e.stream!==void 0&&this.handleStreamUpdate(this.state.stream),this.state.devices.cameras.length===0&&this.state.stream&&this.updateDevices()}async updateDevices(){if(!this.controller)return;let e=this.controller.getDeviceManager(),t=await e.getAvailableDevices();this.updateState({devices:{cameras:t.videoinput,microphones:t.audioinput,selectedCamera:e.getSelectedCameraDeviceId(),selectedMic:e.getSelectedMicDeviceId()}})}handleStreamUpdate(e){this.videoPreviewElements||this.cacheUiElements(),this.videoPreviewElements&&vb(e,this.videoPreviewElements,{onVideoLoaded:()=>{this.updateState({isVideoLoaded:!0}),this.updateOverlayPhase()},onError:e=>{this.updateState({error:e})},startAudioAnalysis:e=>this.startAudioAnalysis(e),stopAudioAnalysis:()=>this.stopAudioAnalysis()})}startAudioAnalysis(e){if(this.stopAudioAnalysis(),e.getAudioTracks().length!==0)try{this.audioContext=new AudioContext;let t=this.audioContext.createMediaStreamSource(e);this.analyser=this.audioContext.createAnalyser(),this.analyser.fftSize=64,t.connect(this.analyser);let n=new Uint8Array(this.analyser.frequencyBinCount),r=()=>{if(!this.analyser)return;this.analyser.getByteFrequencyData(n);let e=0;for(let t of n)e+=t;let t=e/n.length,i=Math.min(1,t/128);this.renderAudioBars(i),this.animationFrameId=requestAnimationFrame(r)};r()}catch(e){this.updateState({error:i(e)})}}stopAudioAnalysis(){this.animationFrameId&&=(cancelAnimationFrame(this.animationFrameId),null),this.audioContext&&=(this.audioContext.close(),null)}renderAudioBars(e){if(!this.audioBarsContainer)return;let t=Wy,n=``;if(!this.state.isMuted)for(let r of t){let t=Math.max(4,e*24*r);n+=`<div class="vidtreo-audio-level-bar" style="height: ${t}px;"></div>`}this.audioBarsContainer.innerHTML=n}render(){if(this.mobileManager&&!this.mobileManager.isModalOpen||(this.previewContentElements&&this.recordingControlsElements&&this.overlayElements&&this.videoPreviewElements||this.cacheUiElements(),!(this.previewContentElements&&this.recordingControlsElements&&this.overlayElements&&this.videoPreviewElements)))return;let e=this.i18n.getAll(),t=cx(e),n=this.state.recordingState===Hy||this.state.isPaused,r=Mx(this.config.minTimeRecord,this.state.timer,n),a={enableDeviceChange:this.config.enableDeviceChange,enableMute:this.config.enableMute,enablePause:this.config.enablePause,enableSourceSwitching:this.config.enableSourceSwitching},o=gx(n,this.state.recordingState,this.state.isPaused,a),s=!1;this.isDemo&&!n&&this.state.recordingState===`idle`&&this.state.recordedBlob!==null&&(s=!0);let c={...o,showDownloadButton:s},l=By;this.controller&&(l=this.controller.getCurrentSourceType());let{errorCode:u,browserName:d,browserVersion:f}=this.resolveBrowserErrorState();Eb({state:{stream:this.state.stream,transitionMessage:this.state.transitionMessage,recordingState:this.state.recordingState,countdown:this.state.countdown,timer:this.state.timer,isMuted:this.state.isMuted,isPaused:this.state.isPaused,errorCode:u,browserName:d,browserVersion:f},isVideoLoaded:this.state.isVideoLoaded,isRecording:n,controller:this.controller,audioLevel:0,buttonVisibility:c,currentSourceType:l,onStartRecording:()=>this.handleRecord(),onStopRecording:()=>this.handleStop(),onSwitchSource:()=>this.handleSwitch(),onToggleSettings:()=>this.updateState({showSettings:!this.state.showSettings}),onToggleMute:()=>this.handleMute(),onPause:()=>this.handlePauseToggle(),onResume:()=>this.handlePauseToggle(),onRetryCamera:()=>{this.startPreview().catch(e=>{let t;t=e instanceof Error?e:Error(i(e)),this.dispatchEvent(new CustomEvent(`error`,{detail:{error:t.message},bubbles:!0,composed:!0}))})},onLoadedChange:()=>this.updateState({isVideoLoaded:!0}),onDownload:()=>this.handleDownload(),translations:t.preview,buttonTranslations:t.buttons},this.previewContentElements),Ib(Pb({stream:this.state.stream,buttonVisibility:c,currentSourceType:l,isMuted:this.state.isMuted,isAudioReady:this.state.isAudioReady,onDownload:()=>this.handleDownload(),onPause:()=>this.handlePauseToggle(),onResume:()=>this.handlePauseToggle(),onStartRecording:()=>this.handleRecord(),onStopRecording:()=>this.handleStop(),onSwitchSource:()=>this.handleSwitch(),onToggleMute:()=>this.handleMute(),onToggleSettings:()=>this.updateState({showSettings:!this.state.showSettings}),recordingState:this.state.recordingState,isStopLocked:r,stopLockedTooltip:t.buttons.minimumRecordingTimeNotReached,buttonTranslations:t.buttons}),this.recordingControlsElements),Gy({uploadProgress:this.state.uploadProgress,uploadingLabel:e.uploading},{overlay:this.overlayElements.uploadOverlay,fill:this.overlayElements.uploadFill,text:this.overlayElements.uploadText}),Ky({transitionMessage:this.state.transitionMessage},{overlay:this.overlayElements.transitionOverlay,message:this.overlayElements.transitionMessage}),Xb(Yb({stream:this.state.stream,showSettings:this.state.showSettings,devices:this.state.devices,onCameraChange:e=>this.handleCameraChange(e),onMicChange:e=>this.handleMicChange(e),translations:t.settings}),this.settingsPanelElement,()=>this.renderSettings()),this.renderDeviceErrorOverlay(),this.renderAudioWarningToast(n),this.renderPermissionFlow(),this.renderMobileIndicators(n),this.renderConfigError()}renderAudioWarningToast(e){let t=this.shadowRoot;if(!t)return;let n=t.querySelector(`.vidtreo-audio-warning-toast`),r=this.state.audioWarning;if(!(e&&r!==null)){n&&(n.remove(),this.clearAudioWarningAutoDismiss());return}if(r===null)return;let i=this.resolveAudioWarningSeverity(r.code),a=this.resolveAudioWarningCopy(r.code),o=`${r.code}|${i}`;if(n&&n.dataset.signature===o)return;n&&n.remove(),this.clearAudioWarningAutoDismiss();let s=t.querySelector(`.vidtreo-preview-container`);if(!s)return;let c=document.createElement(`div`);c.className=`vidtreo-audio-warning-toast vidtreo-audio-warning-toast--${i}`,c.dataset.signature=o,c.setAttribute(`role`,`status`),c.setAttribute(`aria-live`,`polite`);let l=document.createElement(`span`);l.className=`vidtreo-audio-warning-toast__icon`,l.innerHTML=this.getAudioWarningIcon(i),c.appendChild(l);let u=document.createElement(`span`);u.className=`vidtreo-audio-warning-toast__content`;let d=document.createElement(`span`);d.className=`vidtreo-audio-warning-toast__title`,d.textContent=a.title;let f=document.createElement(`span`);if(f.className=`vidtreo-audio-warning-toast__message`,f.textContent=a.message,u.appendChild(d),u.appendChild(f),c.appendChild(u),i===`critical`||r.code===`audio.no-signal`){let e=document.createElement(`button`);e.className=`vidtreo-audio-warning-toast__dismiss`,e.type=`button`,e.setAttribute(`aria-label`,this.i18n.t(`audioWarningDismiss`)),e.innerHTML=`<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" fill="currentColor" viewBox="0 0 256 256"><path d="M205.66,194.34a8,8,0,0,1-11.32,11.32L128,139.31,61.66,205.66a8,8,0,0,1-11.32-11.32L116.69,128,50.34,61.66A8,8,0,0,1,61.66,50.34L128,116.69l66.34-66.35a8,8,0,0,1,11.32,11.32L139.31,128Z"/></svg>`,e.addEventListener(`click`,e=>{e.preventDefault(),e.stopPropagation(),this.updateState({audioWarning:null})}),c.appendChild(e)}r.code===`audio.low-signal`&&(this.audioWarningAutoDismissId=window.setTimeout(()=>{this.audioWarningAutoDismissId=null,this.updateState({audioWarning:null})},6e3)),s.appendChild(c)}clearAudioWarningAutoDismiss(){this.audioWarningAutoDismissId!==null&&(window.clearTimeout(this.audioWarningAutoDismissId),this.audioWarningAutoDismissId=null)}resolveAudioWarningSeverity(e){return e===`audio.track-ended`||e===`audio.track-muted-by-browser`||e===`audio.no-chunks`?`critical`:`soft`}resolveAudioWarningCopy(e){switch(e){case`audio.no-signal`:return{title:this.i18n.t(`audioWarningNoSignalTitle`),message:this.i18n.t(`audioWarningNoSignalMessage`)};case`audio.low-signal`:return{title:this.i18n.t(`audioWarningLowSignalTitle`),message:this.i18n.t(`audioWarningLowSignalMessage`)};case`audio.track-ended`:return{title:this.i18n.t(`audioWarningTrackEndedTitle`),message:this.i18n.t(`audioWarningTrackEndedMessage`)};case`audio.no-chunks`:return{title:this.i18n.t(`audioWarningNoChunksTitle`),message:this.i18n.t(`audioWarningNoChunksMessage`)};case`audio.track-muted-by-browser`:return{title:this.i18n.t(`audioWarningTrackMutedTitle`),message:this.i18n.t(`audioWarningTrackMutedMessage`)};default:return{title:``,message:``}}}getAudioWarningIcon(e){return e===`critical`?`<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" fill="currentColor" viewBox="0 0 256 256"><path d="M213.92,210.62a8,8,0,1,1-11.84,10.76L176,193.63V200a48,48,0,0,1-83.43,32.45A47.84,47.84,0,0,1,80,200V176a8,8,0,0,1,16,0v24a32,32,0,0,0,55.12,22.13L120,188.68V200a8,8,0,0,1-16,0V172.67l-16-17.6V200a8,8,0,0,1-16,0V138.27l-16-17.6V144a8,8,0,0,1-16,0V104.67L42.08,45.38A8,8,0,1,1,53.92,34.62ZM176,152V80A48,48,0,0,0,82.33,60.89l13.73,15.1A32,32,0,0,1,160,80v56.67Z"/></svg>`:`<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" fill="currentColor" viewBox="0 0 256 256"><path d="M128,24A104,104,0,1,0,232,128,104.11,104.11,0,0,0,128,24Zm-8,80V80a8,8,0,0,1,16,0v24a8,8,0,0,1-16,0Zm20,52a12,12,0,1,1-12-12A12,12,0,0,1,140,156Z"/></svg>`}renderDeviceErrorOverlay(){let e=this.shadowRoot;if(!e)return;let t=e.querySelector(`.vidtreo-audio-error-overlay`),n=Ay({errorCode:this.state.errorCode,hasAudioFailed:this.state.hasAudioFailed,error:this.state.error}),r=n.variant===`generic`;if(!(n.visible&&(r||this.state.recordingState===`idle`))){t&&t.remove();return}let i=r&&this.state.error?this.state.error:null,a=`${n.variant}|${i||``}`;if(t&&t.dataset.signature===a)return;t&&t.remove();let o=e.querySelector(`.vidtreo-preview-container`);if(!o)return;let s=this.getDeviceErrorIcon(n.variant),c=n.variant===`audio`?this.resolveAudioOverlayCopy(this.state.errorCode):null,l=c?c.title:this.getDeviceErrorTitle(n.variant),u=i||(c?c.message:this.getDeviceErrorMessage(n.variant)),d=c?c.retryLabel:this.i18n.t(`errorRetry`);t=document.createElement(`div`),t.className=`vidtreo-audio-error-overlay`,t.dataset.variant=n.variant,t.dataset.signature=a;let f=document.createElement(`div`);f.className=`vidtreo-audio-error-icon`,f.innerHTML=s,t.appendChild(f);let p=document.createElement(`h3`);p.className=`vidtreo-audio-error-title`,p.textContent=l,t.appendChild(p);let m=document.createElement(`p`);m.className=`vidtreo-audio-error-message`,m.textContent=u,t.appendChild(m);let h=null;if(n.canRetry){h=document.createElement(`button`),h.className=`vidtreo-audio-error-retry`,h.type=`button`,h.innerHTML=`<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" viewBox="0 0 256 256">
10908
+ </svg>`;let d=document.createElement(`span`);d.textContent=o,u.appendChild(d),u.addEventListener(`click`,e=>{e.preventDefault(),e.stopPropagation(),this.nativeCameraManager?.reset()}),n.appendChild(u),t.appendChild(n)}setupNativeCameraListeners(){let e=this.querySelector(`#btnSelectVideo`),t=this.querySelector(`#btnRecordVideo`),n=this.querySelector(`#btnNativeRetake`),r=this.querySelector(`#nativeCameraInput`);e?.addEventListener(`click`,()=>{r&&(r.accept=`video/*`,r.removeAttribute(`capture`),r.click())}),t?.addEventListener(`click`,()=>{r&&(r.accept=`video/*`,r.setAttribute(`capture`,`environment`),r.click())}),n?.addEventListener(`click`,()=>{this.nativeCameraManager?.reset()}),r?.addEventListener(`change`,async e=>{let t=e.target,n=t.files?.[0];if(n&&this.nativeCameraManager)try{let e=await this.nativeCameraManager.handleFileSelect(n);await this.nativeCameraManager.processAndUpload(e)}catch{}t.value=``})}attributeChangedCallback(e,t,n){if(t!==n){if(e===`min-time-record`){let e=Dx(this,{});this.config={...this.config,minTimeRecord:e.minTimeRecord},this.render();return}[`api-key`,`backend-url`,`demo`].includes(e)&&(this.initialized&&this.cleanup(),this.init())}}async init(){if(!this.isInitializing){this.isInitializing=!0;try{this.initialized&&this.cleanup(),this.config=this.resolveRecorderComponentConfig({});let e=this.config.apiKey||``,t=this.config.backendUrl||``;if(!(this.isDemo||e)){this.updateState({configError:Error(`apiKey is required. Provide it as an attribute or ensure demo mode is enabled.`)}),this.isInitializing=!1;return}this.isDemo||(this.uploadService=new ux({apiKey:e,backendUrl:t})),this.controller=new hy(Ny(this));let n={...this.config};if(await this.controller.initialize(n),await this.initializePermissionFlow(),this.initialized=!0,this.updateState({configError:null}),this.clearBrowserUnsupportedState(),this.mobileManager){Ox();return}this.cacheUiElements(),this.renderPermissionFlow(),this.setupEventListeners(),Ox(),this.getCanStartStreamFromPermissionFlow(this.permissionFlowSnapshot)&&setTimeout(()=>this.startPreview(),100)}catch(e){this.applyBrowserUnsupportedStateFromError(e),this.updateState({error:i(e)})}finally{this.isInitializing=!1}}}renderConfigError(){let e=this.state,t=!!e.configError;if(this.toggleDisplay(`#configErrorOverlay`,t),t&&e.configError){let t=e.configError.message.includes(`apiKey is required`);this.toggleDisplay(`#configErrorMessageDefault`,!t),this.toggleDisplay(`#configErrorDetails`,t),t||this.setText(`#configErrorMessageDefault`,e.configError.message)}}resolveRecorderComponentConfig(e){return Dx(this,e,this.i18n.t(`userInAnotherTab`))}cleanup(){this.audioStatusUnsub&&=(this.audioStatusUnsub(),null),this.cleanupPermissionFlow(),this.controller&&=(this.controller.cleanup(),null),this.stopAudioAnalysis(),this.initialized=!1,this.state={...Lx},this.permissionFlowElements=null}updateState(e){let t={...this.state,...e};e.stream!==void 0&&(t={...t,isVideoLoaded:!1}),e.recordingState!==void 0&&t.showSettings&&t.recordingState===Uy&&(t={...t,showSettings:!1}),this.state=t,this.mobileManager&&e.uploadProgress!==void 0&&this.mobileManager.checkUploadCompletion(this.state.uploadProgress),this.render(),e.stream!==void 0&&this.handleStreamUpdate(this.state.stream),this.state.devices.cameras.length===0&&this.state.stream&&this.updateDevices()}async updateDevices(){if(!this.controller)return;let e=this.controller.getDeviceManager(),t=await e.getAvailableDevices();this.updateState({devices:{cameras:t.videoinput,microphones:t.audioinput,selectedCamera:e.getSelectedCameraDeviceId(),selectedMic:e.getSelectedMicDeviceId()}})}handleStreamUpdate(e){this.videoPreviewElements||this.cacheUiElements(),this.videoPreviewElements&&yb(e,this.videoPreviewElements,{onVideoLoaded:()=>{this.updateState({isVideoLoaded:!0}),this.updateOverlayPhase()},onError:e=>{this.updateState({error:e})},startAudioAnalysis:e=>this.startAudioAnalysis(e),stopAudioAnalysis:()=>this.stopAudioAnalysis()})}startAudioAnalysis(e){if(this.stopAudioAnalysis(),e.getAudioTracks().length!==0)try{this.audioContext=new AudioContext;let t=this.audioContext.createMediaStreamSource(e);this.analyser=this.audioContext.createAnalyser(),this.analyser.fftSize=64,t.connect(this.analyser);let n=new Uint8Array(this.analyser.frequencyBinCount),r=()=>{if(!this.analyser)return;this.analyser.getByteFrequencyData(n);let e=0;for(let t of n)e+=t;let t=e/n.length,i=Math.min(1,t/128);this.renderAudioBars(i),this.animationFrameId=requestAnimationFrame(r)};r()}catch(e){this.updateState({error:i(e)})}}stopAudioAnalysis(){this.animationFrameId&&=(cancelAnimationFrame(this.animationFrameId),null),this.audioContext&&=(this.audioContext.close(),null)}renderAudioBars(e){if(!this.audioBarsContainer)return;let t=Gy,n=``;if(!this.state.isMuted)for(let r of t){let t=Math.max(4,e*24*r);n+=`<div class="vidtreo-audio-level-bar" style="height: ${t}px;"></div>`}this.audioBarsContainer.innerHTML=n}render(){if(this.mobileManager&&!this.mobileManager.isModalOpen||(this.previewContentElements&&this.recordingControlsElements&&this.overlayElements&&this.videoPreviewElements||this.cacheUiElements(),!(this.previewContentElements&&this.recordingControlsElements&&this.overlayElements&&this.videoPreviewElements)))return;let e=this.i18n.getAll(),t=lx(e),n=this.state.recordingState===Uy||this.state.isPaused,r=Nx(this.config.minTimeRecord,this.state.timer,n),a={enableDeviceChange:this.config.enableDeviceChange,enableMute:this.config.enableMute,enablePause:this.config.enablePause,enableSourceSwitching:this.config.enableSourceSwitching},o=_x(n,this.state.recordingState,this.state.isPaused,a),s=!1;this.isDemo&&!n&&this.state.recordingState===`idle`&&this.state.recordedBlob!==null&&(s=!0);let c={...o,showDownloadButton:s},l=Vy;this.controller&&(l=this.controller.getCurrentSourceType());let{errorCode:u,browserName:d,browserVersion:f}=this.resolveBrowserErrorState();Db({state:{stream:this.state.stream,transitionMessage:this.state.transitionMessage,recordingState:this.state.recordingState,countdown:this.state.countdown,timer:this.state.timer,isMuted:this.state.isMuted,isPaused:this.state.isPaused,errorCode:u,browserName:d,browserVersion:f},isVideoLoaded:this.state.isVideoLoaded,isRecording:n,controller:this.controller,audioLevel:0,buttonVisibility:c,currentSourceType:l,onStartRecording:()=>this.handleRecord(),onStopRecording:()=>this.handleStop(),onSwitchSource:()=>this.handleSwitch(),onToggleSettings:()=>this.updateState({showSettings:!this.state.showSettings}),onToggleMute:()=>this.handleMute(),onPause:()=>this.handlePauseToggle(),onResume:()=>this.handlePauseToggle(),onRetryCamera:()=>{this.startPreview().catch(e=>{let t;t=e instanceof Error?e:Error(i(e)),this.dispatchEvent(new CustomEvent(`error`,{detail:{error:t.message},bubbles:!0,composed:!0}))})},onLoadedChange:()=>this.updateState({isVideoLoaded:!0}),onDownload:()=>this.handleDownload(),translations:t.preview,buttonTranslations:t.buttons},this.previewContentElements),Lb(Fb({stream:this.state.stream,buttonVisibility:c,currentSourceType:l,isMuted:this.state.isMuted,isAudioReady:this.state.isAudioReady,onDownload:()=>this.handleDownload(),onPause:()=>this.handlePauseToggle(),onResume:()=>this.handlePauseToggle(),onStartRecording:()=>this.handleRecord(),onStopRecording:()=>this.handleStop(),onSwitchSource:()=>this.handleSwitch(),onToggleMute:()=>this.handleMute(),onToggleSettings:()=>this.updateState({showSettings:!this.state.showSettings}),recordingState:this.state.recordingState,isStopLocked:r,stopLockedTooltip:t.buttons.minimumRecordingTimeNotReached,buttonTranslations:t.buttons}),this.recordingControlsElements),Ky({uploadProgress:this.state.uploadProgress,uploadingLabel:e.uploading},{overlay:this.overlayElements.uploadOverlay,fill:this.overlayElements.uploadFill,text:this.overlayElements.uploadText}),qy({transitionMessage:this.state.transitionMessage},{overlay:this.overlayElements.transitionOverlay,message:this.overlayElements.transitionMessage}),Zb(Xb({stream:this.state.stream,showSettings:this.state.showSettings,devices:this.state.devices,onCameraChange:e=>this.handleCameraChange(e),onMicChange:e=>this.handleMicChange(e),translations:t.settings}),this.settingsPanelElement,()=>this.renderSettings()),this.renderDeviceErrorOverlay(),this.renderAudioWarningToast(n),this.renderPermissionFlow(),this.renderMobileIndicators(n),this.renderConfigError()}renderAudioWarningToast(e){let t=this.shadowRoot;if(!t)return;let n=t.querySelector(`.vidtreo-audio-warning-toast`),r=this.state.audioWarning;if(!(e&&r!==null)){n&&(n.remove(),this.clearAudioWarningAutoDismiss());return}if(r===null)return;let i=this.resolveAudioWarningSeverity(r.code),a=this.resolveAudioWarningCopy(r.code),o=`${r.code}|${i}`;if(n&&n.dataset.signature===o)return;n&&n.remove(),this.clearAudioWarningAutoDismiss();let s=t.querySelector(`.vidtreo-preview-container`);if(!s)return;let c=document.createElement(`div`);c.className=`vidtreo-audio-warning-toast vidtreo-audio-warning-toast--${i}`,c.dataset.signature=o,c.setAttribute(`role`,`status`),c.setAttribute(`aria-live`,`polite`);let l=document.createElement(`span`);l.className=`vidtreo-audio-warning-toast__icon`,l.innerHTML=this.getAudioWarningIcon(i),c.appendChild(l);let u=document.createElement(`span`);u.className=`vidtreo-audio-warning-toast__content`;let d=document.createElement(`span`);d.className=`vidtreo-audio-warning-toast__title`,d.textContent=a.title;let f=document.createElement(`span`);if(f.className=`vidtreo-audio-warning-toast__message`,f.textContent=a.message,u.appendChild(d),u.appendChild(f),c.appendChild(u),i===`critical`||r.code===`audio.no-signal`){let e=document.createElement(`button`);e.className=`vidtreo-audio-warning-toast__dismiss`,e.type=`button`,e.setAttribute(`aria-label`,this.i18n.t(`audioWarningDismiss`)),e.innerHTML=`<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" fill="currentColor" viewBox="0 0 256 256"><path d="M205.66,194.34a8,8,0,0,1-11.32,11.32L128,139.31,61.66,205.66a8,8,0,0,1-11.32-11.32L116.69,128,50.34,61.66A8,8,0,0,1,61.66,50.34L128,116.69l66.34-66.35a8,8,0,0,1,11.32,11.32L139.31,128Z"/></svg>`,e.addEventListener(`click`,e=>{e.preventDefault(),e.stopPropagation(),this.updateState({audioWarning:null})}),c.appendChild(e)}r.code===`audio.low-signal`&&(this.audioWarningAutoDismissId=window.setTimeout(()=>{this.audioWarningAutoDismissId=null,this.updateState({audioWarning:null})},6e3)),s.appendChild(c)}clearAudioWarningAutoDismiss(){this.audioWarningAutoDismissId!==null&&(window.clearTimeout(this.audioWarningAutoDismissId),this.audioWarningAutoDismissId=null)}resolveAudioWarningSeverity(e){return e===`audio.track-ended`||e===`audio.track-muted-by-browser`||e===`audio.no-chunks`?`critical`:`soft`}resolveAudioWarningCopy(e){switch(e){case`audio.no-signal`:return{title:this.i18n.t(`audioWarningNoSignalTitle`),message:this.i18n.t(`audioWarningNoSignalMessage`)};case`audio.low-signal`:return{title:this.i18n.t(`audioWarningLowSignalTitle`),message:this.i18n.t(`audioWarningLowSignalMessage`)};case`audio.track-ended`:return{title:this.i18n.t(`audioWarningTrackEndedTitle`),message:this.i18n.t(`audioWarningTrackEndedMessage`)};case`audio.no-chunks`:return{title:this.i18n.t(`audioWarningNoChunksTitle`),message:this.i18n.t(`audioWarningNoChunksMessage`)};case`audio.track-muted-by-browser`:return{title:this.i18n.t(`audioWarningTrackMutedTitle`),message:this.i18n.t(`audioWarningTrackMutedMessage`)};default:return{title:``,message:``}}}getAudioWarningIcon(e){return e===`critical`?`<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" fill="currentColor" viewBox="0 0 256 256"><path d="M213.92,210.62a8,8,0,1,1-11.84,10.76L176,193.63V200a48,48,0,0,1-83.43,32.45A47.84,47.84,0,0,1,80,200V176a8,8,0,0,1,16,0v24a32,32,0,0,0,55.12,22.13L120,188.68V200a8,8,0,0,1-16,0V172.67l-16-17.6V200a8,8,0,0,1-16,0V138.27l-16-17.6V144a8,8,0,0,1-16,0V104.67L42.08,45.38A8,8,0,1,1,53.92,34.62ZM176,152V80A48,48,0,0,0,82.33,60.89l13.73,15.1A32,32,0,0,1,160,80v56.67Z"/></svg>`:`<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" fill="currentColor" viewBox="0 0 256 256"><path d="M128,24A104,104,0,1,0,232,128,104.11,104.11,0,0,0,128,24Zm-8,80V80a8,8,0,0,1,16,0v24a8,8,0,0,1-16,0Zm20,52a12,12,0,1,1-12-12A12,12,0,0,1,140,156Z"/></svg>`}renderDeviceErrorOverlay(){let e=this.shadowRoot;if(!e)return;let t=e.querySelector(`.vidtreo-audio-error-overlay`),n=jy({errorCode:this.state.errorCode,hasAudioFailed:this.state.hasAudioFailed,error:this.state.error}),r=n.variant===`generic`;if(!(n.visible&&(r||this.state.recordingState===`idle`))){t&&t.remove();return}let i=r&&this.state.error?this.state.error:null,a=`${n.variant}|${i||``}`;if(t&&t.dataset.signature===a)return;t&&t.remove();let o=e.querySelector(`.vidtreo-preview-container`);if(!o)return;let s=this.getDeviceErrorIcon(n.variant),c=n.variant===`audio`?this.resolveAudioOverlayCopy(this.state.errorCode):null,l=c?c.title:this.getDeviceErrorTitle(n.variant),u=i||(c?c.message:this.getDeviceErrorMessage(n.variant)),d=c?c.retryLabel:this.i18n.t(`errorRetry`);t=document.createElement(`div`),t.className=`vidtreo-audio-error-overlay`,t.dataset.variant=n.variant,t.dataset.signature=a;let f=document.createElement(`div`);f.className=`vidtreo-audio-error-icon`,f.innerHTML=s,t.appendChild(f);let p=document.createElement(`h3`);p.className=`vidtreo-audio-error-title`,p.textContent=l,t.appendChild(p);let m=document.createElement(`p`);m.className=`vidtreo-audio-error-message`,m.textContent=u,t.appendChild(m);let h=null;if(n.canRetry){h=document.createElement(`button`),h.className=`vidtreo-audio-error-retry`,h.type=`button`,h.innerHTML=`<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" viewBox="0 0 256 256">
10909
10909
  <path d="M240,56v48a8,8,0,0,1-8,8H184a8,8,0,0,1,0-16h28.69L187.8,71.11A88,88,0,0,0,40.36,98.72,8,8,0,1,1,24.64,93.28,104,104,0,0,1,198.13,60.87L224,86.75V56a8,8,0,0,1,16,0ZM215.36,157.28a88,88,0,0,1-147.44,27.61L43.31,160H72a8,8,0,0,0,0-16H24a8,8,0,0,0-8,8v48a8,8,0,0,0,16,0V169.25l25.87,25.88A104,104,0,0,0,231.36,162.72a8,8,0,0,1-16,5.44Z"/>
10910
10910
  </svg>`;let e=document.createElement(`span`);e.textContent=d,h.appendChild(e),t.appendChild(h)}h&&h.addEventListener(`click`,e=>{e.preventDefault(),e.stopPropagation(),t?.remove(),this.updateState({hasAudioFailed:!1,errorCode:null,error:null}),this.startPreview().catch(e=>{})}),o.appendChild(t)}getDeviceErrorIcon(e){switch(e){case`audio`:return`<svg xmlns="http://www.w3.org/2000/svg" width="28" height="28" fill="currentColor" viewBox="0 0 256 256">
10911
10911
  <path d="M213.92,210.62a8,8,0,1,1-11.84,10.76L176,193.63V200a48,48,0,0,1-83.43,32.45A47.84,47.84,0,0,1,80,200V176a8,8,0,0,1,16,0v24a32,32,0,0,0,55.12,22.13L120,188.68V200a8,8,0,0,1-16,0V172.67l-16-17.6V200a8,8,0,0,1-16,0V138.27l-16-17.6V144a8,8,0,0,1-16,0V104.67L42.08,45.38A8,8,0,1,1,53.92,34.62ZM176,152V80A48,48,0,0,0,82.33,60.89l13.73,15.1A32,32,0,0,1,160,80v56.67Z"/>
@@ -10913,7 +10913,7 @@ Mediabunny was loaded twice.\` + " This will likely cause Mediabunny not to work
10913
10913
  <path d="M251.77,73a8,8,0,0,0-8.21.39L208,97.05V72a16,16,0,0,0-16-16H32A16,16,0,0,0,16,72V184a16,16,0,0,0,16,16H192a16,16,0,0,0,16-16V159l35.56,23.71A8,8,0,0,0,256,176V80A8,8,0,0,0,251.77,73ZM192,184H32V72H192V184Zm48-22.95-32-21.33V116.28l32-21.33Z"/>
10914
10914
  </svg>`;default:return`<svg xmlns="http://www.w3.org/2000/svg" width="28" height="28" fill="currentColor" viewBox="0 0 256 256">
10915
10915
  <path d="M128,24A104,104,0,1,0,232,128,104.11,104.11,0,0,0,128,24Zm0,192a88,88,0,1,1,88-88A88.1,88.1,0,0,1,128,216Zm-8-80V80a8,8,0,0,1,16,0v56a8,8,0,0,1-16,0Zm20,36a12,12,0,1,1-12-12A12,12,0,0,1,140,172Z"/>
10916
- </svg>`}}getDeviceErrorTitle(e){switch(e){case`audio`:return this.i18n.t(`audioErrorTitle`);case`camera`:return this.i18n.t(`cameraErrorTitle`);case`browser`:return this.i18n.t(`browserErrorTitle`);default:return this.i18n.t(`genericErrorTitle`)}}getDeviceErrorMessage(e){switch(e){case`audio`:return this.i18n.t(`audioErrorMessage`);case`camera`:return this.i18n.t(`cameraErrorMessage`);case`browser`:return this.i18n.t(`browserErrorMessage`);default:return this.i18n.t(`genericErrorMessage`)}}resolveAudioOverlayCopy(e){let t=new Set([`recording.audio-no-chunks`,`recording.audio-track-ended`,`recording.no-audio-track`,`recording.no-audio-frames`]),n=new Set([`recording.audio-silent`]),r=new Set([`recording.audio-zero-channels`,`recording.audio-invalid-sample-rate`]);return e&&t.has(e)?{title:this.i18n.t(`audioMissingTitle`),message:this.i18n.t(`audioMissingMessage`),retryLabel:this.i18n.t(`audioMissingRetry`)}:e&&n.has(e)?{title:this.i18n.t(`audioSilentTitle`),message:this.i18n.t(`audioSilentMessage`),retryLabel:this.i18n.t(`audioMissingRetry`)}:e&&r.has(e)?{title:this.i18n.t(`audioProcessingErrorTitle`),message:this.i18n.t(`audioProcessingErrorMessage`),retryLabel:this.i18n.t(`audioMissingRetry`)}:{title:this.i18n.t(`audioErrorTitle`),message:this.i18n.t(`audioErrorMessage`),retryLabel:this.i18n.t(`audioErrorRetry`)}}renderMobileIndicators(e){this.mobileManager?.isModalOpen&&(this.toggleDisplay(`#mobileRecIndicator`,e),this.toggleDisplay(`#mobileTimerBadge`,e),this.setText(`#mobileTimer`,this.state.timer))}toggleDisplay(e,t){let n=this.queryMobileElement(e);if(!n)return;if(!t){n.style.display=`none`;return}let r=n.tagName===`BUTTON`,i=e.includes(`row`)||e.includes(`controls`)||e.includes(`Overlay`)||e.includes(`Indicator`)||e.includes(`Timer`)||e.includes(`Bars`),a=`block`;r&&(a=`inline-flex`),!r&&i&&(a=`flex`),n.style.display=a}setText(e,t){let n=this.queryMobileElement(e);n&&(n.textContent=t)}async startPreview(){if(this.controller&&!this.isStartingPreview){this.isStartingPreview=!0;try{if(!await this.resolveCanStartStreamFromPermissionFlow())return;await this.controller.startStream(),this.updateState({stream:this.controller.getStream(),isAudioReady:this.controller.isAudioReady()}),this.clearBrowserUnsupportedState(),this.audioStatusUnsub&&=(this.audioStatusUnsub(),null),this.audioStatusUnsub=this.controller.getStreamManager().on(`audiostatuschange`,({status:e})=>{this.updateState({isAudioReady:e===`acquired`,hasAudioFailed:e===`failed`})})}catch(e){this.applyBrowserUnsupportedStateFromError(e),this.updateState({error:i(e)}),this.overlayPhase=`hidden`,this.renderPermissionFlow()}finally{this.isStartingPreview=!1}}}getPermissionFlowTranslations(){return{title:this.i18n.t(`permissionFlowTitle`),cameraTitle:this.i18n.t(`permissionFlowCameraTitle`),microphoneTitle:this.i18n.t(`permissionFlowMicrophoneTitle`),cameraLabel:this.i18n.t(`permissionFlowCameraLabel`),microphoneLabel:this.i18n.t(`permissionFlowMicrophoneLabel`),statusPending:this.i18n.t(`permissionFlowStatusPending`),statusGranted:this.i18n.t(`permissionFlowStatusGranted`),statusDenied:this.i18n.t(`permissionFlowStatusDenied`),statusRequesting:this.i18n.t(`permissionFlowStatusRequesting`),allowCamera:this.i18n.t(`permissionFlowAllowCamera`),allowMicrophone:this.i18n.t(`permissionFlowAllowMicrophone`),retry:this.i18n.t(`permissionFlowRetry`),recoveryTitle:this.i18n.t(`permissionFlowRecoveryTitle`),recoveryInstructions:this.i18n.t(`permissionFlowRecoveryInstructions`),connecting:this.i18n.t(`permissionFlowConnecting`)}}updatePermissionFlowSnapshot(e){this.permissionFlowSnapshot=e,this.updateOverlayPhase(),this.renderPermissionFlow(),this.getCanStartStreamFromPermissionFlow(e)&&!this.state.stream&&!this.isStartingPreview&&!this.mobileManager&&setTimeout(()=>this.startPreview(),100)}updateOverlayPhase(){let e=this.permissionFlowSnapshot;if(e.step===`checking`||e.step===`awaiting-user`||e.step===`blocked`){this.overlayPhase=`active`;return}if(e.step===`ready`||e.isComplete){if(this.overlayPhase===`active`){this.state.isVideoLoaded?this.startOverlayFadeOut():this.overlayPhase=`loading`;return}this.overlayPhase===`loading`&&this.state.isVideoLoaded&&this.startOverlayFadeOut()}}startOverlayFadeOut(){this.overlayPhase=`fading`,this.renderPermissionFlow(),this.overlayFadeTimeoutId!==null&&clearTimeout(this.overlayFadeTimeoutId),this.overlayFadeTimeoutId=setTimeout(()=>{this.overlayPhase=`hidden`,this.overlayFadeTimeoutId=null,this.renderPermissionFlow()},600)}async initializePermissionFlow(){this.cleanupPermissionFlow();let e=`en`;this.lang===`es`&&(e=`es`),this.permissionFlowOrchestrator=new Rn(Ln(),{callbacks:{onChange:e=>{this.updatePermissionFlowSnapshot(e)},onComplete:e=>{this.updatePermissionFlowSnapshot(e)}},language:e});let t=await this.permissionFlowOrchestrator.initialize();this.updatePermissionFlowSnapshot(t)}cleanupPermissionFlow(){this.overlayFadeTimeoutId!==null&&(clearTimeout(this.overlayFadeTimeoutId),this.overlayFadeTimeoutId=null),this.overlayPhase=`hidden`;let e=sb(Fx,this.getPermissionFlowTranslations(),!1);this.permissionFlowElements&&mb(e,this.permissionFlowElements),this.permissionFlowOrchestrator&&=(this.permissionFlowOrchestrator.destroy(),null),this.permissionFlowSnapshot=Fx,this.isStartingPreview=!1}async requestPermissionCurrentStep(){if(!this.permissionFlowOrchestrator)return;let e=await this.permissionFlowOrchestrator.requestCurrentStep();this.updatePermissionFlowSnapshot(e)}async retryPermissionCurrentStep(){if(!this.permissionFlowOrchestrator)return;let e=await this.permissionFlowOrchestrator.retryCurrentStep();this.updatePermissionFlowSnapshot(e)}getCanStartStreamFromPermissionFlow(e){return!(!e.isComplete||e.step!==`ready`)}async resolveCanStartStreamFromPermissionFlow(){if(this.permissionFlowOrchestrator||await this.initializePermissionFlow(),!this.permissionFlowOrchestrator)return!1;if(this.getCanStartStreamFromPermissionFlow(this.permissionFlowSnapshot))return!0;let e=await this.permissionFlowOrchestrator.requestCurrentStep();return this.updatePermissionFlowSnapshot(e),this.getCanStartStreamFromPermissionFlow(e)}renderPermissionFlow(){if(!this.permissionFlowElements)return;let e=this.overlayPhase===`fading`,t=sb(this.permissionFlowSnapshot,this.getPermissionFlowTranslations(),e);this.overlayPhase===`hidden`&&(t.isVisible=!1),mb(t,this.permissionFlowElements,{onAllow:()=>{this.requestPermissionCurrentStep().catch(e=>{this.updateState({error:i(e)})})},onRetry:()=>{this.retryPermissionCurrentStep().catch(e=>{this.updateState({error:i(e)})})}})}stopPreview(){if(!this.controller)return;this.stopAudioAnalysis();let e=this.controller.getStream();if(e)for(let t of e.getTracks())t.stop();this.controller.getStreamManager().stopStream(),this.updateState({stream:null,error:null,errorCode:null,canRetry:!1,browserName:null,browserVersion:null})}renderMobile(){if(!this.mobileManager)return;let e=this.mobileManager.portal;if(!this.mobileManager.isModalOpen){this.innerHTML=dx(this.i18n),this.setupMobileLandingListeners(),Dx();return}let t=mx(this.i18n),n=fx(this.i18n,this.mobileManager.canCloseModal,t);e.render(n),this.setupMobileModalListeners(),this.setupEventListeners(),this.cacheUiElements(),this.handleStreamUpdate(this.state.stream),this.render(),Dx()}queryMobileElement(e){return this.mobileManager?.isModalOpen&&this.mobileManager.portal.isActive?this.mobileManager.portal.querySelector(e):this.querySelector(e)}getQueryRoot(){return this.mobileManager?.isModalOpen&&this.mobileManager.portal.isActive?this.mobileManager.portal:this}cacheUiElements(){let e=this.getQueryRoot();this.previewContentElements=yb(e),this.recordingControlsElements=Fb(e),this.videoPreviewElements={previewSkeleton:this.previewContentElements.previewSkeleton,videoPreview:this.previewContentElements.videoPreview},this.audioBarsContainer=this.previewContentElements.audioLevelBars,this.overlayElements={uploadOverlay:e.querySelector(`#uploadProgressOverlay`),uploadFill:e.querySelector(`#uploadProgressFill`),uploadText:e.querySelector(`#uploadProgressText`),transitionOverlay:e.querySelector(`#sourceTransitionOverlay`),transitionMessage:e.querySelector(`#transitionMessage`)},this.settingsPanelElement=e.querySelector(`#settingsPanel`),this.permissionFlowElements=nb(e)}setupMobileLandingListeners(){this.querySelector(`#btnMobileOpenCamera`)?.addEventListener(`click`,()=>this.mobileManager?.openModal())}setupMobileModalListeners(){this.queryMobileElement(`#btnMobileCloseModal`)?.addEventListener(`click`,()=>this.mobileManager?.closeModal())}handleCameraChange(e){return this.handleDeviceChange(e,`camera`)}handleMicChange(e){return this.handleDeviceChange(e,`mic`)}async handleDeviceChange(e,t){if(!this.controller)return;let n=Ny(this.controller,e);t===`mic`&&(n=Py(this.controller,e)),await n.then(e=>{this.updateState({stream:e})}).catch(e=>{this.updateState({error:i(e)})});let r=this.state.devices;t===`camera`&&(r={...this.state.devices,selectedCamera:e}),t===`mic`&&(r={...this.state.devices,selectedMic:e}),this.updateState({devices:r})}async handleRecord(){if(this.controller)try{this.updateState({configError:null,audioWarning:null}),this.clearAudioWarningAutoDismiss(),await Fy(this.controller,By)}catch(e){this.applyBrowserUnsupportedStateFromError(e),this.updateState({configError:Error(i(e)),error:i(e)})}}async processRecordingBlob(e){if(!this.isProcessingBlob){this.isProcessingBlob=!0;try{if(this.isDemo){this.updateState({recordedBlob:e});return}if(!this.uploadService)throw Error(`Upload service not ready`);let t=`recording-${Date.now()}.mp4`;this.updateState({uploadProgress:0});try{let n=await this.uploadService.uploadVideo(e,{apiKey:this.config.apiKey||``,backendUrl:this.config.backendUrl||``,filename:t,userMetadata:this.config.userMetadata,onProgress:e=>{this.updateState({uploadProgress:e})}});this.updateState({uploadProgress:null}),this.dispatchEvent(new CustomEvent(`upload-complete`,{detail:n}))}catch(e){throw this.updateState({uploadProgress:null}),e}}finally{this.isProcessingBlob=!1}}}isStopBlockedByMinimumTime(){let e=this.state.recordingState===Hy||this.state.isPaused;return Mx(this.config.minTimeRecord,this.state.timer,e)}async stopRecording(){if(!this.controller)return null;if(this.isStopBlockedByMinimumTime())throw Nx();let e=await Iy(this.controller,this.isDemo,()=>{},()=>{});return e&&await this.processRecordingBlob(e),e}async handleStop(){if(!this.isStopBlockedByMinimumTime())try{await this.stopRecording()}catch(e){this.applyBrowserUnsupportedStateFromError(e),this.updateState({error:i(e)})}}handlePauseToggle(){this.controller&&(this.state.isPaused&&Ry(this.controller),this.state.isPaused||Ly(this.controller),this.updateState({isPaused:this.controller.isPaused()}))}handleDownload(){this.state.recordedBlob&&Qb(this.state.recordedBlob)}handleMute(){this.controller&&(Zb(this.controller),this.updateState({isMuted:this.controller.getIsMuted()}))}async handleSwitch(){if(!this.controller)return;let e=this.controller.getCurrentSourceType(),t=By;e===By&&(t=Vy),e===Vy&&(t=By);try{await zy(this.controller,t)}catch(e){this.applyBrowserUnsupportedStateFromError(e),this.updateState({error:i(e)})}}setupEventListeners(){let e=(e,t)=>{let n=this.queryMobileElement(e);n&&n.addEventListener(`click`,t)};e(`#btnRecord`,()=>this.handleRecord()),e(`#btnStop`,()=>this.handleStop()),e(`#btnPause`,()=>this.handlePauseToggle()),e(`#btnDownload`,()=>this.handleDownload()),e(`#btnMute`,()=>this.handleMute()),e(`#btnSwitchSource`,()=>this.handleSwitch());let t=this.queryMobileElement(`#startCameraArea`);t&&t.addEventListener(`click`,()=>this.startPreview());let n=this.queryMobileElement(`#btnSettings`),r=this.queryMobileElement(`#settingsPanel`);n&&r&&n.addEventListener(`click`,()=>{let e=!this.state.showSettings;this.updateState({showSettings:e}),e&&this.populateSettings()});let i=this.queryMobileElement(`#btnSettingsBack`);i&&r&&i.addEventListener(`click`,()=>{}),this.setupSettingsListeners()}setupSettingsListeners(){let e=this.queryMobileElement(`#btnCameraMenu`);e&&e.addEventListener(`click`,()=>this.navigateSettings(`camera`));let t=this.queryMobileElement(`#btnMicMenu`);t&&t.addEventListener(`click`,()=>this.navigateSettings(`microphone`));let n=this.queryMobileElement(`#btnSettingsBack`);n&&n.addEventListener(`click`,e=>{e.stopPropagation(),this.settingsView!==`main`&&this.navigateSettings(`main`)})}navigateSettings(e){e===`main`?this.slideDirection=`left`:this.slideDirection=`right`,this.settingsView=e,this.renderSettings(),setTimeout(()=>{this.slideDirection=`none`,this.renderSettings()},300)}renderSettings(){this.updateSettingsContent(),this.renderSettingsView()}updateSettingsContent(){let e=this.queryMobileElement(`#settingsContent`);e&&(e.classList.remove(`vidtreo-slide-left`,`vidtreo-slide-right`,`vidtreo-slide-none`),this.slideDirection!==`none`&&e.classList.add(`vidtreo-slide-${this.slideDirection}`))}renderSettingsView(){let e=this.queryMobileElement(`#settingsMain`),t=this.queryMobileElement(`#cameraList`),n=this.queryMobileElement(`#micList`),r=this.queryMobileElement(`#btnSettingsBack`);e&&(e.style.display=`none`),t&&(t.style.display=`none`),n&&(n.style.display=`none`),r&&(r.style.display=`none`),this.settingsView===`main`&&this.renderSettingsMain(e,r),this.settingsView===`camera`&&this.renderSettingsCamera(t,r),this.settingsView===`microphone`&&this.renderSettingsMicrophone(n,r)}renderSettingsMain(e,t){e&&(e.style.display=`flex`),t&&(t.style.display=`none`),this.updateCurrentDeviceLabels()}updateCurrentDeviceLabels(){let e=this.state.devices.cameras.filter(e=>e.deviceId&&e.deviceId.trim()!==``),t=this.state.devices.microphones.filter(e=>e.deviceId&&e.deviceId.trim()!==``),n=e.find(e=>e.deviceId===this.state.devices.selectedCamera),r=t.find(e=>e.deviceId===this.state.devices.selectedMic),i=n?.label||e[0]?.label||`Camera`,a=r?.label||t[0]?.label||`Microphone`;this.setText(`#currentCameraName`,i),this.setText(`#currentMicName`,a)}renderSettingsCamera(e,t){e&&(e.style.display=`flex`,this.renderDeviceList(e,this.state.devices.cameras,this.state.devices.selectedCamera,`camera`));let n=this.queryMobileElement(`.vidtreo-settings-title`),r=this.queryMobileElement(`.vidtreo-settings-back-icon`);t&&(t.style.display=`flex`,t.style.cursor=`pointer`,t.onclick=()=>this.navigateSettings(`main`)),n&&(n.textContent=`Camera`),r&&(r.style.display=`flex`)}renderSettingsMicrophone(e,t){e&&(e.style.display=`flex`,this.renderDeviceList(e,this.state.devices.microphones,this.state.devices.selectedMic,`mic`));let n=this.queryMobileElement(`.vidtreo-settings-title`),r=this.queryMobileElement(`.vidtreo-settings-back-icon`);t&&(t.style.display=`flex`,t.style.cursor=`pointer`,t.onclick=()=>this.navigateSettings(`main`)),n&&(n.textContent=`Microphone`),r&&(r.style.display=`flex`)}renderDeviceList(e,t,n,r){if(!t||t.length===0){e.innerHTML=`<div class="vidtreo-device-empty">No devices found</div>`;return}e.innerHTML=``;for(let i of t){let t=document.createElement(`button`);t.className=`vidtreo-device-option`;let a=i.deviceId===n,o=`<span class="vidtreo-device-checkmark-placeholder"></span>`;a&&(o=`<i class="ph-fill ph-check vidtreo-device-checkmark" style="display: flex; font-size: 20px;"></i>`);let s=i.label;s||=`Device ${i.deviceId.slice(0,8)}`,t.innerHTML=`
10916
+ </svg>`}}getDeviceErrorTitle(e){switch(e){case`audio`:return this.i18n.t(`audioErrorTitle`);case`camera`:return this.i18n.t(`cameraErrorTitle`);case`browser`:return this.i18n.t(`browserErrorTitle`);default:return this.i18n.t(`genericErrorTitle`)}}getDeviceErrorMessage(e){switch(e){case`audio`:return this.i18n.t(`audioErrorMessage`);case`camera`:return this.i18n.t(`cameraErrorMessage`);case`browser`:return this.i18n.t(`browserErrorMessage`);default:return this.i18n.t(`genericErrorMessage`)}}resolveAudioOverlayCopy(e){let t=new Set([`recording.audio-no-chunks`,`recording.audio-track-ended`,`recording.no-audio-track`,`recording.no-audio-frames`]),n=new Set([`recording.audio-silent`]),r=new Set([`recording.audio-zero-channels`,`recording.audio-invalid-sample-rate`]);return e&&t.has(e)?{title:this.i18n.t(`audioMissingTitle`),message:this.i18n.t(`audioMissingMessage`),retryLabel:this.i18n.t(`audioMissingRetry`)}:e&&n.has(e)?{title:this.i18n.t(`audioSilentTitle`),message:this.i18n.t(`audioSilentMessage`),retryLabel:this.i18n.t(`audioMissingRetry`)}:e&&r.has(e)?{title:this.i18n.t(`audioProcessingErrorTitle`),message:this.i18n.t(`audioProcessingErrorMessage`),retryLabel:this.i18n.t(`audioMissingRetry`)}:{title:this.i18n.t(`audioErrorTitle`),message:this.i18n.t(`audioErrorMessage`),retryLabel:this.i18n.t(`audioErrorRetry`)}}renderMobileIndicators(e){this.mobileManager?.isModalOpen&&(this.toggleDisplay(`#mobileRecIndicator`,e),this.toggleDisplay(`#mobileTimerBadge`,e),this.setText(`#mobileTimer`,this.state.timer))}toggleDisplay(e,t){let n=this.queryMobileElement(e);if(!n)return;if(!t){n.style.display=`none`;return}let r=n.tagName===`BUTTON`,i=e.includes(`row`)||e.includes(`controls`)||e.includes(`Overlay`)||e.includes(`Indicator`)||e.includes(`Timer`)||e.includes(`Bars`),a=`block`;r&&(a=`inline-flex`),!r&&i&&(a=`flex`),n.style.display=a}setText(e,t){let n=this.queryMobileElement(e);n&&(n.textContent=t)}async startPreview(){if(this.controller&&!this.isStartingPreview){this.isStartingPreview=!0;try{if(!await this.resolveCanStartStreamFromPermissionFlow())return;await this.controller.startStream(),this.updateState({stream:this.controller.getStream(),isAudioReady:this.controller.isAudioReady()}),this.clearBrowserUnsupportedState(),this.audioStatusUnsub&&=(this.audioStatusUnsub(),null),this.audioStatusUnsub=this.controller.getStreamManager().on(`audiostatuschange`,({status:e})=>{this.updateState({isAudioReady:e===`acquired`,hasAudioFailed:e===`failed`})})}catch(e){this.applyBrowserUnsupportedStateFromError(e),this.updateState({error:i(e)}),this.overlayPhase=`hidden`,this.renderPermissionFlow()}finally{this.isStartingPreview=!1}}}getPermissionFlowTranslations(){return{title:this.i18n.t(`permissionFlowTitle`),cameraTitle:this.i18n.t(`permissionFlowCameraTitle`),microphoneTitle:this.i18n.t(`permissionFlowMicrophoneTitle`),cameraLabel:this.i18n.t(`permissionFlowCameraLabel`),microphoneLabel:this.i18n.t(`permissionFlowMicrophoneLabel`),statusPending:this.i18n.t(`permissionFlowStatusPending`),statusGranted:this.i18n.t(`permissionFlowStatusGranted`),statusDenied:this.i18n.t(`permissionFlowStatusDenied`),statusRequesting:this.i18n.t(`permissionFlowStatusRequesting`),allowCamera:this.i18n.t(`permissionFlowAllowCamera`),allowMicrophone:this.i18n.t(`permissionFlowAllowMicrophone`),retry:this.i18n.t(`permissionFlowRetry`),recoveryTitle:this.i18n.t(`permissionFlowRecoveryTitle`),recoveryInstructions:this.i18n.t(`permissionFlowRecoveryInstructions`),connecting:this.i18n.t(`permissionFlowConnecting`)}}updatePermissionFlowSnapshot(e){this.permissionFlowSnapshot=e,this.updateOverlayPhase(),this.renderPermissionFlow(),this.getCanStartStreamFromPermissionFlow(e)&&!this.state.stream&&!this.isStartingPreview&&!this.mobileManager&&setTimeout(()=>this.startPreview(),100)}updateOverlayPhase(){let e=this.permissionFlowSnapshot;if(e.step===`checking`||e.step===`awaiting-user`||e.step===`blocked`){this.overlayPhase=`active`;return}if(e.step===`ready`||e.isComplete){if(this.overlayPhase===`active`){this.state.isVideoLoaded?this.startOverlayFadeOut():this.overlayPhase=`loading`;return}this.overlayPhase===`loading`&&this.state.isVideoLoaded&&this.startOverlayFadeOut()}}startOverlayFadeOut(){this.overlayPhase=`fading`,this.renderPermissionFlow(),this.overlayFadeTimeoutId!==null&&clearTimeout(this.overlayFadeTimeoutId),this.overlayFadeTimeoutId=setTimeout(()=>{this.overlayPhase=`hidden`,this.overlayFadeTimeoutId=null,this.renderPermissionFlow()},600)}async initializePermissionFlow(){this.cleanupPermissionFlow();let e=`en`;this.lang===`es`&&(e=`es`),this.permissionFlowOrchestrator=new Rn(Ln(),{callbacks:{onChange:e=>{this.updatePermissionFlowSnapshot(e)},onComplete:e=>{this.updatePermissionFlowSnapshot(e)}},language:e});let t=await this.permissionFlowOrchestrator.initialize();this.updatePermissionFlowSnapshot(t)}cleanupPermissionFlow(){this.overlayFadeTimeoutId!==null&&(clearTimeout(this.overlayFadeTimeoutId),this.overlayFadeTimeoutId=null),this.overlayPhase=`hidden`;let e=cb(Ix,this.getPermissionFlowTranslations(),!1);this.permissionFlowElements&&hb(e,this.permissionFlowElements),this.permissionFlowOrchestrator&&=(this.permissionFlowOrchestrator.destroy(),null),this.permissionFlowSnapshot=Ix,this.isStartingPreview=!1}async requestPermissionCurrentStep(){if(!this.permissionFlowOrchestrator)return;let e=await this.permissionFlowOrchestrator.requestCurrentStep();this.updatePermissionFlowSnapshot(e)}async retryPermissionCurrentStep(){if(!this.permissionFlowOrchestrator)return;let e=await this.permissionFlowOrchestrator.retryCurrentStep();this.updatePermissionFlowSnapshot(e)}getCanStartStreamFromPermissionFlow(e){return!(!e.isComplete||e.step!==`ready`)}async resolveCanStartStreamFromPermissionFlow(){if(this.permissionFlowOrchestrator||await this.initializePermissionFlow(),!this.permissionFlowOrchestrator)return!1;if(this.getCanStartStreamFromPermissionFlow(this.permissionFlowSnapshot))return!0;let e=await this.permissionFlowOrchestrator.requestCurrentStep();return this.updatePermissionFlowSnapshot(e),this.getCanStartStreamFromPermissionFlow(e)}renderPermissionFlow(){if(!this.permissionFlowElements)return;let e=this.overlayPhase===`fading`,t=cb(this.permissionFlowSnapshot,this.getPermissionFlowTranslations(),e);this.overlayPhase===`hidden`&&(t.isVisible=!1),hb(t,this.permissionFlowElements,{onAllow:()=>{this.requestPermissionCurrentStep().catch(e=>{this.updateState({error:i(e)})})},onRetry:()=>{this.retryPermissionCurrentStep().catch(e=>{this.updateState({error:i(e)})})}})}stopPreview(){if(!this.controller)return;this.stopAudioAnalysis();let e=this.controller.getStream();if(e)for(let t of e.getTracks())t.stop();this.controller.getStreamManager().stopStream(),this.updateState({stream:null,error:null,errorCode:null,canRetry:!1,browserName:null,browserVersion:null})}renderMobile(){if(!this.mobileManager)return;let e=this.mobileManager.portal;if(!this.mobileManager.isModalOpen){this.innerHTML=fx(this.i18n),this.setupMobileLandingListeners(),Ox();return}let t=hx(this.i18n),n=px(this.i18n,this.mobileManager.canCloseModal,t);e.render(n),this.setupMobileModalListeners(),this.setupEventListeners(),this.cacheUiElements(),this.handleStreamUpdate(this.state.stream),this.render(),Ox()}queryMobileElement(e){return this.mobileManager?.isModalOpen&&this.mobileManager.portal.isActive?this.mobileManager.portal.querySelector(e):this.querySelector(e)}getQueryRoot(){return this.mobileManager?.isModalOpen&&this.mobileManager.portal.isActive?this.mobileManager.portal:this}cacheUiElements(){let e=this.getQueryRoot();this.previewContentElements=bb(e),this.recordingControlsElements=Ib(e),this.videoPreviewElements={previewSkeleton:this.previewContentElements.previewSkeleton,videoPreview:this.previewContentElements.videoPreview},this.audioBarsContainer=this.previewContentElements.audioLevelBars,this.overlayElements={uploadOverlay:e.querySelector(`#uploadProgressOverlay`),uploadFill:e.querySelector(`#uploadProgressFill`),uploadText:e.querySelector(`#uploadProgressText`),transitionOverlay:e.querySelector(`#sourceTransitionOverlay`),transitionMessage:e.querySelector(`#transitionMessage`)},this.settingsPanelElement=e.querySelector(`#settingsPanel`),this.permissionFlowElements=rb(e)}setupMobileLandingListeners(){this.querySelector(`#btnMobileOpenCamera`)?.addEventListener(`click`,()=>this.mobileManager?.openModal())}setupMobileModalListeners(){this.queryMobileElement(`#btnMobileCloseModal`)?.addEventListener(`click`,()=>this.mobileManager?.closeModal())}handleCameraChange(e){return this.handleDeviceChange(e,`camera`)}handleMicChange(e){return this.handleDeviceChange(e,`mic`)}async handleDeviceChange(e,t){if(!this.controller)return;let n=Py(this.controller,e);t===`mic`&&(n=Fy(this.controller,e)),await n.then(e=>{this.updateState({stream:e})}).catch(e=>{this.updateState({error:i(e)})});let r=this.state.devices;t===`camera`&&(r={...this.state.devices,selectedCamera:e}),t===`mic`&&(r={...this.state.devices,selectedMic:e}),this.updateState({devices:r})}async handleRecord(){if(this.controller)try{this.updateState({configError:null,audioWarning:null}),this.clearAudioWarningAutoDismiss(),await Iy(this.controller,Vy)}catch(e){this.applyBrowserUnsupportedStateFromError(e),this.updateState({configError:Error(i(e)),error:i(e)})}}async processRecordingBlob(e){if(!this.isProcessingBlob){this.isProcessingBlob=!0;try{if(this.isDemo){this.updateState({recordedBlob:e});return}if(!this.uploadService)throw Error(`Upload service not ready`);let t=`recording-${Date.now()}.mp4`;this.updateState({uploadProgress:0});try{let n=await this.uploadService.uploadVideo(e,{apiKey:this.config.apiKey||``,backendUrl:this.config.backendUrl||``,filename:t,userMetadata:this.config.userMetadata,onProgress:e=>{this.updateState({uploadProgress:e})}});this.updateState({uploadProgress:null}),this.dispatchEvent(new CustomEvent(`upload-complete`,{detail:n}))}catch(e){throw this.updateState({uploadProgress:null}),e}}finally{this.isProcessingBlob=!1}}}isStopBlockedByMinimumTime(){let e=this.state.recordingState===Uy||this.state.isPaused;return Nx(this.config.minTimeRecord,this.state.timer,e)}async stopRecording(){if(!this.controller)return null;if(this.isStopBlockedByMinimumTime())throw Px();let e=await Ly(this.controller,this.isDemo,()=>{},()=>{});return e&&await this.processRecordingBlob(e),e}async handleStop(){if(!this.isStopBlockedByMinimumTime())try{await this.stopRecording()}catch(e){this.applyBrowserUnsupportedStateFromError(e),this.updateState({error:i(e)})}}handlePauseToggle(){this.controller&&(this.state.isPaused&&zy(this.controller),this.state.isPaused||Ry(this.controller),this.updateState({isPaused:this.controller.isPaused()}))}handleDownload(){this.state.recordedBlob&&$b(this.state.recordedBlob)}handleMute(){this.controller&&(Qb(this.controller),this.updateState({isMuted:this.controller.getIsMuted()}))}async handleSwitch(){if(!this.controller)return;let e=this.controller.getCurrentSourceType(),t=Vy;e===Vy&&(t=Hy),e===Hy&&(t=Vy);try{await By(this.controller,t)}catch(e){this.applyBrowserUnsupportedStateFromError(e),this.updateState({error:i(e)})}}setupEventListeners(){let e=(e,t)=>{let n=this.queryMobileElement(e);n&&n.addEventListener(`click`,t)};e(`#btnRecord`,()=>this.handleRecord()),e(`#btnStop`,()=>this.handleStop()),e(`#btnPause`,()=>this.handlePauseToggle()),e(`#btnDownload`,()=>this.handleDownload()),e(`#btnMute`,()=>this.handleMute()),e(`#btnSwitchSource`,()=>this.handleSwitch());let t=this.queryMobileElement(`#startCameraArea`);t&&t.addEventListener(`click`,()=>this.startPreview());let n=this.queryMobileElement(`#btnSettings`),r=this.queryMobileElement(`#settingsPanel`);n&&r&&n.addEventListener(`click`,()=>{let e=!this.state.showSettings;this.updateState({showSettings:e}),e&&this.populateSettings()});let i=this.queryMobileElement(`#btnSettingsBack`);i&&r&&i.addEventListener(`click`,()=>{}),this.setupSettingsListeners()}setupSettingsListeners(){let e=this.queryMobileElement(`#btnCameraMenu`);e&&e.addEventListener(`click`,()=>this.navigateSettings(`camera`));let t=this.queryMobileElement(`#btnMicMenu`);t&&t.addEventListener(`click`,()=>this.navigateSettings(`microphone`));let n=this.queryMobileElement(`#btnSettingsBack`);n&&n.addEventListener(`click`,e=>{e.stopPropagation(),this.settingsView!==`main`&&this.navigateSettings(`main`)})}navigateSettings(e){e===`main`?this.slideDirection=`left`:this.slideDirection=`right`,this.settingsView=e,this.renderSettings(),setTimeout(()=>{this.slideDirection=`none`,this.renderSettings()},300)}renderSettings(){this.updateSettingsContent(),this.renderSettingsView()}updateSettingsContent(){let e=this.queryMobileElement(`#settingsContent`);e&&(e.classList.remove(`vidtreo-slide-left`,`vidtreo-slide-right`,`vidtreo-slide-none`),this.slideDirection!==`none`&&e.classList.add(`vidtreo-slide-${this.slideDirection}`))}renderSettingsView(){let e=this.queryMobileElement(`#settingsMain`),t=this.queryMobileElement(`#cameraList`),n=this.queryMobileElement(`#micList`),r=this.queryMobileElement(`#btnSettingsBack`);e&&(e.style.display=`none`),t&&(t.style.display=`none`),n&&(n.style.display=`none`),r&&(r.style.display=`none`),this.settingsView===`main`&&this.renderSettingsMain(e,r),this.settingsView===`camera`&&this.renderSettingsCamera(t,r),this.settingsView===`microphone`&&this.renderSettingsMicrophone(n,r)}renderSettingsMain(e,t){e&&(e.style.display=`flex`),t&&(t.style.display=`none`),this.updateCurrentDeviceLabels()}updateCurrentDeviceLabels(){let e=this.state.devices.cameras.filter(e=>e.deviceId&&e.deviceId.trim()!==``),t=this.state.devices.microphones.filter(e=>e.deviceId&&e.deviceId.trim()!==``),n=e.find(e=>e.deviceId===this.state.devices.selectedCamera),r=t.find(e=>e.deviceId===this.state.devices.selectedMic),i=n?.label||e[0]?.label||`Camera`,a=r?.label||t[0]?.label||`Microphone`;this.setText(`#currentCameraName`,i),this.setText(`#currentMicName`,a)}renderSettingsCamera(e,t){e&&(e.style.display=`flex`,this.renderDeviceList(e,this.state.devices.cameras,this.state.devices.selectedCamera,`camera`));let n=this.queryMobileElement(`.vidtreo-settings-title`),r=this.queryMobileElement(`.vidtreo-settings-back-icon`);t&&(t.style.display=`flex`,t.style.cursor=`pointer`,t.onclick=()=>this.navigateSettings(`main`)),n&&(n.textContent=`Camera`),r&&(r.style.display=`flex`)}renderSettingsMicrophone(e,t){e&&(e.style.display=`flex`,this.renderDeviceList(e,this.state.devices.microphones,this.state.devices.selectedMic,`mic`));let n=this.queryMobileElement(`.vidtreo-settings-title`),r=this.queryMobileElement(`.vidtreo-settings-back-icon`);t&&(t.style.display=`flex`,t.style.cursor=`pointer`,t.onclick=()=>this.navigateSettings(`main`)),n&&(n.textContent=`Microphone`),r&&(r.style.display=`flex`)}renderDeviceList(e,t,n,r){if(!t||t.length===0){e.innerHTML=`<div class="vidtreo-device-empty">No devices found</div>`;return}e.innerHTML=``;for(let i of t){let t=document.createElement(`button`);t.className=`vidtreo-device-option`;let a=i.deviceId===n,o=`<span class="vidtreo-device-checkmark-placeholder"></span>`;a&&(o=`<i class="ph-fill ph-check vidtreo-device-checkmark" style="display: flex; font-size: 20px;"></i>`);let s=i.label;s||=`Device ${i.deviceId.slice(0,8)}`,t.innerHTML=`
10917
10917
  <div class="vidtreo-device-option-check-container">${o}</div>
10918
10918
  <span class="vidtreo-device-option-label">${s}</span>
10919
- `,t.onclick=()=>{r===`camera`&&this.handleCameraChange(i.deviceId),r===`mic`&&this.handleMicChange(i.deviceId),this.navigateSettings(`main`)},e.appendChild(t)}}populateSettings(){this.settingsView=`main`,this.slideDirection=`none`,this.renderSettings()}};return customElements.get(`vidtreo-recorder`)||customElements.define(`vidtreo-recorder`,Lx),e.VidtreoRecorder=Lx,e})({});
10919
+ `,t.onclick=()=>{r===`camera`&&this.handleCameraChange(i.deviceId),r===`mic`&&this.handleMicChange(i.deviceId),this.navigateSettings(`main`)},e.appendChild(t)}}populateSettings(){this.settingsView=`main`,this.slideDirection=`none`,this.renderSettings()}};return customElements.get(`vidtreo-recorder`)||customElements.define(`vidtreo-recorder`,Rx),e.VidtreoRecorder=Rx,e})({});
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vidtreo/recorder-wc",
3
- "version": "1.6.0",
3
+ "version": "1.6.1",
4
4
  "type": "module",
5
5
  "description": "Web component for @vidtreo/recorder - video recording SDK",
6
6
  "main": "./dist/vidtreo-recorder.js",