@waveform-playlist/browser 7.1.3 → 8.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,10 +1,10 @@
1
- "use strict";var Ga=Object.create;var kn=Object.defineProperty;var Na=Object.getOwnPropertyDescriptor;var Ya=Object.getOwnPropertyNames;var Ua=Object.getPrototypeOf,Ka=Object.prototype.hasOwnProperty;var qa=(e,t,n,a)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of Ya(t))!Ka.call(e,r)&&r!==n&&kn(e,r,{get:()=>t[r],enumerable:!(a=Na(t,r))||a.enumerable});return e};var Ja=(e,t,n)=>(n=e!=null?Ga(Ua(e)):{},qa(t||!e||!e.__esModule?kn(n,"default",{value:e,enumerable:!0}):n,e));Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const Z=require("tone"),v=require("react/jsx-runtime"),o=require("react"),R=require("styled-components"),Ke=require("@dnd-kit/core"),Hn=require("react-dom"),Qa=require("@dnd-kit/modifiers");function Xn(e){const t=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e){for(const n in e)if(n!=="default"){const a=Object.getOwnPropertyDescriptor(e,n);Object.defineProperty(t,n,a.get?a:{enumerable:!0,get:()=>e[n]})}}return t.default=e,Object.freeze(t)}const On=Xn(Z),T=Xn(o);var ke=1e3;function Gt(e){const{audioBuffer:t,startSample:n,offsetSamples:a=0,gain:r=1,name:s,color:i,fadeIn:l,fadeOut:c,waveformData:u}=e,m=t?.sampleRate??e.sampleRate??u?.sample_rate,h=t?.length??e.sourceDurationSamples??(u&&m?Math.ceil(u.duration*m):void 0);if(m===void 0)throw new Error("createClip: sampleRate is required when audioBuffer is not provided (can use waveformData.sample_rate)");if(h===void 0)throw new Error("createClip: sourceDurationSamples is required when audioBuffer is not provided (can use waveformData.duration)");t&&u&&t.sampleRate!==u.sample_rate&&console.warn(`Sample rate mismatch: audioBuffer (${t.sampleRate}) vs waveformData (${u.sample_rate}). Using audioBuffer sample rate. Waveform visualization may be slightly off.`);const p=e.durationSamples??h;return{id:Yn(),audioBuffer:t,startSample:n,durationSamples:p,offsetSamples:a,sampleRate:m,sourceDurationSamples:h,gain:r,name:s,color:i,fadeIn:l,fadeOut:c,waveformData:u}}function Gn(e){const{audioBuffer:t,startTime:n,offset:a=0,gain:r=1,name:s,color:i,fadeIn:l,fadeOut:c,waveformData:u}=e,m=t?.sampleRate??e.sampleRate??u?.sample_rate;if(m===void 0)throw new Error("createClipFromSeconds: sampleRate is required when audioBuffer is not provided (can use waveformData.sample_rate)");const h=t?.duration??e.sourceDuration??u?.duration;if(h===void 0)throw new Error("createClipFromSeconds: sourceDuration is required when audioBuffer is not provided (can use waveformData.duration)");t&&u&&t.sampleRate!==u.sample_rate&&console.warn(`Sample rate mismatch: audioBuffer (${t.sampleRate}) vs waveformData (${u.sample_rate}). Using audioBuffer sample rate. Waveform visualization may be slightly off.`);const p=e.duration??h;return Gt({audioBuffer:t,startSample:Math.round(n*m),durationSamples:Math.round(p*m),offsetSamples:Math.round(a*m),sampleRate:m,sourceDurationSamples:Math.ceil(h*m),gain:r,name:s,color:i,fadeIn:l,fadeOut:c,waveformData:u})}function Nn(e){const{name:t,clips:n=[],muted:a=!1,soloed:r=!1,volume:s=1,pan:i=0,color:l,height:c,spectrogramConfig:u,spectrogramColorMap:m}=e;return{id:Yn(),name:t,clips:n,muted:a,soloed:r,volume:s,pan:i,color:l,height:c,spectrogramConfig:u,spectrogramColorMap:m}}function Yn(){return`${Date.now()}-${Math.random().toString(36).substr(2,9)}`}var Sn=!1;function Tt(e){const t=e._param;return!t&&!Sn&&(Sn=!0,console.warn("[waveform-playlist] Unable to access Tone.js internal _param. This likely means the Tone.js version is incompatible. Fades and mute scheduling may not work correctly.")),t}function In(e,t){const n=new Float32Array(e),a=e-1;for(let r=0;r<e;r++){const s=r/a;n[r]=t?s:1-s}return n}function er(e,t){const n=new Float32Array(e),a=e-1;for(let r=0;r<e;r++){const s=r/a,i=t?r:e-1-r;n[i]=Math.exp(2*s-1)/Math.E}return n}function tr(e,t){const n=new Float32Array(e),a=t?Math.PI/2:-Math.PI/2;for(let r=0;r<e;r++)n[r]=Math.sin(Math.PI*r/e-a)/2+.5;return n}function nr(e,t,n=10){const a=new Float32Array(e);for(let r=0;r<e;r++){const s=t?r:e-1-r,i=r/e;a[s]=Math.log(1+n*i)/Math.log(1+n)}return a}function Un(e,t,n){switch(e){case"linear":return In(t,n);case"exponential":return er(t,n);case"sCurve":return tr(t,n);case"logarithmic":return nr(t,n);default:return In(t,n)}}function An(e,t,n,a="linear",r=0,s=1){if(!(n<=0))if(a==="linear")e.setValueAtTime(r,t),e.linearRampToValueAtTime(s,t+n);else if(a==="exponential")e.setValueAtTime(Math.max(r,.001),t),e.exponentialRampToValueAtTime(Math.max(s,.001),t+n);else{const i=Un(a,1e4,!0),l=new Float32Array(i.length),c=s-r;for(let u=0;u<i.length;u++)l[u]=r+i[u]*c;e.setValueCurveAtTime(l,t,n)}}function Mn(e,t,n,a="linear",r=1,s=0){if(!(n<=0))if(a==="linear")e.setValueAtTime(r,t),e.linearRampToValueAtTime(s,t+n);else if(a==="exponential")e.setValueAtTime(Math.max(r,.001),t),e.exponentialRampToValueAtTime(Math.max(s,.001),t+n);else{const i=Un(a,1e4,!1),l=new Float32Array(i.length),c=r-s;for(let u=0;u<i.length;u++)l[u]=s+i[u]*c;e.setValueCurveAtTime(l,t,n)}}var ar=class{constructor(e){this.activePlayers=0,this.track=e.track,this.volumeNode=new Z.Volume(this.gainToDb(e.track.gain)),this.panNode=new Z.Panner(e.track.stereoPan),this.muteGain=new Z.Gain(e.track.muted?0:1);const t=e.destination||Z.getDestination();if(e.effects){const a=e.effects(this.muteGain,t,!1);a&&(this.effectsCleanup=a)}else this.muteGain.connect(t);const n=e.clips||(e.buffer?[{buffer:e.buffer,startTime:0,duration:e.buffer.duration,offset:0,fadeIn:e.track.fadeIn,fadeOut:e.track.fadeOut,gain:1}]:[]);this.clips=n.map(a=>{const r=new Z.Player({url:a.buffer,loop:!1,onstop:()=>{this.activePlayers--,this.activePlayers===0&&this.onStopCallback&&this.onStopCallback()}}),s=new Z.Gain(a.gain);return r.connect(s),s.chain(this.volumeNode,this.panNode,this.muteGain),{player:r,clipInfo:a,fadeGain:s,pausedPosition:0,playStartTime:0}})}scheduleFades(e,t,n=0){const{clipInfo:a,fadeGain:r}=e,s=Tt(r.gain);if(!s)return;s.cancelScheduledValues(0);const i=n-a.offset;if(a.fadeIn&&i<a.fadeIn.duration){const l=a.fadeIn.duration;if(i<=0)An(s,t,l,a.fadeIn.type||"linear",0,a.gain);else{const c=l-i,u=i/l,m=a.gain*u;An(s,t,c,a.fadeIn.type||"linear",m,a.gain)}}else s.setValueAtTime(a.gain,t);if(a.fadeOut){const c=a.duration-a.fadeOut.duration-i;if(c>0){const u=t+c;Mn(s,u,a.fadeOut.duration,a.fadeOut.type||"linear",a.gain,0)}else if(c>-a.fadeOut.duration){const u=-c,m=a.fadeOut.duration-u,h=u/a.fadeOut.duration,p=a.gain*(1-h);Mn(s,t,m,a.fadeOut.type||"linear",p,0)}}}gainToDb(e){return 20*Math.log10(e)}setVolume(e){this.track.gain=e,this.volumeNode.volume.value=this.gainToDb(e)}setPan(e){this.track.stereoPan=e,this.panNode.pan.value=e}setMute(e){this.track.muted=e;const t=e?0:1;Tt(this.muteGain.gain)?.setValueAtTime(t,0),this.muteGain.gain.value=t}setSolo(e){this.track.soloed=e}play(e,t=0,n){this.clips.forEach(a=>{a.player.stop(),a.player.disconnect(),a.player.dispose();const r=new Z.Player({url:a.clipInfo.buffer,loop:!1,onstop:()=>{this.activePlayers--,this.activePlayers===0&&this.onStopCallback&&this.onStopCallback()}});r.connect(a.fadeGain),a.player=r,a.pausedPosition=0}),this.activePlayers=0,this.clips.forEach(a=>{const{player:r,clipInfo:s}=a,i=t,l=s.startTime,c=s.startTime+s.duration;if(i<c){this.activePlayers++;const u=e??Z.now();if(a.playStartTime=u,i>=l){const m=i-l+s.offset,h=s.duration-(i-l),p=n?Math.min(n,h):h;a.pausedPosition=m,this.scheduleFades(a,u,m),r.start(u,m,p)}else{const m=l-i,h=n?Math.min(n-m,s.duration):s.duration;m<(n??1/0)?(a.pausedPosition=s.offset,this.scheduleFades(a,u+m,s.offset),r.start(u+m,s.offset,h)):this.activePlayers--}}})}pause(){this.clips.forEach(e=>{if(e.player.state==="started"){const t=(Z.now()-e.playStartTime)*e.player.playbackRate;e.pausedPosition=e.pausedPosition+t}e.player.stop()}),this.activePlayers=0}stop(e){const t=e??Z.now();this.clips.forEach(n=>{n.player.stop(t),n.pausedPosition=0}),this.activePlayers=0}dispose(){this.effectsCleanup&&this.effectsCleanup(),this.clips.forEach(e=>{e.player.dispose(),e.fadeGain.dispose()}),this.volumeNode.dispose(),this.panNode.dispose(),this.muteGain.dispose()}get id(){return this.track.id}get duration(){if(this.clips.length===0)return 0;const e=this.clips[this.clips.length-1];return e.clipInfo.startTime+e.clipInfo.duration}get buffer(){return this.clips[0]?.clipInfo.buffer}get isPlaying(){return this.clips.some(e=>e.player.state==="started")}get muted(){return this.track.muted}get startTime(){return this.track.startTime}setOnStopCallback(e){this.onStopCallback=e}},rr=class{constructor(e={}){if(this.tracks=new Map,this.isInitialized=!1,this.soloedTracks=new Set,this.manualMuteState=new Map,this.activeTracks=new Map,this.playbackSessionId=0,this.masterVolume=new Z.Volume(this.gainToDb(e.masterGain??1)),e.effects){const t=e.effects(this.masterVolume,Z.getDestination(),!1);t&&(this.effectsCleanup=t)}else this.masterVolume.toDestination();e.tracks&&e.tracks.forEach(t=>{this.tracks.set(t.id,t),this.manualMuteState.set(t.id,t.muted)})}gainToDb(e){return 20*Math.log10(e)}async init(){this.isInitialized||(await Z.start(),this.isInitialized=!0)}addTrack(e){const t={...e,destination:this.masterVolume},n=new ar(t);return this.tracks.set(n.id,n),this.manualMuteState.set(n.id,e.track.muted??!1),e.track.soloed&&this.soloedTracks.add(n.id),n}applyInitialSoloState(){this.updateSoloMuting()}removeTrack(e){const t=this.tracks.get(e);t&&(t.dispose(),this.tracks.delete(e),this.manualMuteState.delete(e),this.soloedTracks.delete(e))}getTrack(e){return this.tracks.get(e)}play(e,t,n){if(!this.isInitialized){console.warn("TonePlayout not initialized. Call init() first.");return}const a=e??Z.now(),r=t??0;this.playbackSessionId++;const s=this.playbackSessionId;this.activeTracks.clear(),this.tracks.forEach(i=>{const l=i.startTime;if(r>=l){const c=r-l;n!==void 0&&(this.activeTracks.set(i.id,s),i.setOnStopCallback(()=>{this.activeTracks.get(i.id)===s&&(this.activeTracks.delete(i.id),this.activeTracks.size===0&&this.onPlaybackCompleteCallback&&this.onPlaybackCompleteCallback())})),i.play(a,c,n)}else{const c=l-r;n!==void 0&&(this.activeTracks.set(i.id,s),i.setOnStopCallback(()=>{this.activeTracks.get(i.id)===s&&(this.activeTracks.delete(i.id),this.activeTracks.size===0&&this.onPlaybackCompleteCallback&&this.onPlaybackCompleteCallback())})),i.play(a+c,0,n)}}),t!==void 0?Z.getTransport().start(a,t):Z.getTransport().start(a)}pause(){Z.getTransport().pause(),this.tracks.forEach(e=>{e.pause()})}stop(){Z.getTransport().stop(),this.tracks.forEach(e=>{e.stop()})}setMasterGain(e){this.masterVolume.volume.value=this.gainToDb(e)}setSolo(e,t){const n=this.tracks.get(e);n&&(n.setSolo(t),t?this.soloedTracks.add(e):this.soloedTracks.delete(e),this.updateSoloMuting())}updateSoloMuting(){const e=this.soloedTracks.size>0;this.tracks.forEach((t,n)=>{if(e)if(!this.soloedTracks.has(n))t.setMute(!0);else{const a=this.manualMuteState.get(n)??!1;t.setMute(a)}else{const a=this.manualMuteState.get(n)??!1;t.setMute(a)}})}setMute(e,t){const n=this.tracks.get(e);n&&(this.manualMuteState.set(e,t),n.setMute(t))}getCurrentTime(){return Z.getTransport().seconds}seekTo(e){Z.getTransport().seconds=e}dispose(){this.tracks.forEach(e=>{e.dispose()}),this.tracks.clear(),this.effectsCleanup&&this.effectsCleanup(),this.masterVolume.dispose()}get context(){return Z.getContext()}get sampleRate(){return Z.getContext().sampleRate}setOnPlaybackComplete(e){this.onPlaybackCompleteCallback=e}},Mt=null;function or(){return Mt||(Mt=new Z.Context,Z.setContext(Mt)),Mt}function sr(){return or().rawContext}const Nt=Object.freeze({Translate:{toString(e){if(!e)return;const{x:t,y:n}=e;return"translate3d("+(t?Math.round(t):0)+"px, "+(n?Math.round(n):0)+"px, 0)"}},Scale:{toString(e){if(!e)return;const{scaleX:t,scaleY:n}=e;return"scaleX("+t+") scaleY("+n+")"}},Transform:{toString(e){if(e)return[Nt.Translate.toString(e),Nt.Scale.toString(e)].join(" ")}},Transition:{toString(e){let{property:t,duration:n,easing:a}=e;return t+" "+n+"ms "+a}}}),ir=new Map([["bold",T.createElement(T.Fragment,null,T.createElement("path",{d:"M144,128a16,16,0,1,1-16-16A16,16,0,0,1,144,128ZM60,112a16,16,0,1,0,16,16A16,16,0,0,0,60,112Zm136,0a16,16,0,1,0,16,16A16,16,0,0,0,196,112Z"}))],["duotone",T.createElement(T.Fragment,null,T.createElement("path",{d:"M240,96v64a16,16,0,0,1-16,16H32a16,16,0,0,1-16-16V96A16,16,0,0,1,32,80H224A16,16,0,0,1,240,96Z",opacity:"0.2"}),T.createElement("path",{d:"M140,128a12,12,0,1,1-12-12A12,12,0,0,1,140,128Zm56-12a12,12,0,1,0,12,12A12,12,0,0,0,196,116ZM60,116a12,12,0,1,0,12,12A12,12,0,0,0,60,116Z"}))],["fill",T.createElement(T.Fragment,null,T.createElement("path",{d:"M224,80H32A16,16,0,0,0,16,96v64a16,16,0,0,0,16,16H224a16,16,0,0,0,16-16V96A16,16,0,0,0,224,80ZM60,140a12,12,0,1,1,12-12A12,12,0,0,1,60,140Zm68,0a12,12,0,1,1,12-12A12,12,0,0,1,128,140Zm68,0a12,12,0,1,1,12-12A12,12,0,0,1,196,140Z"}))],["light",T.createElement(T.Fragment,null,T.createElement("path",{d:"M138,128a10,10,0,1,1-10-10A10,10,0,0,1,138,128ZM60,118a10,10,0,1,0,10,10A10,10,0,0,0,60,118Zm136,0a10,10,0,1,0,10,10A10,10,0,0,0,196,118Z"}))],["regular",T.createElement(T.Fragment,null,T.createElement("path",{d:"M140,128a12,12,0,1,1-12-12A12,12,0,0,1,140,128Zm56-12a12,12,0,1,0,12,12A12,12,0,0,0,196,116ZM60,116a12,12,0,1,0,12,12A12,12,0,0,0,60,116Z"}))],["thin",T.createElement(T.Fragment,null,T.createElement("path",{d:"M136,128a8,8,0,1,1-8-8A8,8,0,0,1,136,128Zm-76-8a8,8,0,1,0,8,8A8,8,0,0,0,60,120Zm136,0a8,8,0,1,0,8,8A8,8,0,0,0,196,120Z"}))]]),lr=new Map([["bold",T.createElement(T.Fragment,null,T.createElement("path",{d:"M157.27,21.22a12,12,0,0,0-12.64,1.31L75.88,76H32A20,20,0,0,0,12,96v64a20,20,0,0,0,20,20H75.88l68.75,53.47A12,12,0,0,0,164,224V32A12,12,0,0,0,157.27,21.22ZM36,100H68v56H36Zm104,99.46L92,162.13V93.87l48-37.33ZM212,128a44,44,0,0,1-11,29.11,12,12,0,1,1-18-15.88,20,20,0,0,0,0-26.43,12,12,0,0,1,18-15.86A43.94,43.94,0,0,1,212,128Zm40,0a83.87,83.87,0,0,1-21.39,56,12,12,0,0,1-17.89-16,60,60,0,0,0,0-80,12,12,0,1,1,17.88-16A83.87,83.87,0,0,1,252,128Z"}))],["duotone",T.createElement(T.Fragment,null,T.createElement("path",{d:"M80,88v80H32a8,8,0,0,1-8-8V96a8,8,0,0,1,8-8Z",opacity:"0.2"}),T.createElement("path",{d:"M155.51,24.81a8,8,0,0,0-8.42.88L77.25,80H32A16,16,0,0,0,16,96v64a16,16,0,0,0,16,16H77.25l69.84,54.31A8,8,0,0,0,160,224V32A8,8,0,0,0,155.51,24.81ZM32,96H72v64H32ZM144,207.64,88,164.09V91.91l56-43.55Zm54-106.08a40,40,0,0,1,0,52.88,8,8,0,0,1-12-10.58,24,24,0,0,0,0-31.72,8,8,0,0,1,12-10.58ZM248,128a79.9,79.9,0,0,1-20.37,53.34,8,8,0,0,1-11.92-10.67,64,64,0,0,0,0-85.33,8,8,0,1,1,11.92-10.67A79.83,79.83,0,0,1,248,128Z"}))],["fill",T.createElement(T.Fragment,null,T.createElement("path",{d:"M160,32.25V223.69a8.29,8.29,0,0,1-3.91,7.18,8,8,0,0,1-9-.56l-65.57-51A4,4,0,0,1,80,176.16V79.84a4,4,0,0,1,1.55-3.15l65.57-51a8,8,0,0,1,10,.16A8.27,8.27,0,0,1,160,32.25ZM60,80H32A16,16,0,0,0,16,96v64a16,16,0,0,0,16,16H60a4,4,0,0,0,4-4V84A4,4,0,0,0,60,80Zm126.77,20.84a8,8,0,0,0-.72,11.3,24,24,0,0,1,0,31.72,8,8,0,1,0,12,10.58,40,40,0,0,0,0-52.88A8,8,0,0,0,186.74,100.84Zm40.89-26.17a8,8,0,1,0-11.92,10.66,64,64,0,0,1,0,85.34,8,8,0,1,0,11.92,10.66,80,80,0,0,0,0-106.66Z"}))],["light",T.createElement(T.Fragment,null,T.createElement("path",{d:"M154.64,26.61a6,6,0,0,0-6.32.65L77.94,82H32A14,14,0,0,0,18,96v64a14,14,0,0,0,14,14H77.94l70.38,54.74A6,6,0,0,0,158,224V32A6,6,0,0,0,154.64,26.61ZM30,160V96a2,2,0,0,1,2-2H74v68H32A2,2,0,0,1,30,160Zm116,51.73L86,165.07V90.93l60-46.66Zm50.53-108.85a38,38,0,0,1,0,50.24,6,6,0,1,1-9-7.94,26,26,0,0,0,0-34.37,6,6,0,0,1,9-7.93ZM246,128a77.86,77.86,0,0,1-19.86,52,6,6,0,1,1-8.94-8,66,66,0,0,0,0-88,6,6,0,1,1,8.94-8A77.86,77.86,0,0,1,246,128Z"}))],["regular",T.createElement(T.Fragment,null,T.createElement("path",{d:"M155.51,24.81a8,8,0,0,0-8.42.88L77.25,80H32A16,16,0,0,0,16,96v64a16,16,0,0,0,16,16H77.25l69.84,54.31A8,8,0,0,0,160,224V32A8,8,0,0,0,155.51,24.81ZM32,96H72v64H32ZM144,207.64,88,164.09V91.91l56-43.55Zm54-106.08a40,40,0,0,1,0,52.88,8,8,0,0,1-12-10.58,24,24,0,0,0,0-31.72,8,8,0,0,1,12-10.58ZM248,128a79.9,79.9,0,0,1-20.37,53.34,8,8,0,0,1-11.92-10.67,64,64,0,0,0,0-85.33,8,8,0,1,1,11.92-10.67A79.83,79.83,0,0,1,248,128Z"}))],["thin",T.createElement(T.Fragment,null,T.createElement("path",{d:"M153.76,28.41a4,4,0,0,0-4.22.43L78.63,84H32A12,12,0,0,0,20,96v64a12,12,0,0,0,12,12H78.63l70.91,55.16A4.07,4.07,0,0,0,152,228a3.92,3.92,0,0,0,1.76-.41A4,4,0,0,0,156,224V32A4,4,0,0,0,153.76,28.41ZM28,160V96a4,4,0,0,1,4-4H76v72H32A4,4,0,0,1,28,160Zm120,55.82L84,166V90l64-49.78Zm47-111.61a36,36,0,0,1,0,47.59,4,4,0,1,1-6-5.3,28,28,0,0,0,0-37,4,4,0,0,1,6-5.28ZM244,128a75.88,75.88,0,0,1-19.35,50.67,4,4,0,0,1-6-5.34,68,68,0,0,0,0-90.66,4,4,0,0,1,6-5.34A75.88,75.88,0,0,1,244,128Z"}))]]),cr=new Map([["bold",T.createElement(T.Fragment,null,T.createElement("path",{d:"M157.27,21.22a12,12,0,0,0-12.64,1.31L75.88,76H32A20,20,0,0,0,12,96v64a20,20,0,0,0,20,20H75.88l68.75,53.47A12,12,0,0,0,164,224V32A12,12,0,0,0,157.27,21.22ZM36,100H68v56H36Zm104,99.46L92,162.13V93.87l48-37.33ZM212,128a44,44,0,0,1-11,29.11,12,12,0,0,1-18-15.88,20,20,0,0,0,0-26.44,12,12,0,0,1,18-15.85A43.94,43.94,0,0,1,212,128Z"}))],["duotone",T.createElement(T.Fragment,null,T.createElement("path",{d:"M80,88v80H32a8,8,0,0,1-8-8V96a8,8,0,0,1,8-8Z",opacity:"0.2"}),T.createElement("path",{d:"M155.51,24.81a8,8,0,0,0-8.42.88L77.25,80H32A16,16,0,0,0,16,96v64a16,16,0,0,0,16,16H77.25l69.84,54.31A8,8,0,0,0,160,224V32A8,8,0,0,0,155.51,24.81ZM32,96H72v64H32ZM144,207.64,88,164.09V91.91l56-43.55ZM208,128a39.93,39.93,0,0,1-10,26.46,8,8,0,0,1-12-10.58,24,24,0,0,0,0-31.72,8,8,0,1,1,12-10.58A40,40,0,0,1,208,128Z"}))],["fill",T.createElement(T.Fragment,null,T.createElement("path",{d:"M160,32.25V223.69a8.29,8.29,0,0,1-3.91,7.18,8,8,0,0,1-9-.56l-65.57-51A4,4,0,0,1,80,176.16V79.84a4,4,0,0,1,1.55-3.15l65.57-51a8,8,0,0,1,10,.16A8.27,8.27,0,0,1,160,32.25ZM60,80H32A16,16,0,0,0,16,96v64a16,16,0,0,0,16,16H60a4,4,0,0,0,4-4V84A4,4,0,0,0,60,80ZM198,101.56a8,8,0,1,0-12,10.58,24,24,0,0,1,0,31.72,8,8,0,1,0,12,10.58,40,40,0,0,0,0-52.88Z"}))],["light",T.createElement(T.Fragment,null,T.createElement("path",{d:"M154.64,26.61a6,6,0,0,0-6.32.65L77.94,82H32A14,14,0,0,0,18,96v64a14,14,0,0,0,14,14H77.94l70.38,54.74A6,6,0,0,0,158,224V32A6,6,0,0,0,154.64,26.61ZM30,160V96a2,2,0,0,1,2-2H74v68H32A2,2,0,0,1,30,160Zm116,51.73L86,165.07V90.93l60-46.66ZM206,128a37.94,37.94,0,0,1-9.5,25.14,6,6,0,1,1-9-7.94,26,26,0,0,0,0-34.37,6,6,0,0,1,9-7.93A38,38,0,0,1,206,128Z"}))],["regular",T.createElement(T.Fragment,null,T.createElement("path",{d:"M155.51,24.81a8,8,0,0,0-8.42.88L77.25,80H32A16,16,0,0,0,16,96v64a16,16,0,0,0,16,16H77.25l69.84,54.31A8,8,0,0,0,160,224V32A8,8,0,0,0,155.51,24.81ZM32,96H72v64H32ZM144,207.64,88,164.09V91.91l56-43.55ZM208,128a39.93,39.93,0,0,1-10,26.46,8,8,0,0,1-12-10.58,24,24,0,0,0,0-31.72,8,8,0,1,1,12-10.58A40,40,0,0,1,208,128Z"}))],["thin",T.createElement(T.Fragment,null,T.createElement("path",{d:"M153.76,28.41a4,4,0,0,0-4.22.43L78.63,84H32A12,12,0,0,0,20,96v64a12,12,0,0,0,12,12H78.63l70.91,55.16A4.07,4.07,0,0,0,152,228a3.92,3.92,0,0,0,1.76-.41A4,4,0,0,0,156,224V32A4,4,0,0,0,153.76,28.41ZM28,160V96a4,4,0,0,1,4-4H76v72H32A4,4,0,0,1,28,160Zm120,55.82L84,166V90l64-49.78ZM204,128a36,36,0,0,1-9,23.82,4,4,0,1,1-6-5.3,28,28,0,0,0,0-37,4,4,0,0,1,6-5.28A36,36,0,0,1,204,128Z"}))]]),ur=new Map([["bold",T.createElement(T.Fragment,null,T.createElement("path",{d:"M208.49,191.51a12,12,0,0,1-17,17L128,145,64.49,208.49a12,12,0,0,1-17-17L111,128,47.51,64.49a12,12,0,0,1,17-17L128,111l63.51-63.52a12,12,0,0,1,17,17L145,128Z"}))],["duotone",T.createElement(T.Fragment,null,T.createElement("path",{d:"M216,56V200a16,16,0,0,1-16,16H56a16,16,0,0,1-16-16V56A16,16,0,0,1,56,40H200A16,16,0,0,1,216,56Z",opacity:"0.2"}),T.createElement("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"}))],["fill",T.createElement(T.Fragment,null,T.createElement("path",{d:"M208,32H48A16,16,0,0,0,32,48V208a16,16,0,0,0,16,16H208a16,16,0,0,0,16-16V48A16,16,0,0,0,208,32ZM181.66,170.34a8,8,0,0,1-11.32,11.32L128,139.31,85.66,181.66a8,8,0,0,1-11.32-11.32L116.69,128,74.34,85.66A8,8,0,0,1,85.66,74.34L128,116.69l42.34-42.35a8,8,0,0,1,11.32,11.32L139.31,128Z"}))],["light",T.createElement(T.Fragment,null,T.createElement("path",{d:"M204.24,195.76a6,6,0,1,1-8.48,8.48L128,136.49,60.24,204.24a6,6,0,0,1-8.48-8.48L119.51,128,51.76,60.24a6,6,0,0,1,8.48-8.48L128,119.51l67.76-67.75a6,6,0,0,1,8.48,8.48L136.49,128Z"}))],["regular",T.createElement(T.Fragment,null,T.createElement("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"}))],["thin",T.createElement(T.Fragment,null,T.createElement("path",{d:"M202.83,197.17a4,4,0,0,1-5.66,5.66L128,133.66,58.83,202.83a4,4,0,0,1-5.66-5.66L122.34,128,53.17,58.83a4,4,0,0,1,5.66-5.66L128,122.34l69.17-69.17a4,4,0,1,1,5.66,5.66L133.66,128Z"}))]]),dr=o.createContext({color:"currentColor",size:"1em",weight:"regular",mirrored:!1}),vt=T.forwardRef((e,t)=>{const{alt:n,color:a,size:r,weight:s,mirrored:i,children:l,weights:c,...u}=e,{color:m="currentColor",size:h,weight:p="regular",mirrored:f=!1,...b}=T.useContext(dr);return T.createElement("svg",{ref:t,xmlns:"http://www.w3.org/2000/svg",width:r??h,height:r??h,fill:a??m,viewBox:"0 0 256 256",transform:i||f?"scale(-1, 1)":void 0,...b,...u},!!n&&T.createElement("title",null,n),l,c.get(s??p))});vt.displayName="IconBase";const Kn=T.forwardRef((e,t)=>T.createElement(vt,{ref:t,...e,weights:ir}));Kn.displayName="DotsThreeIcon";const qn=T.forwardRef((e,t)=>T.createElement(vt,{ref:t,...e,weights:lr}));qn.displayName="SpeakerHighIcon";const Jn=T.forwardRef((e,t)=>T.createElement(vt,{ref:t,...e,weights:cr}));Jn.displayName="SpeakerLowIcon";const Qn=T.forwardRef((e,t)=>T.createElement(vt,{ref:t,...e,weights:ur}));Qn.displayName="XIcon";const fr=Qn;R.span`
1
+ "use strict";var lr=Object.create;var Bn=Object.defineProperty;var cr=Object.getOwnPropertyDescriptor;var ur=Object.getOwnPropertyNames;var dr=Object.getPrototypeOf,fr=Object.prototype.hasOwnProperty;var mr=(e,t,n,a)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of ur(t))!fr.call(e,r)&&r!==n&&Bn(e,r,{get:()=>t[r],enumerable:!(a=cr(t,r))||a.enumerable});return e};var hr=(e,t,n)=>(n=e!=null?lr(dr(e)):{},mr(t||!e||!e.__esModule?Bn(n,"default",{value:e,enumerable:!0}):n,e));Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const Z=require("tone"),v=require("react/jsx-runtime"),i=require("react"),R=require("styled-components"),Ge=require("@dnd-kit/core"),ra=require("react-dom"),pr=require("@dnd-kit/modifiers");function sa(e){const t=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e){for(const n in e)if(n!=="default"){const a=Object.getOwnPropertyDescriptor(e,n);Object.defineProperty(t,n,a.get?a:{enumerable:!0,get:()=>e[n]})}}return t.default=e,Object.freeze(t)}const oa=sa(Z),E=sa(i);var ke=1e3;function Ut(e){const{audioBuffer:t,startSample:n,offsetSamples:a=0,gain:r=1,name:s,color:o,fadeIn:l,fadeOut:c,waveformData:u}=e,f=t?.sampleRate??e.sampleRate??u?.sample_rate,h=t?.length??e.sourceDurationSamples??(u&&f?Math.ceil(u.duration*f):void 0);if(f===void 0)throw new Error("createClip: sampleRate is required when audioBuffer is not provided (can use waveformData.sample_rate)");if(h===void 0)throw new Error("createClip: sourceDurationSamples is required when audioBuffer is not provided (can use waveformData.duration)");t&&u&&t.sampleRate!==u.sample_rate&&console.warn(`Sample rate mismatch: audioBuffer (${t.sampleRate}) vs waveformData (${u.sample_rate}). Using audioBuffer sample rate. Waveform visualization may be slightly off.`);const p=e.durationSamples??h;return{id:ca(),audioBuffer:t,startSample:n,durationSamples:p,offsetSamples:a,sampleRate:f,sourceDurationSamples:h,gain:r,name:s,color:o,fadeIn:l,fadeOut:c,waveformData:u}}function ia(e){const{audioBuffer:t,startTime:n,offset:a=0,gain:r=1,name:s,color:o,fadeIn:l,fadeOut:c,waveformData:u}=e,f=t?.sampleRate??e.sampleRate??u?.sample_rate;if(f===void 0)throw new Error("createClipFromSeconds: sampleRate is required when audioBuffer is not provided (can use waveformData.sample_rate)");const h=t?.duration??e.sourceDuration??u?.duration;if(h===void 0)throw new Error("createClipFromSeconds: sourceDuration is required when audioBuffer is not provided (can use waveformData.duration)");t&&u&&t.sampleRate!==u.sample_rate&&console.warn(`Sample rate mismatch: audioBuffer (${t.sampleRate}) vs waveformData (${u.sample_rate}). Using audioBuffer sample rate. Waveform visualization may be slightly off.`);const p=e.duration??h;return Ut({audioBuffer:t,startSample:Math.round(n*f),durationSamples:Math.round(p*f),offsetSamples:Math.round(a*f),sampleRate:f,sourceDurationSamples:Math.ceil(h*f),gain:r,name:s,color:o,fadeIn:l,fadeOut:c,waveformData:u})}function la(e){const{name:t,clips:n=[],muted:a=!1,soloed:r=!1,volume:s=1,pan:o=0,color:l,height:c,spectrogramConfig:u,spectrogramColorMap:f}=e;return{id:ca(),name:t,clips:n,muted:a,soloed:r,volume:s,pan:o,color:l,height:c,spectrogramConfig:u,spectrogramColorMap:f}}function ca(){return`${Date.now()}-${Math.random().toString(36).substr(2,9)}`}function Kt(e){return[...e].sort((t,n)=>t.startSample-n.startSample)}function Fn(e){return e.startSample/e.sampleRate}function gr(e){return(e.startSample+e.durationSamples)/e.sampleRate}function br(e){return e.offsetSamples/e.sampleRate}function vr(e){return e.durationSamples/e.sampleRate}var Wn=!1;function Dt(e){const t=e._param;return!t&&!Wn&&(Wn=!0,console.warn("[waveform-playlist] Unable to access Tone.js internal _param. This likely means the Tone.js version is incompatible. Fades and mute scheduling may not work correctly.")),t}function Pn(e,t){const n=new Float32Array(e),a=e-1;for(let r=0;r<e;r++){const s=r/a;n[r]=t?s:1-s}return n}function Cr(e,t){const n=new Float32Array(e),a=e-1;for(let r=0;r<e;r++){const s=r/a,o=t?r:e-1-r;n[o]=Math.exp(2*s-1)/Math.E}return n}function yr(e,t){const n=new Float32Array(e),a=t?Math.PI/2:-Math.PI/2;for(let r=0;r<e;r++)n[r]=Math.sin(Math.PI*r/e-a)/2+.5;return n}function wr(e,t,n=10){const a=new Float32Array(e);for(let r=0;r<e;r++){const s=t?r:e-1-r,o=r/e;a[s]=Math.log(1+n*o)/Math.log(1+n)}return a}function ua(e,t,n){switch(e){case"linear":return Pn(t,n);case"exponential":return Cr(t,n);case"sCurve":return yr(t,n);case"logarithmic":return wr(t,n);default:return Pn(t,n)}}function Vn(e,t,n,a="linear",r=0,s=1){if(!(n<=0))if(a==="linear")e.setValueAtTime(r,t),e.linearRampToValueAtTime(s,t+n);else if(a==="exponential")e.setValueAtTime(Math.max(r,.001),t),e.exponentialRampToValueAtTime(Math.max(s,.001),t+n);else{const o=ua(a,1e4,!0),l=new Float32Array(o.length),c=s-r;for(let u=0;u<o.length;u++)l[u]=r+o[u]*c;e.setValueCurveAtTime(l,t,n)}}function Zn(e,t,n,a="linear",r=1,s=0){if(!(n<=0))if(a==="linear")e.setValueAtTime(r,t),e.linearRampToValueAtTime(s,t+n);else if(a==="exponential")e.setValueAtTime(Math.max(r,.001),t),e.exponentialRampToValueAtTime(Math.max(s,.001),t+n);else{const o=ua(a,1e4,!1),l=new Float32Array(o.length),c=r-s;for(let u=0;u<o.length;u++)l[u]=s+o[u]*c;e.setValueCurveAtTime(l,t,n)}}var xr=class{constructor(e){this.activePlayers=0,this.track=e.track,this.volumeNode=new Z.Volume(this.gainToDb(e.track.gain)),this.panNode=new Z.Panner(e.track.stereoPan),this.muteGain=new Z.Gain(e.track.muted?0:1);const t=e.destination||Z.getDestination();if(e.effects){const a=e.effects(this.muteGain,t,!1);a&&(this.effectsCleanup=a)}else this.muteGain.connect(t);const n=e.clips||(e.buffer?[{buffer:e.buffer,startTime:0,duration:e.buffer.duration,offset:0,fadeIn:e.track.fadeIn,fadeOut:e.track.fadeOut,gain:1}]:[]);this.clips=n.map(a=>{const r=new Z.Player({url:a.buffer,loop:!1,onstop:()=>{this.activePlayers--,this.activePlayers===0&&this.onStopCallback&&this.onStopCallback()}}),s=new Z.Gain(a.gain);return r.connect(s),s.chain(this.volumeNode,this.panNode,this.muteGain),{player:r,clipInfo:a,fadeGain:s,pausedPosition:0,playStartTime:0}})}scheduleFades(e,t,n=0){const{clipInfo:a,fadeGain:r}=e,s=Dt(r.gain);if(!s)return;s.cancelScheduledValues(0);const o=n-a.offset;if(a.fadeIn&&o<a.fadeIn.duration){const l=a.fadeIn.duration;if(o<=0)Vn(s,t,l,a.fadeIn.type||"linear",0,a.gain);else{const c=l-o,u=o/l,f=a.gain*u;Vn(s,t,c,a.fadeIn.type||"linear",f,a.gain)}}else s.setValueAtTime(a.gain,t);if(a.fadeOut){const c=a.duration-a.fadeOut.duration-o;if(c>0){const u=t+c;Zn(s,u,a.fadeOut.duration,a.fadeOut.type||"linear",a.gain,0)}else if(c>-a.fadeOut.duration){const u=-c,f=a.fadeOut.duration-u,h=u/a.fadeOut.duration,p=a.gain*(1-h);Zn(s,t,f,a.fadeOut.type||"linear",p,0)}}}gainToDb(e){return 20*Math.log10(e)}setVolume(e){this.track.gain=e,this.volumeNode.volume.value=this.gainToDb(e)}setPan(e){this.track.stereoPan=e,this.panNode.pan.value=e}setMute(e){this.track.muted=e;const t=e?0:1;Dt(this.muteGain.gain)?.setValueAtTime(t,0),this.muteGain.gain.value=t}setSolo(e){this.track.soloed=e}play(e,t=0,n){this.clips.forEach(a=>{a.player.stop(),a.player.disconnect(),a.player.dispose();const r=new Z.Player({url:a.clipInfo.buffer,loop:!1,onstop:()=>{this.activePlayers--,this.activePlayers===0&&this.onStopCallback&&this.onStopCallback()}});r.connect(a.fadeGain),a.player=r,a.pausedPosition=0}),this.activePlayers=0,this.clips.forEach(a=>{const{player:r,clipInfo:s}=a,o=t,l=s.startTime,c=s.startTime+s.duration;if(o<c){this.activePlayers++;const u=e??Z.now();if(a.playStartTime=u,o>=l){const f=o-l+s.offset,h=s.duration-(o-l),p=n?Math.min(n,h):h;a.pausedPosition=f,this.scheduleFades(a,u,f),r.start(u,f,p)}else{const f=l-o,h=n?Math.min(n-f,s.duration):s.duration;f<(n??1/0)?(a.pausedPosition=s.offset,this.scheduleFades(a,u+f,s.offset),r.start(u+f,s.offset,h)):this.activePlayers--}}})}pause(){this.clips.forEach(e=>{if(e.player.state==="started"){const t=(Z.now()-e.playStartTime)*e.player.playbackRate;e.pausedPosition=e.pausedPosition+t}e.player.stop()}),this.activePlayers=0}stop(e){const t=e??Z.now();this.clips.forEach(n=>{n.player.stop(t),n.pausedPosition=0}),this.activePlayers=0}dispose(){this.effectsCleanup&&this.effectsCleanup(),this.clips.forEach(e=>{e.player.dispose(),e.fadeGain.dispose()}),this.volumeNode.dispose(),this.panNode.dispose(),this.muteGain.dispose()}get id(){return this.track.id}get duration(){if(this.clips.length===0)return 0;const e=this.clips[this.clips.length-1];return e.clipInfo.startTime+e.clipInfo.duration}get buffer(){return this.clips[0]?.clipInfo.buffer}get isPlaying(){return this.clips.some(e=>e.player.state==="started")}get muted(){return this.track.muted}get startTime(){return this.track.startTime}setOnStopCallback(e){this.onStopCallback=e}},kr=class{constructor(e={}){if(this.tracks=new Map,this.isInitialized=!1,this.soloedTracks=new Set,this.manualMuteState=new Map,this.activeTracks=new Map,this.playbackSessionId=0,this.masterVolume=new Z.Volume(this.gainToDb(e.masterGain??1)),e.effects){const t=e.effects(this.masterVolume,Z.getDestination(),!1);t&&(this.effectsCleanup=t)}else this.masterVolume.toDestination();e.tracks&&e.tracks.forEach(t=>{this.tracks.set(t.id,t),this.manualMuteState.set(t.id,t.muted)})}gainToDb(e){return 20*Math.log10(e)}async init(){this.isInitialized||(await Z.start(),this.isInitialized=!0)}addTrack(e){const t={...e,destination:this.masterVolume},n=new xr(t);return this.tracks.set(n.id,n),this.manualMuteState.set(n.id,e.track.muted??!1),e.track.soloed&&this.soloedTracks.add(n.id),n}applyInitialSoloState(){this.updateSoloMuting()}removeTrack(e){const t=this.tracks.get(e);t&&(t.dispose(),this.tracks.delete(e),this.manualMuteState.delete(e),this.soloedTracks.delete(e))}getTrack(e){return this.tracks.get(e)}play(e,t,n){if(!this.isInitialized){console.warn("TonePlayout not initialized. Call init() first.");return}const a=e??Z.now(),r=t??0;this.playbackSessionId++;const s=this.playbackSessionId;this.activeTracks.clear(),this.tracks.forEach(o=>{const l=o.startTime;if(r>=l){const c=r-l;n!==void 0&&(this.activeTracks.set(o.id,s),o.setOnStopCallback(()=>{this.activeTracks.get(o.id)===s&&(this.activeTracks.delete(o.id),this.activeTracks.size===0&&this.onPlaybackCompleteCallback&&this.onPlaybackCompleteCallback())})),o.play(a,c,n)}else{const c=l-r;n!==void 0&&(this.activeTracks.set(o.id,s),o.setOnStopCallback(()=>{this.activeTracks.get(o.id)===s&&(this.activeTracks.delete(o.id),this.activeTracks.size===0&&this.onPlaybackCompleteCallback&&this.onPlaybackCompleteCallback())})),o.play(a+c,0,n)}}),t!==void 0?Z.getTransport().start(a,t):Z.getTransport().start(a)}pause(){Z.getTransport().pause(),this.tracks.forEach(e=>{e.pause()})}stop(){Z.getTransport().stop(),this.tracks.forEach(e=>{e.stop()})}setMasterGain(e){this.masterVolume.volume.value=this.gainToDb(e)}setSolo(e,t){const n=this.tracks.get(e);n&&(n.setSolo(t),t?this.soloedTracks.add(e):this.soloedTracks.delete(e),this.updateSoloMuting())}updateSoloMuting(){const e=this.soloedTracks.size>0;this.tracks.forEach((t,n)=>{if(e)if(!this.soloedTracks.has(n))t.setMute(!0);else{const a=this.manualMuteState.get(n)??!1;t.setMute(a)}else{const a=this.manualMuteState.get(n)??!1;t.setMute(a)}})}setMute(e,t){const n=this.tracks.get(e);n&&(this.manualMuteState.set(e,t),n.setMute(t))}getCurrentTime(){return Z.getTransport().seconds}seekTo(e){Z.getTransport().seconds=e}dispose(){this.tracks.forEach(e=>{e.dispose()}),this.tracks.clear(),this.effectsCleanup&&this.effectsCleanup(),this.masterVolume.dispose()}get context(){return Z.getContext()}get sampleRate(){return Z.getContext().sampleRate}setOnPlaybackComplete(e){this.onPlaybackCompleteCallback=e}},Et=null;function Sr(){return Et||(Et=new Z.Context,Z.setContext(Et)),Et}function Ir(){return Sr().rawContext}function _r(e){let t=null,n=!1,a=0;function r(s){t&&t.dispose(),a++;const o=a;t=new kr({effects:e?.effects});for(const l of s){const c=l.clips.filter(d=>d.audioBuffer);if(c.length===0)continue;const u=Math.min(...c.map(Fn)),f=Math.max(...c.map(gr)),h={id:l.id,name:l.name,gain:l.volume,muted:l.muted,soloed:l.soloed,stereoPan:l.pan,startTime:u,endTime:f},p=c.map(d=>({buffer:d.audioBuffer,startTime:Fn(d)-u,duration:vr(d),offset:br(d),fadeIn:d.fadeIn,fadeOut:d.fadeOut,gain:d.gain}));t.addTrack({clips:p,track:h,effects:l.effects})}t.applyInitialSoloState(),t.setOnPlaybackComplete(()=>{o===a&&(n=!1)})}return{async init(){t&&await t.init()},setTracks(s){r(s)},async play(s,o){if(!t)return;await t.init();const l=o!==void 0?o-s:void 0;t.play(Z.now(),s,l),n=!0},pause(){t?.pause(),n=!1},stop(){t?.stop(),n=!1},seek(s){t?.seekTo(s)},getCurrentTime(){return t?.getCurrentTime()??0},isPlaying(){return n},setMasterVolume(s){t?.setMasterGain(s)},setTrackVolume(s,o){t?.getTrack(s)?.setVolume(o)},setTrackMute(s,o){t?.setMute(s,o)},setTrackSolo(s,o){t?.setSolo(s,o)},setTrackPan(s,o){t?.getTrack(s)?.setPan(o)},dispose(){t?.dispose(),t=null,n=!1}}}function da(e,t,n,a){let r=t;const s=-e.startSample;if(r=Math.max(r,s),a>0){const o=n[a-1],c=o.startSample+o.durationSamples-e.startSample;r=Math.max(r,c)}if(a<n.length-1){const l=n[a+1].startSample-(e.startSample+e.durationSamples);r=Math.min(r,l)}return r}function qt(e,t,n,a,r,s){let o=t;if(n==="left"){if(o=Math.max(o,-e.startSample),o=Math.max(o,-e.offsetSamples),r>0){const l=a[r-1],c=l.startSample+l.durationSamples;o=Math.max(o,c-e.startSample)}o=Math.min(o,e.durationSamples-s)}else if(o=Math.max(o,s-e.durationSamples),o=Math.min(o,e.sourceDurationSamples-e.offsetSamples-e.durationSamples),r<a.length-1){const l=a[r+1];o=Math.min(o,l.startSample-e.startSample-e.durationSamples)}return o}function Ar(e,t){return Math.floor(e/t)*t}function Mr(e,t){const n=t-e.startSample,a=e.durationSamples-n,r=e.name?`${e.name} (1)`:void 0,s=e.name?`${e.name} (2)`:void 0,o=Ut({startSample:e.startSample,durationSamples:n,offsetSamples:e.offsetSamples,sampleRate:e.sampleRate,sourceDurationSamples:e.sourceDurationSamples,gain:e.gain,name:r,color:e.color,fadeIn:e.fadeIn,audioBuffer:e.audioBuffer,waveformData:e.waveformData}),l=Ut({startSample:t,durationSamples:a,offsetSamples:e.offsetSamples+n,sampleRate:e.sampleRate,sourceDurationSamples:e.sourceDurationSamples,gain:e.gain,name:s,color:e.color,fadeOut:e.fadeOut,audioBuffer:e.audioBuffer,waveformData:e.waveformData});return{left:o,right:l}}function fa(e,t,n){const a=e.startSample+e.durationSamples;if(t<=e.startSample||t>=a)return!1;const r=t-e.startSample,s=a-t;return r>=n&&s>=n}function Ot(e){let t=0;for(const n of e)for(const a of n.clips){const s=(a.startSample+a.durationSamples)/a.sampleRate;t=Math.max(t,s)}return t}function Ln(e,t){if(t.length===0)return 0;let n=0,a=Math.abs(t[0]-e);for(let r=1;r<t.length;r++){const s=Math.abs(t[r]-e);s<a&&(a=s,n=r)}return n}function jn(e,t){return Math.max(0,Math.min(e,t))}var Er=44100,Tr=1e3,$r=[256,512,1024,2048,4096,8192],zn=.1,Rr=class{constructor(e={}){if(this._tracks=[],this._currentTime=0,this._isPlaying=!1,this._selectedTrackId=null,this._selectionStart=0,this._selectionEnd=0,this._masterVolume=1,this._loopStart=0,this._loopEnd=0,this._isLoopEnabled=!1,this._tracksVersion=0,this._animFrameId=null,this._disposed=!1,this._listeners=new Map,this._sampleRate=e.sampleRate??Er,this._zoomLevels=[...e.zoomLevels??$r],this._adapter=e.adapter??null,this._zoomLevels.length===0)throw new Error("PlaylistEngine: zoomLevels must not be empty");const t=e.samplesPerPixel??Tr;this._zoomIndex=Ln(t,this._zoomLevels)}getState(){return{tracks:this._tracks.map(e=>({...e,clips:[...e.clips]})),tracksVersion:this._tracksVersion,duration:Ot(this._tracks),currentTime:this._currentTime,isPlaying:this._isPlaying,samplesPerPixel:this._zoomLevels[this._zoomIndex],sampleRate:this._sampleRate,selectedTrackId:this._selectedTrackId,zoomIndex:this._zoomIndex,canZoomIn:this._zoomIndex>0,canZoomOut:this._zoomIndex<this._zoomLevels.length-1,selectionStart:this._selectionStart,selectionEnd:this._selectionEnd,masterVolume:this._masterVolume,loopStart:this._loopStart,loopEnd:this._loopEnd,isLoopEnabled:this._isLoopEnabled}}setTracks(e){this._tracks=[...e],this._tracksVersion++,this._adapter?.setTracks(this._tracks),this._emitStateChange()}addTrack(e){this._tracks=[...this._tracks,e],this._tracksVersion++,this._adapter?.setTracks(this._tracks),this._emitStateChange()}removeTrack(e){this._tracks.some(t=>t.id===e)&&(this._tracks=this._tracks.filter(t=>t.id!==e),this._tracksVersion++,this._selectedTrackId===e&&(this._selectedTrackId=null),this._adapter?.setTracks(this._tracks),this._emitStateChange())}selectTrack(e){e!==this._selectedTrackId&&(this._selectedTrackId=e,this._emitStateChange())}moveClip(e,t,n){const a=this._tracks.find(u=>u.id===e);if(!a){console.warn(`[waveform-playlist/engine] moveClip: track "${e}" not found`);return}const r=a.clips.findIndex(u=>u.id===t);if(r===-1){console.warn(`[waveform-playlist/engine] moveClip: clip "${t}" not found in track "${e}"`);return}const s=a.clips[r],o=Kt(a.clips),l=o.findIndex(u=>u.id===t),c=da(s,n,o,l);c!==0&&(this._tracks=this._tracks.map(u=>{if(u.id!==e)return u;const f=u.clips.map((h,p)=>p===r?{...h,startSample:Math.floor(h.startSample+c)}:h);return{...u,clips:f}}),this._tracksVersion++,this._adapter?.setTracks(this._tracks),this._emitStateChange())}splitClip(e,t,n){const a=this._tracks.find(u=>u.id===e);if(!a){console.warn(`[waveform-playlist/engine] splitClip: track "${e}" not found`);return}const r=a.clips.findIndex(u=>u.id===t);if(r===-1){console.warn(`[waveform-playlist/engine] splitClip: clip "${t}" not found in track "${e}"`);return}const s=a.clips[r],o=Math.floor(zn*this._sampleRate);if(!fa(s,n,o)){console.warn(`[waveform-playlist/engine] splitClip: cannot split clip "${t}" at sample ${n} (clip range: ${s.startSample}–${s.startSample+s.durationSamples}, minDuration: ${o})`);return}const{left:l,right:c}=Mr(s,n);this._tracks=this._tracks.map(u=>{if(u.id!==e)return u;const f=[...u.clips];return f.splice(r,1,l,c),{...u,clips:f}}),this._tracksVersion++,this._adapter?.setTracks(this._tracks),this._emitStateChange()}trimClip(e,t,n,a){const r=this._tracks.find(h=>h.id===e);if(!r){console.warn(`[waveform-playlist/engine] trimClip: track "${e}" not found`);return}const s=r.clips.findIndex(h=>h.id===t);if(s===-1){console.warn(`[waveform-playlist/engine] trimClip: clip "${t}" not found in track "${e}"`);return}const o=r.clips[s],l=Kt(r.clips),c=l.findIndex(h=>h.id===t),u=Math.floor(zn*this._sampleRate),f=qt(o,a,n,l,c,u);f!==0&&(this._tracks=this._tracks.map(h=>{if(h.id!==e)return h;const p=h.clips.map((d,g)=>g!==s?d:n==="left"?{...d,startSample:d.startSample+f,offsetSamples:d.offsetSamples+f,durationSamples:d.durationSamples-f}:{...d,durationSamples:d.durationSamples+f});return{...h,clips:p}}),this._tracksVersion++,this._adapter?.setTracks(this._tracks),this._emitStateChange())}async play(e,t){if(e!==void 0){const n=Ot(this._tracks);this._currentTime=jn(e,n)}this._adapter&&(await this._adapter.play(this._currentTime,t),this._startTimeUpdateLoop()),this._isPlaying=!0,this._emit("play"),this._emitStateChange()}pause(){this._isPlaying=!1,this._stopTimeUpdateLoop(),this._adapter?.pause(),this._adapter&&(this._currentTime=this._adapter.getCurrentTime()),this._emit("pause"),this._emitStateChange()}stop(){this._isPlaying=!1,this._currentTime=0,this._stopTimeUpdateLoop(),this._adapter?.stop(),this._emit("stop"),this._emitStateChange()}seek(e){const t=Ot(this._tracks);this._currentTime=jn(e,t),this._adapter?.seek(this._currentTime),this._emitStateChange()}setMasterVolume(e){e!==this._masterVolume&&(this._masterVolume=e,this._adapter?.setMasterVolume(e),this._emitStateChange())}setSelection(e,t){const n=Math.min(e,t),a=Math.max(e,t);n===this._selectionStart&&a===this._selectionEnd||(this._selectionStart=n,this._selectionEnd=a,this._emitStateChange())}setLoopRegion(e,t){const n=Math.min(e,t),a=Math.max(e,t);n===this._loopStart&&a===this._loopEnd||(this._loopStart=n,this._loopEnd=a,this._emitStateChange())}setLoopEnabled(e){e!==this._isLoopEnabled&&(this._isLoopEnabled=e,this._emitStateChange())}setTrackVolume(e,t){this._adapter?.setTrackVolume(e,t)}setTrackMute(e,t){this._adapter?.setTrackMute(e,t)}setTrackSolo(e,t){this._adapter?.setTrackSolo(e,t)}setTrackPan(e,t){this._adapter?.setTrackPan(e,t)}zoomIn(){this._zoomIndex>0&&(this._zoomIndex--,this._emitStateChange())}zoomOut(){this._zoomIndex<this._zoomLevels.length-1&&(this._zoomIndex++,this._emitStateChange())}setZoomLevel(e){const t=Ln(e,this._zoomLevels);t!==this._zoomIndex&&(this._zoomIndex=t,this._emitStateChange())}on(e,t){this._listeners.has(e)||this._listeners.set(e,new Set),this._listeners.get(e).add(t)}off(e,t){this._listeners.get(e)?.delete(t)}dispose(){this._disposed||(this._disposed=!0,this._stopTimeUpdateLoop(),this._adapter?.dispose(),this._listeners.clear())}_emit(e,...t){const n=this._listeners.get(e);if(n)for(const a of n)try{a(...t)}catch(r){console.warn("[waveform-playlist/engine] Error in event listener:",r)}}_emitStateChange(){this._emit("statechange",this.getState())}_startTimeUpdateLoop(){if(typeof requestAnimationFrame>"u")return;this._stopTimeUpdateLoop();const e=()=>{this._disposed||!this._isPlaying||(this._adapter&&(this._currentTime=this._adapter.getCurrentTime(),this._emit("timeupdate",this._currentTime)),this._animFrameId=requestAnimationFrame(e))};this._animFrameId=requestAnimationFrame(e)}_stopTimeUpdateLoop(){this._animFrameId!==null&&typeof cancelAnimationFrame<"u"&&(cancelAnimationFrame(this._animFrameId),this._animFrameId=null)}};const Jt=Object.freeze({Translate:{toString(e){if(!e)return;const{x:t,y:n}=e;return"translate3d("+(t?Math.round(t):0)+"px, "+(n?Math.round(n):0)+"px, 0)"}},Scale:{toString(e){if(!e)return;const{scaleX:t,scaleY:n}=e;return"scaleX("+t+") scaleY("+n+")"}},Transform:{toString(e){if(e)return[Jt.Translate.toString(e),Jt.Scale.toString(e)].join(" ")}},Transition:{toString(e){let{property:t,duration:n,easing:a}=e;return t+" "+n+"ms "+a}}}),Dr=new Map([["bold",E.createElement(E.Fragment,null,E.createElement("path",{d:"M144,128a16,16,0,1,1-16-16A16,16,0,0,1,144,128ZM60,112a16,16,0,1,0,16,16A16,16,0,0,0,60,112Zm136,0a16,16,0,1,0,16,16A16,16,0,0,0,196,112Z"}))],["duotone",E.createElement(E.Fragment,null,E.createElement("path",{d:"M240,96v64a16,16,0,0,1-16,16H32a16,16,0,0,1-16-16V96A16,16,0,0,1,32,80H224A16,16,0,0,1,240,96Z",opacity:"0.2"}),E.createElement("path",{d:"M140,128a12,12,0,1,1-12-12A12,12,0,0,1,140,128Zm56-12a12,12,0,1,0,12,12A12,12,0,0,0,196,116ZM60,116a12,12,0,1,0,12,12A12,12,0,0,0,60,116Z"}))],["fill",E.createElement(E.Fragment,null,E.createElement("path",{d:"M224,80H32A16,16,0,0,0,16,96v64a16,16,0,0,0,16,16H224a16,16,0,0,0,16-16V96A16,16,0,0,0,224,80ZM60,140a12,12,0,1,1,12-12A12,12,0,0,1,60,140Zm68,0a12,12,0,1,1,12-12A12,12,0,0,1,128,140Zm68,0a12,12,0,1,1,12-12A12,12,0,0,1,196,140Z"}))],["light",E.createElement(E.Fragment,null,E.createElement("path",{d:"M138,128a10,10,0,1,1-10-10A10,10,0,0,1,138,128ZM60,118a10,10,0,1,0,10,10A10,10,0,0,0,60,118Zm136,0a10,10,0,1,0,10,10A10,10,0,0,0,196,118Z"}))],["regular",E.createElement(E.Fragment,null,E.createElement("path",{d:"M140,128a12,12,0,1,1-12-12A12,12,0,0,1,140,128Zm56-12a12,12,0,1,0,12,12A12,12,0,0,0,196,116ZM60,116a12,12,0,1,0,12,12A12,12,0,0,0,60,116Z"}))],["thin",E.createElement(E.Fragment,null,E.createElement("path",{d:"M136,128a8,8,0,1,1-8-8A8,8,0,0,1,136,128Zm-76-8a8,8,0,1,0,8,8A8,8,0,0,0,60,120Zm136,0a8,8,0,1,0,8,8A8,8,0,0,0,196,120Z"}))]]),Br=new Map([["bold",E.createElement(E.Fragment,null,E.createElement("path",{d:"M157.27,21.22a12,12,0,0,0-12.64,1.31L75.88,76H32A20,20,0,0,0,12,96v64a20,20,0,0,0,20,20H75.88l68.75,53.47A12,12,0,0,0,164,224V32A12,12,0,0,0,157.27,21.22ZM36,100H68v56H36Zm104,99.46L92,162.13V93.87l48-37.33ZM212,128a44,44,0,0,1-11,29.11,12,12,0,1,1-18-15.88,20,20,0,0,0,0-26.43,12,12,0,0,1,18-15.86A43.94,43.94,0,0,1,212,128Zm40,0a83.87,83.87,0,0,1-21.39,56,12,12,0,0,1-17.89-16,60,60,0,0,0,0-80,12,12,0,1,1,17.88-16A83.87,83.87,0,0,1,252,128Z"}))],["duotone",E.createElement(E.Fragment,null,E.createElement("path",{d:"M80,88v80H32a8,8,0,0,1-8-8V96a8,8,0,0,1,8-8Z",opacity:"0.2"}),E.createElement("path",{d:"M155.51,24.81a8,8,0,0,0-8.42.88L77.25,80H32A16,16,0,0,0,16,96v64a16,16,0,0,0,16,16H77.25l69.84,54.31A8,8,0,0,0,160,224V32A8,8,0,0,0,155.51,24.81ZM32,96H72v64H32ZM144,207.64,88,164.09V91.91l56-43.55Zm54-106.08a40,40,0,0,1,0,52.88,8,8,0,0,1-12-10.58,24,24,0,0,0,0-31.72,8,8,0,0,1,12-10.58ZM248,128a79.9,79.9,0,0,1-20.37,53.34,8,8,0,0,1-11.92-10.67,64,64,0,0,0,0-85.33,8,8,0,1,1,11.92-10.67A79.83,79.83,0,0,1,248,128Z"}))],["fill",E.createElement(E.Fragment,null,E.createElement("path",{d:"M160,32.25V223.69a8.29,8.29,0,0,1-3.91,7.18,8,8,0,0,1-9-.56l-65.57-51A4,4,0,0,1,80,176.16V79.84a4,4,0,0,1,1.55-3.15l65.57-51a8,8,0,0,1,10,.16A8.27,8.27,0,0,1,160,32.25ZM60,80H32A16,16,0,0,0,16,96v64a16,16,0,0,0,16,16H60a4,4,0,0,0,4-4V84A4,4,0,0,0,60,80Zm126.77,20.84a8,8,0,0,0-.72,11.3,24,24,0,0,1,0,31.72,8,8,0,1,0,12,10.58,40,40,0,0,0,0-52.88A8,8,0,0,0,186.74,100.84Zm40.89-26.17a8,8,0,1,0-11.92,10.66,64,64,0,0,1,0,85.34,8,8,0,1,0,11.92,10.66,80,80,0,0,0,0-106.66Z"}))],["light",E.createElement(E.Fragment,null,E.createElement("path",{d:"M154.64,26.61a6,6,0,0,0-6.32.65L77.94,82H32A14,14,0,0,0,18,96v64a14,14,0,0,0,14,14H77.94l70.38,54.74A6,6,0,0,0,158,224V32A6,6,0,0,0,154.64,26.61ZM30,160V96a2,2,0,0,1,2-2H74v68H32A2,2,0,0,1,30,160Zm116,51.73L86,165.07V90.93l60-46.66Zm50.53-108.85a38,38,0,0,1,0,50.24,6,6,0,1,1-9-7.94,26,26,0,0,0,0-34.37,6,6,0,0,1,9-7.93ZM246,128a77.86,77.86,0,0,1-19.86,52,6,6,0,1,1-8.94-8,66,66,0,0,0,0-88,6,6,0,1,1,8.94-8A77.86,77.86,0,0,1,246,128Z"}))],["regular",E.createElement(E.Fragment,null,E.createElement("path",{d:"M155.51,24.81a8,8,0,0,0-8.42.88L77.25,80H32A16,16,0,0,0,16,96v64a16,16,0,0,0,16,16H77.25l69.84,54.31A8,8,0,0,0,160,224V32A8,8,0,0,0,155.51,24.81ZM32,96H72v64H32ZM144,207.64,88,164.09V91.91l56-43.55Zm54-106.08a40,40,0,0,1,0,52.88,8,8,0,0,1-12-10.58,24,24,0,0,0,0-31.72,8,8,0,0,1,12-10.58ZM248,128a79.9,79.9,0,0,1-20.37,53.34,8,8,0,0,1-11.92-10.67,64,64,0,0,0,0-85.33,8,8,0,1,1,11.92-10.67A79.83,79.83,0,0,1,248,128Z"}))],["thin",E.createElement(E.Fragment,null,E.createElement("path",{d:"M153.76,28.41a4,4,0,0,0-4.22.43L78.63,84H32A12,12,0,0,0,20,96v64a12,12,0,0,0,12,12H78.63l70.91,55.16A4.07,4.07,0,0,0,152,228a3.92,3.92,0,0,0,1.76-.41A4,4,0,0,0,156,224V32A4,4,0,0,0,153.76,28.41ZM28,160V96a4,4,0,0,1,4-4H76v72H32A4,4,0,0,1,28,160Zm120,55.82L84,166V90l64-49.78Zm47-111.61a36,36,0,0,1,0,47.59,4,4,0,1,1-6-5.3,28,28,0,0,0,0-37,4,4,0,0,1,6-5.28ZM244,128a75.88,75.88,0,0,1-19.35,50.67,4,4,0,0,1-6-5.34,68,68,0,0,0,0-90.66,4,4,0,0,1,6-5.34A75.88,75.88,0,0,1,244,128Z"}))]]),Fr=new Map([["bold",E.createElement(E.Fragment,null,E.createElement("path",{d:"M157.27,21.22a12,12,0,0,0-12.64,1.31L75.88,76H32A20,20,0,0,0,12,96v64a20,20,0,0,0,20,20H75.88l68.75,53.47A12,12,0,0,0,164,224V32A12,12,0,0,0,157.27,21.22ZM36,100H68v56H36Zm104,99.46L92,162.13V93.87l48-37.33ZM212,128a44,44,0,0,1-11,29.11,12,12,0,0,1-18-15.88,20,20,0,0,0,0-26.44,12,12,0,0,1,18-15.85A43.94,43.94,0,0,1,212,128Z"}))],["duotone",E.createElement(E.Fragment,null,E.createElement("path",{d:"M80,88v80H32a8,8,0,0,1-8-8V96a8,8,0,0,1,8-8Z",opacity:"0.2"}),E.createElement("path",{d:"M155.51,24.81a8,8,0,0,0-8.42.88L77.25,80H32A16,16,0,0,0,16,96v64a16,16,0,0,0,16,16H77.25l69.84,54.31A8,8,0,0,0,160,224V32A8,8,0,0,0,155.51,24.81ZM32,96H72v64H32ZM144,207.64,88,164.09V91.91l56-43.55ZM208,128a39.93,39.93,0,0,1-10,26.46,8,8,0,0,1-12-10.58,24,24,0,0,0,0-31.72,8,8,0,1,1,12-10.58A40,40,0,0,1,208,128Z"}))],["fill",E.createElement(E.Fragment,null,E.createElement("path",{d:"M160,32.25V223.69a8.29,8.29,0,0,1-3.91,7.18,8,8,0,0,1-9-.56l-65.57-51A4,4,0,0,1,80,176.16V79.84a4,4,0,0,1,1.55-3.15l65.57-51a8,8,0,0,1,10,.16A8.27,8.27,0,0,1,160,32.25ZM60,80H32A16,16,0,0,0,16,96v64a16,16,0,0,0,16,16H60a4,4,0,0,0,4-4V84A4,4,0,0,0,60,80ZM198,101.56a8,8,0,1,0-12,10.58,24,24,0,0,1,0,31.72,8,8,0,1,0,12,10.58,40,40,0,0,0,0-52.88Z"}))],["light",E.createElement(E.Fragment,null,E.createElement("path",{d:"M154.64,26.61a6,6,0,0,0-6.32.65L77.94,82H32A14,14,0,0,0,18,96v64a14,14,0,0,0,14,14H77.94l70.38,54.74A6,6,0,0,0,158,224V32A6,6,0,0,0,154.64,26.61ZM30,160V96a2,2,0,0,1,2-2H74v68H32A2,2,0,0,1,30,160Zm116,51.73L86,165.07V90.93l60-46.66ZM206,128a37.94,37.94,0,0,1-9.5,25.14,6,6,0,1,1-9-7.94,26,26,0,0,0,0-34.37,6,6,0,0,1,9-7.93A38,38,0,0,1,206,128Z"}))],["regular",E.createElement(E.Fragment,null,E.createElement("path",{d:"M155.51,24.81a8,8,0,0,0-8.42.88L77.25,80H32A16,16,0,0,0,16,96v64a16,16,0,0,0,16,16H77.25l69.84,54.31A8,8,0,0,0,160,224V32A8,8,0,0,0,155.51,24.81ZM32,96H72v64H32ZM144,207.64,88,164.09V91.91l56-43.55ZM208,128a39.93,39.93,0,0,1-10,26.46,8,8,0,0,1-12-10.58,24,24,0,0,0,0-31.72,8,8,0,1,1,12-10.58A40,40,0,0,1,208,128Z"}))],["thin",E.createElement(E.Fragment,null,E.createElement("path",{d:"M153.76,28.41a4,4,0,0,0-4.22.43L78.63,84H32A12,12,0,0,0,20,96v64a12,12,0,0,0,12,12H78.63l70.91,55.16A4.07,4.07,0,0,0,152,228a3.92,3.92,0,0,0,1.76-.41A4,4,0,0,0,156,224V32A4,4,0,0,0,153.76,28.41ZM28,160V96a4,4,0,0,1,4-4H76v72H32A4,4,0,0,1,28,160Zm120,55.82L84,166V90l64-49.78ZM204,128a36,36,0,0,1-9,23.82,4,4,0,1,1-6-5.3,28,28,0,0,0,0-37,4,4,0,0,1,6-5.28A36,36,0,0,1,204,128Z"}))]]),Wr=new Map([["bold",E.createElement(E.Fragment,null,E.createElement("path",{d:"M208.49,191.51a12,12,0,0,1-17,17L128,145,64.49,208.49a12,12,0,0,1-17-17L111,128,47.51,64.49a12,12,0,0,1,17-17L128,111l63.51-63.52a12,12,0,0,1,17,17L145,128Z"}))],["duotone",E.createElement(E.Fragment,null,E.createElement("path",{d:"M216,56V200a16,16,0,0,1-16,16H56a16,16,0,0,1-16-16V56A16,16,0,0,1,56,40H200A16,16,0,0,1,216,56Z",opacity:"0.2"}),E.createElement("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"}))],["fill",E.createElement(E.Fragment,null,E.createElement("path",{d:"M208,32H48A16,16,0,0,0,32,48V208a16,16,0,0,0,16,16H208a16,16,0,0,0,16-16V48A16,16,0,0,0,208,32ZM181.66,170.34a8,8,0,0,1-11.32,11.32L128,139.31,85.66,181.66a8,8,0,0,1-11.32-11.32L116.69,128,74.34,85.66A8,8,0,0,1,85.66,74.34L128,116.69l42.34-42.35a8,8,0,0,1,11.32,11.32L139.31,128Z"}))],["light",E.createElement(E.Fragment,null,E.createElement("path",{d:"M204.24,195.76a6,6,0,1,1-8.48,8.48L128,136.49,60.24,204.24a6,6,0,0,1-8.48-8.48L119.51,128,51.76,60.24a6,6,0,0,1,8.48-8.48L128,119.51l67.76-67.75a6,6,0,0,1,8.48,8.48L136.49,128Z"}))],["regular",E.createElement(E.Fragment,null,E.createElement("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"}))],["thin",E.createElement(E.Fragment,null,E.createElement("path",{d:"M202.83,197.17a4,4,0,0,1-5.66,5.66L128,133.66,58.83,202.83a4,4,0,0,1-5.66-5.66L122.34,128,53.17,58.83a4,4,0,0,1,5.66-5.66L128,122.34l69.17-69.17a4,4,0,1,1,5.66,5.66L133.66,128Z"}))]]),Pr=i.createContext({color:"currentColor",size:"1em",weight:"regular",mirrored:!1}),yt=E.forwardRef((e,t)=>{const{alt:n,color:a,size:r,weight:s,mirrored:o,children:l,weights:c,...u}=e,{color:f="currentColor",size:h,weight:p="regular",mirrored:d=!1,...g}=E.useContext(Pr);return E.createElement("svg",{ref:t,xmlns:"http://www.w3.org/2000/svg",width:r??h,height:r??h,fill:a??f,viewBox:"0 0 256 256",transform:o||d?"scale(-1, 1)":void 0,...g,...u},!!n&&E.createElement("title",null,n),l,c.get(s??p))});yt.displayName="IconBase";const ma=E.forwardRef((e,t)=>E.createElement(yt,{ref:t,...e,weights:Dr}));ma.displayName="DotsThreeIcon";const ha=E.forwardRef((e,t)=>E.createElement(yt,{ref:t,...e,weights:Br}));ha.displayName="SpeakerHighIcon";const pa=E.forwardRef((e,t)=>E.createElement(yt,{ref:t,...e,weights:Fr}));pa.displayName="SpeakerLowIcon";const ga=E.forwardRef((e,t)=>E.createElement(yt,{ref:t,...e,weights:Wr}));ga.displayName="XIcon";const Vr=ga;R.span`
2
2
  font-family: 'Courier New', Monaco, monospace;
3
3
  font-size: 1rem;
4
4
  font-weight: 600;
5
5
  color: ${e=>e.theme?.textColor||"#333"};
6
6
  user-select: none;
7
- `;var Kt=R.button`
7
+ `;var tn=R.button`
8
8
  display: inline-flex;
9
9
  align-items: center;
10
10
  justify-content: center;
@@ -35,30 +35,30 @@
35
35
  opacity: 0.6;
36
36
  cursor: not-allowed;
37
37
  }
38
- `;R(Kt)`
38
+ `;R(tn)`
39
39
  padding: 0.25rem 0.5rem;
40
40
  font-size: ${e=>e.theme.fontSizeSmall};
41
- `;R(Kt)`
41
+ `;R(tn)`
42
42
  padding: 0.5rem;
43
43
  min-width: 2.25rem;
44
44
  min-height: 2.25rem;
45
- `;R(Kt)`
45
+ `;R(tn)`
46
46
  padding: 0.25rem;
47
47
  min-width: 1.75rem;
48
48
  min-height: 1.75rem;
49
49
  font-size: ${e=>e.theme.fontSizeSmall};
50
- `;var mr=R.div`
50
+ `;var Zr=R.div`
51
51
  display: inline-flex;
52
52
  align-items: center;
53
53
  gap: 0.5rem;
54
- `,hr=R.input`
54
+ `,Lr=R.input`
55
55
  cursor: pointer;
56
56
  accent-color: ${e=>e.theme.inputFocusBorder};
57
57
 
58
58
  &:disabled {
59
59
  cursor: not-allowed;
60
60
  }
61
- `,pr=R.label`
61
+ `,jr=R.label`
62
62
  margin: 0;
63
63
  cursor: pointer;
64
64
  user-select: none;
@@ -91,7 +91,7 @@
91
91
  cursor: not-allowed;
92
92
  opacity: 0.6;
93
93
  }
94
- `,ea=R.input`
94
+ `,ba=R.input`
95
95
  padding: 0.5rem 0.75rem;
96
96
  font-family: ${e=>e.theme.fontFamily};
97
97
  font-size: ${e=>e.theme.fontSize};
@@ -117,10 +117,10 @@
117
117
  opacity: 0.6;
118
118
  cursor: not-allowed;
119
119
  }
120
- `;R(ea)`
120
+ `;R(ba)`
121
121
  padding: 0.25rem 0.5rem;
122
122
  font-size: ${e=>e.theme.fontSizeSmall};
123
- `;var gr=R.label`
123
+ `;var zr=R.label`
124
124
  font-family: ${e=>e.theme.fontFamily};
125
125
  font-size: ${e=>e.theme.fontSizeSmall};
126
126
  font-weight: 500;
@@ -135,7 +135,7 @@
135
135
  align-items: center;
136
136
  gap: 0.5rem;
137
137
  cursor: pointer;
138
- `;var br=R.span`
138
+ `;var Hr=R.span`
139
139
  position: absolute;
140
140
  width: 1px;
141
141
  height: 1px;
@@ -145,7 +145,7 @@
145
145
  clip: rect(0, 0, 0, 0);
146
146
  white-space: nowrap;
147
147
  border: 0;
148
- `,ta=R.select`
148
+ `,va=R.select`
149
149
  padding: 0.5rem 2rem 0.5rem 0.75rem;
150
150
  font-family: ${e=>e.theme.fontFamily};
151
151
  font-size: ${e=>e.theme.fontSize};
@@ -178,10 +178,10 @@
178
178
  color: ${e=>e.theme.inputText};
179
179
  background-color: ${e=>e.theme.inputBackground};
180
180
  }
181
- `;R(ta)`
181
+ `;R(va)`
182
182
  padding: 0.25rem 1.75rem 0.25rem 0.5rem;
183
183
  font-size: ${e=>e.theme.fontSizeSmall};
184
- `;var na=R.input.attrs({type:"range"})`
184
+ `;var Ca=R.input.attrs({type:"range"})`
185
185
  -webkit-appearance: none;
186
186
  appearance: none;
187
187
  width: 100%;
@@ -261,7 +261,7 @@
261
261
  &:disabled::-moz-range-thumb {
262
262
  cursor: not-allowed;
263
263
  }
264
- `,vr=({checked:e,onChange:t,disabled:n=!1,className:a})=>{const r=s=>{t(s.target.checked)};return v.jsxs(mr,{className:a,children:[v.jsx(hr,{type:"checkbox",id:"automatic-scroll",className:"automatic-scroll",checked:e,onChange:r,disabled:n}),v.jsx(pr,{htmlFor:"automatic-scroll",children:"Automatic Scroll"})]})};function aa(e){return typeof e=="object"&&e!==null&&"type"in e}function tt(e){if(!aa(e))return e;const t=e.direction==="vertical"?"to bottom":"to right",n=e.stops.map(a=>`${a.color} ${a.offset*100}%`).join(", ");return`linear-gradient(${t}, ${n})`}var ra={waveformDrawMode:"inverted",waveOutlineColor:"#ffffff",waveFillColor:"#1a7f8e",waveProgressColor:"rgba(0, 0, 0, 0.10)",selectedWaveOutlineColor:"#ffffff",selectedWaveFillColor:"#00b4d8",selectedTrackControlsBackground:"#d9e9ff",timeColor:"#000",timescaleBackgroundColor:"#fff",playheadColor:"#f00",selectionColor:"rgba(255, 105, 180, 0.7)",loopRegionColor:"rgba(59, 130, 246, 0.3)",loopMarkerColor:"#3b82f6",clipHeaderBackgroundColor:"rgba(0, 0, 0, 0.1)",clipHeaderBorderColor:"rgba(0, 0, 0, 0.2)",clipHeaderTextColor:"#333",clipHeaderFontFamily:"inherit",selectedClipHeaderBackgroundColor:"#b3d9ff",fadeOverlayColor:"rgba(0, 0, 0, 0.4)",backgroundColor:"#ffffff",surfaceColor:"#f5f5f5",borderColor:"#ddd",textColor:"#333",textColorMuted:"#666",inputBackground:"#ffffff",inputBorder:"#ccc",inputText:"#333",inputPlaceholder:"#999",inputFocusBorder:"#0066cc",buttonBackground:"#0091ff",buttonText:"#ffffff",buttonBorder:"#0081e6",buttonHoverBackground:"#0081e6",sliderTrackColor:"#ddd",sliderThumbColor:"#daa520",annotationBoxBackground:"rgba(255, 255, 255, 0.85)",annotationBoxActiveBackground:"rgba(255, 255, 255, 0.95)",annotationBoxHoverBackground:"rgba(255, 255, 255, 0.98)",annotationBoxBorder:"#ff9800",annotationBoxActiveBorder:"#d67600",annotationLabelColor:"#2a2a2a",annotationResizeHandleColor:"rgba(0, 0, 0, 0.4)",annotationResizeHandleActiveColor:"rgba(0, 0, 0, 0.8)",annotationTextItemHoverBackground:"rgba(0, 0, 0, 0.03)",borderRadius:"4px",fontFamily:'-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, sans-serif',fontSize:"14px",fontSizeSmall:"12px"},Cr=class{constructor(){this._state=null,this._listeners=new Set,this.subscribe=e=>(this._listeners.add(e),()=>this._listeners.delete(e)),this.getSnapshot=()=>this._state}update(e,t){const n=t*1.5,a=Math.max(0,e-n),r=e+t+n;if(!(this._state&&this._state.containerWidth===t&&Math.abs(this._state.scrollLeft-e)<100)){this._state={scrollLeft:e,containerWidth:t,visibleStart:a,visibleEnd:r};for(const s of this._listeners)s()}}},oa=o.createContext(null),wr=()=>()=>{},yr=({containerRef:e,children:t})=>{const n=o.useRef(null);n.current===null&&(n.current=new Cr);const a=n.current,r=o.useRef(null),s=o.useCallback(()=>{const l=e.current;l&&a.update(l.scrollLeft,l.clientWidth)},[e,a]),i=o.useCallback(()=>{r.current===null&&(r.current=requestAnimationFrame(()=>{r.current=null,s()}))},[s]);return o.useEffect(()=>{const l=e.current;if(!l)return;s(),l.addEventListener("scroll",i,{passive:!0});const c=new ResizeObserver(()=>{i()});return c.observe(l),()=>{l.removeEventListener("scroll",i),c.disconnect(),r.current!==null&&(cancelAnimationFrame(r.current),r.current=null)}},[e,s,i]),v.jsx(oa.Provider,{value:a,children:t})};function xr(e){const t=o.useContext(oa);return o.useSyncExternalStore(t?t.subscribe:wr,()=>e(t?t.getSnapshot():null),()=>e(null))}function qt(e,t,n=0){const a=xr(r=>{const s=Math.ceil(e/t),i=[];for(let l=0;l<s;l++){const c=l*t,u=Math.min(e-c,t);if(r){const m=n+c;if(m+u<=r.visibleStart||m>=r.visibleEnd)continue}i.push(l)}return i.join(",")});return o.useMemo(()=>a?a.split(",").map(Number):[],[a])}var sa=o.createContext(0),kr=({originX:e,children:t})=>v.jsx(sa.Provider,{value:e,children:t}),ia=()=>o.useContext(sa);function Jt(){const e=o.useRef(new Map),t=o.useCallback(n=>{if(n!==null){const a=parseInt(n.dataset.index,10);e.current.set(a,n)}},[]);return o.useEffect(()=>{const n=e.current;for(const[a,r]of n.entries())r.isConnected||n.delete(a)}),{canvasRef:t,canvasMapRef:e}}function Sr(e,t,n,a){if(!aa(t))return t;let r;t.direction==="vertical"?r=e.createLinearGradient(0,0,0,a):r=e.createLinearGradient(0,0,n,0);for(const s of t.stops)r.addColorStop(s.offset,s.color);return r}var Ir=R.canvas.attrs(e=>({style:{width:`${e.$cssWidth}px`,height:`${e.$waveHeight}px`,left:`${e.$left}px`}}))`
264
+ `,Xr=({checked:e,onChange:t,disabled:n=!1,className:a})=>{const r=s=>{t(s.target.checked)};return v.jsxs(Zr,{className:a,children:[v.jsx(Lr,{type:"checkbox",id:"automatic-scroll",className:"automatic-scroll",checked:e,onChange:r,disabled:n}),v.jsx(jr,{htmlFor:"automatic-scroll",children:"Automatic Scroll"})]})};function ya(e){return typeof e=="object"&&e!==null&&"type"in e}function at(e){if(!ya(e))return e;const t=e.direction==="vertical"?"to bottom":"to right",n=e.stops.map(a=>`${a.color} ${a.offset*100}%`).join(", ");return`linear-gradient(${t}, ${n})`}var wa={waveformDrawMode:"inverted",waveOutlineColor:"#ffffff",waveFillColor:"#1a7f8e",waveProgressColor:"rgba(0, 0, 0, 0.10)",selectedWaveOutlineColor:"#ffffff",selectedWaveFillColor:"#00b4d8",selectedTrackControlsBackground:"#d9e9ff",timeColor:"#000",timescaleBackgroundColor:"#fff",playheadColor:"#f00",selectionColor:"rgba(255, 105, 180, 0.7)",loopRegionColor:"rgba(59, 130, 246, 0.3)",loopMarkerColor:"#3b82f6",clipHeaderBackgroundColor:"rgba(0, 0, 0, 0.1)",clipHeaderBorderColor:"rgba(0, 0, 0, 0.2)",clipHeaderTextColor:"#333",clipHeaderFontFamily:"inherit",selectedClipHeaderBackgroundColor:"#b3d9ff",fadeOverlayColor:"rgba(0, 0, 0, 0.4)",backgroundColor:"#ffffff",surfaceColor:"#f5f5f5",borderColor:"#ddd",textColor:"#333",textColorMuted:"#666",inputBackground:"#ffffff",inputBorder:"#ccc",inputText:"#333",inputPlaceholder:"#999",inputFocusBorder:"#0066cc",buttonBackground:"#0091ff",buttonText:"#ffffff",buttonBorder:"#0081e6",buttonHoverBackground:"#0081e6",sliderTrackColor:"#ddd",sliderThumbColor:"#daa520",annotationBoxBackground:"rgba(255, 255, 255, 0.85)",annotationBoxActiveBackground:"rgba(255, 255, 255, 0.95)",annotationBoxHoverBackground:"rgba(255, 255, 255, 0.98)",annotationBoxBorder:"#ff9800",annotationBoxActiveBorder:"#d67600",annotationLabelColor:"#2a2a2a",annotationResizeHandleColor:"rgba(0, 0, 0, 0.4)",annotationResizeHandleActiveColor:"rgba(0, 0, 0, 0.8)",annotationTextItemHoverBackground:"rgba(0, 0, 0, 0.03)",borderRadius:"4px",fontFamily:'-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, sans-serif',fontSize:"14px",fontSizeSmall:"12px"},Or=class{constructor(){this._state=null,this._listeners=new Set,this.subscribe=e=>(this._listeners.add(e),()=>this._listeners.delete(e)),this.getSnapshot=()=>this._state}update(e,t){const n=t*1.5,a=Math.max(0,e-n),r=e+t+n;if(!(this._state&&this._state.containerWidth===t&&Math.abs(this._state.scrollLeft-e)<100)){this._state={scrollLeft:e,containerWidth:t,visibleStart:a,visibleEnd:r};for(const s of this._listeners)s()}}},xa=i.createContext(null),Nr=()=>()=>{},Gr=({containerRef:e,children:t})=>{const n=i.useRef(null);n.current===null&&(n.current=new Or);const a=n.current,r=i.useRef(null),s=i.useCallback(()=>{const l=e.current;l&&a.update(l.scrollLeft,l.clientWidth)},[e,a]),o=i.useCallback(()=>{r.current===null&&(r.current=requestAnimationFrame(()=>{r.current=null,s()}))},[s]);return i.useEffect(()=>{const l=e.current;if(!l)return;s(),l.addEventListener("scroll",o,{passive:!0});const c=new ResizeObserver(()=>{o()});return c.observe(l),()=>{l.removeEventListener("scroll",o),c.disconnect(),r.current!==null&&(cancelAnimationFrame(r.current),r.current=null)}},[e,s,o]),v.jsx(xa.Provider,{value:a,children:t})};function Yr(e){const t=i.useContext(xa);return i.useSyncExternalStore(t?t.subscribe:Nr,()=>e(t?t.getSnapshot():null),()=>e(null))}function nn(e,t,n=0){const a=Yr(r=>{const s=Math.ceil(e/t),o=[];for(let l=0;l<s;l++){const c=l*t,u=Math.min(e-c,t);if(r){const f=n+c;if(f+u<=r.visibleStart||f>=r.visibleEnd)continue}o.push(l)}return o.join(",")});return i.useMemo(()=>a?a.split(",").map(Number):[],[a])}var ka=i.createContext(0),Ur=({originX:e,children:t})=>v.jsx(ka.Provider,{value:e,children:t}),Sa=()=>i.useContext(ka);function an(){const e=i.useRef(new Map),t=i.useCallback(n=>{if(n!==null){const a=parseInt(n.dataset.index,10);e.current.set(a,n)}},[]);return i.useEffect(()=>{const n=e.current;for(const[a,r]of n.entries())r.isConnected||n.delete(a)}),{canvasRef:t,canvasMapRef:e}}function Kr(e,t,n,a){if(!ya(t))return t;let r;t.direction==="vertical"?r=e.createLinearGradient(0,0,0,a):r=e.createLinearGradient(0,0,n,0);for(const s of t.stops)r.addColorStop(s.offset,s.color);return r}var qr=R.canvas.attrs(e=>({style:{width:`${e.$cssWidth}px`,height:`${e.$waveHeight}px`,left:`${e.$left}px`}}))`
265
265
  position: absolute;
266
266
  top: 0;
267
267
  /* Promote to own compositing layer for smoother scrolling */
@@ -269,15 +269,15 @@
269
269
  /* Disable image rendering interpolation */
270
270
  image-rendering: pixelated;
271
271
  image-rendering: crisp-edges;
272
- `,Ar=R.div.attrs(e=>({style:{top:`${e.$waveHeight*e.$index}px`,width:`${e.$cssWidth}px`,height:`${e.$waveHeight}px`}}))`
272
+ `,Jr=R.div.attrs(e=>({style:{top:`${e.$waveHeight*e.$index}px`,width:`${e.$cssWidth}px`,height:`${e.$waveHeight}px`}}))`
273
273
  position: absolute;
274
274
  background: ${e=>e.$waveFillColor};
275
275
  /* Force GPU compositing layer to reduce scroll flickering */
276
276
  transform: translateZ(0);
277
277
  backface-visibility: hidden;
278
- `,_n=e=>{const{data:t,bits:n,length:a,index:r,className:s,devicePixelRatio:i=1,waveHeight:l=80,waveOutlineColor:c="#E0EFF1",waveFillColor:u="grey",barWidth:m=1,barGap:h=0,transparentBackground:p=!1,drawMode:f="inverted"}=e,{canvasRef:b,canvasMapRef:w}=Jt(),g=ia(),d=qt(a,ke,g);o.useLayoutEffect(()=>{const k=m+h;for(const[S,M]of w.current.entries()){const A=S*ke,E=M.getContext("2d"),_=Math.floor(l/2),I=2**(n-1);if(E){E.resetTransform(),E.clearRect(0,0,M.width,M.height),E.imageSmoothingEnabled=!1,E.scale(i,i);const B=M.width/i;let $;f==="normal"?$=u:$=c,E.fillStyle=Sr(E,$,B,l);const W=A,z=A+B,Y=Math.floor((W-m+k)/k)*k;for(let j=Math.max(0,Y);j<z;j+=k){const N=j-W;if(N+m<=0)continue;const L=j;if(L*2+1<t.length){const ae=t[L*2]/I,oe=t[L*2+1]/I,q=Math.abs(ae*_),fe=Math.abs(oe*_);f==="normal"?E.fillRect(N,_-fe,m,fe+q):(E.fillRect(N,0,m,_-fe),E.fillRect(N,_+q,m,_-q))}}}}},[w,t,n,l,c,u,i,a,m,h,f,d]);const x=d.map(k=>{const S=k*ke,M=Math.min(a-S,ke);return v.jsx(Ir,{$cssWidth:M,$left:S,width:M*i,height:l*i,$waveHeight:l,"data-index":k,ref:b},`${a}-${k}`)}),C=p?"transparent":tt(u);return v.jsx(Ar,{$index:r,$cssWidth:a,className:s,$waveHeight:l,$waveFillColor:C,children:x})},Mr={padding:"16px",background:"#1a1a2e",color:"#e0e0e0",border:"1px solid #d08070",borderRadius:"4px",fontFamily:"monospace",fontSize:"13px",minHeight:"60px",display:"flex",alignItems:"center",justifyContent:"center"};(class extends o.Component{constructor(e){super(e),this.state={hasError:!1,error:null}}static getDerivedStateFromError(e){return{hasError:!0,error:e}}componentDidCatch(e,t){console.error("[waveform-playlist] Render error:",e,t.componentStack)}render(){return this.state.hasError?this.props.fallback?this.props.fallback:v.jsx("div",{style:Mr,children:"Waveform playlist encountered an error. Check console for details."}):this.props.children}});var la=22,ca=R.div`
278
+ `,Hn=e=>{const{data:t,bits:n,length:a,index:r,className:s,devicePixelRatio:o=1,waveHeight:l=80,waveOutlineColor:c="#E0EFF1",waveFillColor:u="grey",barWidth:f=1,barGap:h=0,transparentBackground:p=!1,drawMode:d="inverted"}=e,{canvasRef:g,canvasMapRef:y}=an(),b=Sa(),m=nn(a,ke,b);i.useLayoutEffect(()=>{const k=f+h;for(const[S,I]of y.current.entries()){const A=S*ke,_=I.getContext("2d"),T=Math.floor(l/2),M=2**(n-1);if(_){_.resetTransform(),_.clearRect(0,0,I.width,I.height),_.imageSmoothingEnabled=!1,_.scale(o,o);const W=I.width/o;let $;d==="normal"?$=u:$=c,_.fillStyle=Kr(_,$,W,l);const B=A,P=A+W,N=Math.floor((B-f+k)/k)*k;for(let U=Math.max(0,N);U<P;U+=k){const J=U-B;if(J+f<=0)continue;const V=U;if(V*2+1<t.length){const te=t[V*2]/M,se=t[V*2+1]/M,Q=Math.abs(te*T),le=Math.abs(se*T);d==="normal"?_.fillRect(J,T-le,f,le+Q):(_.fillRect(J,0,f,T-le),_.fillRect(J,T+Q,f,T-Q))}}}}},[y,t,n,l,c,u,o,a,f,h,d,m]);const w=m.map(k=>{const S=k*ke,I=Math.min(a-S,ke);return v.jsx(qr,{$cssWidth:I,$left:S,width:I*o,height:l*o,$waveHeight:l,"data-index":k,ref:g},`${a}-${k}`)}),C=p?"transparent":at(u);return v.jsx(Jr,{$index:r,$cssWidth:a,className:s,$waveHeight:l,$waveFillColor:C,children:w})},Qr={padding:"16px",background:"#1a1a2e",color:"#e0e0e0",border:"1px solid #d08070",borderRadius:"4px",fontFamily:"monospace",fontSize:"13px",minHeight:"60px",display:"flex",alignItems:"center",justifyContent:"center"};(class extends i.Component{constructor(e){super(e),this.state={hasError:!1,error:null}}static getDerivedStateFromError(e){return{hasError:!0,error:e}}componentDidCatch(e,t){console.error("[waveform-playlist] Render error:",e,t.componentStack)}render(){return this.state.hasError?this.props.fallback?this.props.fallback:v.jsx("div",{style:Qr,children:"Waveform playlist encountered an error. Check console for details."}):this.props.children}});var Ia=22,_a=R.div`
279
279
  position: relative;
280
- height: ${la}px;
280
+ height: ${Ia}px;
281
281
  background: ${e=>e.$isSelected?e.theme.selectedClipHeaderBackgroundColor:e.theme.clipHeaderBackgroundColor};
282
282
  border-bottom: 1px solid ${e=>e.theme.clipHeaderBorderColor};
283
283
  display: flex;
@@ -299,7 +299,7 @@
299
299
  cursor: grabbing;
300
300
  }
301
301
  `}
302
- `,ua=R.span`
302
+ `,Aa=R.span`
303
303
  font-size: 11px;
304
304
  font-weight: 600;
305
305
  font-family: ${e=>e.theme.clipHeaderFontFamily};
@@ -307,12 +307,12 @@
307
307
  white-space: nowrap;
308
308
  overflow: hidden;
309
309
  text-overflow: ellipsis;
310
- `,_r=({trackName:e,isSelected:t=!1})=>v.jsx(ca,{$isDragging:!1,$interactive:!1,$isSelected:t,children:v.jsx(ua,{children:e})}),Er=({clipId:e,trackIndex:t,clipIndex:n,trackName:a,isSelected:r=!1,disableDrag:s=!1,dragHandleProps:i})=>{if(s||!i)return v.jsx(_r,{trackName:a,isSelected:r});const{attributes:l,listeners:c,setActivatorNodeRef:u}=i;return v.jsx(ca,{ref:u,"data-clip-id":e,$interactive:!0,$isSelected:r,...c,...l,children:v.jsx(ua,{children:a})})},$r=8,Tr=24,Rr=R.div`
310
+ `,es=({trackName:e,isSelected:t=!1})=>v.jsx(_a,{$isDragging:!1,$interactive:!1,$isSelected:t,children:v.jsx(Aa,{children:e})}),ts=({clipId:e,trackIndex:t,clipIndex:n,trackName:a,isSelected:r=!1,disableDrag:s=!1,dragHandleProps:o})=>{if(s||!o)return v.jsx(es,{trackName:a,isSelected:r});const{attributes:l,listeners:c,setActivatorNodeRef:u}=o;return v.jsx(_a,{ref:u,"data-clip-id":e,$interactive:!0,$isSelected:r,...c,...l,children:v.jsx(Aa,{children:a})})},ns=8,as=24,rs=R.div`
311
311
  position: absolute;
312
312
  ${e=>e.$edge==="left"?"left: 0;":"right: 0;"}
313
313
  top: 0;
314
314
  bottom: 0;
315
- width: ${e=>e.$touchOptimized?Tr:$r}px;
315
+ width: ${e=>e.$touchOptimized?as:ns}px;
316
316
  cursor: col-resize;
317
317
  user-select: none;
318
318
  z-index: 105; /* Above waveform, below header */
@@ -335,19 +335,19 @@
335
335
  background: rgba(255, 255, 255, 0.4);
336
336
  ${e=>e.$edge==="left"?"border-left: 2px solid rgba(255, 255, 255, 0.8);":"border-right: 2px solid rgba(255, 255, 255, 0.8);"}
337
337
  }
338
- `,En=({clipId:e,trackIndex:t,clipIndex:n,edge:a,dragHandleProps:r,touchOptimized:s=!1})=>{const[i,l]=o.useState(!1);if(!r)return null;const{attributes:c,listeners:u,setActivatorNodeRef:m,isDragging:h}=r;return v.jsx(Rr,{ref:m,"data-clip-id":e,"data-boundary-edge":a,$edge:a,$isDragging:h,$isHovered:i,$touchOptimized:s,onMouseEnter:()=>l(!0),onMouseLeave:()=>l(!1),...u,...c})},Dr=R.div.attrs(e=>({style:{left:`${e.$left}px`,width:`${e.$width}px`}}))`
338
+ `,Xn=({clipId:e,trackIndex:t,clipIndex:n,edge:a,dragHandleProps:r,touchOptimized:s=!1})=>{const[o,l]=i.useState(!1);if(!r)return null;const{attributes:c,listeners:u,setActivatorNodeRef:f,isDragging:h}=r;return v.jsx(rs,{ref:f,"data-clip-id":e,"data-boundary-edge":a,$edge:a,$isDragging:h,$isHovered:o,$touchOptimized:s,onMouseEnter:()=>l(!0),onMouseLeave:()=>l(!1),...u,...c})},ss=R.div.attrs(e=>({style:{left:`${e.$left}px`,width:`${e.$width}px`}}))`
339
339
  position: absolute;
340
340
  top: 0;
341
341
  bottom: 0;
342
342
  pointer-events: none;
343
343
  z-index: 50;
344
- `,Br=R.svg`
344
+ `,os=R.svg`
345
345
  width: 100%;
346
346
  height: 100%;
347
347
  display: block;
348
348
  /* Flip horizontally for fadeOut - makes it mirror of fadeIn */
349
349
  transform: ${e=>e.$type==="fadeOut"?"scaleX(-1)":"none"};
350
- `;function Fr(e,t,n="logarithmic"){const a=[],r=Math.max(20,Math.min(e,100));for(let s=0;s<=r;s++){const i=s/r*e,l=s/r;let c;switch(n){case"linear":c=l;break;case"exponential":c=l*l;break;case"sCurve":c=(1-Math.cos(l*Math.PI))/2;break;case"logarithmic":default:c=Math.log10(1+l*9)/Math.log10(10);break}const u=(1-c)*t;a.push(`${i},${u}`)}return`M 0,${t} L ${a.join(" L ")} L ${e},0 L 0,0 Z`}var $n=({left:e,width:t,type:n,curveType:a="logarithmic",color:r})=>{const s=R.useTheme();if(t<1)return null;const i=r||s?.fadeOverlayColor||"rgba(0, 0, 0, 0.4)";return v.jsx(Dr,{$left:e,$width:t,$type:n,children:v.jsx(Br,{$type:n,viewBox:`0 0 ${t} 100`,preserveAspectRatio:"none",children:v.jsx("path",{d:Fr(t,100,a),fill:i})})})},Wr=R.div.attrs(e=>({style:e.$isOverlay?{}:{left:`${e.$left}px`,width:`${e.$width}px`}}))`
350
+ `;function is(e,t,n="logarithmic"){const a=[],r=Math.max(20,Math.min(e,100));for(let s=0;s<=r;s++){const o=s/r*e,l=s/r;let c;switch(n){case"linear":c=l;break;case"exponential":c=l*l;break;case"sCurve":c=(1-Math.cos(l*Math.PI))/2;break;case"logarithmic":default:c=Math.log10(1+l*9)/Math.log10(10);break}const u=(1-c)*t;a.push(`${o},${u}`)}return`M 0,${t} L ${a.join(" L ")} L ${e},0 L 0,0 Z`}var On=({left:e,width:t,type:n,curveType:a="logarithmic",color:r})=>{const s=R.useTheme();if(t<1)return null;const o=r||s?.fadeOverlayColor||"rgba(0, 0, 0, 0.4)";return v.jsx(ss,{$left:e,$width:t,$type:n,children:v.jsx(os,{$type:n,viewBox:`0 0 ${t} 100`,preserveAspectRatio:"none",children:v.jsx("path",{d:is(t,100,a),fill:o})})})},ls=R.div.attrs(e=>({style:e.$isOverlay?{}:{left:`${e.$left}px`,width:`${e.$width}px`}}))`
351
351
  position: ${e=>e.$isOverlay?"relative":"absolute"};
352
352
  top: 0;
353
353
  height: ${e=>e.$isOverlay?"auto":"100%"};
@@ -361,20 +361,20 @@
361
361
  &:hover {
362
362
  background: rgba(255, 255, 255, 0.08);
363
363
  }
364
- `,Pr=R.div`
364
+ `,cs=R.div`
365
365
  flex: 1;
366
366
  position: relative;
367
367
  overflow: ${e=>e.$isOverlay?"visible":"hidden"};
368
- `,Yt=({children:e,className:t,clipId:n,trackIndex:a,clipIndex:r,trackName:s,startSample:i,durationSamples:l,samplesPerPixel:c,showHeader:u=!1,disableHeaderDrag:m=!1,isOverlay:h=!1,isSelected:p=!1,onMouseDown:f,trackId:b,fadeIn:w,fadeOut:g,sampleRate:d=44100,showFades:x=!1,touchOptimized:y=!1})=>{const C=Math.floor(i/c),S=Math.floor((i+l)/c)-C,M=u&&!m&&!h,A=`clip-${a}-${r}`,{attributes:E,listeners:_,setNodeRef:I,setActivatorNodeRef:B,transform:$,isDragging:W}=Ke.useDraggable({id:A,data:{clipId:n,trackIndex:a,clipIndex:r},disabled:!M}),z=`clip-boundary-left-${a}-${r}`,{attributes:Y,listeners:j,setActivatorNodeRef:N,isDragging:L}=Ke.useDraggable({id:z,data:{clipId:n,trackIndex:a,clipIndex:r,boundary:"left"},disabled:!M}),ae=`clip-boundary-right-${a}-${r}`,{attributes:oe,listeners:q,setActivatorNodeRef:fe,isDragging:ue}=Ke.useDraggable({id:ae,data:{clipId:n,trackIndex:a,clipIndex:r,boundary:"right"},disabled:!M}),le=$?{transform:Nt.Translate.toString($),zIndex:W?100:void 0}:void 0;return v.jsxs(Wr,{ref:I,style:le,className:t,$left:C,$width:S,$isOverlay:h,"data-clip-container":"true","data-track-id":b,onMouseDown:f,children:[u&&v.jsx(Er,{clipId:n,trackIndex:a,clipIndex:r,trackName:s,isSelected:p,disableDrag:m,dragHandleProps:M?{attributes:E,listeners:_,setActivatorNodeRef:B}:void 0}),v.jsx(kr,{originX:C,children:v.jsxs(Pr,{$isOverlay:h,children:[e,x&&w&&w.duration>0&&v.jsx($n,{left:0,width:Math.floor(w.duration*d/c),type:"fadeIn",curveType:w.type}),x&&g&&g.duration>0&&v.jsx($n,{left:S-Math.floor(g.duration*d/c),width:Math.floor(g.duration*d/c),type:"fadeOut",curveType:g.type})]})}),u&&!m&&!h&&v.jsxs(v.Fragment,{children:[v.jsx(En,{clipId:n,trackIndex:a,clipIndex:r,edge:"left",touchOptimized:y,dragHandleProps:{attributes:Y,listeners:j,setActivatorNodeRef:N,isDragging:L}}),v.jsx(En,{clipId:n,trackIndex:a,clipIndex:r,edge:"right",touchOptimized:y,dragHandleProps:{attributes:oe,listeners:q,setActivatorNodeRef:fe,isDragging:ue}})]})]})},Zr=R.div`
368
+ `,Qt=({children:e,className:t,clipId:n,trackIndex:a,clipIndex:r,trackName:s,startSample:o,durationSamples:l,samplesPerPixel:c,showHeader:u=!1,disableHeaderDrag:f=!1,isOverlay:h=!1,isSelected:p=!1,onMouseDown:d,trackId:g,fadeIn:y,fadeOut:b,sampleRate:m=44100,showFades:w=!1,touchOptimized:x=!1})=>{const C=Math.floor(o/c),S=Math.floor((o+l)/c)-C,I=u&&!f&&!h,A=`clip-${a}-${r}`,{attributes:_,listeners:T,setNodeRef:M,setActivatorNodeRef:W,transform:$,isDragging:B}=Ge.useDraggable({id:A,data:{clipId:n,trackIndex:a,clipIndex:r},disabled:!I}),P=`clip-boundary-left-${a}-${r}`,{attributes:N,listeners:U,setActivatorNodeRef:J,isDragging:V}=Ge.useDraggable({id:P,data:{clipId:n,trackIndex:a,clipIndex:r,boundary:"left"},disabled:!I}),te=`clip-boundary-right-${a}-${r}`,{attributes:se,listeners:Q,setActivatorNodeRef:le,isDragging:ce}=Ge.useDraggable({id:te,data:{clipId:n,trackIndex:a,clipIndex:r,boundary:"right"},disabled:!I}),ue=$?{transform:Jt.Translate.toString($),zIndex:B?100:void 0}:void 0;return v.jsxs(ls,{ref:M,style:ue,className:t,$left:C,$width:S,$isOverlay:h,"data-clip-container":"true","data-track-id":g,onMouseDown:d,children:[u&&v.jsx(ts,{clipId:n,trackIndex:a,clipIndex:r,trackName:s,isSelected:p,disableDrag:f,dragHandleProps:I?{attributes:_,listeners:T,setActivatorNodeRef:W}:void 0}),v.jsx(Ur,{originX:C,children:v.jsxs(cs,{$isOverlay:h,children:[e,w&&y&&y.duration>0&&v.jsx(On,{left:0,width:Math.floor(y.duration*m/c),type:"fadeIn",curveType:y.type}),w&&b&&b.duration>0&&v.jsx(On,{left:S-Math.floor(b.duration*m/c),width:Math.floor(b.duration*m/c),type:"fadeOut",curveType:b.type})]})}),u&&!f&&!h&&v.jsxs(v.Fragment,{children:[v.jsx(Xn,{clipId:n,trackIndex:a,clipIndex:r,edge:"left",touchOptimized:x,dragHandleProps:{attributes:N,listeners:U,setActivatorNodeRef:J,isDragging:V}}),v.jsx(Xn,{clipId:n,trackIndex:a,clipIndex:r,edge:"right",touchOptimized:x,dragHandleProps:{attributes:se,listeners:Q,setActivatorNodeRef:le,isDragging:ce}})]})]})},us=R.div`
369
369
  display: inline-flex;
370
370
  align-items: center;
371
371
  gap: 0.5rem;
372
- `,Vr=R(gr)`
372
+ `,ds=R(zr)`
373
373
  margin: 0;
374
374
  white-space: nowrap;
375
- `,jr=R(na)`
375
+ `,fs=R(Ca)`
376
376
  width: 120px;
377
- `,Lr=({volume:e,onChange:t,disabled:n=!1,className:a})=>{const r=s=>{t(parseFloat(s.target.value)/100)};return v.jsxs(Zr,{className:a,children:[v.jsx(Vr,{htmlFor:"master-gain",children:"Master Volume"}),v.jsx(jr,{min:"0",max:"100",value:e*100,onChange:r,disabled:n,id:"master-gain"})]})};R.div.attrs(e=>({style:{transform:`translate3d(${e.$position}px, 0, 0)`}}))`
377
+ `,ms=({volume:e,onChange:t,disabled:n=!1,className:a})=>{const r=s=>{t(parseFloat(s.target.value)/100)};return v.jsxs(us,{className:a,children:[v.jsx(ds,{htmlFor:"master-gain",children:"Master Volume"}),v.jsx(fs,{min:"0",max:"100",value:e*100,onChange:r,disabled:n,id:"master-gain"})]})};R.div.attrs(e=>({style:{transform:`translate3d(${e.$position}px, 0, 0)`}}))`
378
378
  position: absolute;
379
379
  top: 0;
380
380
  left: 0;
@@ -408,23 +408,23 @@
408
408
  width: 2px;
409
409
  height: 100%;
410
410
  background: ${e=>e.$color};
411
- `;var zr=R.div`
411
+ `;var hs=R.div`
412
412
  overflow-y: hidden;
413
413
  overflow-x: auto;
414
414
  position: relative;
415
- `,Hr=R.div.attrs(e=>({style:e.$width!==void 0?{width:`${e.$width}px`}:{}}))`
415
+ `,ps=R.div.attrs(e=>({style:e.$width!==void 0?{width:`${e.$width}px`}:{}}))`
416
416
  position: relative;
417
417
  background: ${e=>e.$backgroundColor||"transparent"};
418
- `,Xr=R.div.attrs(e=>({style:e.$width?{minWidth:`${e.$width}px`}:{}}))`
418
+ `,gs=R.div.attrs(e=>({style:e.$width?{minWidth:`${e.$width}px`}:{}}))`
419
419
  background: ${e=>e.$backgroundColor||"white"};
420
420
  width: 100%;
421
421
  position: relative;
422
422
  overflow: hidden; /* Constrain loop region to timescale area */
423
- `,Or=R.div.attrs(e=>({style:e.$width!==void 0?{minWidth:`${e.$width}px`}:{}}))`
423
+ `,bs=R.div.attrs(e=>({style:e.$width!==void 0?{minWidth:`${e.$width}px`}:{}}))`
424
424
  position: relative;
425
425
  background: ${e=>e.$backgroundColor||"transparent"};
426
426
  width: 100%;
427
- `,Gr=R.div`
427
+ `,vs=R.div`
428
428
  position: absolute;
429
429
  top: 0;
430
430
  left: 0;
@@ -433,7 +433,7 @@
433
433
  cursor: crosshair;
434
434
  /* When selecting, raise z-index above clip boundaries (z-index: 105) to prevent interference */
435
435
  z-index: ${e=>e.$isSelecting?110:1};
436
- `,Qt=({children:e,backgroundColor:t,timescaleBackgroundColor:n,timescale:a,timescaleWidth:r,tracksWidth:s,scrollContainerWidth:i,controlsWidth:l,onTracksClick:c,onTracksMouseDown:u,onTracksMouseMove:m,onTracksMouseUp:h,scrollContainerRef:p,isSelecting:f,"data-playlist-state":b})=>{const w=o.useRef(null),g=o.useCallback(d=>{w.current=d,p?.(d)},[p]);return v.jsx(zr,{"data-scroll-container":"true","data-playlist-state":b,ref:g,children:v.jsx(yr,{containerRef:w,children:v.jsxs(Hr,{$backgroundColor:t,$width:i,children:[a&&v.jsx(Xr,{$width:r,$backgroundColor:n,children:a}),v.jsxs(Or,{$width:s,$backgroundColor:t,children:[e,(c||u)&&v.jsx(Gr,{$controlsWidth:l,$isSelecting:f,onClick:c,onMouseDown:u,onMouseMove:m,onMouseUp:h})]})]})})})};R.withTheme(Qt);var Nr=R.div.attrs(e=>({style:{left:`${e.$left}px`,width:`${e.$width}px`}}))`
436
+ `,rn=({children:e,backgroundColor:t,timescaleBackgroundColor:n,timescale:a,timescaleWidth:r,tracksWidth:s,scrollContainerWidth:o,controlsWidth:l,onTracksClick:c,onTracksMouseDown:u,onTracksMouseMove:f,onTracksMouseUp:h,scrollContainerRef:p,isSelecting:d,"data-playlist-state":g})=>{const y=i.useRef(null),b=i.useCallback(m=>{y.current=m,p?.(m)},[p]);return v.jsx(hs,{"data-scroll-container":"true","data-playlist-state":g,ref:b,children:v.jsx(Gr,{containerRef:y,children:v.jsxs(ps,{$backgroundColor:t,$width:o,children:[a&&v.jsx(gs,{$width:r,$backgroundColor:n,children:a}),v.jsxs(bs,{$width:s,$backgroundColor:t,children:[e,(c||u)&&v.jsx(vs,{$controlsWidth:l,$isSelecting:d,onClick:c,onMouseDown:u,onMouseMove:f,onMouseUp:h})]})]})})})};R.withTheme(rn);var Cs=R.div.attrs(e=>({style:{left:`${e.$left}px`,width:`${e.$width}px`}}))`
437
437
  position: absolute;
438
438
  top: 0;
439
439
  background: ${e=>e.$color};
@@ -441,7 +441,7 @@
441
441
  z-index: 60; /* Above clips (z-index: 10) and fades (z-index: 50), below playhead (z-index: 100) */
442
442
  pointer-events: none;
443
443
  opacity: 0.3;
444
- `,da=({startPosition:e,endPosition:t,color:n="#00ff00"})=>{const a=Math.max(0,t-e);return a<=0?null:v.jsx(Nr,{$left:e,$width:a,$color:n,"data-selection":!0})};R.div.attrs(e=>({style:{left:`${e.$left}px`,width:`${e.$width}px`}}))`
444
+ `,Ma=({startPosition:e,endPosition:t,color:n="#00ff00"})=>{const a=Math.max(0,t-e);return a<=0?null:v.jsx(Cs,{$left:e,$width:a,$color:n,"data-selection":!0})};R.div.attrs(e=>({style:{left:`${e.$left}px`,width:`${e.$width}px`}}))`
445
445
  position: absolute;
446
446
  top: 0;
447
447
  background: ${e=>e.$color};
@@ -468,7 +468,7 @@
468
468
  border-top: 8px solid ${e=>e.$color};
469
469
  ${e=>e.$isStart?"border-right: 8px solid transparent;":"border-left: 8px solid transparent;"}
470
470
  }
471
- `;var Tn=R.div.attrs(e=>({style:{left:`${e.$left}px`}}))`
471
+ `;var Nn=R.div.attrs(e=>({style:{left:`${e.$left}px`}}))`
472
472
  position: absolute;
473
473
  top: 0;
474
474
  width: 12px;
@@ -505,7 +505,7 @@
505
505
  &:hover::before {
506
506
  opacity: 1;
507
507
  }
508
- `,Yr=R.div.attrs(e=>({style:{left:`${e.$left}px`,width:`${e.$width}px`}}))`
508
+ `,ys=R.div.attrs(e=>({style:{left:`${e.$left}px`,width:`${e.$width}px`}}))`
509
509
  position: absolute;
510
510
  top: 0;
511
511
  height: 100%;
@@ -516,26 +516,26 @@
516
516
  &:active {
517
517
  cursor: grabbing;
518
518
  }
519
- `,Ur=({startPosition:e,endPosition:t,markerColor:n="#3b82f6",regionColor:a="rgba(59, 130, 246, 0.3)",onLoopStartChange:r,onLoopEndChange:s,onLoopRegionMove:i,minPosition:l=0,maxPosition:c=1/0})=>{const[u,m]=o.useState(null),h=o.useRef(0),p=o.useRef(0),f=o.useRef(0),b=Math.max(0,t-e),w=o.useCallback((d,x)=>{d.preventDefault(),d.stopPropagation(),m(x),h.current=d.clientX,p.current=x==="start"?e:t;const y=k=>{const S=k.clientX-h.current,M=p.current+S;if(x==="start"){const A=Math.max(l,Math.min(t-10,M));r?.(A)}else{const A=Math.max(e+10,Math.min(c,M));s?.(A)}},C=()=>{m(null),document.removeEventListener("mousemove",y),document.removeEventListener("mouseup",C)};document.addEventListener("mousemove",y),document.addEventListener("mouseup",C)},[e,t,l,c,r,s]),g=o.useCallback(d=>{d.preventDefault(),d.stopPropagation(),m("region"),h.current=d.clientX,p.current=e,f.current=t;const x=t-e,y=k=>{const S=k.clientX-h.current;let M=p.current+S,A=f.current+S;M<l&&(M=l,A=l+x),A>c&&(A=c,M=c-x),i?.(M,A)},C=()=>{m(null),document.removeEventListener("mousemove",y),document.removeEventListener("mouseup",C)};document.addEventListener("mousemove",y),document.addEventListener("mouseup",C)},[e,t,l,c,i]);return b<=0?null:v.jsxs(v.Fragment,{children:[v.jsx(Yr,{$left:e,$width:b,$color:a,$isDragging:u==="region",onMouseDown:g,"data-loop-region-timescale":!0}),v.jsx(Tn,{$left:e,$color:n,$isStart:!0,$isDragging:u==="start",onMouseDown:d=>w(d,"start"),"data-loop-marker-handle":"start"}),v.jsx(Tn,{$left:t,$color:n,$isStart:!1,$isDragging:u==="end",onMouseDown:d=>w(d,"end"),"data-loop-marker-handle":"end"})]})},Kr=R.div.attrs(e=>({style:{left:`${e.$leftOffset||0}px`}}))`
519
+ `,ws=({startPosition:e,endPosition:t,markerColor:n="#3b82f6",regionColor:a="rgba(59, 130, 246, 0.3)",onLoopStartChange:r,onLoopEndChange:s,onLoopRegionMove:o,minPosition:l=0,maxPosition:c=1/0})=>{const[u,f]=i.useState(null),h=i.useRef(0),p=i.useRef(0),d=i.useRef(0),g=Math.max(0,t-e),y=i.useCallback((m,w)=>{m.preventDefault(),m.stopPropagation(),f(w),h.current=m.clientX,p.current=w==="start"?e:t;const x=k=>{const S=k.clientX-h.current,I=p.current+S;if(w==="start"){const A=Math.max(l,Math.min(t-10,I));r?.(A)}else{const A=Math.max(e+10,Math.min(c,I));s?.(A)}},C=()=>{f(null),document.removeEventListener("mousemove",x),document.removeEventListener("mouseup",C)};document.addEventListener("mousemove",x),document.addEventListener("mouseup",C)},[e,t,l,c,r,s]),b=i.useCallback(m=>{m.preventDefault(),m.stopPropagation(),f("region"),h.current=m.clientX,p.current=e,d.current=t;const w=t-e,x=k=>{const S=k.clientX-h.current;let I=p.current+S,A=d.current+S;I<l&&(I=l,A=l+w),A>c&&(A=c,I=c-w),o?.(I,A)},C=()=>{f(null),document.removeEventListener("mousemove",x),document.removeEventListener("mouseup",C)};document.addEventListener("mousemove",x),document.addEventListener("mouseup",C)},[e,t,l,c,o]);return g<=0?null:v.jsxs(v.Fragment,{children:[v.jsx(ys,{$left:e,$width:g,$color:a,$isDragging:u==="region",onMouseDown:b,"data-loop-region-timescale":!0}),v.jsx(Nn,{$left:e,$color:n,$isStart:!0,$isDragging:u==="start",onMouseDown:m=>y(m,"start"),"data-loop-marker-handle":"start"}),v.jsx(Nn,{$left:t,$color:n,$isStart:!1,$isDragging:u==="end",onMouseDown:m=>y(m,"end"),"data-loop-marker-handle":"end"})]})},xs=R.div.attrs(e=>({style:{left:`${e.$leftOffset||0}px`}}))`
520
520
  position: absolute;
521
521
  top: 0;
522
522
  right: 0;
523
523
  height: 100%; /* Stay within timescale bounds, don't extend into tracks */
524
524
  cursor: crosshair;
525
525
  z-index: 40; /* Below markers and shading */
526
- `,qr=({startPosition:e,endPosition:t,markerColor:n="#3b82f6",regionColor:a="rgba(59, 130, 246, 0.3)",onLoopRegionChange:r,minPosition:s=0,maxPosition:i=1/0,controlsOffset:l=0})=>{const[,c]=o.useState(!1),u=o.useRef(0),m=o.useRef(null),h=t>e,p=o.useCallback(f=>{const b=f.target;if(b.closest("[data-loop-marker-handle]")||b.closest("[data-loop-region-timescale]"))return;f.preventDefault(),c(!0);const w=m.current?.getBoundingClientRect();if(!w)return;const g=f.clientX-w.left,d=Math.max(s,Math.min(i,g));u.current=d,r?.(d,d);const x=C=>{const k=C.clientX-w.left,S=Math.max(s,Math.min(i,k)),M=Math.min(u.current,S),A=Math.max(u.current,S);r?.(M,A)},y=()=>{c(!1),document.removeEventListener("mousemove",x),document.removeEventListener("mouseup",y)};document.addEventListener("mousemove",x),document.addEventListener("mouseup",y)},[s,i,r]);return v.jsx(Kr,{ref:m,$leftOffset:l,onMouseDown:p,"data-timescale-loop-creator":!0,children:h&&v.jsx(Ur,{startPosition:e,endPosition:t,markerColor:n,regionColor:a,minPosition:s,maxPosition:i,onLoopStartChange:f=>r?.(f,t),onLoopEndChange:f=>r?.(e,f),onLoopRegionMove:(f,b)=>r?.(f,b)})})};function pt(e,t){const n=Math.floor(e/3600)%24,a=Math.floor(e/60)%60,r=(e%60).toFixed(t);return String(n).padStart(2,"0")+":"+String(a).padStart(2,"0")+":"+r.padStart(t+3,"0")}function mt(e,t){switch(t){case"seconds":return e.toFixed(0);case"thousandths":return e.toFixed(3);case"hh:mm:ss":return pt(e,0);case"hh:mm:ss.u":return pt(e,1);case"hh:mm:ss.uu":return pt(e,2);case"hh:mm:ss.uuu":return pt(e,3);default:return pt(e,3)}}function fa(e,t){if(!e)return 0;switch(t){case"seconds":case"thousandths":return parseFloat(e)||0;case"hh:mm:ss":case"hh:mm:ss.u":case"hh:mm:ss.uu":case"hh:mm:ss.uuu":{const n=e.split(":");if(n.length!==3)return 0;const a=parseInt(n[0],10)||0,r=parseInt(n[1],10)||0,s=parseFloat(n[2])||0;return a*3600+r*60+s}default:return 0}}var Rn=({id:e,label:t,value:n,format:a,className:r,onChange:s,readOnly:i=!1})=>{const[l,c]=o.useState("");o.useEffect(()=>{const p=mt(n,a);c(p)},[n,a,e]);const u=p=>{const f=p.target.value;c(f)},m=()=>{if(s){const p=fa(l,a);s(p)}c(mt(n,a))},h=p=>{p.key==="Enter"&&p.currentTarget.blur()};return v.jsxs(v.Fragment,{children:[v.jsx(br,{as:"label",htmlFor:e,children:t}),v.jsx(ea,{type:"text",className:r,id:e,value:l,onChange:u,onBlur:m,onKeyDown:h,readOnly:i})]})},Jr=({selectionStart:e,selectionEnd:t,onSelectionChange:n,className:a})=>{const[r,s]=o.useState("hh:mm:ss.uuu");o.useEffect(()=>{const c=document.querySelector(".time-format"),u=()=>{c&&s(c.value)};return c&&(s(c.value),c.addEventListener("change",u)),()=>{c?.removeEventListener("change",u)}},[]);const i=c=>{n&&n(c,t)},l=c=>{n&&n(e,c)};return v.jsxs("div",{className:a,children:[v.jsx(Rn,{id:"audio_start",label:"Start of audio selection",value:e,format:r,className:"audio-start form-control mr-sm-2",onChange:i}),v.jsx(Rn,{id:"audio_end",label:"End of audio selection",value:t,format:r,className:"audio-end form-control mr-sm-2",onChange:l})]})};function $t(){return window.devicePixelRatio}var ma=o.createContext($t()),ha=({children:e})=>{const[t,n]=o.useState($t());return matchMedia(`(resolution: ${$t()}dppx)`).addEventListener("change",()=>{n($t())},{once:!0}),v.jsx(ma.Provider,{value:Math.ceil(t),children:e})},en=()=>o.useContext(ma),Ct=o.createContext({sampleRate:48e3,samplesPerPixel:1e3,zoomLevels:[1e3,1500,2e3,2500],waveHeight:80,timeScaleHeight:15,controls:{show:!1,width:150},duration:3e4,barWidth:1,barGap:0}),Bt=()=>o.useContext(Ct),wt=()=>o.useContext(R.ThemeContext),tn=o.createContext(v.jsx(o.Fragment,{})),Qr=()=>o.useContext(tn),eo=0,to=!1,no=0,ao=0,ro={progress:eo,isPlaying:to,selectionStart:no,selectionEnd:ao};o.createContext(ro);o.createContext({setIsPlaying:()=>{},setProgress:()=>{},setSelection:()=>{}});var oo=(e,t,n)=>(e-t)/(n-t),so=R.div.attrs(e=>({style:{top:`${e.$waveHeight*e.$index}px`,width:`${e.$cssWidth}px`,height:`${e.$waveHeight}px`}}))`
526
+ `,ks=({startPosition:e,endPosition:t,markerColor:n="#3b82f6",regionColor:a="rgba(59, 130, 246, 0.3)",onLoopRegionChange:r,minPosition:s=0,maxPosition:o=1/0,controlsOffset:l=0})=>{const[,c]=i.useState(!1),u=i.useRef(0),f=i.useRef(null),h=t>e,p=i.useCallback(d=>{const g=d.target;if(g.closest("[data-loop-marker-handle]")||g.closest("[data-loop-region-timescale]"))return;d.preventDefault(),c(!0);const y=f.current?.getBoundingClientRect();if(!y)return;const b=d.clientX-y.left,m=Math.max(s,Math.min(o,b));u.current=m,r?.(m,m);const w=C=>{const k=C.clientX-y.left,S=Math.max(s,Math.min(o,k)),I=Math.min(u.current,S),A=Math.max(u.current,S);r?.(I,A)},x=()=>{c(!1),document.removeEventListener("mousemove",w),document.removeEventListener("mouseup",x)};document.addEventListener("mousemove",w),document.addEventListener("mouseup",x)},[s,o,r]);return v.jsx(xs,{ref:f,$leftOffset:l,onMouseDown:p,"data-timescale-loop-creator":!0,children:h&&v.jsx(ws,{startPosition:e,endPosition:t,markerColor:n,regionColor:a,minPosition:s,maxPosition:o,onLoopStartChange:d=>r?.(d,t),onLoopEndChange:d=>r?.(e,d),onLoopRegionMove:(d,g)=>r?.(d,g)})})};function bt(e,t){const n=Math.floor(e/3600)%24,a=Math.floor(e/60)%60,r=(e%60).toFixed(t);return String(n).padStart(2,"0")+":"+String(a).padStart(2,"0")+":"+r.padStart(t+3,"0")}function mt(e,t){switch(t){case"seconds":return e.toFixed(0);case"thousandths":return e.toFixed(3);case"hh:mm:ss":return bt(e,0);case"hh:mm:ss.u":return bt(e,1);case"hh:mm:ss.uu":return bt(e,2);case"hh:mm:ss.uuu":return bt(e,3);default:return bt(e,3)}}function Ea(e,t){if(!e)return 0;switch(t){case"seconds":case"thousandths":return parseFloat(e)||0;case"hh:mm:ss":case"hh:mm:ss.u":case"hh:mm:ss.uu":case"hh:mm:ss.uuu":{const n=e.split(":");if(n.length!==3)return 0;const a=parseInt(n[0],10)||0,r=parseInt(n[1],10)||0,s=parseFloat(n[2])||0;return a*3600+r*60+s}default:return 0}}var Gn=({id:e,label:t,value:n,format:a,className:r,onChange:s,readOnly:o=!1})=>{const[l,c]=i.useState("");i.useEffect(()=>{const p=mt(n,a);c(p)},[n,a,e]);const u=p=>{const d=p.target.value;c(d)},f=()=>{if(s){const p=Ea(l,a);s(p)}c(mt(n,a))},h=p=>{p.key==="Enter"&&p.currentTarget.blur()};return v.jsxs(v.Fragment,{children:[v.jsx(Hr,{as:"label",htmlFor:e,children:t}),v.jsx(ba,{type:"text",className:r,id:e,value:l,onChange:u,onBlur:f,onKeyDown:h,readOnly:o})]})},Ss=({selectionStart:e,selectionEnd:t,onSelectionChange:n,className:a})=>{const[r,s]=i.useState("hh:mm:ss.uuu");i.useEffect(()=>{const c=document.querySelector(".time-format"),u=()=>{c&&s(c.value)};return c&&(s(c.value),c.addEventListener("change",u)),()=>{c?.removeEventListener("change",u)}},[]);const o=c=>{n&&n(c,t)},l=c=>{n&&n(e,c)};return v.jsxs("div",{className:a,children:[v.jsx(Gn,{id:"audio_start",label:"Start of audio selection",value:e,format:r,className:"audio-start form-control mr-sm-2",onChange:o}),v.jsx(Gn,{id:"audio_end",label:"End of audio selection",value:t,format:r,className:"audio-end form-control mr-sm-2",onChange:l})]})};function Rt(){return window.devicePixelRatio}var Ta=i.createContext(Rt()),$a=({children:e})=>{const[t,n]=i.useState(Rt());return matchMedia(`(resolution: ${Rt()}dppx)`).addEventListener("change",()=>{n(Rt())},{once:!0}),v.jsx(Ta.Provider,{value:Math.ceil(t),children:e})},sn=()=>i.useContext(Ta),wt=i.createContext({sampleRate:48e3,samplesPerPixel:1e3,zoomLevels:[1e3,1500,2e3,2500],waveHeight:80,timeScaleHeight:15,controls:{show:!1,width:150},duration:3e4,barWidth:1,barGap:0}),Wt=()=>i.useContext(wt),xt=()=>i.useContext(R.ThemeContext),on=i.createContext(v.jsx(i.Fragment,{})),Is=()=>i.useContext(on),_s=0,As=!1,Ms=0,Es=0,Ts={progress:_s,isPlaying:As,selectionStart:Ms,selectionEnd:Es};i.createContext(Ts);i.createContext({setIsPlaying:()=>{},setProgress:()=>{},setSelection:()=>{}});var $s=(e,t,n)=>(e-t)/(n-t),Rs=R.div.attrs(e=>({style:{top:`${e.$waveHeight*e.$index}px`,width:`${e.$cssWidth}px`,height:`${e.$waveHeight}px`}}))`
527
527
  position: absolute;
528
528
  background: #000;
529
529
  transform: translateZ(0);
530
530
  backface-visibility: hidden;
531
- `,io=R.canvas.attrs(e=>({style:{width:`${e.$cssWidth}px`,height:`${e.$waveHeight}px`,left:`${e.$left}px`}}))`
531
+ `,Ds=R.canvas.attrs(e=>({style:{width:`${e.$cssWidth}px`,height:`${e.$waveHeight}px`,left:`${e.$left}px`}}))`
532
532
  position: absolute;
533
533
  top: 0;
534
534
  /* Promote to own compositing layer for smoother scrolling */
535
535
  will-change: transform;
536
536
  image-rendering: pixelated;
537
537
  image-rendering: crisp-edges;
538
- `;function lo(){const e=new Uint8Array(768);for(let t=0;t<256;t++)e[t*3]=e[t*3+1]=e[t*3+2]=t;return e}var co=lo(),Dn=({index:e,channelIndex:t,data:n,length:a,waveHeight:r,devicePixelRatio:s=1,samplesPerPixel:i,colorLUT:l,frequencyScaleFn:c,minFrequency:u=0,maxFrequency:m,workerApi:h,clipId:p,onCanvasesReady:f})=>{const b=t??e,{canvasRef:w,canvasMapRef:g}=Jt(),d=o.useRef([]),x=o.useRef(new WeakSet),y=o.useRef(h),C=o.useRef(f),k=!!(h&&p),S=ia(),M=qt(a,ke,S),A=l??co,E=m??(n?n.sampleRate/2:22050),_=c??oo,I=!!c;o.useEffect(()=>{y.current=h},[h]),o.useEffect(()=>{C.current=f},[f]),o.useEffect(()=>{if(!k)return;const $=y.current;if(!$||!p)return;const W=d.current.length,z=[];for(const N of d.current){const L=N.match(/chunk(\d+)$/);if(!L){z.push(N);continue}const ae=parseInt(L[1],10),oe=g.current.get(ae);if(oe&&oe.isConnected)z.push(N);else try{$.unregisterCanvas(N)}catch(q){console.warn(`[spectrogram] unregisterCanvas failed for ${N}:`,q)}}d.current=z;const Y=[];for(const[N,L]of g.current.entries()){if(x.current.has(L))continue;const ae=`${p}-ch${b}-chunk${N}`;let oe;try{oe=L.transferControlToOffscreen()}catch(q){console.warn(`[spectrogram] transferControlToOffscreen failed for ${ae}:`,q);continue}x.current.add(L);try{$.registerCanvas(ae,oe),Y.push(ae)}catch(q){console.warn(`[spectrogram] registerCanvas failed for ${ae}:`,q);continue}}if(Y.length>0&&(d.current=[...d.current,...Y]),Y.length>0||z.length<W){const N=d.current,L=N.map(ae=>{const oe=ae.match(/chunk(\d+)$/);if(!oe)return console.warn(`[spectrogram] Unexpected canvas ID format: ${ae}`),ke;const q=parseInt(oe[1],10);return Math.min(a-q*ke,ke)});C.current?.(N,L)}},[g,k,p,b,a,M]),o.useEffect(()=>()=>{const $=y.current;if($){for(const W of d.current)try{$.unregisterCanvas(W)}catch(z){console.warn(`[spectrogram] unregisterCanvas failed for ${W}:`,z)}d.current=[]}},[]),o.useLayoutEffect(()=>{if(k||!n)return;const{frequencyBinCount:$,frameCount:W,hopSize:z,sampleRate:Y,gainDb:j,rangeDb:N}=n,L=N===0?1:N,ae=oe=>oe/$*(Y/2);for(const[oe,q]of g.current.entries()){const fe=oe*ke,ue=q.getContext("2d");if(!ue)continue;const le=q.width/s,Ee=r;ue.resetTransform(),ue.clearRect(0,0,q.width,q.height),ue.imageSmoothingEnabled=!1,ue.scale(s,s);const P=ue.createImageData(le,Ee),ee=P.data;for(let U=0;U<le;U++){const ie=(fe+U)*i,he=Math.floor(ie/z);if(he<0||he>=W)continue;const te=he*$;for(let Se=0;Se<Ee;Se++){const Be=1-Se/Ee;let Xe=Math.floor(Be*$);if(I){let F=0,ye=$-1;for(;F<ye;){const ce=F+ye>>1,je=ae(ce);_(je,u,E)<Be?F=ce+1:ye=ce}Xe=F}if(Xe<0||Xe>=$)continue;const qe=n.data[te+Xe],ne=Math.max(0,Math.min(1,(qe+L+j)/L)),Ve=Math.floor(ne*255),Oe=(Se*le+U)*4;ee[Oe]=A[Ve*3],ee[Oe+1]=A[Ve*3+1],ee[Oe+2]=A[Ve*3+2],ee[Oe+3]=255}}if(ue.resetTransform(),ue.putImageData(P,0,0),s!==1){const U=document.createElement("canvas");U.width=le,U.height=Ee;const K=U.getContext("2d");if(!K)continue;K.putImageData(P,0,0),ue.clearRect(0,0,q.width,q.height),ue.imageSmoothingEnabled=!1,ue.drawImage(U,0,0,q.width,q.height)}}},[g,k,n,a,r,s,i,A,u,E,_,I,M]);const B=M.map($=>{const W=$*ke,z=Math.min(a-W,ke);return v.jsx(io,{$cssWidth:z,$left:W,width:z*s,height:r*s,$waveHeight:r,"data-index":$,ref:w},`${a}-${$}`)});return v.jsx(so,{$index:e,$cssWidth:a,$waveHeight:r,children:B})},pa=({isSelected:e,transparentBackground:t,renderMode:n="waveform",spectrogramData:a,spectrogramColorLUT:r,samplesPerPixel:s,spectrogramFrequencyScaleFn:i,spectrogramMinFrequency:l,spectrogramMaxFrequency:c,spectrogramWorkerApi:u,spectrogramClipId:m,spectrogramOnCanvasesReady:h,...p})=>{const f=wt(),{waveHeight:b,barWidth:w,barGap:g,samplesPerPixel:d}=Bt(),x=en(),y=s??d,C=e&&f?f.selectedWaveOutlineColor:f?.waveOutlineColor,k=e&&f?f.selectedWaveFillColor:f?.waveFillColor,S=f?.waveformDrawMode||"inverted",M=a||u;if(n==="spectrogram"&&M)return v.jsx(Dn,{index:p.index,data:a,length:p.length,waveHeight:b,devicePixelRatio:x,samplesPerPixel:y,colorLUT:r,frequencyScaleFn:i,minFrequency:l,maxFrequency:c,workerApi:u,clipId:m,onCanvasesReady:h});if(n==="both"&&M){const A=Math.floor(b/2);return v.jsxs(v.Fragment,{children:[v.jsx(Dn,{index:p.index*2,channelIndex:p.index,data:a,length:p.length,waveHeight:A,devicePixelRatio:x,samplesPerPixel:y,colorLUT:r,frequencyScaleFn:i,minFrequency:l,maxFrequency:c,workerApi:u,clipId:m,onCanvasesReady:h}),v.jsx("div",{style:{position:"absolute",top:(p.index*2+1)*A,width:p.length,height:A},children:v.jsx(_n,{...p,index:0,waveOutlineColor:C,waveFillColor:k,waveHeight:A,devicePixelRatio:x,barWidth:w,barGap:g,transparentBackground:t,drawMode:S})})]})}return v.jsx(_n,{...p,waveOutlineColor:C,waveFillColor:k,waveHeight:b,devicePixelRatio:x,barWidth:w,barGap:g,transparentBackground:t,drawMode:S})},Bn=72,uo=R.div`
538
+ `;function Bs(){const e=new Uint8Array(768);for(let t=0;t<256;t++)e[t*3]=e[t*3+1]=e[t*3+2]=t;return e}var Fs=Bs(),Yn=({index:e,channelIndex:t,data:n,length:a,waveHeight:r,devicePixelRatio:s=1,samplesPerPixel:o,colorLUT:l,frequencyScaleFn:c,minFrequency:u=0,maxFrequency:f,workerApi:h,clipId:p,onCanvasesReady:d})=>{const g=t??e,{canvasRef:y,canvasMapRef:b}=an(),m=i.useRef([]),w=i.useRef(new WeakSet),x=i.useRef(h),C=i.useRef(d),k=!!(h&&p),S=Sa(),I=nn(a,ke,S),A=l??Fs,_=f??(n?n.sampleRate/2:22050),T=c??$s,M=!!c;i.useEffect(()=>{x.current=h},[h]),i.useEffect(()=>{C.current=d},[d]),i.useEffect(()=>{if(!k)return;const $=x.current;if(!$||!p)return;const B=m.current.length,P=[];for(const J of m.current){const V=J.match(/chunk(\d+)$/);if(!V){P.push(J);continue}const te=parseInt(V[1],10),se=b.current.get(te);if(se&&se.isConnected)P.push(J);else try{$.unregisterCanvas(J)}catch(Q){console.warn(`[spectrogram] unregisterCanvas failed for ${J}:`,Q)}}m.current=P;const N=[];for(const[J,V]of b.current.entries()){if(w.current.has(V))continue;const te=`${p}-ch${g}-chunk${J}`;let se;try{se=V.transferControlToOffscreen()}catch(Q){console.warn(`[spectrogram] transferControlToOffscreen failed for ${te}:`,Q);continue}w.current.add(V);try{$.registerCanvas(te,se),N.push(te)}catch(Q){console.warn(`[spectrogram] registerCanvas failed for ${te}:`,Q);continue}}if(N.length>0&&(m.current=[...m.current,...N]),N.length>0||P.length<B){const J=m.current,V=J.map(te=>{const se=te.match(/chunk(\d+)$/);if(!se)return console.warn(`[spectrogram] Unexpected canvas ID format: ${te}`),ke;const Q=parseInt(se[1],10);return Math.min(a-Q*ke,ke)});C.current?.(J,V)}},[b,k,p,g,a,I]),i.useEffect(()=>()=>{const $=x.current;if($){for(const B of m.current)try{$.unregisterCanvas(B)}catch(P){console.warn(`[spectrogram] unregisterCanvas failed for ${B}:`,P)}m.current=[]}},[]),i.useLayoutEffect(()=>{if(k||!n)return;const{frequencyBinCount:$,frameCount:B,hopSize:P,sampleRate:N,gainDb:U,rangeDb:J}=n,V=J===0?1:J,te=se=>se/$*(N/2);for(const[se,Q]of b.current.entries()){const le=se*ke,ce=Q.getContext("2d");if(!ce)continue;const ue=Q.width/s,Ae=r;ce.resetTransform(),ce.clearRect(0,0,Q.width,Q.height),ce.imageSmoothingEnabled=!1,ce.scale(s,s);const L=ce.createImageData(ue,Ae),ee=L.data;for(let G=0;G<ue;G++){const D=(le+G)*o,ie=Math.floor(D/P);if(ie<0||ie>=B)continue;const z=ie*$;for(let be=0;be<Ae;be++){const Ve=1-be/Ae;let ye=Math.floor(Ve*$);if(M){let ve=0,Se=$-1;for(;ve<Se;){const Ee=ve+Se>>1,Oe=te(Ee);T(Oe,u,_)<Ve?ve=Ee+1:Se=Ee}ye=ve}if(ye<0||ye>=$)continue;const Me=n.data[z+ye],q=Math.max(0,Math.min(1,(Me+V+U)/V)),we=Math.floor(q*255),Xe=(be*ue+G)*4;ee[Xe]=A[we*3],ee[Xe+1]=A[we*3+1],ee[Xe+2]=A[we*3+2],ee[Xe+3]=255}}if(ce.resetTransform(),ce.putImageData(L,0,0),s!==1){const G=document.createElement("canvas");G.width=ue,G.height=Ae;const K=G.getContext("2d");if(!K)continue;K.putImageData(L,0,0),ce.clearRect(0,0,Q.width,Q.height),ce.imageSmoothingEnabled=!1,ce.drawImage(G,0,0,Q.width,Q.height)}}},[b,k,n,a,r,s,o,A,u,_,T,M,I]);const W=I.map($=>{const B=$*ke,P=Math.min(a-B,ke);return v.jsx(Ds,{$cssWidth:P,$left:B,width:P*s,height:r*s,$waveHeight:r,"data-index":$,ref:y},`${a}-${$}`)});return v.jsx(Rs,{$index:e,$cssWidth:a,$waveHeight:r,children:W})},Ra=({isSelected:e,transparentBackground:t,renderMode:n="waveform",spectrogramData:a,spectrogramColorLUT:r,samplesPerPixel:s,spectrogramFrequencyScaleFn:o,spectrogramMinFrequency:l,spectrogramMaxFrequency:c,spectrogramWorkerApi:u,spectrogramClipId:f,spectrogramOnCanvasesReady:h,...p})=>{const d=xt(),{waveHeight:g,barWidth:y,barGap:b,samplesPerPixel:m}=Wt(),w=sn(),x=s??m,C=e&&d?d.selectedWaveOutlineColor:d?.waveOutlineColor,k=e&&d?d.selectedWaveFillColor:d?.waveFillColor,S=d?.waveformDrawMode||"inverted",I=a||u;if(n==="spectrogram"&&I)return v.jsx(Yn,{index:p.index,data:a,length:p.length,waveHeight:g,devicePixelRatio:w,samplesPerPixel:x,colorLUT:r,frequencyScaleFn:o,minFrequency:l,maxFrequency:c,workerApi:u,clipId:f,onCanvasesReady:h});if(n==="both"&&I){const A=Math.floor(g/2);return v.jsxs(v.Fragment,{children:[v.jsx(Yn,{index:p.index*2,channelIndex:p.index,data:a,length:p.length,waveHeight:A,devicePixelRatio:w,samplesPerPixel:x,colorLUT:r,frequencyScaleFn:o,minFrequency:l,maxFrequency:c,workerApi:u,clipId:f,onCanvasesReady:h}),v.jsx("div",{style:{position:"absolute",top:(p.index*2+1)*A,width:p.length,height:A},children:v.jsx(Hn,{...p,index:0,waveOutlineColor:C,waveFillColor:k,waveHeight:A,devicePixelRatio:w,barWidth:y,barGap:b,transparentBackground:t,drawMode:S})})]})}return v.jsx(Hn,{...p,waveOutlineColor:C,waveFillColor:k,waveHeight:g,devicePixelRatio:w,barWidth:y,barGap:b,transparentBackground:t,drawMode:S})},Un=72,Ws=R.div`
539
539
  position: sticky;
540
540
  left: 0;
541
541
  z-index: 101;
@@ -543,34 +543,34 @@
543
543
  height: 0;
544
544
  width: 0;
545
545
  overflow: visible;
546
- `;function fo(e,t,n){const r=[20,50,100,200,500,1e3,2e3,3e3,4e3,5e3,8e3,1e4,12e3,16e3,2e4].filter(c=>c>=e&&c<=t),s=Math.max(2,Math.floor(n/20));if(r.length<=s)return r;const i=(r.length-1)/(s-1),l=[];for(let c=0;c<s;c++)l.push(r[Math.round(c*i)]);return l}var mo=({waveHeight:e,numChannels:t,frequencyScaleFn:n,minFrequency:a,maxFrequency:r,labelsColor:s="#ccc",labelsBackground:i="rgba(0,0,0,0.6)",renderMode:l="spectrogram",hasClipHeaders:c=!1})=>{const u=o.useRef(null),m=en(),h=l==="both"?Math.floor(e/2):e,p=t*e,f=c?22:0;return o.useLayoutEffect(()=>{const b=u.current;if(!b)return;const w=b.getContext("2d");if(!w)return;w.resetTransform(),w.clearRect(0,0,b.width,b.height),w.scale(m,m);const g=fo(a,r,h);for(let d=0;d<t;d++){const x=d*e+f;w.font="11px monospace",w.textBaseline="middle";for(const y of g){const C=n(y,a,r);if(C<0||C>1)continue;const k=x+h*(1-C),S=y>=1e3?`${(y/1e3).toFixed(1)}k`:`${y} Hz`,M=w.measureText(S),A=3;w.fillStyle=i,w.fillRect(0,k-7,M.width+A*2,14),w.fillStyle=s,w.fillText(S,A,k)}}},[e,t,n,a,r,s,i,m,h,f]),v.jsx(uo,{$height:p+f,children:v.jsx("canvas",{ref:u,width:Bn*m,height:(p+f)*m,style:{width:Bn,height:p+f,pointerEvents:"none"}})})};function ho(e,t,n){return Math.ceil(e*n/t)}function po(e){const t=Math.floor(e/1e3),n=t%60;return`${(t-n)/60}:${String(n).padStart(2,"0")}`}var go=R.div.attrs(e=>({style:{width:`${e.$cssWidth}px`,marginLeft:`${e.$controlWidth}px`,height:`${e.$timeScaleHeight}px`}}))`
546
+ `;function Ps(e,t,n){const r=[20,50,100,200,500,1e3,2e3,3e3,4e3,5e3,8e3,1e4,12e3,16e3,2e4].filter(c=>c>=e&&c<=t),s=Math.max(2,Math.floor(n/20));if(r.length<=s)return r;const o=(r.length-1)/(s-1),l=[];for(let c=0;c<s;c++)l.push(r[Math.round(c*o)]);return l}var Vs=({waveHeight:e,numChannels:t,frequencyScaleFn:n,minFrequency:a,maxFrequency:r,labelsColor:s="#ccc",labelsBackground:o="rgba(0,0,0,0.6)",renderMode:l="spectrogram",hasClipHeaders:c=!1})=>{const u=i.useRef(null),f=sn(),h=l==="both"?Math.floor(e/2):e,p=t*e,d=c?22:0;return i.useLayoutEffect(()=>{const g=u.current;if(!g)return;const y=g.getContext("2d");if(!y)return;y.resetTransform(),y.clearRect(0,0,g.width,g.height),y.scale(f,f);const b=Ps(a,r,h);for(let m=0;m<t;m++){const w=m*e+d;y.font="11px monospace",y.textBaseline="middle";for(const x of b){const C=n(x,a,r);if(C<0||C>1)continue;const k=w+h*(1-C),S=x>=1e3?`${(x/1e3).toFixed(1)}k`:`${x} Hz`,I=y.measureText(S),A=3;y.fillStyle=o,y.fillRect(0,k-7,I.width+A*2,14),y.fillStyle=s,y.fillText(S,A,k)}}},[e,t,n,a,r,s,o,f,h,d]),v.jsx(Ws,{$height:p+d,children:v.jsx("canvas",{ref:u,width:Un*f,height:(p+d)*f,style:{width:Un,height:p+d,pointerEvents:"none"}})})};function Zs(e,t,n){return Math.ceil(e*n/t)}function Ls(e){const t=Math.floor(e/1e3),n=t%60;return`${(t-n)/60}:${String(n).padStart(2,"0")}`}var js=R.div.attrs(e=>({style:{width:`${e.$cssWidth}px`,marginLeft:`${e.$controlWidth}px`,height:`${e.$timeScaleHeight}px`}}))`
547
547
  position: relative;
548
548
  overflow: visible; /* Allow time labels to render above the container */
549
549
  border-bottom: 1px solid ${e=>e.theme.timeColor};
550
550
  box-sizing: border-box;
551
- `,bo=R.canvas.attrs(e=>({style:{width:`${e.$cssWidth}px`,height:`${e.$timeScaleHeight}px`,left:`${e.$left}px`}}))`
551
+ `,zs=R.canvas.attrs(e=>({style:{width:`${e.$cssWidth}px`,height:`${e.$timeScaleHeight}px`,left:`${e.$left}px`}}))`
552
552
  position: absolute;
553
553
  bottom: 0;
554
554
  /* Promote to own compositing layer for smoother scrolling */
555
555
  will-change: transform;
556
- `,vo=R.div.attrs(e=>({style:{left:`${e.$left+4}px`}}))`
556
+ `,Hs=R.div.attrs(e=>({style:{left:`${e.$left+4}px`}}))`
557
557
  position: absolute;
558
558
  font-size: 0.75rem; /* Smaller font to prevent overflow */
559
559
  white-space: nowrap; /* Prevent text wrapping */
560
560
  color: ${e=>e.theme.timeColor}; /* Use theme color instead of inheriting */
561
- `,Co=e=>{const{theme:{timeColor:t},duration:n,marker:a,bigStep:r,secondStep:s,renderTimestamp:i}=e,{canvasRef:l,canvasMapRef:c}=Jt(),{sampleRate:u,samplesPerPixel:m,timeScaleHeight:h,controls:{show:p,width:f}}=o.useContext(Ct),b=en(),{widthX:w,canvasInfo:g,timeMarkersWithPositions:d}=o.useMemo(()=>{const M=new Map,A=[],E=ho(n/1e3,m,u),_=u/m;let I=0;for(let B=0;B<E;B+=_*s/1e3){const $=Math.floor(B);if(I%a===0){const W=I,z=po(W),Y=i?v.jsx(o.Fragment,{children:i(W,$)},`timestamp-${I}`):v.jsx(vo,{$left:$,children:z},z);A.push({pix:$,element:Y}),M.set($,h)}else I%r===0?M.set($,Math.floor(h/2)):I%s===0&&M.set($,Math.floor(h/5));I+=s}return{widthX:E,canvasInfo:M,timeMarkersWithPositions:A}},[n,m,u,a,r,s,i,h]),x=qt(w,ke),y=x.map(M=>{const A=M*ke,E=Math.min(w-A,ke);return v.jsx(bo,{$cssWidth:E,$left:A,$timeScaleHeight:h,width:E*b,height:h*b,"data-index":M,ref:l},`timescale-${M}`)}),C=x.length>0?x[0]*ke:0,k=x.length>0?(x[x.length-1]+1)*ke:1/0,S=x.length>0?d.filter(({pix:M})=>M>=C&&M<k).map(({element:M})=>M):d.map(({element:M})=>M);return o.useLayoutEffect(()=>{for(const[M,A]of c.current.entries()){const E=A.getContext("2d");if(!E)continue;const _=M*ke,I=A.width/b;E.resetTransform(),E.clearRect(0,0,A.width,A.height),E.imageSmoothingEnabled=!1,E.fillStyle=t,E.scale(b,b);for(const[B,$]of g.entries()){if(B<_||B>=_+I)continue;const W=B-_,z=h-$;E.fillRect(W,z,1,$)}}},[c,n,b,t,h,g,x]),v.jsxs(go,{$cssWidth:w,$controlWidth:p?f:0,$timeScaleHeight:h,children:[S,y]})},wo=R.withTheme(Co),Fn=new Map([[700,{marker:1e3,bigStep:500,smallStep:100}],[1500,{marker:2e3,bigStep:1e3,smallStep:200}],[2500,{marker:2e3,bigStep:1e3,smallStep:500}],[5e3,{marker:5e3,bigStep:1e3,smallStep:500}],[1e4,{marker:1e4,bigStep:5e3,smallStep:1e3}],[12e3,{marker:15e3,bigStep:5e3,smallStep:1e3}],[1/0,{marker:3e4,bigStep:1e4,smallStep:5e3}]]);function yo(e){const t=Fn.keys();let n;for(const a of t)if(e<a){n=Fn.get(a);break}return n===void 0&&(n={marker:3e4,bigStep:1e4,smallStep:5e3}),n}var ga=({renderTimestamp:e})=>{const{samplesPerPixel:t,duration:n}=o.useContext(Ct);let a=yo(t);return v.jsx(wo,{marker:a.marker,bigStep:a.bigStep,secondStep:a.smallStep,duration:n,renderTimestamp:e})},xo=R.div`
561
+ `,Xs=e=>{const{theme:{timeColor:t},duration:n,marker:a,bigStep:r,secondStep:s,renderTimestamp:o}=e,{canvasRef:l,canvasMapRef:c}=an(),{sampleRate:u,samplesPerPixel:f,timeScaleHeight:h,controls:{show:p,width:d}}=i.useContext(wt),g=sn(),{widthX:y,canvasInfo:b,timeMarkersWithPositions:m}=i.useMemo(()=>{const I=new Map,A=[],_=Zs(n/1e3,f,u),T=u/f;let M=0;for(let W=0;W<_;W+=T*s/1e3){const $=Math.floor(W);if(M%a===0){const B=M,P=Ls(B),N=o?v.jsx(i.Fragment,{children:o(B,$)},`timestamp-${M}`):v.jsx(Hs,{$left:$,children:P},P);A.push({pix:$,element:N}),I.set($,h)}else M%r===0?I.set($,Math.floor(h/2)):M%s===0&&I.set($,Math.floor(h/5));M+=s}return{widthX:_,canvasInfo:I,timeMarkersWithPositions:A}},[n,f,u,a,r,s,o,h]),w=nn(y,ke),x=w.map(I=>{const A=I*ke,_=Math.min(y-A,ke);return v.jsx(zs,{$cssWidth:_,$left:A,$timeScaleHeight:h,width:_*g,height:h*g,"data-index":I,ref:l},`timescale-${I}`)}),C=w.length>0?w[0]*ke:0,k=w.length>0?(w[w.length-1]+1)*ke:1/0,S=w.length>0?m.filter(({pix:I})=>I>=C&&I<k).map(({element:I})=>I):m.map(({element:I})=>I);return i.useLayoutEffect(()=>{for(const[I,A]of c.current.entries()){const _=A.getContext("2d");if(!_)continue;const T=I*ke,M=A.width/g;_.resetTransform(),_.clearRect(0,0,A.width,A.height),_.imageSmoothingEnabled=!1,_.fillStyle=t,_.scale(g,g);for(const[W,$]of b.entries()){if(W<T||W>=T+M)continue;const B=W-T,P=h-$;_.fillRect(B,P,1,$)}}},[c,n,g,t,h,b,w]),v.jsxs(js,{$cssWidth:y,$controlWidth:p?d:0,$timeScaleHeight:h,children:[S,x]})},Os=R.withTheme(Xs),Kn=new Map([[700,{marker:1e3,bigStep:500,smallStep:100}],[1500,{marker:2e3,bigStep:1e3,smallStep:200}],[2500,{marker:2e3,bigStep:1e3,smallStep:500}],[5e3,{marker:5e3,bigStep:1e3,smallStep:500}],[1e4,{marker:1e4,bigStep:5e3,smallStep:1e3}],[12e3,{marker:15e3,bigStep:5e3,smallStep:1e3}],[1/0,{marker:3e4,bigStep:1e4,smallStep:5e3}]]);function Ns(e){const t=Kn.keys();let n;for(const a of t)if(e<a){n=Kn.get(a);break}return n===void 0&&(n={marker:3e4,bigStep:1e4,smallStep:5e3}),n}var Da=({renderTimestamp:e})=>{const{samplesPerPixel:t,duration:n}=i.useContext(wt);let a=Ns(t);return v.jsx(Os,{marker:a.marker,bigStep:a.bigStep,secondStep:a.smallStep,duration:n,renderTimestamp:e})},Gs=R.div`
562
562
  display: inline-flex;
563
563
  align-items: center;
564
564
  gap: 0.5rem;
565
- `,ko=[{value:"seconds",label:"seconds"},{value:"thousandths",label:"thousandths"},{value:"hh:mm:ss",label:"hh:mm:ss"},{value:"hh:mm:ss.u",label:"hh:mm:ss + tenths"},{value:"hh:mm:ss.uu",label:"hh:mm:ss + hundredths"},{value:"hh:mm:ss.uuu",label:"hh:mm:ss + milliseconds"}],So=({value:e,onChange:t,disabled:n=!1,className:a})=>{const r=s=>{t(s.target.value)};return v.jsx(xo,{className:a,children:v.jsx(ta,{className:"time-format",value:e,onChange:r,disabled:n,"aria-label":"Time format selection",children:ko.map(s=>v.jsx("option",{value:s.value,children:s.label},s.value))})})},Io=R.div.attrs(e=>({style:{height:`${e.$waveHeight*e.$numChannels+(e.$hasClipHeaders?la:0)}px`}}))`
565
+ `,Ys=[{value:"seconds",label:"seconds"},{value:"thousandths",label:"thousandths"},{value:"hh:mm:ss",label:"hh:mm:ss"},{value:"hh:mm:ss.u",label:"hh:mm:ss + tenths"},{value:"hh:mm:ss.uu",label:"hh:mm:ss + hundredths"},{value:"hh:mm:ss.uuu",label:"hh:mm:ss + milliseconds"}],Us=({value:e,onChange:t,disabled:n=!1,className:a})=>{const r=s=>{t(s.target.value)};return v.jsx(Gs,{className:a,children:v.jsx(va,{className:"time-format",value:e,onChange:r,disabled:n,"aria-label":"Time format selection",children:Ys.map(s=>v.jsx("option",{value:s.value,children:s.label},s.value))})})},Ks=R.div.attrs(e=>({style:{height:`${e.$waveHeight*e.$numChannels+(e.$hasClipHeaders?Ia:0)}px`}}))`
566
566
  position: relative;
567
567
  display: flex;
568
568
  ${e=>e.$width!==void 0&&`width: ${e.$width}px;`}
569
- `,Ao=R.div.attrs(e=>({style:{paddingLeft:`${e.$offset||0}px`}}))`
569
+ `,qs=R.div.attrs(e=>({style:{paddingLeft:`${e.$offset||0}px`}}))`
570
570
  position: relative;
571
571
  background: ${e=>e.$backgroundColor||"transparent"};
572
572
  flex: 1;
573
- `,Mo=R.div.attrs(e=>({style:{width:`${e.$controlWidth}px`}}))`
573
+ `,Js=R.div.attrs(e=>({style:{width:`${e.$controlWidth}px`}}))`
574
574
  position: sticky;
575
575
  z-index: 102; /* Above waveform content and spectrogram labels (101), below Docusaurus navbar (200) */
576
576
  left: 0;
@@ -584,7 +584,7 @@
584
584
  ${e=>e.$isSelected&&`
585
585
  background: ${e.theme.selectedTrackControlsBackground};
586
586
  `}
587
- `,ba=({numChannels:e,children:t,className:n,backgroundColor:a,offset:r=0,width:s,hasClipHeaders:i=!1,onClick:l,trackId:c,isSelected:u=!1})=>{const{waveHeight:m,controls:{show:h,width:p}}=Bt(),f=Qr();return v.jsxs(Io,{$numChannels:e,className:n,$waveHeight:m,$controlWidth:h?p:0,$width:s,$hasClipHeaders:i,$isSelected:u,children:[v.jsx(Mo,{$controlWidth:h?p:0,$isSelected:u,children:f}),v.jsx(Ao,{$controlWidth:h?p:0,$backgroundColor:a,$offset:r,onClick:l,"data-track-id":c,children:t})]})},Wn=R.button.attrs({type:"button"})`
587
+ `,Ba=({numChannels:e,children:t,className:n,backgroundColor:a,offset:r=0,width:s,hasClipHeaders:o=!1,onClick:l,trackId:c,isSelected:u=!1})=>{const{waveHeight:f,controls:{show:h,width:p}}=Wt(),d=Is();return v.jsxs(Ks,{$numChannels:e,className:n,$waveHeight:f,$controlWidth:h?p:0,$width:s,$hasClipHeaders:o,$isSelected:u,children:[v.jsx(Js,{$controlWidth:h?p:0,$isSelected:u,children:d}),v.jsx(qs,{$controlWidth:h?p:0,$backgroundColor:a,$offset:r,onClick:l,"data-track-id":c,children:t})]})},qn=R.button.attrs({type:"button"})`
588
588
  display: inline-block;
589
589
  font-family: ${e=>e.theme.fontFamily};
590
590
  font-weight: 500;
@@ -646,7 +646,7 @@
646
646
  box-shadow: 0 0 0 0.2rem ${e.theme.inputFocusBorder}33;
647
647
  }
648
648
  `}
649
- `,_o=R.div`
649
+ `,Qs=R.div`
650
650
  margin-bottom: 0.3rem;
651
651
 
652
652
  button:not(:first-child) {
@@ -658,7 +658,7 @@
658
658
  border-top-right-radius: 0;
659
659
  border-bottom-right-radius: 0;
660
660
  }
661
- `,Eo=R.button`
661
+ `,eo=R.button`
662
662
  position: absolute;
663
663
  left: 0;
664
664
  top: 0;
@@ -680,7 +680,7 @@
680
680
  opacity: 1;
681
681
  color: #dc3545;
682
682
  }
683
- `,$o=({onClick:e,title:t="Remove track"})=>v.jsx(Eo,{onClick:e,title:t,children:v.jsx(fr,{size:12,weight:"bold"})}),To=R.div`
683
+ `,to=({onClick:e,title:t="Remove track"})=>v.jsx(eo,{onClick:e,title:t,children:v.jsx(Vr,{size:12,weight:"bold"})}),no=R.div`
684
684
  background: transparent;
685
685
  width: 100%;
686
686
  height: 100%;
@@ -693,7 +693,7 @@
693
693
  text-align: center;
694
694
  border: 1px solid ${e=>e.theme.borderColor};
695
695
  border-radius: ${e=>e.theme.borderRadius};
696
- `,Ro=R.header`
696
+ `,ao=R.header`
697
697
  overflow: hidden;
698
698
  height: 26px;
699
699
  width: 100%;
@@ -704,7 +704,7 @@
704
704
  font-size: ${e=>e.theme.fontSizeSmall};
705
705
  color: ${e=>e.theme.textColor};
706
706
  background-color: transparent;
707
- `,Do=e=>v.jsx(Jn,{weight:"light",...e}),Bo=e=>v.jsx(qn,{weight:"light",...e}),Fo=e=>v.jsx(Kn,{weight:"bold",...e}),Pn=R(na)`
707
+ `,ro=e=>v.jsx(pa,{weight:"light",...e}),so=e=>v.jsx(ha,{weight:"light",...e}),oo=e=>v.jsx(ma,{weight:"bold",...e}),Jn=R(Ca)`
708
708
  width: 75%;
709
709
  height: 5px;
710
710
  background: ${e=>e.theme.sliderTrackColor};
@@ -753,7 +753,7 @@
753
753
  &:focus::-moz-range-thumb {
754
754
  border: 2px solid ${e=>e.theme.textColor};
755
755
  }
756
- `,Zn=R.label`
756
+ `,Qn=R.label`
757
757
  width: 100%;
758
758
  display: flex;
759
759
  justify-content: space-between;
@@ -761,10 +761,10 @@
761
761
  padding: 0 1rem;
762
762
  margin-bottom: 0.2rem;
763
763
  font-size: 14px;
764
- `,Wo=R.div`
764
+ `,io=R.div`
765
765
  position: relative;
766
766
  display: inline-block;
767
- `,Po=R.button`
767
+ `,lo=R.button`
768
768
  background: none;
769
769
  border: none;
770
770
  cursor: pointer;
@@ -778,7 +778,7 @@
778
778
  &:hover {
779
779
  opacity: 1;
780
780
  }
781
- `,Zo=R.div`
781
+ `,co=R.div`
782
782
  position: fixed;
783
783
  top: ${e=>e.$top}px;
784
784
  left: ${e=>e.$left}px;
@@ -790,12 +790,12 @@
790
790
  padding: 0.5rem 0;
791
791
  min-width: 180px;
792
792
  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
793
- `,Vo=R.hr`
793
+ `,uo=R.hr`
794
794
  border: none;
795
795
  border-top: 1px solid rgba(128, 128, 128, 0.3);
796
796
  margin: 0.35rem 0;
797
- `,jo=({items:e})=>{const[t,n]=o.useState(!1),r=typeof e=="function"?e(()=>n(!1)):e,[s,i]=o.useState({top:0,left:0}),l=o.useRef(null),c=o.useRef(null);return o.useEffect(()=>{if(t&&l.current){const u=l.current.getBoundingClientRect();i({top:u.bottom+2,left:Math.max(0,u.right-180)})}},[t]),o.useEffect(()=>{if(!t)return;const u=m=>{const h=m.target;l.current&&!l.current.contains(h)&&c.current&&!c.current.contains(h)&&n(!1)};return document.addEventListener("mousedown",u),()=>document.removeEventListener("mousedown",u)},[t]),v.jsxs(Wo,{children:[v.jsx(Po,{ref:l,onClick:u=>{u.stopPropagation(),n(m=>!m)},onMouseDown:u=>u.stopPropagation(),title:"Track menu","aria-label":"Track menu",children:v.jsx(Fo,{size:16})}),t&&typeof document<"u"&&Hn.createPortal(v.jsx(Zo,{ref:c,$top:s.top,$left:s.left,onMouseDown:u=>u.stopPropagation(),children:r.map((u,m)=>v.jsxs(o.Fragment,{children:[m>0&&v.jsx(Vo,{}),u.content]},u.id))}),document.body)]})};function lt(e,t){this._waveformData=e,this._channelIndex=t}lt.prototype.min_sample=function(e){var t=(e*this._waveformData.channels+this._channelIndex)*2;return this._waveformData._at(t)};lt.prototype.max_sample=function(e){var t=(e*this._waveformData.channels+this._channelIndex)*2+1;return this._waveformData._at(t)};lt.prototype.set_min_sample=function(e,t){var n=(e*this._waveformData.channels+this._channelIndex)*2;return this._waveformData._set_at(n,t)};lt.prototype.set_max_sample=function(e,t){var n=(e*this._waveformData.channels+this._channelIndex)*2+1;return this._waveformData._set_at(n,t)};lt.prototype.min_array=function(){for(var e=this._waveformData.length,t=[],n=0;n<e;n++)t.push(this.min_sample(n));return t};lt.prototype.max_array=function(){for(var e=this._waveformData.length,t=[],n=0;n<e;n++)t.push(this.max_sample(n));return t};var Lo=127,zo=-128,Ho=32767,Xo=-32768;function Oo(e,t){var n=Math.floor(e/t),a=e-n*t;return a>0&&n++,n}function Go(e){for(var t=e.scale,n=e.amplitude_scale,a=e.split_channels,r=e.length,s=e.sample_rate,i=e.channels.map(function(I){return new Float32Array(I)}),l=a?i.length:1,c=24,u=Oo(r,t),m=e.bits===8?1:2,h=c+u*2*m*l,p=new ArrayBuffer(h),f=new DataView(p),b=0,w=c,g=new Array(l),d=new Array(l),x=0;x<l;x++)g[x]=1/0,d[x]=-1/0;var y=e.bits===8?zo:Xo,C=e.bits===8?Lo:Ho;f.setInt32(0,2,!0),f.setUint32(4,e.bits===8,!0),f.setInt32(8,s,!0),f.setInt32(12,t,!0),f.setInt32(16,u,!0),f.setInt32(20,l,!0);for(var k=0;k<r;k++){var S=0;if(l===1){for(var M=0;M<i.length;++M)S+=i[M][k];S=Math.floor(C*S*n/i.length),S<g[0]&&(g[0]=S,g[0]<y&&(g[0]=y)),S>d[0]&&(d[0]=S,d[0]>C&&(d[0]=C))}else for(var A=0;A<l;++A)S=Math.floor(C*i[A][k]*n),S<g[A]&&(g[A]=S,g[A]<y&&(g[A]=y)),S>d[A]&&(d[A]=S,d[A]>C&&(d[A]=C));if(++b===t){for(var E=0;E<l;E++)e.bits===8?(f.setInt8(w++,g[E]),f.setInt8(w++,d[E])):(f.setInt16(w,g[E],!0),f.setInt16(w+2,d[E],!0),w+=4),g[E]=1/0,d[E]=-1/0;b=0}}if(b>0)for(var _=0;_<l;_++)e.bits===8?(f.setInt8(w++,g[_]),f.setInt8(w++,d[_])):(f.setInt16(w,g[_],!0),f.setInt16(w+2,d[_],!0));return p}function Rt(e){"@babel/helpers - typeof";return Rt=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(t){return typeof t}:function(t){return t&&typeof Symbol=="function"&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},Rt(e)}function No(e){return e&&Rt(e)==="object"&&"sample_rate"in e&&"samples_per_pixel"in e&&"bits"in e&&"length"in e&&"data"in e}function Yo(e){var t=e&&Rt(e)==="object"&&"byteLength"in e;if(t){var n=new DataView(e),a=n.getInt32(0,!0);if(a!==1&&a!==2)throw new TypeError("WaveformData.create(): This waveform data version not supported")}return t}function Uo(e){var t=e.data,n=e.channels||1,a=24,r=e.bits===8?1:2,s=e.length*2*n;if(t.length!==s)throw new Error("WaveformData.create(): Length mismatch in JSON waveform data");var i=a+t.length*r,l=new ArrayBuffer(i),c=new DataView(l);c.setInt32(0,2,!0),c.setUint32(4,e.bits===8,!0),c.setInt32(8,e.sample_rate,!0),c.setInt32(12,e.samples_per_pixel,!0),c.setInt32(16,e.length,!0),c.setInt32(20,n,!0);var u=a;if(e.bits===8)for(var m=0;m<t.length;m++)c.setInt8(u++,t[m],!0);else for(var h=0;h<t.length;h++)c.setInt16(u,t[h],!0),u+=2;return l}function ft(e){return e==null}function Ko(e,t){var n=atob(e);return n}function qo(e,t,n){var a=Ko(e),r=a.indexOf(`
798
- `,10)+1,s=a.substring(r)+"",i=new Blob([s],{type:"application/javascript"});return URL.createObjectURL(i)}function Jo(e,t,n){var a;return function(s){return a=a||qo(e),new Worker(a,s)}}var Qo=Jo("Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwooZnVuY3Rpb24gKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgLyoqCiAgICogQXVkaW9CdWZmZXItYmFzZWQgV2F2ZWZvcm1EYXRhIGdlbmVyYXRvcgogICAqCiAgICogQWRhcHRlZCBmcm9tIEJsb2NrRmlsZTo6Q2FsY1N1bW1hcnkgaW4gQXVkYWNpdHksIHdpdGggcGVybWlzc2lvbi4KICAgKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2F1ZGFjaXR5L2F1ZGFjaXR5L2Jsb2IvCiAgICogICAxMTA4YzEzNzZjMDkxNjYxNjIzMzVmYWI0NzQzMDA4Y2JhNTdjNGVlL3NyYy9CbG9ja0ZpbGUuY3BwI0wxOTgKICAgKi8KCiAgdmFyIElOVDhfTUFYID0gMTI3OwogIHZhciBJTlQ4X01JTiA9IC0xMjg7CiAgdmFyIElOVDE2X01BWCA9IDMyNzY3OwogIHZhciBJTlQxNl9NSU4gPSAtMzI3Njg7CiAgZnVuY3Rpb24gY2FsY3VsYXRlV2F2ZWZvcm1EYXRhTGVuZ3RoKGF1ZGlvX3NhbXBsZV9jb3VudCwgc2NhbGUpIHsKICAgIHZhciBkYXRhX2xlbmd0aCA9IE1hdGguZmxvb3IoYXVkaW9fc2FtcGxlX2NvdW50IC8gc2NhbGUpOwogICAgdmFyIHNhbXBsZXNfcmVtYWluaW5nID0gYXVkaW9fc2FtcGxlX2NvdW50IC0gZGF0YV9sZW5ndGggKiBzY2FsZTsKICAgIGlmIChzYW1wbGVzX3JlbWFpbmluZyA+IDApIHsKICAgICAgZGF0YV9sZW5ndGgrKzsKICAgIH0KICAgIHJldHVybiBkYXRhX2xlbmd0aDsKICB9CiAgZnVuY3Rpb24gZ2VuZXJhdGVXYXZlZm9ybURhdGEob3B0aW9ucykgewogICAgdmFyIHNjYWxlID0gb3B0aW9ucy5zY2FsZTsKICAgIHZhciBhbXBsaXR1ZGVfc2NhbGUgPSBvcHRpb25zLmFtcGxpdHVkZV9zY2FsZTsKICAgIHZhciBzcGxpdF9jaGFubmVscyA9IG9wdGlvbnMuc3BsaXRfY2hhbm5lbHM7CiAgICB2YXIgbGVuZ3RoID0gb3B0aW9ucy5sZW5ndGg7CiAgICB2YXIgc2FtcGxlX3JhdGUgPSBvcHRpb25zLnNhbXBsZV9yYXRlOwogICAgdmFyIGNoYW5uZWxzID0gb3B0aW9ucy5jaGFubmVscy5tYXAoZnVuY3Rpb24gKGNoYW5uZWwpIHsKICAgICAgcmV0dXJuIG5ldyBGbG9hdDMyQXJyYXkoY2hhbm5lbCk7CiAgICB9KTsKICAgIHZhciBvdXRwdXRfY2hhbm5lbHMgPSBzcGxpdF9jaGFubmVscyA/IGNoYW5uZWxzLmxlbmd0aCA6IDE7CiAgICB2YXIgaGVhZGVyX3NpemUgPSAyNDsKICAgIHZhciBkYXRhX2xlbmd0aCA9IGNhbGN1bGF0ZVdhdmVmb3JtRGF0YUxlbmd0aChsZW5ndGgsIHNjYWxlKTsKICAgIHZhciBieXRlc19wZXJfc2FtcGxlID0gb3B0aW9ucy5iaXRzID09PSA4ID8gMSA6IDI7CiAgICB2YXIgdG90YWxfc2l6ZSA9IGhlYWRlcl9zaXplICsgZGF0YV9sZW5ndGggKiAyICogYnl0ZXNfcGVyX3NhbXBsZSAqIG91dHB1dF9jaGFubmVsczsKICAgIHZhciBidWZmZXIgPSBuZXcgQXJyYXlCdWZmZXIodG90YWxfc2l6ZSk7CiAgICB2YXIgZGF0YV92aWV3ID0gbmV3IERhdGFWaWV3KGJ1ZmZlcik7CiAgICB2YXIgc2NhbGVfY291bnRlciA9IDA7CiAgICB2YXIgb2Zmc2V0ID0gaGVhZGVyX3NpemU7CiAgICB2YXIgbWluX3ZhbHVlID0gbmV3IEFycmF5KG91dHB1dF9jaGFubmVscyk7CiAgICB2YXIgbWF4X3ZhbHVlID0gbmV3IEFycmF5KG91dHB1dF9jaGFubmVscyk7CiAgICBmb3IgKHZhciBjaGFubmVsID0gMDsgY2hhbm5lbCA8IG91dHB1dF9jaGFubmVsczsgY2hhbm5lbCsrKSB7CiAgICAgIG1pbl92YWx1ZVtjaGFubmVsXSA9IEluZmluaXR5OwogICAgICBtYXhfdmFsdWVbY2hhbm5lbF0gPSAtSW5maW5pdHk7CiAgICB9CiAgICB2YXIgcmFuZ2VfbWluID0gb3B0aW9ucy5iaXRzID09PSA4ID8gSU5UOF9NSU4gOiBJTlQxNl9NSU47CiAgICB2YXIgcmFuZ2VfbWF4ID0gb3B0aW9ucy5iaXRzID09PSA4ID8gSU5UOF9NQVggOiBJTlQxNl9NQVg7CiAgICBkYXRhX3ZpZXcuc2V0SW50MzIoMCwgMiwgdHJ1ZSk7IC8vIFZlcnNpb24KICAgIGRhdGFfdmlldy5zZXRVaW50MzIoNCwgb3B0aW9ucy5iaXRzID09PSA4LCB0cnVlKTsgLy8gSXMgOCBiaXQ/CiAgICBkYXRhX3ZpZXcuc2V0SW50MzIoOCwgc2FtcGxlX3JhdGUsIHRydWUpOyAvLyBTYW1wbGUgcmF0ZQogICAgZGF0YV92aWV3LnNldEludDMyKDEyLCBzY2FsZSwgdHJ1ZSk7IC8vIFNjYWxlCiAgICBkYXRhX3ZpZXcuc2V0SW50MzIoMTYsIGRhdGFfbGVuZ3RoLCB0cnVlKTsgLy8gTGVuZ3RoCiAgICBkYXRhX3ZpZXcuc2V0SW50MzIoMjAsIG91dHB1dF9jaGFubmVscywgdHJ1ZSk7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciBzYW1wbGUgPSAwOwogICAgICBpZiAob3V0cHV0X2NoYW5uZWxzID09PSAxKSB7CiAgICAgICAgZm9yICh2YXIgX2NoYW5uZWwgPSAwOyBfY2hhbm5lbCA8IGNoYW5uZWxzLmxlbmd0aDsgKytfY2hhbm5lbCkgewogICAgICAgICAgc2FtcGxlICs9IGNoYW5uZWxzW19jaGFubmVsXVtpXTsKICAgICAgICB9CiAgICAgICAgc2FtcGxlID0gTWF0aC5mbG9vcihyYW5nZV9tYXggKiBzYW1wbGUgKiBhbXBsaXR1ZGVfc2NhbGUgLyBjaGFubmVscy5sZW5ndGgpOwogICAgICAgIGlmIChzYW1wbGUgPCBtaW5fdmFsdWVbMF0pIHsKICAgICAgICAgIG1pbl92YWx1ZVswXSA9IHNhbXBsZTsKICAgICAgICAgIGlmIChtaW5fdmFsdWVbMF0gPCByYW5nZV9taW4pIHsKICAgICAgICAgICAgbWluX3ZhbHVlWzBdID0gcmFuZ2VfbWluOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoc2FtcGxlID4gbWF4X3ZhbHVlWzBdKSB7CiAgICAgICAgICBtYXhfdmFsdWVbMF0gPSBzYW1wbGU7CiAgICAgICAgICBpZiAobWF4X3ZhbHVlWzBdID4gcmFuZ2VfbWF4KSB7CiAgICAgICAgICAgIG1heF92YWx1ZVswXSA9IHJhbmdlX21heDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZm9yICh2YXIgX2NoYW5uZWwyID0gMDsgX2NoYW5uZWwyIDwgb3V0cHV0X2NoYW5uZWxzOyArK19jaGFubmVsMikgewogICAgICAgICAgc2FtcGxlID0gTWF0aC5mbG9vcihyYW5nZV9tYXggKiBjaGFubmVsc1tfY2hhbm5lbDJdW2ldICogYW1wbGl0dWRlX3NjYWxlKTsKICAgICAgICAgIGlmIChzYW1wbGUgPCBtaW5fdmFsdWVbX2NoYW5uZWwyXSkgewogICAgICAgICAgICBtaW5fdmFsdWVbX2NoYW5uZWwyXSA9IHNhbXBsZTsKICAgICAgICAgICAgaWYgKG1pbl92YWx1ZVtfY2hhbm5lbDJdIDwgcmFuZ2VfbWluKSB7CiAgICAgICAgICAgICAgbWluX3ZhbHVlW19jaGFubmVsMl0gPSByYW5nZV9taW47CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGlmIChzYW1wbGUgPiBtYXhfdmFsdWVbX2NoYW5uZWwyXSkgewogICAgICAgICAgICBtYXhfdmFsdWVbX2NoYW5uZWwyXSA9IHNhbXBsZTsKICAgICAgICAgICAgaWYgKG1heF92YWx1ZVtfY2hhbm5lbDJdID4gcmFuZ2VfbWF4KSB7CiAgICAgICAgICAgICAgbWF4X3ZhbHVlW19jaGFubmVsMl0gPSByYW5nZV9tYXg7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKCsrc2NhbGVfY291bnRlciA9PT0gc2NhbGUpIHsKICAgICAgICBmb3IgKHZhciBfY2hhbm5lbDMgPSAwOyBfY2hhbm5lbDMgPCBvdXRwdXRfY2hhbm5lbHM7IF9jaGFubmVsMysrKSB7CiAgICAgICAgICBpZiAob3B0aW9ucy5iaXRzID09PSA4KSB7CiAgICAgICAgICAgIGRhdGFfdmlldy5zZXRJbnQ4KG9mZnNldCsrLCBtaW5fdmFsdWVbX2NoYW5uZWwzXSk7CiAgICAgICAgICAgIGRhdGFfdmlldy5zZXRJbnQ4KG9mZnNldCsrLCBtYXhfdmFsdWVbX2NoYW5uZWwzXSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBkYXRhX3ZpZXcuc2V0SW50MTYob2Zmc2V0LCBtaW5fdmFsdWVbX2NoYW5uZWwzXSwgdHJ1ZSk7CiAgICAgICAgICAgIGRhdGFfdmlldy5zZXRJbnQxNihvZmZzZXQgKyAyLCBtYXhfdmFsdWVbX2NoYW5uZWwzXSwgdHJ1ZSk7CiAgICAgICAgICAgIG9mZnNldCArPSA0OwogICAgICAgICAgfQogICAgICAgICAgbWluX3ZhbHVlW19jaGFubmVsM10gPSBJbmZpbml0eTsKICAgICAgICAgIG1heF92YWx1ZVtfY2hhbm5lbDNdID0gLUluZmluaXR5OwogICAgICAgIH0KICAgICAgICBzY2FsZV9jb3VudGVyID0gMDsKICAgICAgfQogICAgfQogICAgaWYgKHNjYWxlX2NvdW50ZXIgPiAwKSB7CiAgICAgIGZvciAodmFyIF9jaGFubmVsNCA9IDA7IF9jaGFubmVsNCA8IG91dHB1dF9jaGFubmVsczsgX2NoYW5uZWw0KyspIHsKICAgICAgICBpZiAob3B0aW9ucy5iaXRzID09PSA4KSB7CiAgICAgICAgICBkYXRhX3ZpZXcuc2V0SW50OChvZmZzZXQrKywgbWluX3ZhbHVlW19jaGFubmVsNF0pOwogICAgICAgICAgZGF0YV92aWV3LnNldEludDgob2Zmc2V0KyssIG1heF92YWx1ZVtfY2hhbm5lbDRdKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgZGF0YV92aWV3LnNldEludDE2KG9mZnNldCwgbWluX3ZhbHVlW19jaGFubmVsNF0sIHRydWUpOwogICAgICAgICAgZGF0YV92aWV3LnNldEludDE2KG9mZnNldCArIDIsIG1heF92YWx1ZVtfY2hhbm5lbDRdLCB0cnVlKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBidWZmZXI7CiAgfQoKICBvbm1lc3NhZ2UgPSBmdW5jdGlvbiBvbm1lc3NhZ2UoZXZ0KSB7CiAgICB2YXIgYnVmZmVyID0gZ2VuZXJhdGVXYXZlZm9ybURhdGEoZXZ0LmRhdGEpOwoKICAgIC8vIFRyYW5zZmVyIGJ1ZmZlciB0byB0aGUgY2FsbGluZyB0aHJlYWQKICAgIHRoaXMucG9zdE1lc3NhZ2UoYnVmZmVyLCBbYnVmZmVyXSk7CiAgICB0aGlzLmNsb3NlKCk7CiAgfTsKCn0pKCk7Ci8vIyBzb3VyY2VNYXBwaW5nVVJMPXdhdmVmb3JtLWRhdGEtd29ya2VyLmpzLm1hcAoK");function Ze(e){if(No(e)&&(e=Uo(e)),Yo(e)){this._data=new DataView(e),this._offset=this._version()===2?24:20,this._channels=[];for(var t=0;t<this.channels;t++)this._channels[t]=new lt(this,t)}else throw new TypeError("WaveformData.create(): Unknown data format")}var gt={scale:512,bits:8,amplitude_scale:1,split_channels:!1,disable_worker:!1};function es(e){var t={scale:e.scale||gt.scale,bits:e.bits||gt.bits,amplitude_scale:e.amplitude_scale||gt.amplitude_scale,split_channels:e.split_channels||gt.split_channels,disable_worker:e.disable_worker||gt.disable_worker};return t}function ts(e){for(var t=[],n=0;n<e.numberOfChannels;++n)t.push(e.getChannelData(n).buffer);return t}function va(e,t,n){var a=ts(e);if(t.disable_worker){var r=Go({scale:t.scale,bits:t.bits,amplitude_scale:t.amplitude_scale,split_channels:t.split_channels,length:e.length,sample_rate:e.sampleRate,channels:a});n(void 0,new Ze(r),e)}else{var s=new Qo;s.onmessage=function(i){n(void 0,new Ze(i.data),e)},s.postMessage({scale:t.scale,bits:t.bits,amplitude_scale:t.amplitude_scale,split_channels:t.split_channels,length:e.length,sample_rate:e.sampleRate,channels:a},a)}}function ns(e,t,n,a){function r(i){i||(i=new DOMException("EncodingError")),a(i),a=function(){}}var s=e.decodeAudioData(t,function(i){va(i,n,a)},r);s&&s.catch(r)}Ze.create=function(t){return new Ze(t)};Ze.createFromAudio=function(e,t){var n=es(e);if(e.audio_context&&e.array_buffer)return ns(e.audio_context,e.array_buffer,n,t);if(e.audio_buffer)return va(e.audio_buffer,n,t);throw new TypeError("WaveformData.createFromAudio(): Pass either an AudioContext and ArrayBuffer, or an AudioBuffer object")};function Ft(e){this._inputData=e.waveformData,this._output_samples_per_pixel=e.scale,this._scale=this._inputData.scale,this._input_buffer_size=this._inputData.length;var t=this._input_buffer_size*this._inputData.scale,n=Math.ceil(t/this._output_samples_per_pixel),a=24,r=this._inputData.bits===8?1:2,s=a+n*2*this._inputData.channels*r;this._output_data=new ArrayBuffer(s),this.output_dataview=new DataView(this._output_data),this.output_dataview.setInt32(0,2,!0),this.output_dataview.setUint32(4,this._inputData.bits===8,!0),this.output_dataview.setInt32(8,this._inputData.sample_rate,!0),this.output_dataview.setInt32(12,this._output_samples_per_pixel,!0),this.output_dataview.setInt32(16,n,!0),this.output_dataview.setInt32(20,this._inputData.channels,!0),this._outputWaveformData=new Ze(this._output_data),this._input_index=0,this._output_index=0;var i=this._inputData.channels;this._min=new Array(i),this._max=new Array(i);for(var l=0;l<i;++l)this._input_buffer_size>0?(this._min[l]=this._inputData.channel(l).min_sample(this._input_index),this._max[l]=this._inputData.channel(l).max_sample(this._input_index)):(this._min[l]=0,this._max[l]=0);this._min_value=this._inputData.bits===8?-128:-32768,this._max_value=this._inputData.bits===8?127:32767,this._where=0,this._prev_where=0,this._stop=0,this._last_input_index=0}Ft.prototype.sample_at_pixel=function(e){return Math.floor(e*this._output_samples_per_pixel)};Ft.prototype.next=function(){for(var e=0,t=1e3,n=this._inputData.channels,a;this._input_index<this._input_buffer_size&&e<t;){for(;Math.floor(this.sample_at_pixel(this._output_index)/this._scale)===this._input_index;){if(this._output_index>0)for(var r=0;r<n;++r)a=this._outputWaveformData.channel(r),a.set_min_sample(this._output_index-1,this._min[r]),a.set_max_sample(this._output_index-1,this._max[r]);if(this._last_input_index=this._input_index,this._output_index++,this._where=this.sample_at_pixel(this._output_index),this._prev_where=this.sample_at_pixel(this._output_index-1),this._where!==this._prev_where)for(var s=0;s<n;++s)this._min[s]=this._max_value,this._max[s]=this._min_value}for(this._where=this.sample_at_pixel(this._output_index),this._stop=Math.floor(this._where/this._scale),this._stop>this._input_buffer_size&&(this._stop=this._input_buffer_size);this._input_index<this._stop;){for(var i=0;i<n;++i){a=this._inputData.channel(i);var l=a.min_sample(this._input_index);l<this._min[i]&&(this._min[i]=l),l=a.max_sample(this._input_index),l>this._max[i]&&(this._max[i]=l)}this._input_index++}e++}if(this._input_index<this._input_buffer_size)return!1;if(this._input_index!==this._last_input_index)for(var c=0;c<n;++c)a=this._outputWaveformData.channel(c),a.set_min_sample(this._output_index-1,this._min[c]),a.set_max_sample(this._output_index-1,this._max[c]);return!0};Ft.prototype.getOutputData=function(){return this._output_data};Ze.prototype={_getResampleOptions:function(t){var n={};if(n.scale=t.scale,n.width=t.width,!ft(n.width)&&(typeof n.width!="number"||n.width<=0))throw new RangeError("WaveformData.resample(): width should be a positive integer value");if(!ft(n.scale)&&(typeof n.scale!="number"||n.scale<=0))throw new RangeError("WaveformData.resample(): scale should be a positive integer value");if(!n.scale&&!n.width)throw new Error("WaveformData.resample(): Missing scale or width option");if(n.width&&(n.scale=Math.floor(this.duration*this.sample_rate/n.width)),n.scale<this.scale)throw new Error("WaveformData.resample(): Zoom level "+n.scale+" too low, minimum: "+this.scale);return n.abortSignal=t.abortSignal,n},resample:function(t){t=this._getResampleOptions(t),t.waveformData=this;for(var n=new Ft(t);!n.next(););return new Ze(n.getOutputData())},concat:function(){var t=this,n=Array.prototype.slice.call(arguments);n.forEach(function(r){if(t.channels!==r.channels||t.sample_rate!==r.sample_rate||t.bits!==r.bits||t.scale!==r.scale)throw new Error("WaveformData.concat(): Waveforms are incompatible")});var a=this._concatBuffers.apply(this,n);return Ze.create(a)},_concatBuffers:function(){for(var t=Array.prototype.slice.call(arguments),n=this._offset,a=n,r=0,s=[this].concat(t).map(function(d){return d._data.buffer}),i=0;i<s.length;i++){var l=s[i],c=new DataView(l).getInt32(16,!0);a+=l.byteLength-n,r+=c}for(var u=new ArrayBuffer(a),m=new DataView(s[0]),h=new DataView(u),p=0;p<n;p++)h.setUint8(p,m.getUint8(p));h.setInt32(16,r,!0);for(var f=0,b=new Uint8Array(u,n),w=0;w<s.length;w++){var g=s[w];b.set(new Uint8Array(g,n),f),f+=g.byteLength-n}return u},slice:function(t){var n=0,a=0;if(!ft(t.startIndex)&&!ft(t.endIndex)?(n=t.startIndex,a=t.endIndex):!ft(t.startTime)&&!ft(t.endTime)&&(n=this.at_time(t.startTime),a=this.at_time(t.endTime)),n<0)throw new RangeError("startIndex or startTime must not be negative");if(a<0)throw new RangeError("endIndex or endTime must not be negative");n>this.length&&(n=this.length),a>this.length&&(a=this.length),n>a&&(n=a);var r=a-n,s=24,i=this.bits===8?1:2,l=s+r*2*this.channels*i,c=new ArrayBuffer(l),u=new DataView(c);u.setInt32(0,2,!0),u.setUint32(4,this.bits===8,!0),u.setInt32(8,this.sample_rate,!0),u.setInt32(12,this.scale,!0),u.setInt32(16,r,!0),u.setInt32(20,this.channels,!0);for(var m=0;m<r*this.channels*2;m++){var h=this._at(n*this.channels*2+m);this.bits===8?u.setInt8(s+m,h):u.setInt16(s+m*2,h,!0)}return new Ze(c)},_version:function(){return this._data.getInt32(0,!0)},get length(){return this._data.getUint32(16,!0)},get bits(){var e=!!this._data.getUint32(4,!0);return e?8:16},get duration(){return this.length*this.scale/this.sample_rate},get pixels_per_second(){return this.sample_rate/this.scale},get seconds_per_pixel(){return this.scale/this.sample_rate},get channels(){return this._version()===2?this._data.getInt32(20,!0):1},channel:function(t){if(t>=0&&t<this._channels.length)return this._channels[t];throw new RangeError("Invalid channel: "+t)},get sample_rate(){return this._data.getInt32(8,!0)},get scale(){return this._data.getInt32(12,!0)},_at:function(t){return this.bits===8?this._data.getInt8(this._offset+t):this._data.getInt16(this._offset+t*2,!0)},_set_at:function(t,n){return this.bits===8?this._data.setInt8(this._offset+t,n):this._data.setInt16(this._offset+t*2,n,!0)},at_time:function(t){return Math.floor(t*this.sample_rate/this.scale)},time:function(t){return t*this.scale/this.sample_rate},toJSON:function(){for(var t={version:2,channels:this.channels,sample_rate:this.sample_rate,samples_per_pixel:this.scale,bits:this.bits,length:this.length,data:[]},n=0;n<this.length;n++)for(var a=0;a<this.channels;a++)t.data.push(this.channel(a).min_sample(n)),t.data.push(this.channel(a).max_sample(n));return t},toArrayBuffer:function(){return this._data.buffer}};async function nn(e){const t=await fetch(e);if(!t.ok)throw new Error(`Failed to fetch waveform data: ${t.statusText}`);if(e.endsWith(".dat")){const a=await t.arrayBuffer();return Ze.create(a)}else{const a=await t.json();return Ze.create(a)}}function Ca(e,t=0){const n=e.channel(t),a=e.bits,r=n.min_array(),s=n.max_array(),i=r.length,l=a===8?new Int8Array(i*2):new Int16Array(i*2);for(let c=0;c<i;c++)l[c*2]=r[c],l[c*2+1]=s[c];return{data:l,bits:a,length:i,sampleRate:e.sample_rate}}async function as(e,t=0){const n=await nn(e);return Ca(n,t)}async function rs(e){const t=await nn(e);return{sampleRate:t.sample_rate,channels:t.channels,duration:t.duration,samplesPerPixel:t.scale,length:t.length,bits:t.bits}}function os(e,t,n=0,a,r){let s=e;if(r!==void 0){const p=e.scale,f=Math.floor(a/p),b=Math.ceil((a+r)/p);s=s.slice({startIndex:f,endIndex:b})}s.scale!==t&&(s=s.resample({scale:t}));const i=s.channel(n),l=s.bits,c=i.min_array(),u=i.max_array(),m=c.length,h=l===8?new Int8Array(m*2):new Int16Array(m*2);for(let p=0;p<m;p++)h[p*2]=c[p],h[p*2+1]=u[p];return{data:h,bits:l,length:m}}function Vn(e,t,n,a,r){let s=e;if(a!==void 0&&r!==void 0){const m=e.scale,h=Math.floor(a/m),p=Math.ceil((a+r)/m);s=s.slice({startIndex:h,endIndex:p})}s.scale!==t&&(s=s.resample({scale:t}));const i=s.channels,l=s.bits,c=[];for(let m=0;m<i;m++){const h=s.channel(m),p=h.min_array(),f=h.max_array(),b=p.length,w=l===8?new Int8Array(b*2):new Int16Array(b*2);for(let g=0;g<b;g++)w[g*2]=p[g],w[g*2+1]=f[g];c.push(w)}if(n&&c.length>1){const m=1/c.length,h=c[0].length/2,p=l===8?new Int8Array(h*2):new Int16Array(h*2);for(let f=0;f<h;f++){let b=0,w=0;for(let g=0;g<c.length;g++)b+=m*c[g][f*2],w+=m*c[g][f*2+1];p[f*2]=b,p[f*2+1]=w}return{length:h,data:[p],bits:l}}return{length:c.length>0?c[0].length/2:0,data:c,bits:l}}function wa(){const[e,t]=o.useState("hh:mm:ss.uuu");return{timeFormat:e,setTimeFormat:t,formatTime:r=>mt(r,e),parseTime:r=>fa(r,e)}}const ss=[256,512,1024,2048,4096,8192];function ya({initialSamplesPerPixel:e,zoomLevels:t=ss}){const[n,a]=o.useState(()=>{const u=t.indexOf(e);return u!==-1?u:Math.floor(t.length/2)}),r=t[n],s=n>0,i=n<t.length-1,l=o.useCallback(()=>{o.startTransition(()=>{a(u=>Math.max(0,u-1))})},[]),c=o.useCallback(()=>{o.startTransition(()=>{a(u=>Math.min(t.length-1,u+1))})},[t.length]);return{samplesPerPixel:r,zoomIn:l,zoomOut:c,canZoomIn:s,canZoomOut:i}}function xa({playoutRef:e,initialVolume:t=1,onVolumeChange:n}){const[a,r]=o.useState(t),s=o.useCallback(i=>{r(i),e.current&&e.current.setMasterGain(i),n?.(i)},[e,n]);return{masterVolume:a,setMasterVolume:s}}const is=(e=256)=>{const t=o.useRef(null),n=o.useCallback((a,r,s)=>{const i=new Z.Analyser("fft",e);return a.connect(i),a.connect(r),t.current=i,function(){i.dispose(),t.current=null}},[e]);return{analyserRef:t,masterEffects:n}};function ls(e,t={}){const{progressive:n=!1}=t,[a,r]=o.useState([]),[s,i]=o.useState(!0),[l,c]=o.useState(null),[u,m]=o.useState(0),h=e.length;return o.useEffect(()=>{if(e.length===0){r([]),i(!1),m(0);return}let p=!1;const f=new AbortController,b=new Map,w=(d,x,y)=>{const C=y??d.audioBuffer;if(!C&&!d.waveformData)throw new Error(`Track ${x+1}: Must provide src, audioBuffer, or waveformData`);const k=C?.duration??d.waveformData?.duration,S=Gn({audioBuffer:C,startTime:d.startTime??0,duration:d.duration??k,offset:d.offset??0,name:d.name||`Track ${x+1}`,fadeIn:d.fadeIn,fadeOut:d.fadeOut,waveformData:d.waveformData});if(isNaN(S.startSample)||isNaN(S.durationSamples)||isNaN(S.offsetSamples))throw console.error("Invalid clip values:",S),new Error(`Invalid clip values for track ${x+1}`);return{...Nn({name:d.name||`Track ${x+1}`,clips:[S],muted:d.muted??!1,soloed:d.soloed??!1,volume:d.volume??1,pan:d.pan??0,color:d.color}),effects:d.effects,renderMode:d.renderMode,spectrogramConfig:d.spectrogramConfig,spectrogramColorMap:d.spectrogramColorMap}};return(async()=>{try{i(!0),c(null),m(0);const d=On.getContext().rawContext,x=e.map(async(C,k)=>{if(C.audioBuffer){const _=w(C,k,C.audioBuffer);return n&&!p&&(b.set(k,_),m(I=>I+1),r(Array.from({length:e.length},(I,B)=>b.get(B)).filter(I=>I!==void 0))),_}if(!C.src&&C.waveformData){const _=w(C,k);return n&&!p&&(b.set(k,_),m(I=>I+1),r(Array.from({length:e.length},(I,B)=>b.get(B)).filter(I=>I!==void 0))),_}if(!C.src)throw new Error(`Track ${k+1}: Must provide src, audioBuffer, or waveformData`);const S=await fetch(C.src,{signal:f.signal});if(!S.ok)throw new Error(`Failed to fetch ${C.src}: ${S.statusText}`);const M=await S.arrayBuffer(),A=await d.decodeAudioData(M);if(!A||!A.sampleRate||!A.duration)throw new Error(`Invalid audio buffer for ${C.src}`);const E=w(C,k,A);return n&&!p&&(b.set(k,E),m(_=>_+1),r(Array.from({length:e.length},(_,I)=>b.get(I)).filter(_=>_!==void 0))),E}),y=await Promise.all(x);p||(n||(r(y),m(y.length)),i(!1))}catch(d){if(!p){const x=d instanceof Error?d.message:"Unknown error loading audio";c(x),i(!1),console.error("Error loading audio tracks:",d)}}})(),()=>{p=!0,f.abort()}},[e,n]),{tracks:a,loading:s,error:l,loadedCount:u,totalCount:h}}function cs({tracks:e,onTracksChange:t,samplesPerPixel:n,sampleRate:a}){const r=o.useRef(null),s=o.useCallback(u=>{const{transform:m,active:h}=u;if(!h?.data?.current)return{...m,scaleX:1,scaleY:1};const{trackIndex:p,clipIndex:f,boundary:b}=h.data.current;if(b)return{...m,scaleX:1,scaleY:1};const w=e[p];if(!w)return{...m,scaleX:1,scaleY:1};const g=w.clips[f];if(!g)return{...m,scaleX:1,scaleY:1};const d=g.startSample/a,x=g.durationSamples/a,y=m.x*n/a;let C=d+y;const k=[...w.clips].sort((I,B)=>I.startSample-B.startSample),S=k.findIndex(I=>I===g);C=Math.max(0,C);const M=S>0?k[S-1]:null;if(M){const I=(M.startSample+M.durationSamples)/a;C=Math.max(C,I)}const A=S<k.length-1?k[S+1]:null;if(A){const I=C+x,B=A.startSample/a;I>B&&(C=B-x)}const _=(C-d)*a/n;return{...m,x:_,scaleX:1,scaleY:1}},[e,n,a]),i=o.useCallback(u=>{const{active:m}=u,{boundary:h}=m.data.current;if(!h){r.current=null;return}const{trackIndex:p,clipIndex:f}=m.data.current,w=e[p]?.clips[f];w&&(r.current={offsetSamples:w.offsetSamples,durationSamples:w.durationSamples,startSample:w.startSample})},[e]),l=o.useCallback(u=>{const{active:m,delta:h}=u,{boundary:p}=m.data.current;if(!p||!r.current)return;const{trackIndex:f,clipIndex:b}=m.data.current,w=h.x*n,g=Math.floor(.1*a),d=r.current,x=e.map((y,C)=>{if(C!==f)return y;const k=[...y.clips].sort((A,E)=>A.startSample-E.startSample),S=k.findIndex(A=>A===y.clips[b]),M=y.clips.map((A,E)=>{if(E!==b)return A;const _=A.sourceDurationSamples;if(p==="left"){let I=Math.floor(w);const B=-d.startSample;I<B&&(I=B);const $=-d.offsetSamples;I<$&&(I=$);const W=S>0?k[S-1]:null;if(W){const ae=W.startSample+W.durationSamples-d.startSample;I<ae&&(I=ae)}const z=d.durationSamples-g;I>z&&(I=z);const Y=d.offsetSamples+I,j=d.durationSamples-I,N=d.startSample+I;return{...A,offsetSamples:Y,durationSamples:j,startSample:N}}else{let I=Math.floor(d.durationSamples+w);I=Math.max(g,I),d.offsetSamples+I>_&&(I=_-d.offsetSamples);const B=S<k.length-1?k[S+1]:null;return B&&d.startSample+I>B.startSample&&(I=B.startSample-d.startSample,I=Math.max(g,I)),{...A,durationSamples:I}}});return{...y,clips:M}});t(x)},[e,t,n,a]),c=o.useCallback(u=>{const{active:m,delta:h}=u,{trackIndex:p,clipIndex:f,boundary:b}=m.data.current,w=h.x*n;if(b){r.current=null;return}const g=e.map((d,x)=>{if(x!==p)return d;const y=[...d.clips].sort((S,M)=>S.startSample-M.startSample),C=y.findIndex(S=>S===d.clips[f]),k=d.clips.map((S,M)=>{if(M!==f)return S;let A=Math.floor(S.startSample+w);A=Math.max(0,A);const E=C>0?y[C-1]:null;if(E){const I=E.startSample+E.durationSamples;A=Math.max(A,I)}const _=C<y.length-1?y[C+1]:null;return _&&A+S.durationSamples>_.startSample&&(A=_.startSample-S.durationSamples),{...S,startSample:A}});return{...d,clips:k}});t(g)},[e,t,n]);return{onDragStart:i,onDragMove:l,onDragEnd:c,collisionModifier:s}}const Ht=.01;function ka({annotations:e,onAnnotationsChange:t,samplesPerPixel:n,sampleRate:a,duration:r,linkEndpoints:s}){const i=o.useRef(null),l=o.useCallback(m=>{const{active:h}=m,p=h.data.current;if(!p||p.annotationIndex===void 0){i.current=null;return}const f=e[p.annotationIndex];f&&(i.current={start:f.start,end:f.end,annotationIndex:p.annotationIndex})},[e]),c=o.useCallback(m=>{const{active:h,delta:p}=m;if(!i.current)return;const f=h.data.current;if(!f)return;const{edge:b,annotationIndex:w}=f,g=i.current,d=p.x*n/a,x=b==="start"?g.start+d:g.end+d,y=us({annotationIndex:w,newTime:x,isDraggingStart:b==="start",annotations:e,duration:r,linkEndpoints:s});t(y)},[e,t,n,a,r,s]),u=o.useCallback(()=>{i.current=null},[]);return{onDragStart:l,onDragMove:c,onDragEnd:u}}function us({annotationIndex:e,newTime:t,isDraggingStart:n,annotations:a,duration:r,linkEndpoints:s}){const i=[...a],l=a[e];if(n){const c=Math.min(l.end-.1,Math.max(0,t)),u=c-l.start;if(i[e]={...l,start:c},s&&e>0){const m=i[e-1];Math.abs(m.end-l.start)<Ht?i[e-1]={...m,end:Math.max(m.start+.1,m.end+u)}:c<=m.end&&(i[e]={...i[e],start:m.end})}else!s&&e>0&&c<i[e-1].end&&(i[e-1]={...i[e-1],end:c})}else{const c=Math.max(l.start+.1,Math.min(t,r)),u=c-l.end;if(i[e]={...l,end:c},s&&e<i.length-1){const m=i[e+1];if(Math.abs(m.start-l.end)<Ht){const h=m.start+u;i[e+1]={...m,start:Math.min(m.end-.1,h)};let p=e+1;for(;p<i.length-1;){const f=i[p],b=i[p+1];if(Math.abs(b.start-f.end)<Ht){const w=f.end-a[p].end;i[p+1]={...b,start:Math.min(b.end-.1,b.start+w)},p++}else break}}else c>=m.start&&(i[e]={...i[e],end:m.start})}else if(!s&&e<i.length-1&&c>i[e+1].start){const m=i[e+1];i[e+1]={...m,start:c};let h=e+1;for(;h<i.length-1;){const p=i[h],f=i[h+1];if(p.end>f.start)i[h+1]={...f,start:p.end},h++;else break}}}return i}function ds(e={}){const{touchOptimized:t=!1,touchDelay:n=250,touchTolerance:a=5,mouseDistance:r=1}=e,s=Ke.useSensor(Ke.MouseSensor,{activationConstraint:{distance:r}}),i=Ke.useSensor(Ke.TouchSensor,{activationConstraint:t?{delay:n,tolerance:a}:{distance:r}}),l=Ke.useSensor(Ke.PointerSensor,{activationConstraint:{distance:r}});return Ke.useSensors(...t?[s,i]:[l])}const fs=e=>{const{tracks:t,onTracksChange:n,sampleRate:a}=e,{currentTimeRef:r}=Re(),{selectedTrackId:s}=De(),i=o.useCallback((c,u,m)=>{const{sampleRate:h,samplesPerPixel:p}=e,f=t[c];if(!f)return!1;const b=f.clips[u];if(!b)return!1;const w=b.startSample/h,g=(b.startSample+b.durationSamples)/h;if(m<=w||m>=g)return console.warn("Split time is outside clip bounds"),!1;const d=Math.round(m*h),x=Math.floor(d/p),y=b.startSample+b.durationSamples,C=x*p,k=b.startSample,S=C-k,M=C,A=y-M,E=C-b.startSample,_=Gt({audioBuffer:b.audioBuffer,startSample:k,durationSamples:S,offsetSamples:b.offsetSamples,sampleRate:b.sampleRate,sourceDurationSamples:b.sourceDurationSamples,gain:b.gain,name:b.name?`${b.name} (1)`:void 0,color:b.color,fadeIn:b.fadeIn,waveformData:b.waveformData}),I=Gt({audioBuffer:b.audioBuffer,startSample:M,durationSamples:A,offsetSamples:b.offsetSamples+E,sampleRate:b.sampleRate,sourceDurationSamples:b.sourceDurationSamples,gain:b.gain,name:b.name?`${b.name} (2)`:void 0,color:b.color,waveformData:b.waveformData,fadeOut:b.fadeOut}),B=[...f.clips];B.splice(u,1,_,I);const $=[...t];return $[c]={...f,clips:B},n($),!0},[t,n,e]);return{splitClipAtPlayhead:o.useCallback(()=>{if(!s)return console.log("No track selected - click a clip to select a track first"),!1;const c=t.findIndex(h=>h.id===s);if(c===-1)return console.warn("Selected track not found"),!1;const u=t[c],m=r.current??0;for(let h=0;h<u.clips.length;h++){const p=u.clips[h],f=p.startSample/a,b=(p.startSample+p.durationSamples)/a;if(m>f&&m<b)return console.log(`Splitting clip on track "${u.name}" at ${m}s`),i(c,h,m)}return console.log(`No clip found at playhead position on track "${u.name}"`),!1},[t,r,s,i,a]),splitClipAt:i}},Dt=e=>{const{shortcuts:t,enabled:n=!0}=e,a=o.useCallback(r=>{if(!n)return;const s=r.target;if(s.tagName==="INPUT"||s.tagName==="TEXTAREA"||s.isContentEditable)return;const i=t.find(l=>{const c=r.key.toLowerCase()===l.key.toLowerCase()||r.key===l.key,u=l.ctrlKey===void 0||r.ctrlKey===l.ctrlKey,m=l.shiftKey===void 0||r.shiftKey===l.shiftKey,h=l.metaKey===void 0||r.metaKey===l.metaKey,p=l.altKey===void 0||r.altKey===l.altKey;return c&&u&&m&&h&&p});i&&(i.preventDefault!==!1&&r.preventDefault(),i.action())},[t,n]);o.useEffect(()=>{if(n)return window.addEventListener("keydown",a),()=>{window.removeEventListener("keydown",a)}},[a,n])},ms=e=>{const t=[],n=typeof navigator<"u"&&navigator.platform.includes("Mac");return e.metaKey&&t.push(n?"Cmd":"Ctrl"),e.ctrlKey&&!e.metaKey&&t.push("Ctrl"),e.altKey&&t.push(n?"Option":"Alt"),e.shiftKey&&t.push("Shift"),t.push(e.key.toUpperCase()),t.join("+")},hs=(e={})=>{const{enabled:t=!0,additionalShortcuts:n=[],shortcuts:a}=e,{isPlaying:r}=Re(),{setCurrentTime:s,play:i,pause:l,stop:c}=be(),{playoutRef:u}=Me(),m=o.useCallback(()=>{r?l():i()},[r,i,l]),h=o.useCallback(()=>{c()},[c]),p=o.useCallback(()=>{r&&u.current?(u.current.stop(),s(0),i(0)):s(0)},[r,u,s,i]),b=a??[...[{key:" ",action:m,description:"Play/Pause",preventDefault:!0},{key:"Escape",action:h,description:"Stop",preventDefault:!0},{key:"0",action:p,description:"Rewind to start",preventDefault:!0}],...n];return Dt({shortcuts:b,enabled:t}),{rewindToStart:p,togglePlayPause:m,stopPlayback:h,shortcuts:b}},Xt=.01,_t=.01;function ps({annotations:e,activeAnnotationId:t,onAnnotationsChange:n,onActiveAnnotationChange:a,duration:r,linkEndpoints:s,continuousPlay:i=!1,enabled:l=!0,scrollContainerRef:c,samplesPerPixel:u,sampleRate:m,controlsWidth:h=0,onPlay:p}){const f=o.useMemo(()=>t?e.findIndex(E=>E.id===t):-1,[e,t]),b=o.useCallback(E=>{if(!c?.current||!u||!m)return;const _=e.find(L=>L.id===E);if(!_)return;const I=c.current,B=I.clientWidth,$=_.start*m/u+h,W=_.end*m/u+h,z=($+W)/2,Y=I.scrollLeft,j=Y,N=Y+B;if($<j||W>N){const L=Math.max(0,z-B/2);I.scrollTo({left:L,behavior:"smooth"})}},[e,c,u,m,h]);o.useEffect(()=>{t&&c?.current&&u&&m&&b(t)},[t,b,c,u,m]);const w=o.useCallback(E=>{if(f<0)return;const _=e[f],I=Math.max(0,Math.min(_.end-.1,_.start+E)),B=I-_.start,$=[...e];if($[f]={..._,start:I},s&&f>0){const W=$[f-1];Math.abs(W.end-_.start)<Xt&&($[f-1]={...W,end:Math.max(W.start+.1,W.end+B)})}else if(!s&&f>0){const W=$[f-1];I<W.end&&($[f-1]={...W,end:I})}n($)},[e,f,s,n]),g=o.useCallback(E=>{if(f<0)return;const _=e[f],I=Math.max(_.start+.1,Math.min(r,_.end+E)),B=I-_.end,$=[...e];if($[f]={..._,end:I},s&&f<e.length-1){const W=$[f+1];if(Math.abs(W.start-_.end)<Xt){const z=Math.min(W.end-.1,W.start+B);$[f+1]={...W,start:z};let Y=f+1;for(;Y<$.length-1;){const j=$[Y],N=$[Y+1];if(Math.abs(N.start-e[Y].end)<Xt){const L=j.end-e[Y].end;$[Y+1]={...N,start:Math.min(N.end-.1,N.start+L)},Y++}else break}}}else if(!s&&f<e.length-1){const W=$[f+1];if(I>W.start){$[f+1]={...W,start:I};let z=f+1;for(;z<$.length-1;){const Y=$[z],j=$[z+1];if(Y.end>j.start)$[z+1]={...j,start:Y.end},z++;else break}}}n($)},[e,f,r,s,n]),d=o.useCallback(()=>{!a||e.length===0||(f<=0?a(e[e.length-1].id):a(e[f-1].id))},[e,f,a]),x=o.useCallback(()=>{!a||e.length===0||(f<0||f>=e.length-1?a(e[0].id):a(e[f+1].id))},[e,f,a]),y=o.useCallback(()=>{!a||e.length===0||a(e[0].id)},[e,a]),C=o.useCallback(()=>{!a||e.length===0||a(e[e.length-1].id)},[e,a]),k=o.useCallback(()=>{a&&a(null)},[a]),S=o.useCallback(()=>{if(f<0||!p)return;const E=e[f],_=i?void 0:E.end-E.start;p(E.start,_)},[e,f,i,p]),M=o.useMemo(()=>[{key:"[",action:()=>w(-_t),description:"Move annotation start earlier",preventDefault:!0},{key:"]",action:()=>w(_t),description:"Move annotation start later",preventDefault:!0},{key:"{",shiftKey:!0,action:()=>g(-_t),description:"Move annotation end earlier",preventDefault:!0},{key:"}",shiftKey:!0,action:()=>g(_t),description:"Move annotation end later",preventDefault:!0},{key:"Enter",action:S,description:"Play selected annotation",preventDefault:!0}],[w,g,S]),A=o.useMemo(()=>[{key:"ArrowUp",action:d,description:"Select previous annotation",preventDefault:!0},{key:"ArrowLeft",action:d,description:"Select previous annotation",preventDefault:!0},{key:"ArrowDown",action:x,description:"Select next annotation",preventDefault:!0},{key:"ArrowRight",action:x,description:"Select next annotation",preventDefault:!0},{key:"Home",action:y,description:"Select first annotation",preventDefault:!0},{key:"End",action:C,description:"Select last annotation",preventDefault:!0},{key:"Escape",action:k,description:"Deselect annotation",preventDefault:!0}],[d,x,y,C,k]);return Dt({shortcuts:M,enabled:l&&f>=0}),Dt({shortcuts:A,enabled:l&&e.length>0&&!!a}),{moveStartBoundary:w,moveEndBoundary:g,selectPrevious:d,selectNext:x,selectFirst:y,selectLast:C,clearSelection:k,scrollToAnnotation:b,playActiveAnnotation:S}}const yt=[{id:"reverb",name:"Reverb",category:"reverb",description:"Simple convolution reverb with adjustable decay time",parameters:[{name:"decay",label:"Decay",type:"number",min:.1,max:10,step:.1,default:1.5,unit:"s"},{name:"wet",label:"Mix",type:"number",min:0,max:1,step:.01,default:.5}]},{id:"freeverb",name:"Freeverb",category:"reverb",description:"Classic Schroeder/Moorer reverb with room size and dampening",parameters:[{name:"roomSize",label:"Room Size",type:"number",min:0,max:1,step:.01,default:.7},{name:"dampening",label:"Dampening",type:"number",min:0,max:1e4,step:100,default:3e3,unit:"Hz"},{name:"wet",label:"Mix",type:"number",min:0,max:1,step:.01,default:.5}]},{id:"jcReverb",name:"JC Reverb",category:"reverb",description:"Attempt at Roland JC-120 chorus reverb emulation",parameters:[{name:"roomSize",label:"Room Size",type:"number",min:0,max:1,step:.01,default:.5},{name:"wet",label:"Mix",type:"number",min:0,max:1,step:.01,default:.5}]},{id:"feedbackDelay",name:"Feedback Delay",category:"delay",description:"Delay line with feedback for echo effects",parameters:[{name:"delayTime",label:"Delay Time",type:"number",min:0,max:1,step:.01,default:.25,unit:"s"},{name:"feedback",label:"Feedback",type:"number",min:0,max:.95,step:.01,default:.5},{name:"wet",label:"Mix",type:"number",min:0,max:1,step:.01,default:.5}]},{id:"pingPongDelay",name:"Ping Pong Delay",category:"delay",description:"Stereo delay bouncing between left and right channels",parameters:[{name:"delayTime",label:"Delay Time",type:"number",min:0,max:1,step:.01,default:.25,unit:"s"},{name:"feedback",label:"Feedback",type:"number",min:0,max:.95,step:.01,default:.5},{name:"wet",label:"Mix",type:"number",min:0,max:1,step:.01,default:.5}]},{id:"chorus",name:"Chorus",category:"modulation",description:"Creates thickness by layering detuned copies of the signal",parameters:[{name:"frequency",label:"Rate",type:"number",min:.1,max:10,step:.1,default:1.5,unit:"Hz"},{name:"delayTime",label:"Delay",type:"number",min:0,max:20,step:.5,default:3.5,unit:"ms"},{name:"depth",label:"Depth",type:"number",min:0,max:1,step:.01,default:.7},{name:"wet",label:"Mix",type:"number",min:0,max:1,step:.01,default:.5}]},{id:"phaser",name:"Phaser",category:"modulation",description:"Classic phaser effect using allpass filters",parameters:[{name:"frequency",label:"Rate",type:"number",min:.1,max:10,step:.1,default:.5,unit:"Hz"},{name:"octaves",label:"Octaves",type:"number",min:1,max:6,step:1,default:3},{name:"baseFrequency",label:"Base Freq",type:"number",min:100,max:2e3,step:10,default:350,unit:"Hz"},{name:"wet",label:"Mix",type:"number",min:0,max:1,step:.01,default:.5}]},{id:"tremolo",name:"Tremolo",category:"modulation",description:"Rhythmic volume modulation",parameters:[{name:"frequency",label:"Rate",type:"number",min:.1,max:20,step:.1,default:4,unit:"Hz"},{name:"depth",label:"Depth",type:"number",min:0,max:1,step:.01,default:.5},{name:"wet",label:"Mix",type:"number",min:0,max:1,step:.01,default:1}]},{id:"vibrato",name:"Vibrato",category:"modulation",description:"Pitch modulation effect",parameters:[{name:"frequency",label:"Rate",type:"number",min:.1,max:20,step:.1,default:5,unit:"Hz"},{name:"depth",label:"Depth",type:"number",min:0,max:1,step:.01,default:.1},{name:"wet",label:"Mix",type:"number",min:0,max:1,step:.01,default:1}]},{id:"autoPanner",name:"Auto Panner",category:"modulation",description:"Automatic left-right panning",parameters:[{name:"frequency",label:"Rate",type:"number",min:.1,max:10,step:.1,default:1,unit:"Hz"},{name:"depth",label:"Depth",type:"number",min:0,max:1,step:.01,default:1},{name:"wet",label:"Mix",type:"number",min:0,max:1,step:.01,default:1}]},{id:"autoFilter",name:"Auto Filter",category:"filter",description:"Automated filter sweep with LFO",parameters:[{name:"frequency",label:"Rate",type:"number",min:.1,max:10,step:.1,default:1,unit:"Hz"},{name:"baseFrequency",label:"Base Freq",type:"number",min:20,max:2e3,step:10,default:200,unit:"Hz"},{name:"octaves",label:"Octaves",type:"number",min:.5,max:8,step:.5,default:2.6},{name:"depth",label:"Depth",type:"number",min:0,max:1,step:.01,default:1},{name:"wet",label:"Mix",type:"number",min:0,max:1,step:.01,default:1}]},{id:"autoWah",name:"Auto Wah",category:"filter",description:"Envelope follower filter effect",parameters:[{name:"baseFrequency",label:"Base Freq",type:"number",min:20,max:500,step:10,default:100,unit:"Hz"},{name:"octaves",label:"Octaves",type:"number",min:1,max:8,step:1,default:6},{name:"sensitivity",label:"Sensitivity",type:"number",min:-40,max:0,step:1,default:0,unit:"dB"},{name:"wet",label:"Mix",type:"number",min:0,max:1,step:.01,default:1}]},{id:"eq3",name:"3-Band EQ",category:"filter",description:"Three band equalizer with low, mid, and high controls",parameters:[{name:"low",label:"Low",type:"number",min:-24,max:24,step:.5,default:0,unit:"dB"},{name:"mid",label:"Mid",type:"number",min:-24,max:24,step:.5,default:0,unit:"dB"},{name:"high",label:"High",type:"number",min:-24,max:24,step:.5,default:0,unit:"dB"},{name:"lowFrequency",label:"Low Freq",type:"number",min:20,max:500,step:10,default:400,unit:"Hz"},{name:"highFrequency",label:"High Freq",type:"number",min:1e3,max:1e4,step:100,default:2500,unit:"Hz"}]},{id:"distortion",name:"Distortion",category:"distortion",description:"Wave shaping distortion effect",parameters:[{name:"distortion",label:"Drive",type:"number",min:0,max:1,step:.01,default:.4},{name:"wet",label:"Mix",type:"number",min:0,max:1,step:.01,default:1}]},{id:"bitCrusher",name:"Bit Crusher",category:"distortion",description:"Reduces bit depth for lo-fi digital texture",parameters:[{name:"bits",label:"Bits",type:"number",min:1,max:16,step:1,default:4},{name:"wet",label:"Mix",type:"number",min:0,max:1,step:.01,default:1}]},{id:"chebyshev",name:"Chebyshev",category:"distortion",description:"Waveshaping distortion using Chebyshev polynomials",parameters:[{name:"order",label:"Order",type:"number",min:1,max:100,step:1,default:50},{name:"wet",label:"Mix",type:"number",min:0,max:1,step:.01,default:1}]},{id:"compressor",name:"Compressor",category:"dynamics",description:"Dynamic range compressor",parameters:[{name:"threshold",label:"Threshold",type:"number",min:-60,max:0,step:1,default:-24,unit:"dB"},{name:"ratio",label:"Ratio",type:"number",min:1,max:20,step:.5,default:4},{name:"attack",label:"Attack",type:"number",min:0,max:1,step:.001,default:.003,unit:"s"},{name:"release",label:"Release",type:"number",min:0,max:1,step:.01,default:.25,unit:"s"},{name:"knee",label:"Knee",type:"number",min:0,max:40,step:1,default:30,unit:"dB"}]},{id:"limiter",name:"Limiter",category:"dynamics",description:"Hard limiter to prevent clipping",parameters:[{name:"threshold",label:"Threshold",type:"number",min:-12,max:0,step:.5,default:-6,unit:"dB"}]},{id:"gate",name:"Gate",category:"dynamics",description:"Noise gate to silence signal below threshold",parameters:[{name:"threshold",label:"Threshold",type:"number",min:-100,max:0,step:1,default:-40,unit:"dB"},{name:"attack",label:"Attack",type:"number",min:0,max:.3,step:.001,default:.001,unit:"s"},{name:"release",label:"Release",type:"number",min:0,max:.5,step:.01,default:.1,unit:"s"}]},{id:"stereoWidener",name:"Stereo Widener",category:"spatial",description:"Expands or narrows the stereo image",parameters:[{name:"width",label:"Width",type:"number",min:0,max:1,step:.01,default:.5}]}],an=e=>yt.find(t=>t.id===e),gs=e=>yt.filter(t=>t.category===e),bs=[{id:"reverb",name:"Reverb"},{id:"delay",name:"Delay"},{id:"modulation",name:"Modulation"},{id:"filter",name:"Filter"},{id:"distortion",name:"Distortion"},{id:"dynamics",name:"Dynamics"},{id:"spatial",name:"Spatial"}];const vs={reverb:Z.Reverb,freeverb:Z.Freeverb,jcReverb:Z.JCReverb,feedbackDelay:Z.FeedbackDelay,pingPongDelay:Z.PingPongDelay,chorus:Z.Chorus,phaser:Z.Phaser,tremolo:Z.Tremolo,vibrato:Z.Vibrato,autoPanner:Z.AutoPanner,autoFilter:Z.AutoFilter,autoWah:Z.AutoWah,eq3:Z.EQ3,distortion:Z.Distortion,bitCrusher:Z.BitCrusher,chebyshev:Z.Chebyshev,compressor:Z.Compressor,limiter:Z.Limiter,gate:Z.Gate,stereoWidener:Z.StereoWidener};let Cs=0;const ws=()=>`effect_${Date.now()}_${++Cs}`;function bt(e,t){const n=vs[e.id];if(!n)throw new Error(`Unknown effect type: ${e.id}`);const a={};e.parameters.forEach(l=>{const c=t?.[l.name]??l.default;a[l.name]=c});const r=new n(a),s=ws(),i=r;return{effect:r,id:e.id,instanceId:s,dispose(){try{r.disconnect(),r.dispose()}catch(l){console.warn(`[waveform-playlist] Error disposing effect "${e.id}" (${s}):`,l)}},setParameter(l,c){const u=i[l];if(l==="wet"){const m=i.wet;if(m&&typeof m=="object"&&"value"in m){m.value=c;return}}u!==void 0&&(u&&typeof u=="object"&&"value"in u?u.value=c:i[l]=c)},getParameter(l){if(l==="wet"){const u=i.wet;if(u&&typeof u=="object"&&"value"in u)return u.value}const c=i[l];if(c!==void 0)return c&&typeof c=="object"&&"value"in c?c.value:c},connect(l){r.connect(l)},disconnect(){try{r.disconnect()}catch(l){console.warn(`[waveform-playlist] Error disconnecting effect "${e.id}" (${s}):`,l)}}}}function ys(e){if(e.length===0)throw new Error("Cannot create effect chain with no effects");for(let t=0;t<e.length-1;t++)e[t].effect.connect(e[t+1].effect);return{input:e[0].effect,output:e[e.length-1].effect,dispose(){e.forEach(t=>t.dispose())}}}function xs(e=256){const[t,n]=o.useState([]),a=o.useRef(t);a.current=t;const r=o.useRef(new Map),s=o.useRef(null),i=o.useRef(null),l=o.useCallback(g=>{const d=i.current;if(!d)return;const{masterGainNode:x,destination:y,analyserNode:C}=d;try{x.disconnect()}catch(S){console.warn("[waveform-playlist] Error disconnecting master effects chain:",S)}const k=g.map(S=>r.current.get(S.instanceId)).filter(S=>S!==void 0);if(k.length===0)x.connect(C),C.connect(y);else{let S=x;k.forEach(M=>{try{M.disconnect()}catch(A){console.warn(`[waveform-playlist] Error disconnecting effect "${M.id}":`,A)}S.connect(M.effect),S=M.effect}),S.connect(C),C.connect(y)}},[]),c=o.useCallback(g=>{const d=an(g);if(!d){console.error(`Unknown effect: ${g}`);return}const x={};d.parameters.forEach(k=>{x[k.name]=k.default});const y=bt(d,x);r.current.set(y.instanceId,y);const C={instanceId:y.instanceId,effectId:d.id,definition:d,params:x,bypassed:!1};n(k=>[...k,C])},[]),u=o.useCallback(g=>{const d=r.current.get(g);d&&(d.dispose(),r.current.delete(g)),n(x=>x.filter(y=>y.instanceId!==g))},[]),m=o.useCallback((g,d,x)=>{const y=r.current.get(g);y&&y.setParameter(d,x),n(C=>C.map(k=>k.instanceId===g?{...k,params:{...k.params,[d]:x}}:k))},[]),h=o.useCallback(g=>{const d=a.current.find(C=>C.instanceId===g);if(!d)return;const x=!d.bypassed,y=r.current.get(g);if(y){const C=d.params.wet??1;y.setParameter("wet",x?0:C)}n(C=>C.map(k=>k.instanceId===g?{...k,bypassed:x}:k))},[]),p=o.useCallback((g,d)=>{n(x=>{const y=[...x],[C]=y.splice(g,1);return y.splice(d,0,C),y})},[]),f=o.useCallback(()=>{r.current.forEach(g=>g.dispose()),r.current.clear(),n([])},[]);o.useEffect(()=>{l(t)},[t,l]);const b=o.useCallback((g,d,x)=>{const y=new Z.Analyser("fft",e);s.current=y,i.current={masterGainNode:g,destination:d,analyserNode:y};const k=a.current.map(S=>r.current.get(S.instanceId)).filter(S=>S!==void 0);if(k.length===0)g.connect(y),y.connect(d);else{let S=g;k.forEach(M=>{S.connect(M.effect),S=M.effect}),S.connect(y),y.connect(d)}return function(){y.dispose(),s.current=null,i.current=null}},[e]);o.useEffect(()=>{const g=r.current;return()=>{g.forEach(d=>d.dispose()),g.clear()}},[]);const w=o.useCallback(()=>{const g=t.filter(d=>!d.bypassed);if(g.length!==0)return(d,x,y)=>{const C=[];for(const k of g){const S=bt(k.definition,k.params);C.push(S)}if(C.length===0)d.connect(x);else{let k=d;C.forEach(S=>{k.connect(S.effect),k=S.effect}),k.connect(x)}return function(){C.forEach(S=>S.dispose())}}},[t]);return{activeEffects:t,availableEffects:yt,addEffect:c,removeEffect:u,updateParameter:m,toggleBypass:h,reorderEffects:p,clearAllEffects:f,masterEffects:b,createOfflineEffectsFunction:w,analyserRef:s}}function ks(){const[e,t]=o.useState(new Map),n=o.useRef(new Map),a=o.useRef(new Map),r=o.useCallback((f,b)=>{const w=a.current.get(f);if(!w)return;const{graphEnd:g,masterGainNode:d}=w,x=n.current.get(f);try{g.disconnect()}catch(C){console.warn(`[waveform-playlist] Error disconnecting track "${f}" effect chain:`,C)}const y=b.map(C=>x?.get(C.instanceId)).filter(C=>C!==void 0);if(y.length===0)g.connect(d);else{let C=g;y.forEach(k=>{try{k.disconnect()}catch(S){console.warn(`[waveform-playlist] Error disconnecting effect "${k.id}" on track "${f}":`,S)}C.connect(k.effect),C=k.effect}),C.connect(d)}},[]),s=o.useCallback((f,b)=>{const w=an(b);if(!w){console.error(`Unknown effect: ${b}`);return}const g={};w.parameters.forEach(y=>{g[y.name]=y.default});const d=bt(w,g);n.current.has(f)||n.current.set(f,new Map),n.current.get(f).set(d.instanceId,d);const x={instanceId:d.instanceId,effectId:w.id,definition:w,params:g,bypassed:!1};t(y=>{const C=new Map(y),k=C.get(f)||[];return C.set(f,[...k,x]),C})},[]),i=o.useCallback((f,b)=>{const w=n.current.get(f),g=w?.get(b);g&&(g.dispose(),w?.delete(b)),t(d=>{const x=new Map(d),y=x.get(f)||[];return x.set(f,y.filter(C=>C.instanceId!==b)),x})},[]),l=o.useCallback((f,b,w,g)=>{const x=n.current.get(f)?.get(b);x&&x.setParameter(w,g),t(y=>{const C=new Map(y),k=C.get(f)||[];return C.set(f,k.map(S=>S.instanceId===b?{...S,params:{...S.params,[w]:g}}:S)),C})},[]),c=o.useCallback((f,b)=>{const g=(m.current.get(f)||[]).find(C=>C.instanceId===b);if(!g)return;const d=!g.bypassed,y=n.current.get(f)?.get(b);if(y){const C=g.params.wet??1;y.setParameter("wet",d?0:C)}t(C=>{const k=new Map(C),S=k.get(f)||[];return k.set(f,S.map(M=>M.instanceId===b?{...M,bypassed:d}:M)),k})},[]),u=o.useCallback(f=>{const b=n.current.get(f);b&&(b.forEach(w=>w.dispose()),b.clear()),t(w=>{const g=new Map(w);return g.set(f,[]),g})},[]),m=o.useRef(e);m.current=e;const h=o.useCallback(f=>(b,w,g)=>{a.current.set(f,{graphEnd:b,masterGainNode:w});const d=m.current.get(f)||[],x=n.current.get(f),y=d.map(C=>x?.get(C.instanceId)).filter(C=>C!==void 0);if(y.length===0)b.connect(w);else{let C=b;y.forEach(k=>{C.connect(k.effect),C=k.effect}),C.connect(w)}return function(){a.current.delete(f)}},[]);o.useEffect(()=>{e.forEach((f,b)=>{r(b,f)})},[e,r]),o.useEffect(()=>{const f=n.current;return()=>{f.forEach(b=>{b.forEach(w=>w.dispose()),b.clear()}),f.clear()}},[]);const p=o.useCallback(f=>{const w=(e.get(f)||[]).filter(g=>!g.bypassed);if(w.length!==0)return(g,d,x)=>{const y=[];for(const C of w){const k=bt(C.definition,C.params);y.push(k)}if(y.length===0)g.connect(d);else{let C=g;y.forEach(k=>{C.connect(k.effect),C=k.effect}),C.connect(d)}return function(){y.forEach(k=>k.dispose())}}},[e]);return{trackEffectsState:e,addEffectToTrack:s,removeEffectFromTrack:i,updateTrackEffectParameter:l,toggleBypass:c,clearTrackEffects:u,getTrackEffectsFunction:h,createOfflineTrackEffectsFunction:p,availableEffects:yt}}function Ss(e,t={}){const{bitDepth:n=16}=t,a=e.numberOfChannels,r=e.sampleRate,s=e.length,i=n/8,l=a*i,c=r*l,u=s*l,m=44,h=m+u,p=new ArrayBuffer(h),f=new DataView(p);Et(f,0,"RIFF"),f.setUint32(4,h-8,!0),Et(f,8,"WAVE"),Et(f,12,"fmt "),f.setUint32(16,16,!0),f.setUint16(20,n===32?3:1,!0),f.setUint16(22,a,!0),f.setUint32(24,r,!0),f.setUint32(28,c,!0),f.setUint16(32,l,!0),f.setUint16(34,n,!0),Et(f,36,"data"),f.setUint32(40,u,!0);const b=[];for(let g=0;g<a;g++)b.push(e.getChannelData(g));let w=m;if(n===16)for(let g=0;g<s;g++)for(let d=0;d<a;d++){const x=b[d][g],y=Math.max(-1,Math.min(1,x)),C=y<0?y*32768:y*32767;f.setInt16(w,C,!0),w+=2}else for(let g=0;g<s;g++)for(let d=0;d<a;d++)f.setFloat32(w,b[d][g],!0),w+=4;return new Blob([p],{type:"audio/wav"})}function Et(e,t,n){for(let a=0;a<n.length;a++)e.setUint8(t+a,n.charCodeAt(a))}function Is(e,t){const n=URL.createObjectURL(e),a=document.createElement("a");a.href=n,a.download=t,a.style.display="none",document.body.appendChild(a),a.click(),document.body.removeChild(a),URL.revokeObjectURL(n)}function Sa(){const[e,t]=o.useState(!1),[n,a]=o.useState(0),[r,s]=o.useState(null);return{exportWav:o.useCallback(async(l,c,u={})=>{const{filename:m="export",mode:h="master",trackIndex:p,autoDownload:f=!0,applyEffects:b=!0,effectsFunction:w,createOfflineTrackEffects:g,bitDepth:d=16,onProgress:x}=u;t(!0),a(0),s(null);try{if(l.length===0)throw new Error("No tracks to export");if(h==="individual"&&(p===void 0||p<0||p>=l.length))throw new Error("Invalid track index for individual export");const y=l[0].clips[0]?.sampleRate||44100;let C=0;for(const I of l)for(const B of I.clips){const $=B.startSample+B.durationSamples;C=Math.max(C,$)}C+=Math.round(y*.1);const k=C/y,S=h==="individual"?[{track:l[p],state:c[p],index:p}]:l.map((I,B)=>({track:I,state:c[B],index:B})),M=c.some(I=>I.soloed),A=!!g;let E;if((w||A)&&b)E=await As(S,c,M,k,y,w,g,I=>{a(I),x?.(I)});else{const I=new OfflineAudioContext(2,C,y);let B=0;const $=S.reduce((W,{track:z})=>W+z.clips.length,0);for(const{track:W,state:z}of S)if(!(z.muted&&!z.soloed)&&!(M&&!z.soloed))for(const Y of W.clips){await _s(I,Y,z,y,b),B++;const j=B/$*.5;a(j),x?.(j)}a(.5),x?.(.5),E=await I.startRendering()}a(.9),x?.(.9);const _=Ss(E,{bitDepth:d});if(a(1),x?.(1),f){const I=h==="individual"?`${m}_${l[p].name}`:m;Is(_,`${I}.wav`)}return{audioBuffer:E,blob:_,duration:k}}catch(y){const C=y instanceof Error?y.message:"Export failed";throw s(C),y}finally{t(!1)}},[]),isExporting:e,progress:n,error:r}}async function As(e,t,n,a,r,s,i,l){const{Offline:c,Volume:u,Gain:m,Panner:h,Player:p,ToneAudioBuffer:f}=await import("tone");l(.1);let b;try{b=await c(async({transport:w,destination:g})=>{const d=new u(0);let x;s?x=s(d,g,!0):d.connect(g);for(const{track:y,state:C}of e){if(C.muted&&!C.soloed||n&&!C.soloed)continue;const k=new u(Ms(C.volume)),S=new h(C.pan),M=new m(C.muted?0:1),A=i?.(y.id);A?A(M,d,!0):M.connect(d),S.connect(M),k.connect(S);for(const E of y.clips){const{audioBuffer:_,startSample:I,durationSamples:B,offsetSamples:$,gain:W,fadeIn:z,fadeOut:Y}=E,j=I/r,N=B/r,L=$/r,ae=new f(_),oe=new p(ae),q=new m(W);if(oe.connect(q),q.connect(k),z){const fe=j,ue=j+z.duration,le=Tt(q.gain);le&&(le.setValueAtTime(0,fe),le.linearRampToValueAtTime(W,ue))}if(Y){const fe=j+N-Y.duration,ue=j+N,le=Tt(q.gain);le&&(le.setValueAtTime(W,fe),le.linearRampToValueAtTime(0,ue))}oe.start(j,L,N)}}w.start(0)},a,2,r)}catch(w){throw w instanceof Error?w:new Error(`Tone.Offline rendering failed: ${String(w)}`)}return l(.9),b.get()}function Ms(e){return 20*Math.log10(Math.max(e,1e-4))}async function _s(e,t,n,a,r){const{audioBuffer:s,startSample:i,durationSamples:l,offsetSamples:c,gain:u,fadeIn:m,fadeOut:h}=t;if(!s){console.warn(`Skipping clip "${t.name||t.id}" - no audioBuffer for export`);return}const p=i/a,f=l/a,b=c/a,w=e.createBufferSource();w.buffer=s;const g=e.createGain(),d=u*n.volume,x=e.createStereoPanner();if(x.pan.value=n.pan,w.connect(g),g.connect(x),x.connect(e.destination),r){if(m?g.gain.setValueAtTime(0,p):g.gain.setValueAtTime(d,p),m){const y=p,C=p+m.duration;jn(g.gain,y,C,0,d,m.type||"linear")}if(h){const y=p+f-h.duration,C=p+f;(!m||m.duration<f-h.duration)&&g.gain.setValueAtTime(d,y),jn(g.gain,y,C,d,0,h.type||"linear")}}else g.gain.setValueAtTime(d,p);w.start(p,b,f)}function jn(e,t,n,a,r,s){const i=n-t;if(!(i<=0))switch(s){case"linear":e.setValueAtTime(a,t),e.linearRampToValueAtTime(r,n);break;case"exponential":{const l=Math.max(a,1e-4),c=Math.max(r,1e-4);e.setValueAtTime(l,t),e.exponentialRampToValueAtTime(c,n),r===0&&e.setValueAtTime(0,n);break}case"logarithmic":{const l=Ln(a,r,256,"logarithmic");e.setValueCurveAtTime(l,t,i);break}case"sCurve":{const l=Ln(a,r,256,"sCurve");e.setValueCurveAtTime(l,t,i);break}default:e.setValueAtTime(a,t),e.linearRampToValueAtTime(r,n)}}function Ln(e,t,n,a){const r=new Float32Array(n),s=t-e;for(let i=0;i<n;i++){const l=i/(n-1);let c;a==="logarithmic"?s>0?c=Math.log10(1+l*9)/Math.log10(10):c=1-Math.log10(1+(1-l)*9)/Math.log10(10):c=l*l*(3-2*l),r[i]=e+s*c}return r}const Ia=()=>{const e=o.useRef(null),t=o.useCallback(()=>{e.current!==null&&(cancelAnimationFrame(e.current),e.current=null)},[]),n=o.useCallback(a=>{t(),e.current=requestAnimationFrame(a)},[t]);return o.useEffect(()=>()=>{t()},[t]),{animationFrameRef:e,startAnimationFrameLoop:n,stopAnimationFrameLoop:t}},Es=`
797
+ `,fo=({items:e})=>{const[t,n]=i.useState(!1),r=typeof e=="function"?e(()=>n(!1)):e,[s,o]=i.useState({top:0,left:0}),l=i.useRef(null),c=i.useRef(null);return i.useEffect(()=>{if(t&&l.current){const u=l.current.getBoundingClientRect();o({top:u.bottom+2,left:Math.max(0,u.right-180)})}},[t]),i.useEffect(()=>{if(!t)return;const u=f=>{const h=f.target;l.current&&!l.current.contains(h)&&c.current&&!c.current.contains(h)&&n(!1)};return document.addEventListener("mousedown",u),()=>document.removeEventListener("mousedown",u)},[t]),v.jsxs(io,{children:[v.jsx(lo,{ref:l,onClick:u=>{u.stopPropagation(),n(f=>!f)},onMouseDown:u=>u.stopPropagation(),title:"Track menu","aria-label":"Track menu",children:v.jsx(oo,{size:16})}),t&&typeof document<"u"&&ra.createPortal(v.jsx(co,{ref:c,$top:s.top,$left:s.left,onMouseDown:u=>u.stopPropagation(),children:r.map((u,f)=>v.jsxs(i.Fragment,{children:[f>0&&v.jsx(uo,{}),u.content]},u.id))}),document.body)]})};function lt(e,t){this._waveformData=e,this._channelIndex=t}lt.prototype.min_sample=function(e){var t=(e*this._waveformData.channels+this._channelIndex)*2;return this._waveformData._at(t)};lt.prototype.max_sample=function(e){var t=(e*this._waveformData.channels+this._channelIndex)*2+1;return this._waveformData._at(t)};lt.prototype.set_min_sample=function(e,t){var n=(e*this._waveformData.channels+this._channelIndex)*2;return this._waveformData._set_at(n,t)};lt.prototype.set_max_sample=function(e,t){var n=(e*this._waveformData.channels+this._channelIndex)*2+1;return this._waveformData._set_at(n,t)};lt.prototype.min_array=function(){for(var e=this._waveformData.length,t=[],n=0;n<e;n++)t.push(this.min_sample(n));return t};lt.prototype.max_array=function(){for(var e=this._waveformData.length,t=[],n=0;n<e;n++)t.push(this.max_sample(n));return t};var mo=127,ho=-128,po=32767,go=-32768;function bo(e,t){var n=Math.floor(e/t),a=e-n*t;return a>0&&n++,n}function vo(e){for(var t=e.scale,n=e.amplitude_scale,a=e.split_channels,r=e.length,s=e.sample_rate,o=e.channels.map(function(M){return new Float32Array(M)}),l=a?o.length:1,c=24,u=bo(r,t),f=e.bits===8?1:2,h=c+u*2*f*l,p=new ArrayBuffer(h),d=new DataView(p),g=0,y=c,b=new Array(l),m=new Array(l),w=0;w<l;w++)b[w]=1/0,m[w]=-1/0;var x=e.bits===8?ho:go,C=e.bits===8?mo:po;d.setInt32(0,2,!0),d.setUint32(4,e.bits===8,!0),d.setInt32(8,s,!0),d.setInt32(12,t,!0),d.setInt32(16,u,!0),d.setInt32(20,l,!0);for(var k=0;k<r;k++){var S=0;if(l===1){for(var I=0;I<o.length;++I)S+=o[I][k];S=Math.floor(C*S*n/o.length),S<b[0]&&(b[0]=S,b[0]<x&&(b[0]=x)),S>m[0]&&(m[0]=S,m[0]>C&&(m[0]=C))}else for(var A=0;A<l;++A)S=Math.floor(C*o[A][k]*n),S<b[A]&&(b[A]=S,b[A]<x&&(b[A]=x)),S>m[A]&&(m[A]=S,m[A]>C&&(m[A]=C));if(++g===t){for(var _=0;_<l;_++)e.bits===8?(d.setInt8(y++,b[_]),d.setInt8(y++,m[_])):(d.setInt16(y,b[_],!0),d.setInt16(y+2,m[_],!0),y+=4),b[_]=1/0,m[_]=-1/0;g=0}}if(g>0)for(var T=0;T<l;T++)e.bits===8?(d.setInt8(y++,b[T]),d.setInt8(y++,m[T])):(d.setInt16(y,b[T],!0),d.setInt16(y+2,m[T],!0));return p}function Bt(e){"@babel/helpers - typeof";return Bt=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(t){return typeof t}:function(t){return t&&typeof Symbol=="function"&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},Bt(e)}function Co(e){return e&&Bt(e)==="object"&&"sample_rate"in e&&"samples_per_pixel"in e&&"bits"in e&&"length"in e&&"data"in e}function yo(e){var t=e&&Bt(e)==="object"&&"byteLength"in e;if(t){var n=new DataView(e),a=n.getInt32(0,!0);if(a!==1&&a!==2)throw new TypeError("WaveformData.create(): This waveform data version not supported")}return t}function wo(e){var t=e.data,n=e.channels||1,a=24,r=e.bits===8?1:2,s=e.length*2*n;if(t.length!==s)throw new Error("WaveformData.create(): Length mismatch in JSON waveform data");var o=a+t.length*r,l=new ArrayBuffer(o),c=new DataView(l);c.setInt32(0,2,!0),c.setUint32(4,e.bits===8,!0),c.setInt32(8,e.sample_rate,!0),c.setInt32(12,e.samples_per_pixel,!0),c.setInt32(16,e.length,!0),c.setInt32(20,n,!0);var u=a;if(e.bits===8)for(var f=0;f<t.length;f++)c.setInt8(u++,t[f],!0);else for(var h=0;h<t.length;h++)c.setInt16(u,t[h],!0),u+=2;return l}function ft(e){return e==null}function xo(e,t){var n=atob(e);return n}function ko(e,t,n){var a=xo(e),r=a.indexOf(`
798
+ `,10)+1,s=a.substring(r)+"",o=new Blob([s],{type:"application/javascript"});return URL.createObjectURL(o)}function So(e,t,n){var a;return function(s){return a=a||ko(e),new Worker(a,s)}}var Io=So("Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwooZnVuY3Rpb24gKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgLyoqCiAgICogQXVkaW9CdWZmZXItYmFzZWQgV2F2ZWZvcm1EYXRhIGdlbmVyYXRvcgogICAqCiAgICogQWRhcHRlZCBmcm9tIEJsb2NrRmlsZTo6Q2FsY1N1bW1hcnkgaW4gQXVkYWNpdHksIHdpdGggcGVybWlzc2lvbi4KICAgKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2F1ZGFjaXR5L2F1ZGFjaXR5L2Jsb2IvCiAgICogICAxMTA4YzEzNzZjMDkxNjYxNjIzMzVmYWI0NzQzMDA4Y2JhNTdjNGVlL3NyYy9CbG9ja0ZpbGUuY3BwI0wxOTgKICAgKi8KCiAgdmFyIElOVDhfTUFYID0gMTI3OwogIHZhciBJTlQ4X01JTiA9IC0xMjg7CiAgdmFyIElOVDE2X01BWCA9IDMyNzY3OwogIHZhciBJTlQxNl9NSU4gPSAtMzI3Njg7CiAgZnVuY3Rpb24gY2FsY3VsYXRlV2F2ZWZvcm1EYXRhTGVuZ3RoKGF1ZGlvX3NhbXBsZV9jb3VudCwgc2NhbGUpIHsKICAgIHZhciBkYXRhX2xlbmd0aCA9IE1hdGguZmxvb3IoYXVkaW9fc2FtcGxlX2NvdW50IC8gc2NhbGUpOwogICAgdmFyIHNhbXBsZXNfcmVtYWluaW5nID0gYXVkaW9fc2FtcGxlX2NvdW50IC0gZGF0YV9sZW5ndGggKiBzY2FsZTsKICAgIGlmIChzYW1wbGVzX3JlbWFpbmluZyA+IDApIHsKICAgICAgZGF0YV9sZW5ndGgrKzsKICAgIH0KICAgIHJldHVybiBkYXRhX2xlbmd0aDsKICB9CiAgZnVuY3Rpb24gZ2VuZXJhdGVXYXZlZm9ybURhdGEob3B0aW9ucykgewogICAgdmFyIHNjYWxlID0gb3B0aW9ucy5zY2FsZTsKICAgIHZhciBhbXBsaXR1ZGVfc2NhbGUgPSBvcHRpb25zLmFtcGxpdHVkZV9zY2FsZTsKICAgIHZhciBzcGxpdF9jaGFubmVscyA9IG9wdGlvbnMuc3BsaXRfY2hhbm5lbHM7CiAgICB2YXIgbGVuZ3RoID0gb3B0aW9ucy5sZW5ndGg7CiAgICB2YXIgc2FtcGxlX3JhdGUgPSBvcHRpb25zLnNhbXBsZV9yYXRlOwogICAgdmFyIGNoYW5uZWxzID0gb3B0aW9ucy5jaGFubmVscy5tYXAoZnVuY3Rpb24gKGNoYW5uZWwpIHsKICAgICAgcmV0dXJuIG5ldyBGbG9hdDMyQXJyYXkoY2hhbm5lbCk7CiAgICB9KTsKICAgIHZhciBvdXRwdXRfY2hhbm5lbHMgPSBzcGxpdF9jaGFubmVscyA/IGNoYW5uZWxzLmxlbmd0aCA6IDE7CiAgICB2YXIgaGVhZGVyX3NpemUgPSAyNDsKICAgIHZhciBkYXRhX2xlbmd0aCA9IGNhbGN1bGF0ZVdhdmVmb3JtRGF0YUxlbmd0aChsZW5ndGgsIHNjYWxlKTsKICAgIHZhciBieXRlc19wZXJfc2FtcGxlID0gb3B0aW9ucy5iaXRzID09PSA4ID8gMSA6IDI7CiAgICB2YXIgdG90YWxfc2l6ZSA9IGhlYWRlcl9zaXplICsgZGF0YV9sZW5ndGggKiAyICogYnl0ZXNfcGVyX3NhbXBsZSAqIG91dHB1dF9jaGFubmVsczsKICAgIHZhciBidWZmZXIgPSBuZXcgQXJyYXlCdWZmZXIodG90YWxfc2l6ZSk7CiAgICB2YXIgZGF0YV92aWV3ID0gbmV3IERhdGFWaWV3KGJ1ZmZlcik7CiAgICB2YXIgc2NhbGVfY291bnRlciA9IDA7CiAgICB2YXIgb2Zmc2V0ID0gaGVhZGVyX3NpemU7CiAgICB2YXIgbWluX3ZhbHVlID0gbmV3IEFycmF5KG91dHB1dF9jaGFubmVscyk7CiAgICB2YXIgbWF4X3ZhbHVlID0gbmV3IEFycmF5KG91dHB1dF9jaGFubmVscyk7CiAgICBmb3IgKHZhciBjaGFubmVsID0gMDsgY2hhbm5lbCA8IG91dHB1dF9jaGFubmVsczsgY2hhbm5lbCsrKSB7CiAgICAgIG1pbl92YWx1ZVtjaGFubmVsXSA9IEluZmluaXR5OwogICAgICBtYXhfdmFsdWVbY2hhbm5lbF0gPSAtSW5maW5pdHk7CiAgICB9CiAgICB2YXIgcmFuZ2VfbWluID0gb3B0aW9ucy5iaXRzID09PSA4ID8gSU5UOF9NSU4gOiBJTlQxNl9NSU47CiAgICB2YXIgcmFuZ2VfbWF4ID0gb3B0aW9ucy5iaXRzID09PSA4ID8gSU5UOF9NQVggOiBJTlQxNl9NQVg7CiAgICBkYXRhX3ZpZXcuc2V0SW50MzIoMCwgMiwgdHJ1ZSk7IC8vIFZlcnNpb24KICAgIGRhdGFfdmlldy5zZXRVaW50MzIoNCwgb3B0aW9ucy5iaXRzID09PSA4LCB0cnVlKTsgLy8gSXMgOCBiaXQ/CiAgICBkYXRhX3ZpZXcuc2V0SW50MzIoOCwgc2FtcGxlX3JhdGUsIHRydWUpOyAvLyBTYW1wbGUgcmF0ZQogICAgZGF0YV92aWV3LnNldEludDMyKDEyLCBzY2FsZSwgdHJ1ZSk7IC8vIFNjYWxlCiAgICBkYXRhX3ZpZXcuc2V0SW50MzIoMTYsIGRhdGFfbGVuZ3RoLCB0cnVlKTsgLy8gTGVuZ3RoCiAgICBkYXRhX3ZpZXcuc2V0SW50MzIoMjAsIG91dHB1dF9jaGFubmVscywgdHJ1ZSk7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciBzYW1wbGUgPSAwOwogICAgICBpZiAob3V0cHV0X2NoYW5uZWxzID09PSAxKSB7CiAgICAgICAgZm9yICh2YXIgX2NoYW5uZWwgPSAwOyBfY2hhbm5lbCA8IGNoYW5uZWxzLmxlbmd0aDsgKytfY2hhbm5lbCkgewogICAgICAgICAgc2FtcGxlICs9IGNoYW5uZWxzW19jaGFubmVsXVtpXTsKICAgICAgICB9CiAgICAgICAgc2FtcGxlID0gTWF0aC5mbG9vcihyYW5nZV9tYXggKiBzYW1wbGUgKiBhbXBsaXR1ZGVfc2NhbGUgLyBjaGFubmVscy5sZW5ndGgpOwogICAgICAgIGlmIChzYW1wbGUgPCBtaW5fdmFsdWVbMF0pIHsKICAgICAgICAgIG1pbl92YWx1ZVswXSA9IHNhbXBsZTsKICAgICAgICAgIGlmIChtaW5fdmFsdWVbMF0gPCByYW5nZV9taW4pIHsKICAgICAgICAgICAgbWluX3ZhbHVlWzBdID0gcmFuZ2VfbWluOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoc2FtcGxlID4gbWF4X3ZhbHVlWzBdKSB7CiAgICAgICAgICBtYXhfdmFsdWVbMF0gPSBzYW1wbGU7CiAgICAgICAgICBpZiAobWF4X3ZhbHVlWzBdID4gcmFuZ2VfbWF4KSB7CiAgICAgICAgICAgIG1heF92YWx1ZVswXSA9IHJhbmdlX21heDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZm9yICh2YXIgX2NoYW5uZWwyID0gMDsgX2NoYW5uZWwyIDwgb3V0cHV0X2NoYW5uZWxzOyArK19jaGFubmVsMikgewogICAgICAgICAgc2FtcGxlID0gTWF0aC5mbG9vcihyYW5nZV9tYXggKiBjaGFubmVsc1tfY2hhbm5lbDJdW2ldICogYW1wbGl0dWRlX3NjYWxlKTsKICAgICAgICAgIGlmIChzYW1wbGUgPCBtaW5fdmFsdWVbX2NoYW5uZWwyXSkgewogICAgICAgICAgICBtaW5fdmFsdWVbX2NoYW5uZWwyXSA9IHNhbXBsZTsKICAgICAgICAgICAgaWYgKG1pbl92YWx1ZVtfY2hhbm5lbDJdIDwgcmFuZ2VfbWluKSB7CiAgICAgICAgICAgICAgbWluX3ZhbHVlW19jaGFubmVsMl0gPSByYW5nZV9taW47CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGlmIChzYW1wbGUgPiBtYXhfdmFsdWVbX2NoYW5uZWwyXSkgewogICAgICAgICAgICBtYXhfdmFsdWVbX2NoYW5uZWwyXSA9IHNhbXBsZTsKICAgICAgICAgICAgaWYgKG1heF92YWx1ZVtfY2hhbm5lbDJdID4gcmFuZ2VfbWF4KSB7CiAgICAgICAgICAgICAgbWF4X3ZhbHVlW19jaGFubmVsMl0gPSByYW5nZV9tYXg7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKCsrc2NhbGVfY291bnRlciA9PT0gc2NhbGUpIHsKICAgICAgICBmb3IgKHZhciBfY2hhbm5lbDMgPSAwOyBfY2hhbm5lbDMgPCBvdXRwdXRfY2hhbm5lbHM7IF9jaGFubmVsMysrKSB7CiAgICAgICAgICBpZiAob3B0aW9ucy5iaXRzID09PSA4KSB7CiAgICAgICAgICAgIGRhdGFfdmlldy5zZXRJbnQ4KG9mZnNldCsrLCBtaW5fdmFsdWVbX2NoYW5uZWwzXSk7CiAgICAgICAgICAgIGRhdGFfdmlldy5zZXRJbnQ4KG9mZnNldCsrLCBtYXhfdmFsdWVbX2NoYW5uZWwzXSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBkYXRhX3ZpZXcuc2V0SW50MTYob2Zmc2V0LCBtaW5fdmFsdWVbX2NoYW5uZWwzXSwgdHJ1ZSk7CiAgICAgICAgICAgIGRhdGFfdmlldy5zZXRJbnQxNihvZmZzZXQgKyAyLCBtYXhfdmFsdWVbX2NoYW5uZWwzXSwgdHJ1ZSk7CiAgICAgICAgICAgIG9mZnNldCArPSA0OwogICAgICAgICAgfQogICAgICAgICAgbWluX3ZhbHVlW19jaGFubmVsM10gPSBJbmZpbml0eTsKICAgICAgICAgIG1heF92YWx1ZVtfY2hhbm5lbDNdID0gLUluZmluaXR5OwogICAgICAgIH0KICAgICAgICBzY2FsZV9jb3VudGVyID0gMDsKICAgICAgfQogICAgfQogICAgaWYgKHNjYWxlX2NvdW50ZXIgPiAwKSB7CiAgICAgIGZvciAodmFyIF9jaGFubmVsNCA9IDA7IF9jaGFubmVsNCA8IG91dHB1dF9jaGFubmVsczsgX2NoYW5uZWw0KyspIHsKICAgICAgICBpZiAob3B0aW9ucy5iaXRzID09PSA4KSB7CiAgICAgICAgICBkYXRhX3ZpZXcuc2V0SW50OChvZmZzZXQrKywgbWluX3ZhbHVlW19jaGFubmVsNF0pOwogICAgICAgICAgZGF0YV92aWV3LnNldEludDgob2Zmc2V0KyssIG1heF92YWx1ZVtfY2hhbm5lbDRdKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgZGF0YV92aWV3LnNldEludDE2KG9mZnNldCwgbWluX3ZhbHVlW19jaGFubmVsNF0sIHRydWUpOwogICAgICAgICAgZGF0YV92aWV3LnNldEludDE2KG9mZnNldCArIDIsIG1heF92YWx1ZVtfY2hhbm5lbDRdLCB0cnVlKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBidWZmZXI7CiAgfQoKICBvbm1lc3NhZ2UgPSBmdW5jdGlvbiBvbm1lc3NhZ2UoZXZ0KSB7CiAgICB2YXIgYnVmZmVyID0gZ2VuZXJhdGVXYXZlZm9ybURhdGEoZXZ0LmRhdGEpOwoKICAgIC8vIFRyYW5zZmVyIGJ1ZmZlciB0byB0aGUgY2FsbGluZyB0aHJlYWQKICAgIHRoaXMucG9zdE1lc3NhZ2UoYnVmZmVyLCBbYnVmZmVyXSk7CiAgICB0aGlzLmNsb3NlKCk7CiAgfTsKCn0pKCk7Ci8vIyBzb3VyY2VNYXBwaW5nVVJMPXdhdmVmb3JtLWRhdGEtd29ya2VyLmpzLm1hcAoK");function je(e){if(Co(e)&&(e=wo(e)),yo(e)){this._data=new DataView(e),this._offset=this._version()===2?24:20,this._channels=[];for(var t=0;t<this.channels;t++)this._channels[t]=new lt(this,t)}else throw new TypeError("WaveformData.create(): Unknown data format")}var vt={scale:512,bits:8,amplitude_scale:1,split_channels:!1,disable_worker:!1};function _o(e){var t={scale:e.scale||vt.scale,bits:e.bits||vt.bits,amplitude_scale:e.amplitude_scale||vt.amplitude_scale,split_channels:e.split_channels||vt.split_channels,disable_worker:e.disable_worker||vt.disable_worker};return t}function Ao(e){for(var t=[],n=0;n<e.numberOfChannels;++n)t.push(e.getChannelData(n).buffer);return t}function Fa(e,t,n){var a=Ao(e);if(t.disable_worker){var r=vo({scale:t.scale,bits:t.bits,amplitude_scale:t.amplitude_scale,split_channels:t.split_channels,length:e.length,sample_rate:e.sampleRate,channels:a});n(void 0,new je(r),e)}else{var s=new Io;s.onmessage=function(o){n(void 0,new je(o.data),e)},s.postMessage({scale:t.scale,bits:t.bits,amplitude_scale:t.amplitude_scale,split_channels:t.split_channels,length:e.length,sample_rate:e.sampleRate,channels:a},a)}}function Mo(e,t,n,a){function r(o){o||(o=new DOMException("EncodingError")),a(o),a=function(){}}var s=e.decodeAudioData(t,function(o){Fa(o,n,a)},r);s&&s.catch(r)}je.create=function(t){return new je(t)};je.createFromAudio=function(e,t){var n=_o(e);if(e.audio_context&&e.array_buffer)return Mo(e.audio_context,e.array_buffer,n,t);if(e.audio_buffer)return Fa(e.audio_buffer,n,t);throw new TypeError("WaveformData.createFromAudio(): Pass either an AudioContext and ArrayBuffer, or an AudioBuffer object")};function Pt(e){this._inputData=e.waveformData,this._output_samples_per_pixel=e.scale,this._scale=this._inputData.scale,this._input_buffer_size=this._inputData.length;var t=this._input_buffer_size*this._inputData.scale,n=Math.ceil(t/this._output_samples_per_pixel),a=24,r=this._inputData.bits===8?1:2,s=a+n*2*this._inputData.channels*r;this._output_data=new ArrayBuffer(s),this.output_dataview=new DataView(this._output_data),this.output_dataview.setInt32(0,2,!0),this.output_dataview.setUint32(4,this._inputData.bits===8,!0),this.output_dataview.setInt32(8,this._inputData.sample_rate,!0),this.output_dataview.setInt32(12,this._output_samples_per_pixel,!0),this.output_dataview.setInt32(16,n,!0),this.output_dataview.setInt32(20,this._inputData.channels,!0),this._outputWaveformData=new je(this._output_data),this._input_index=0,this._output_index=0;var o=this._inputData.channels;this._min=new Array(o),this._max=new Array(o);for(var l=0;l<o;++l)this._input_buffer_size>0?(this._min[l]=this._inputData.channel(l).min_sample(this._input_index),this._max[l]=this._inputData.channel(l).max_sample(this._input_index)):(this._min[l]=0,this._max[l]=0);this._min_value=this._inputData.bits===8?-128:-32768,this._max_value=this._inputData.bits===8?127:32767,this._where=0,this._prev_where=0,this._stop=0,this._last_input_index=0}Pt.prototype.sample_at_pixel=function(e){return Math.floor(e*this._output_samples_per_pixel)};Pt.prototype.next=function(){for(var e=0,t=1e3,n=this._inputData.channels,a;this._input_index<this._input_buffer_size&&e<t;){for(;Math.floor(this.sample_at_pixel(this._output_index)/this._scale)===this._input_index;){if(this._output_index>0)for(var r=0;r<n;++r)a=this._outputWaveformData.channel(r),a.set_min_sample(this._output_index-1,this._min[r]),a.set_max_sample(this._output_index-1,this._max[r]);if(this._last_input_index=this._input_index,this._output_index++,this._where=this.sample_at_pixel(this._output_index),this._prev_where=this.sample_at_pixel(this._output_index-1),this._where!==this._prev_where)for(var s=0;s<n;++s)this._min[s]=this._max_value,this._max[s]=this._min_value}for(this._where=this.sample_at_pixel(this._output_index),this._stop=Math.floor(this._where/this._scale),this._stop>this._input_buffer_size&&(this._stop=this._input_buffer_size);this._input_index<this._stop;){for(var o=0;o<n;++o){a=this._inputData.channel(o);var l=a.min_sample(this._input_index);l<this._min[o]&&(this._min[o]=l),l=a.max_sample(this._input_index),l>this._max[o]&&(this._max[o]=l)}this._input_index++}e++}if(this._input_index<this._input_buffer_size)return!1;if(this._input_index!==this._last_input_index)for(var c=0;c<n;++c)a=this._outputWaveformData.channel(c),a.set_min_sample(this._output_index-1,this._min[c]),a.set_max_sample(this._output_index-1,this._max[c]);return!0};Pt.prototype.getOutputData=function(){return this._output_data};je.prototype={_getResampleOptions:function(t){var n={};if(n.scale=t.scale,n.width=t.width,!ft(n.width)&&(typeof n.width!="number"||n.width<=0))throw new RangeError("WaveformData.resample(): width should be a positive integer value");if(!ft(n.scale)&&(typeof n.scale!="number"||n.scale<=0))throw new RangeError("WaveformData.resample(): scale should be a positive integer value");if(!n.scale&&!n.width)throw new Error("WaveformData.resample(): Missing scale or width option");if(n.width&&(n.scale=Math.floor(this.duration*this.sample_rate/n.width)),n.scale<this.scale)throw new Error("WaveformData.resample(): Zoom level "+n.scale+" too low, minimum: "+this.scale);return n.abortSignal=t.abortSignal,n},resample:function(t){t=this._getResampleOptions(t),t.waveformData=this;for(var n=new Pt(t);!n.next(););return new je(n.getOutputData())},concat:function(){var t=this,n=Array.prototype.slice.call(arguments);n.forEach(function(r){if(t.channels!==r.channels||t.sample_rate!==r.sample_rate||t.bits!==r.bits||t.scale!==r.scale)throw new Error("WaveformData.concat(): Waveforms are incompatible")});var a=this._concatBuffers.apply(this,n);return je.create(a)},_concatBuffers:function(){for(var t=Array.prototype.slice.call(arguments),n=this._offset,a=n,r=0,s=[this].concat(t).map(function(m){return m._data.buffer}),o=0;o<s.length;o++){var l=s[o],c=new DataView(l).getInt32(16,!0);a+=l.byteLength-n,r+=c}for(var u=new ArrayBuffer(a),f=new DataView(s[0]),h=new DataView(u),p=0;p<n;p++)h.setUint8(p,f.getUint8(p));h.setInt32(16,r,!0);for(var d=0,g=new Uint8Array(u,n),y=0;y<s.length;y++){var b=s[y];g.set(new Uint8Array(b,n),d),d+=b.byteLength-n}return u},slice:function(t){var n=0,a=0;if(!ft(t.startIndex)&&!ft(t.endIndex)?(n=t.startIndex,a=t.endIndex):!ft(t.startTime)&&!ft(t.endTime)&&(n=this.at_time(t.startTime),a=this.at_time(t.endTime)),n<0)throw new RangeError("startIndex or startTime must not be negative");if(a<0)throw new RangeError("endIndex or endTime must not be negative");n>this.length&&(n=this.length),a>this.length&&(a=this.length),n>a&&(n=a);var r=a-n,s=24,o=this.bits===8?1:2,l=s+r*2*this.channels*o,c=new ArrayBuffer(l),u=new DataView(c);u.setInt32(0,2,!0),u.setUint32(4,this.bits===8,!0),u.setInt32(8,this.sample_rate,!0),u.setInt32(12,this.scale,!0),u.setInt32(16,r,!0),u.setInt32(20,this.channels,!0);for(var f=0;f<r*this.channels*2;f++){var h=this._at(n*this.channels*2+f);this.bits===8?u.setInt8(s+f,h):u.setInt16(s+f*2,h,!0)}return new je(c)},_version:function(){return this._data.getInt32(0,!0)},get length(){return this._data.getUint32(16,!0)},get bits(){var e=!!this._data.getUint32(4,!0);return e?8:16},get duration(){return this.length*this.scale/this.sample_rate},get pixels_per_second(){return this.sample_rate/this.scale},get seconds_per_pixel(){return this.scale/this.sample_rate},get channels(){return this._version()===2?this._data.getInt32(20,!0):1},channel:function(t){if(t>=0&&t<this._channels.length)return this._channels[t];throw new RangeError("Invalid channel: "+t)},get sample_rate(){return this._data.getInt32(8,!0)},get scale(){return this._data.getInt32(12,!0)},_at:function(t){return this.bits===8?this._data.getInt8(this._offset+t):this._data.getInt16(this._offset+t*2,!0)},_set_at:function(t,n){return this.bits===8?this._data.setInt8(this._offset+t,n):this._data.setInt16(this._offset+t*2,n,!0)},at_time:function(t){return Math.floor(t*this.sample_rate/this.scale)},time:function(t){return t*this.scale/this.sample_rate},toJSON:function(){for(var t={version:2,channels:this.channels,sample_rate:this.sample_rate,samples_per_pixel:this.scale,bits:this.bits,length:this.length,data:[]},n=0;n<this.length;n++)for(var a=0;a<this.channels;a++)t.data.push(this.channel(a).min_sample(n)),t.data.push(this.channel(a).max_sample(n));return t},toArrayBuffer:function(){return this._data.buffer}};async function ln(e){const t=await fetch(e);if(!t.ok)throw new Error(`Failed to fetch waveform data: ${t.statusText}`);if(e.endsWith(".dat")){const a=await t.arrayBuffer();return je.create(a)}else{const a=await t.json();return je.create(a)}}function Wa(e,t=0){const n=e.channel(t),a=e.bits,r=n.min_array(),s=n.max_array(),o=r.length,l=a===8?new Int8Array(o*2):new Int16Array(o*2);for(let c=0;c<o;c++)l[c*2]=r[c],l[c*2+1]=s[c];return{data:l,bits:a,length:o,sampleRate:e.sample_rate}}async function Eo(e,t=0){const n=await ln(e);return Wa(n,t)}async function To(e){const t=await ln(e);return{sampleRate:t.sample_rate,channels:t.channels,duration:t.duration,samplesPerPixel:t.scale,length:t.length,bits:t.bits}}function $o(e,t,n=0,a,r){let s=e;if(r!==void 0){const p=e.scale,d=Math.floor(a/p),g=Math.ceil((a+r)/p);s=s.slice({startIndex:d,endIndex:g})}s.scale!==t&&(s=s.resample({scale:t}));const o=s.channel(n),l=s.bits,c=o.min_array(),u=o.max_array(),f=c.length,h=l===8?new Int8Array(f*2):new Int16Array(f*2);for(let p=0;p<f;p++)h[p*2]=c[p],h[p*2+1]=u[p];return{data:h,bits:l,length:f}}function ea(e,t,n,a,r){let s=e;if(a!==void 0&&r!==void 0){const f=e.scale,h=Math.floor(a/f),p=Math.ceil((a+r)/f);s=s.slice({startIndex:h,endIndex:p})}s.scale!==t&&(s=s.resample({scale:t}));const o=s.channels,l=s.bits,c=[];for(let f=0;f<o;f++){const h=s.channel(f),p=h.min_array(),d=h.max_array(),g=p.length,y=l===8?new Int8Array(g*2):new Int16Array(g*2);for(let b=0;b<g;b++)y[b*2]=p[b],y[b*2+1]=d[b];c.push(y)}if(n&&c.length>1){const f=1/c.length,h=c[0].length/2,p=l===8?new Int8Array(h*2):new Int16Array(h*2);for(let d=0;d<h;d++){let g=0,y=0;for(let b=0;b<c.length;b++)g+=f*c[b][d*2],y+=f*c[b][d*2+1];p[d*2]=g,p[d*2+1]=y}return{length:h,data:[p],bits:l}}return{length:c.length>0?c[0].length/2:0,data:c,bits:l}}function Pa(){const[e,t]=i.useState("hh:mm:ss.uuu");return{timeFormat:e,setTimeFormat:t,formatTime:r=>mt(r,e),parseTime:r=>Ea(r,e)}}function Va({engineRef:e,initialSamplesPerPixel:t}){const[n,a]=i.useState(t),[r,s]=i.useState(!0),[o,l]=i.useState(!0),c=i.useRef(!0),u=i.useRef(!0),f=i.useRef(t),h=i.useCallback(()=>{e.current?.zoomIn()},[e]),p=i.useCallback(()=>{e.current?.zoomOut()},[e]),d=i.useCallback(g=>{g.samplesPerPixel!==f.current&&(f.current=g.samplesPerPixel,i.startTransition(()=>{a(g.samplesPerPixel)})),g.canZoomIn!==c.current&&(c.current=g.canZoomIn,s(g.canZoomIn)),g.canZoomOut!==u.current&&(u.current=g.canZoomOut,l(g.canZoomOut))},[]);return{samplesPerPixel:n,zoomIn:h,zoomOut:p,canZoomIn:r,canZoomOut:o,onEngineState:d}}function Za({engineRef:e,initialVolume:t=1}){const[n,a]=i.useState(t),r=i.useRef(t),s=i.useCallback(l=>{e.current?e.current.setMasterVolume(l):(r.current=l,a(l))},[e]),o=i.useCallback(l=>{l.masterVolume!==r.current&&(r.current=l.masterVolume,a(l.masterVolume))},[]);return{masterVolume:n,setMasterVolume:s,masterVolumeRef:r,onEngineState:o}}function Ro({engineRef:e}){const[t,n]=i.useState(0),[a,r]=i.useState(0),s=i.useRef(0),o=i.useRef(0),l=i.useCallback((u,f)=>{e.current?.setSelection(u,f)},[e]),c=i.useCallback(u=>{u.selectionStart!==s.current&&(s.current=u.selectionStart,n(u.selectionStart)),u.selectionEnd!==o.current&&(o.current=u.selectionEnd,r(u.selectionEnd))},[]);return{selectionStart:t,selectionEnd:a,setSelection:l,selectionStartRef:s,selectionEndRef:o,onEngineState:c}}function Do({engineRef:e}){const[t,n]=i.useState(!1),[a,r]=i.useState(0),[s,o]=i.useState(0),l=i.useRef(!1),c=i.useRef(0),u=i.useRef(0),f=i.useCallback(g=>{e.current?.setLoopEnabled(g)},[e]),h=i.useCallback((g,y)=>{e.current?.setLoopRegion(g,y)},[e]),p=i.useCallback(()=>{e.current?.setLoopRegion(0,0)},[e]),d=i.useCallback(g=>{g.isLoopEnabled!==l.current&&(l.current=g.isLoopEnabled,n(g.isLoopEnabled)),g.loopStart!==c.current&&(c.current=g.loopStart,r(g.loopStart)),g.loopEnd!==u.current&&(u.current=g.loopEnd,o(g.loopEnd))},[]);return{isLoopEnabled:t,loopStart:a,loopEnd:s,setLoopEnabled:f,setLoopRegion:h,clearLoopRegion:p,isLoopEnabledRef:l,loopStartRef:c,loopEndRef:u,onEngineState:d}}function Bo({engineRef:e}){const[t,n]=i.useState(null),a=i.useRef(null),r=i.useCallback(o=>{e.current?.selectTrack(o)},[e]),s=i.useCallback(o=>{o.selectedTrackId!==a.current&&(a.current=o.selectedTrackId,n(o.selectedTrackId))},[]);return{selectedTrackId:t,setSelectedTrackId:r,onEngineState:s,selectedTrackIdRef:a}}const Fo=(e=256)=>{const t=i.useRef(null),n=i.useCallback((a,r,s)=>{const o=new Z.Analyser("fft",e);return a.connect(o),a.connect(r),t.current=o,function(){o.dispose(),t.current=null}},[e]);return{analyserRef:t,masterEffects:n}};function Wo(e,t={}){const{progressive:n=!1}=t,[a,r]=i.useState([]),[s,o]=i.useState(!0),[l,c]=i.useState(null),[u,f]=i.useState(0),h=e.length;return i.useEffect(()=>{if(e.length===0){r([]),o(!1),f(0);return}let p=!1;const d=new AbortController,g=new Map,y=(m,w,x)=>{const C=x??m.audioBuffer;if(!C&&!m.waveformData)throw new Error(`Track ${w+1}: Must provide src, audioBuffer, or waveformData`);const k=C?.duration??m.waveformData?.duration,S=ia({audioBuffer:C,startTime:m.startTime??0,duration:m.duration??k,offset:m.offset??0,name:m.name||`Track ${w+1}`,fadeIn:m.fadeIn,fadeOut:m.fadeOut,waveformData:m.waveformData});if(isNaN(S.startSample)||isNaN(S.durationSamples)||isNaN(S.offsetSamples))throw console.error("Invalid clip values:",S),new Error(`Invalid clip values for track ${w+1}`);return{...la({name:m.name||`Track ${w+1}`,clips:[S],muted:m.muted??!1,soloed:m.soloed??!1,volume:m.volume??1,pan:m.pan??0,color:m.color}),effects:m.effects,renderMode:m.renderMode,spectrogramConfig:m.spectrogramConfig,spectrogramColorMap:m.spectrogramColorMap}};return(async()=>{try{o(!0),c(null),f(0);const m=oa.getContext().rawContext,w=e.map(async(C,k)=>{if(C.audioBuffer){const T=y(C,k,C.audioBuffer);return n&&!p&&(g.set(k,T),f(M=>M+1),r(Array.from({length:e.length},(M,W)=>g.get(W)).filter(M=>M!==void 0))),T}if(!C.src&&C.waveformData){const T=y(C,k);return n&&!p&&(g.set(k,T),f(M=>M+1),r(Array.from({length:e.length},(M,W)=>g.get(W)).filter(M=>M!==void 0))),T}if(!C.src)throw new Error(`Track ${k+1}: Must provide src, audioBuffer, or waveformData`);const S=await fetch(C.src,{signal:d.signal});if(!S.ok)throw new Error(`Failed to fetch ${C.src}: ${S.statusText}`);const I=await S.arrayBuffer(),A=await m.decodeAudioData(I);if(!A||!A.sampleRate||!A.duration)throw new Error(`Invalid audio buffer for ${C.src}`);const _=y(C,k,A);return n&&!p&&(g.set(k,_),f(T=>T+1),r(Array.from({length:e.length},(T,M)=>g.get(M)).filter(T=>T!==void 0))),_}),x=await Promise.all(w);p||(n||(r(x),f(x.length)),o(!1))}catch(m){if(!p){const w=m instanceof Error?m.message:"Unknown error loading audio";c(w),o(!1),console.error("Error loading audio tracks:",m)}}})(),()=>{p=!0,d.abort()}},[e,n]),{tracks:a,loading:s,error:l,loadedCount:u,totalCount:h}}function Po({tracks:e,onTracksChange:t,samplesPerPixel:n,sampleRate:a,engineRef:r,isDraggingRef:s}){const o=i.useRef(null),l=i.useCallback(p=>{const{transform:d,active:g}=p;if(!g?.data?.current)return{...d,scaleX:1,scaleY:1};const{trackIndex:y,clipIndex:b,boundary:m}=g.data.current;if(m)return{...d,scaleX:1,scaleY:1};const w=e[y];if(!w)return{...d,scaleX:1,scaleY:1};const x=w.clips[b];if(!x)return{...d,scaleX:1,scaleY:1};const C=d.x*n,k=Kt(w.clips),S=k.findIndex(_=>_.id===x.id),A=da(x,C,k,S)/n;return{...d,x:A,scaleX:1,scaleY:1}},[e,n]),c=i.useCallback(p=>{const{active:d}=p,{boundary:g}=d.data.current;if(!g){o.current=null;return}const{trackIndex:y,clipIndex:b}=d.data.current,w=e[y]?.clips[b];w&&(o.current={offsetSamples:w.offsetSamples,durationSamples:w.durationSamples,startSample:w.startSample},s.current=!0)},[e,s]),u=i.useCallback(p=>{const{active:d,delta:g}=p,{boundary:y}=d.data.current;if(!y||!o.current)return;const{trackIndex:b,clipIndex:m}=d.data.current,w=g.x*n,x=Math.floor(.1*a),C=o.current,k=e.map((S,I)=>{if(I!==b)return S;const A=[...S.clips].sort((M,W)=>M.startSample-W.startSample),_=A.findIndex(M=>M===S.clips[m]),T=S.clips.map((M,W)=>{if(W!==m)return M;if(y==="left"){const $={...M,startSample:C.startSample,offsetSamples:C.offsetSamples,durationSamples:C.durationSamples},B=qt($,Math.floor(w),"left",A,_,x),P=C.offsetSamples+B,N=C.durationSamples-B,U=C.startSample+B;return{...M,offsetSamples:P,durationSamples:N,startSample:U}}else{const $={...M,startSample:C.startSample,offsetSamples:C.offsetSamples,durationSamples:C.durationSamples},B=qt($,Math.floor(w),"right",A,_,x),P=C.durationSamples+B;return{...M,durationSamples:P}}});return{...S,clips:T}});t(k)},[e,t,n,a]),f=i.useCallback(p=>{const{active:d,delta:g}=p,{trackIndex:y,clipId:b,boundary:m}=d.data.current,w=g.x*n,x=e[y]?.id;if(m){s.current=!1,x?r.current?r.current.trimClip(x,b,m,Math.floor(w)):console.warn("[waveform-playlist] engineRef is null — trim not synced to adapter"):console.warn(`[waveform-playlist] onDragEnd: track at index ${y} not found — trim not synced to adapter`),o.current=null;return}x?r.current?r.current.moveClip(x,b,Math.floor(w)):console.warn("[waveform-playlist] engineRef is null — move not synced to adapter"):console.warn(`[waveform-playlist] onDragEnd: track at index ${y} not found — move not synced to adapter`)},[e,n,r,s]),h=i.useCallback(p=>{s.current=!1,o.current=null},[s]);return{onDragStart:c,onDragMove:u,onDragEnd:f,onDragCancel:h,collisionModifier:l}}const Nt=.01;function La({annotations:e,onAnnotationsChange:t,samplesPerPixel:n,sampleRate:a,duration:r,linkEndpoints:s}){const o=i.useRef(null),l=i.useCallback(f=>{const{active:h}=f,p=h.data.current;if(!p||p.annotationIndex===void 0){o.current=null;return}const d=e[p.annotationIndex];d&&(o.current={start:d.start,end:d.end,annotationIndex:p.annotationIndex})},[e]),c=i.useCallback(f=>{const{active:h,delta:p}=f;if(!o.current)return;const d=h.data.current;if(!d)return;const{edge:g,annotationIndex:y}=d,b=o.current,m=p.x*n/a,w=g==="start"?b.start+m:b.end+m,x=Vo({annotationIndex:y,newTime:w,isDraggingStart:g==="start",annotations:e,duration:r,linkEndpoints:s});t(x)},[e,t,n,a,r,s]),u=i.useCallback(()=>{o.current=null},[]);return{onDragStart:l,onDragMove:c,onDragEnd:u}}function Vo({annotationIndex:e,newTime:t,isDraggingStart:n,annotations:a,duration:r,linkEndpoints:s}){const o=[...a],l=a[e];if(n){const c=Math.min(l.end-.1,Math.max(0,t)),u=c-l.start;if(o[e]={...l,start:c},s&&e>0){const f=o[e-1];Math.abs(f.end-l.start)<Nt?o[e-1]={...f,end:Math.max(f.start+.1,f.end+u)}:c<=f.end&&(o[e]={...o[e],start:f.end})}else!s&&e>0&&c<o[e-1].end&&(o[e-1]={...o[e-1],end:c})}else{const c=Math.max(l.start+.1,Math.min(t,r)),u=c-l.end;if(o[e]={...l,end:c},s&&e<o.length-1){const f=o[e+1];if(Math.abs(f.start-l.end)<Nt){const h=f.start+u;o[e+1]={...f,start:Math.min(f.end-.1,h)};let p=e+1;for(;p<o.length-1;){const d=o[p],g=o[p+1];if(Math.abs(g.start-d.end)<Nt){const y=d.end-a[p].end;o[p+1]={...g,start:Math.min(g.end-.1,g.start+y)},p++}else break}}else c>=f.start&&(o[e]={...o[e],end:f.start})}else if(!s&&e<o.length-1&&c>o[e+1].start){const f=o[e+1];o[e+1]={...f,start:c};let h=e+1;for(;h<o.length-1;){const p=o[h],d=o[h+1];if(p.end>d.start)o[h+1]={...d,start:p.end},h++;else break}}}return o}function Zo(e={}){const{touchOptimized:t=!1,touchDelay:n=250,touchTolerance:a=5,mouseDistance:r=1}=e,s=Ge.useSensor(Ge.MouseSensor,{activationConstraint:{distance:r}}),o=Ge.useSensor(Ge.TouchSensor,{activationConstraint:t?{delay:n,tolerance:a}:{distance:r}}),l=Ge.useSensor(Ge.PointerSensor,{activationConstraint:{distance:r}});return Ge.useSensors(...t?[s,o]:[l])}const Lo=e=>{const{tracks:t,sampleRate:n,engineRef:a}=e,{currentTimeRef:r}=We(),{selectedTrackId:s}=Pe(),o=i.useCallback((c,u,f)=>{const{samplesPerPixel:h}=e,p=t[c];if(!p)return!1;const d=p.clips[u];if(!d)return!1;const g=Math.round(f*n),y=Ar(g,h),b=Math.floor(.1*n);if(!fa(d,y,b))return console.warn("Split point is invalid (outside bounds or too close to edge)"),!1;const m=a.current;return m?(m.splitClip(p.id,d.id,y),!0):(console.warn("[waveform-playlist] engineRef is null — split not synced to adapter"),!1)},[t,e,n,a]);return{splitClipAtPlayhead:i.useCallback(()=>{if(!s)return console.warn("[waveform-playlist] No track selected — click a clip to select a track first"),!1;const c=t.findIndex(h=>h.id===s);if(c===-1)return console.warn("Selected track not found"),!1;const u=t[c],f=r.current??0;for(let h=0;h<u.clips.length;h++){const p=u.clips[h],d=p.startSample/n,g=(p.startSample+p.durationSamples)/n;if(f>d&&f<g)return o(c,h,f)}return console.warn(`[waveform-playlist] No clip found at playhead position on track "${u.name}"`),!1},[t,r,s,o,n]),splitClipAt:o}},Ft=e=>{const{shortcuts:t,enabled:n=!0}=e,a=i.useCallback(r=>{if(!n)return;const s=r.target;if(s.tagName==="INPUT"||s.tagName==="TEXTAREA"||s.isContentEditable)return;const o=t.find(l=>{const c=r.key.toLowerCase()===l.key.toLowerCase()||r.key===l.key,u=l.ctrlKey===void 0||r.ctrlKey===l.ctrlKey,f=l.shiftKey===void 0||r.shiftKey===l.shiftKey,h=l.metaKey===void 0||r.metaKey===l.metaKey,p=l.altKey===void 0||r.altKey===l.altKey;return c&&u&&f&&h&&p});o&&(o.preventDefault!==!1&&r.preventDefault(),o.action())},[t,n]);i.useEffect(()=>{if(n)return window.addEventListener("keydown",a),()=>{window.removeEventListener("keydown",a)}},[a,n])},jo=e=>{const t=[],n=typeof navigator<"u"&&navigator.platform.includes("Mac");return e.metaKey&&t.push(n?"Cmd":"Ctrl"),e.ctrlKey&&!e.metaKey&&t.push("Ctrl"),e.altKey&&t.push(n?"Option":"Alt"),e.shiftKey&&t.push("Shift"),t.push(e.key.toUpperCase()),t.join("+")},zo=(e={})=>{const{enabled:t=!0,additionalShortcuts:n=[],shortcuts:a}=e,{isPlaying:r}=We(),{setCurrentTime:s,play:o,pause:l,stop:c}=pe(),{playoutRef:u}=_e(),f=i.useCallback(()=>{r?l():o()},[r,o,l]),h=i.useCallback(()=>{c()},[c]),p=i.useCallback(()=>{r&&u.current?(u.current.stop(),s(0),o(0)):s(0)},[r,u,s,o]),g=a??[...[{key:" ",action:f,description:"Play/Pause",preventDefault:!0},{key:"Escape",action:h,description:"Stop",preventDefault:!0},{key:"0",action:p,description:"Rewind to start",preventDefault:!0}],...n];return Ft({shortcuts:g,enabled:t}),{rewindToStart:p,togglePlayPause:f,stopPlayback:h,shortcuts:g}},Gt=.01,Tt=.01;function Ho({annotations:e,activeAnnotationId:t,onAnnotationsChange:n,onActiveAnnotationChange:a,duration:r,linkEndpoints:s,continuousPlay:o=!1,enabled:l=!0,scrollContainerRef:c,samplesPerPixel:u,sampleRate:f,controlsWidth:h=0,onPlay:p}){const d=i.useMemo(()=>t?e.findIndex(_=>_.id===t):-1,[e,t]),g=i.useCallback(_=>{if(!c?.current||!u||!f)return;const T=e.find(V=>V.id===_);if(!T)return;const M=c.current,W=M.clientWidth,$=T.start*f/u+h,B=T.end*f/u+h,P=($+B)/2,N=M.scrollLeft,U=N,J=N+W;if($<U||B>J){const V=Math.max(0,P-W/2);M.scrollTo({left:V,behavior:"smooth"})}},[e,c,u,f,h]);i.useEffect(()=>{t&&c?.current&&u&&f&&g(t)},[t,g,c,u,f]);const y=i.useCallback(_=>{if(d<0)return;const T=e[d],M=Math.max(0,Math.min(T.end-.1,T.start+_)),W=M-T.start,$=[...e];if($[d]={...T,start:M},s&&d>0){const B=$[d-1];Math.abs(B.end-T.start)<Gt&&($[d-1]={...B,end:Math.max(B.start+.1,B.end+W)})}else if(!s&&d>0){const B=$[d-1];M<B.end&&($[d-1]={...B,end:M})}n($)},[e,d,s,n]),b=i.useCallback(_=>{if(d<0)return;const T=e[d],M=Math.max(T.start+.1,Math.min(r,T.end+_)),W=M-T.end,$=[...e];if($[d]={...T,end:M},s&&d<e.length-1){const B=$[d+1];if(Math.abs(B.start-T.end)<Gt){const P=Math.min(B.end-.1,B.start+W);$[d+1]={...B,start:P};let N=d+1;for(;N<$.length-1;){const U=$[N],J=$[N+1];if(Math.abs(J.start-e[N].end)<Gt){const V=U.end-e[N].end;$[N+1]={...J,start:Math.min(J.end-.1,J.start+V)},N++}else break}}}else if(!s&&d<e.length-1){const B=$[d+1];if(M>B.start){$[d+1]={...B,start:M};let P=d+1;for(;P<$.length-1;){const N=$[P],U=$[P+1];if(N.end>U.start)$[P+1]={...U,start:N.end},P++;else break}}}n($)},[e,d,r,s,n]),m=i.useCallback(()=>{!a||e.length===0||(d<=0?a(e[e.length-1].id):a(e[d-1].id))},[e,d,a]),w=i.useCallback(()=>{!a||e.length===0||(d<0||d>=e.length-1?a(e[0].id):a(e[d+1].id))},[e,d,a]),x=i.useCallback(()=>{!a||e.length===0||a(e[0].id)},[e,a]),C=i.useCallback(()=>{!a||e.length===0||a(e[e.length-1].id)},[e,a]),k=i.useCallback(()=>{a&&a(null)},[a]),S=i.useCallback(()=>{if(d<0||!p)return;const _=e[d],T=o?void 0:_.end-_.start;p(_.start,T)},[e,d,o,p]),I=i.useMemo(()=>[{key:"[",action:()=>y(-Tt),description:"Move annotation start earlier",preventDefault:!0},{key:"]",action:()=>y(Tt),description:"Move annotation start later",preventDefault:!0},{key:"{",shiftKey:!0,action:()=>b(-Tt),description:"Move annotation end earlier",preventDefault:!0},{key:"}",shiftKey:!0,action:()=>b(Tt),description:"Move annotation end later",preventDefault:!0},{key:"Enter",action:S,description:"Play selected annotation",preventDefault:!0}],[y,b,S]),A=i.useMemo(()=>[{key:"ArrowUp",action:m,description:"Select previous annotation",preventDefault:!0},{key:"ArrowLeft",action:m,description:"Select previous annotation",preventDefault:!0},{key:"ArrowDown",action:w,description:"Select next annotation",preventDefault:!0},{key:"ArrowRight",action:w,description:"Select next annotation",preventDefault:!0},{key:"Home",action:x,description:"Select first annotation",preventDefault:!0},{key:"End",action:C,description:"Select last annotation",preventDefault:!0},{key:"Escape",action:k,description:"Deselect annotation",preventDefault:!0}],[m,w,x,C,k]);return Ft({shortcuts:I,enabled:l&&d>=0}),Ft({shortcuts:A,enabled:l&&e.length>0&&!!a}),{moveStartBoundary:y,moveEndBoundary:b,selectPrevious:m,selectNext:w,selectFirst:x,selectLast:C,clearSelection:k,scrollToAnnotation:g,playActiveAnnotation:S}}const kt=[{id:"reverb",name:"Reverb",category:"reverb",description:"Simple convolution reverb with adjustable decay time",parameters:[{name:"decay",label:"Decay",type:"number",min:.1,max:10,step:.1,default:1.5,unit:"s"},{name:"wet",label:"Mix",type:"number",min:0,max:1,step:.01,default:.5}]},{id:"freeverb",name:"Freeverb",category:"reverb",description:"Classic Schroeder/Moorer reverb with room size and dampening",parameters:[{name:"roomSize",label:"Room Size",type:"number",min:0,max:1,step:.01,default:.7},{name:"dampening",label:"Dampening",type:"number",min:0,max:1e4,step:100,default:3e3,unit:"Hz"},{name:"wet",label:"Mix",type:"number",min:0,max:1,step:.01,default:.5}]},{id:"jcReverb",name:"JC Reverb",category:"reverb",description:"Attempt at Roland JC-120 chorus reverb emulation",parameters:[{name:"roomSize",label:"Room Size",type:"number",min:0,max:1,step:.01,default:.5},{name:"wet",label:"Mix",type:"number",min:0,max:1,step:.01,default:.5}]},{id:"feedbackDelay",name:"Feedback Delay",category:"delay",description:"Delay line with feedback for echo effects",parameters:[{name:"delayTime",label:"Delay Time",type:"number",min:0,max:1,step:.01,default:.25,unit:"s"},{name:"feedback",label:"Feedback",type:"number",min:0,max:.95,step:.01,default:.5},{name:"wet",label:"Mix",type:"number",min:0,max:1,step:.01,default:.5}]},{id:"pingPongDelay",name:"Ping Pong Delay",category:"delay",description:"Stereo delay bouncing between left and right channels",parameters:[{name:"delayTime",label:"Delay Time",type:"number",min:0,max:1,step:.01,default:.25,unit:"s"},{name:"feedback",label:"Feedback",type:"number",min:0,max:.95,step:.01,default:.5},{name:"wet",label:"Mix",type:"number",min:0,max:1,step:.01,default:.5}]},{id:"chorus",name:"Chorus",category:"modulation",description:"Creates thickness by layering detuned copies of the signal",parameters:[{name:"frequency",label:"Rate",type:"number",min:.1,max:10,step:.1,default:1.5,unit:"Hz"},{name:"delayTime",label:"Delay",type:"number",min:0,max:20,step:.5,default:3.5,unit:"ms"},{name:"depth",label:"Depth",type:"number",min:0,max:1,step:.01,default:.7},{name:"wet",label:"Mix",type:"number",min:0,max:1,step:.01,default:.5}]},{id:"phaser",name:"Phaser",category:"modulation",description:"Classic phaser effect using allpass filters",parameters:[{name:"frequency",label:"Rate",type:"number",min:.1,max:10,step:.1,default:.5,unit:"Hz"},{name:"octaves",label:"Octaves",type:"number",min:1,max:6,step:1,default:3},{name:"baseFrequency",label:"Base Freq",type:"number",min:100,max:2e3,step:10,default:350,unit:"Hz"},{name:"wet",label:"Mix",type:"number",min:0,max:1,step:.01,default:.5}]},{id:"tremolo",name:"Tremolo",category:"modulation",description:"Rhythmic volume modulation",parameters:[{name:"frequency",label:"Rate",type:"number",min:.1,max:20,step:.1,default:4,unit:"Hz"},{name:"depth",label:"Depth",type:"number",min:0,max:1,step:.01,default:.5},{name:"wet",label:"Mix",type:"number",min:0,max:1,step:.01,default:1}]},{id:"vibrato",name:"Vibrato",category:"modulation",description:"Pitch modulation effect",parameters:[{name:"frequency",label:"Rate",type:"number",min:.1,max:20,step:.1,default:5,unit:"Hz"},{name:"depth",label:"Depth",type:"number",min:0,max:1,step:.01,default:.1},{name:"wet",label:"Mix",type:"number",min:0,max:1,step:.01,default:1}]},{id:"autoPanner",name:"Auto Panner",category:"modulation",description:"Automatic left-right panning",parameters:[{name:"frequency",label:"Rate",type:"number",min:.1,max:10,step:.1,default:1,unit:"Hz"},{name:"depth",label:"Depth",type:"number",min:0,max:1,step:.01,default:1},{name:"wet",label:"Mix",type:"number",min:0,max:1,step:.01,default:1}]},{id:"autoFilter",name:"Auto Filter",category:"filter",description:"Automated filter sweep with LFO",parameters:[{name:"frequency",label:"Rate",type:"number",min:.1,max:10,step:.1,default:1,unit:"Hz"},{name:"baseFrequency",label:"Base Freq",type:"number",min:20,max:2e3,step:10,default:200,unit:"Hz"},{name:"octaves",label:"Octaves",type:"number",min:.5,max:8,step:.5,default:2.6},{name:"depth",label:"Depth",type:"number",min:0,max:1,step:.01,default:1},{name:"wet",label:"Mix",type:"number",min:0,max:1,step:.01,default:1}]},{id:"autoWah",name:"Auto Wah",category:"filter",description:"Envelope follower filter effect",parameters:[{name:"baseFrequency",label:"Base Freq",type:"number",min:20,max:500,step:10,default:100,unit:"Hz"},{name:"octaves",label:"Octaves",type:"number",min:1,max:8,step:1,default:6},{name:"sensitivity",label:"Sensitivity",type:"number",min:-40,max:0,step:1,default:0,unit:"dB"},{name:"wet",label:"Mix",type:"number",min:0,max:1,step:.01,default:1}]},{id:"eq3",name:"3-Band EQ",category:"filter",description:"Three band equalizer with low, mid, and high controls",parameters:[{name:"low",label:"Low",type:"number",min:-24,max:24,step:.5,default:0,unit:"dB"},{name:"mid",label:"Mid",type:"number",min:-24,max:24,step:.5,default:0,unit:"dB"},{name:"high",label:"High",type:"number",min:-24,max:24,step:.5,default:0,unit:"dB"},{name:"lowFrequency",label:"Low Freq",type:"number",min:20,max:500,step:10,default:400,unit:"Hz"},{name:"highFrequency",label:"High Freq",type:"number",min:1e3,max:1e4,step:100,default:2500,unit:"Hz"}]},{id:"distortion",name:"Distortion",category:"distortion",description:"Wave shaping distortion effect",parameters:[{name:"distortion",label:"Drive",type:"number",min:0,max:1,step:.01,default:.4},{name:"wet",label:"Mix",type:"number",min:0,max:1,step:.01,default:1}]},{id:"bitCrusher",name:"Bit Crusher",category:"distortion",description:"Reduces bit depth for lo-fi digital texture",parameters:[{name:"bits",label:"Bits",type:"number",min:1,max:16,step:1,default:4},{name:"wet",label:"Mix",type:"number",min:0,max:1,step:.01,default:1}]},{id:"chebyshev",name:"Chebyshev",category:"distortion",description:"Waveshaping distortion using Chebyshev polynomials",parameters:[{name:"order",label:"Order",type:"number",min:1,max:100,step:1,default:50},{name:"wet",label:"Mix",type:"number",min:0,max:1,step:.01,default:1}]},{id:"compressor",name:"Compressor",category:"dynamics",description:"Dynamic range compressor",parameters:[{name:"threshold",label:"Threshold",type:"number",min:-60,max:0,step:1,default:-24,unit:"dB"},{name:"ratio",label:"Ratio",type:"number",min:1,max:20,step:.5,default:4},{name:"attack",label:"Attack",type:"number",min:0,max:1,step:.001,default:.003,unit:"s"},{name:"release",label:"Release",type:"number",min:0,max:1,step:.01,default:.25,unit:"s"},{name:"knee",label:"Knee",type:"number",min:0,max:40,step:1,default:30,unit:"dB"}]},{id:"limiter",name:"Limiter",category:"dynamics",description:"Hard limiter to prevent clipping",parameters:[{name:"threshold",label:"Threshold",type:"number",min:-12,max:0,step:.5,default:-6,unit:"dB"}]},{id:"gate",name:"Gate",category:"dynamics",description:"Noise gate to silence signal below threshold",parameters:[{name:"threshold",label:"Threshold",type:"number",min:-100,max:0,step:1,default:-40,unit:"dB"},{name:"attack",label:"Attack",type:"number",min:0,max:.3,step:.001,default:.001,unit:"s"},{name:"release",label:"Release",type:"number",min:0,max:.5,step:.01,default:.1,unit:"s"}]},{id:"stereoWidener",name:"Stereo Widener",category:"spatial",description:"Expands or narrows the stereo image",parameters:[{name:"width",label:"Width",type:"number",min:0,max:1,step:.01,default:.5}]}],cn=e=>kt.find(t=>t.id===e),Xo=e=>kt.filter(t=>t.category===e),Oo=[{id:"reverb",name:"Reverb"},{id:"delay",name:"Delay"},{id:"modulation",name:"Modulation"},{id:"filter",name:"Filter"},{id:"distortion",name:"Distortion"},{id:"dynamics",name:"Dynamics"},{id:"spatial",name:"Spatial"}];const No={reverb:Z.Reverb,freeverb:Z.Freeverb,jcReverb:Z.JCReverb,feedbackDelay:Z.FeedbackDelay,pingPongDelay:Z.PingPongDelay,chorus:Z.Chorus,phaser:Z.Phaser,tremolo:Z.Tremolo,vibrato:Z.Vibrato,autoPanner:Z.AutoPanner,autoFilter:Z.AutoFilter,autoWah:Z.AutoWah,eq3:Z.EQ3,distortion:Z.Distortion,bitCrusher:Z.BitCrusher,chebyshev:Z.Chebyshev,compressor:Z.Compressor,limiter:Z.Limiter,gate:Z.Gate,stereoWidener:Z.StereoWidener};let Go=0;const Yo=()=>`effect_${Date.now()}_${++Go}`;function Ct(e,t){const n=No[e.id];if(!n)throw new Error(`Unknown effect type: ${e.id}`);const a={};e.parameters.forEach(l=>{const c=t?.[l.name]??l.default;a[l.name]=c});const r=new n(a),s=Yo(),o=r;return{effect:r,id:e.id,instanceId:s,dispose(){try{r.disconnect(),r.dispose()}catch(l){console.warn(`[waveform-playlist] Error disposing effect "${e.id}" (${s}):`,l)}},setParameter(l,c){const u=o[l];if(l==="wet"){const f=o.wet;if(f&&typeof f=="object"&&"value"in f){f.value=c;return}}u!==void 0&&(u&&typeof u=="object"&&"value"in u?u.value=c:o[l]=c)},getParameter(l){if(l==="wet"){const u=o.wet;if(u&&typeof u=="object"&&"value"in u)return u.value}const c=o[l];if(c!==void 0)return c&&typeof c=="object"&&"value"in c?c.value:c},connect(l){r.connect(l)},disconnect(){try{r.disconnect()}catch(l){console.warn(`[waveform-playlist] Error disconnecting effect "${e.id}" (${s}):`,l)}}}}function Uo(e){if(e.length===0)throw new Error("Cannot create effect chain with no effects");for(let t=0;t<e.length-1;t++)e[t].effect.connect(e[t+1].effect);return{input:e[0].effect,output:e[e.length-1].effect,dispose(){e.forEach(t=>t.dispose())}}}function Ko(e=256){const[t,n]=i.useState([]),a=i.useRef(t);a.current=t;const r=i.useRef(new Map),s=i.useRef(null),o=i.useRef(null),l=i.useCallback(b=>{const m=o.current;if(!m)return;const{masterGainNode:w,destination:x,analyserNode:C}=m;try{w.disconnect()}catch(S){console.warn("[waveform-playlist] Error disconnecting master effects chain:",S)}const k=b.map(S=>r.current.get(S.instanceId)).filter(S=>S!==void 0);if(k.length===0)w.connect(C),C.connect(x);else{let S=w;k.forEach(I=>{try{I.disconnect()}catch(A){console.warn(`[waveform-playlist] Error disconnecting effect "${I.id}":`,A)}S.connect(I.effect),S=I.effect}),S.connect(C),C.connect(x)}},[]),c=i.useCallback(b=>{const m=cn(b);if(!m){console.error(`Unknown effect: ${b}`);return}const w={};m.parameters.forEach(k=>{w[k.name]=k.default});const x=Ct(m,w);r.current.set(x.instanceId,x);const C={instanceId:x.instanceId,effectId:m.id,definition:m,params:w,bypassed:!1};n(k=>[...k,C])},[]),u=i.useCallback(b=>{const m=r.current.get(b);m&&(m.dispose(),r.current.delete(b)),n(w=>w.filter(x=>x.instanceId!==b))},[]),f=i.useCallback((b,m,w)=>{const x=r.current.get(b);x&&x.setParameter(m,w),n(C=>C.map(k=>k.instanceId===b?{...k,params:{...k.params,[m]:w}}:k))},[]),h=i.useCallback(b=>{const m=a.current.find(C=>C.instanceId===b);if(!m)return;const w=!m.bypassed,x=r.current.get(b);if(x){const C=m.params.wet??1;x.setParameter("wet",w?0:C)}n(C=>C.map(k=>k.instanceId===b?{...k,bypassed:w}:k))},[]),p=i.useCallback((b,m)=>{n(w=>{const x=[...w],[C]=x.splice(b,1);return x.splice(m,0,C),x})},[]),d=i.useCallback(()=>{r.current.forEach(b=>b.dispose()),r.current.clear(),n([])},[]);i.useEffect(()=>{l(t)},[t,l]);const g=i.useCallback((b,m,w)=>{const x=new Z.Analyser("fft",e);s.current=x,o.current={masterGainNode:b,destination:m,analyserNode:x};const k=a.current.map(S=>r.current.get(S.instanceId)).filter(S=>S!==void 0);if(k.length===0)b.connect(x),x.connect(m);else{let S=b;k.forEach(I=>{S.connect(I.effect),S=I.effect}),S.connect(x),x.connect(m)}return function(){x.dispose(),s.current=null,o.current=null}},[e]);i.useEffect(()=>{const b=r.current;return()=>{b.forEach(m=>m.dispose()),b.clear()}},[]);const y=i.useCallback(()=>{const b=t.filter(m=>!m.bypassed);if(b.length!==0)return(m,w,x)=>{const C=[];for(const k of b){const S=Ct(k.definition,k.params);C.push(S)}if(C.length===0)m.connect(w);else{let k=m;C.forEach(S=>{k.connect(S.effect),k=S.effect}),k.connect(w)}return function(){C.forEach(S=>S.dispose())}}},[t]);return{activeEffects:t,availableEffects:kt,addEffect:c,removeEffect:u,updateParameter:f,toggleBypass:h,reorderEffects:p,clearAllEffects:d,masterEffects:g,createOfflineEffectsFunction:y,analyserRef:s}}function qo(){const[e,t]=i.useState(new Map),n=i.useRef(new Map),a=i.useRef(new Map),r=i.useCallback((d,g)=>{const y=a.current.get(d);if(!y)return;const{graphEnd:b,masterGainNode:m}=y,w=n.current.get(d);try{b.disconnect()}catch(C){console.warn(`[waveform-playlist] Error disconnecting track "${d}" effect chain:`,C)}const x=g.map(C=>w?.get(C.instanceId)).filter(C=>C!==void 0);if(x.length===0)b.connect(m);else{let C=b;x.forEach(k=>{try{k.disconnect()}catch(S){console.warn(`[waveform-playlist] Error disconnecting effect "${k.id}" on track "${d}":`,S)}C.connect(k.effect),C=k.effect}),C.connect(m)}},[]),s=i.useCallback((d,g)=>{const y=cn(g);if(!y){console.error(`Unknown effect: ${g}`);return}const b={};y.parameters.forEach(x=>{b[x.name]=x.default});const m=Ct(y,b);n.current.has(d)||n.current.set(d,new Map),n.current.get(d).set(m.instanceId,m);const w={instanceId:m.instanceId,effectId:y.id,definition:y,params:b,bypassed:!1};t(x=>{const C=new Map(x),k=C.get(d)||[];return C.set(d,[...k,w]),C})},[]),o=i.useCallback((d,g)=>{const y=n.current.get(d),b=y?.get(g);b&&(b.dispose(),y?.delete(g)),t(m=>{const w=new Map(m),x=w.get(d)||[];return w.set(d,x.filter(C=>C.instanceId!==g)),w})},[]),l=i.useCallback((d,g,y,b)=>{const w=n.current.get(d)?.get(g);w&&w.setParameter(y,b),t(x=>{const C=new Map(x),k=C.get(d)||[];return C.set(d,k.map(S=>S.instanceId===g?{...S,params:{...S.params,[y]:b}}:S)),C})},[]),c=i.useCallback((d,g)=>{const b=(f.current.get(d)||[]).find(C=>C.instanceId===g);if(!b)return;const m=!b.bypassed,x=n.current.get(d)?.get(g);if(x){const C=b.params.wet??1;x.setParameter("wet",m?0:C)}t(C=>{const k=new Map(C),S=k.get(d)||[];return k.set(d,S.map(I=>I.instanceId===g?{...I,bypassed:m}:I)),k})},[]),u=i.useCallback(d=>{const g=n.current.get(d);g&&(g.forEach(y=>y.dispose()),g.clear()),t(y=>{const b=new Map(y);return b.set(d,[]),b})},[]),f=i.useRef(e);f.current=e;const h=i.useCallback(d=>(g,y,b)=>{a.current.set(d,{graphEnd:g,masterGainNode:y});const m=f.current.get(d)||[],w=n.current.get(d),x=m.map(C=>w?.get(C.instanceId)).filter(C=>C!==void 0);if(x.length===0)g.connect(y);else{let C=g;x.forEach(k=>{C.connect(k.effect),C=k.effect}),C.connect(y)}return function(){a.current.delete(d)}},[]);i.useEffect(()=>{e.forEach((d,g)=>{r(g,d)})},[e,r]),i.useEffect(()=>{const d=n.current;return()=>{d.forEach(g=>{g.forEach(y=>y.dispose()),g.clear()}),d.clear()}},[]);const p=i.useCallback(d=>{const y=(e.get(d)||[]).filter(b=>!b.bypassed);if(y.length!==0)return(b,m,w)=>{const x=[];for(const C of y){const k=Ct(C.definition,C.params);x.push(k)}if(x.length===0)b.connect(m);else{let C=b;x.forEach(k=>{C.connect(k.effect),C=k.effect}),C.connect(m)}return function(){x.forEach(k=>k.dispose())}}},[e]);return{trackEffectsState:e,addEffectToTrack:s,removeEffectFromTrack:o,updateTrackEffectParameter:l,toggleBypass:c,clearTrackEffects:u,getTrackEffectsFunction:h,createOfflineTrackEffectsFunction:p,availableEffects:kt}}function Jo(e,t={}){const{bitDepth:n=16}=t,a=e.numberOfChannels,r=e.sampleRate,s=e.length,o=n/8,l=a*o,c=r*l,u=s*l,f=44,h=f+u,p=new ArrayBuffer(h),d=new DataView(p);$t(d,0,"RIFF"),d.setUint32(4,h-8,!0),$t(d,8,"WAVE"),$t(d,12,"fmt "),d.setUint32(16,16,!0),d.setUint16(20,n===32?3:1,!0),d.setUint16(22,a,!0),d.setUint32(24,r,!0),d.setUint32(28,c,!0),d.setUint16(32,l,!0),d.setUint16(34,n,!0),$t(d,36,"data"),d.setUint32(40,u,!0);const g=[];for(let b=0;b<a;b++)g.push(e.getChannelData(b));let y=f;if(n===16)for(let b=0;b<s;b++)for(let m=0;m<a;m++){const w=g[m][b],x=Math.max(-1,Math.min(1,w)),C=x<0?x*32768:x*32767;d.setInt16(y,C,!0),y+=2}else for(let b=0;b<s;b++)for(let m=0;m<a;m++)d.setFloat32(y,g[m][b],!0),y+=4;return new Blob([p],{type:"audio/wav"})}function $t(e,t,n){for(let a=0;a<n.length;a++)e.setUint8(t+a,n.charCodeAt(a))}function Qo(e,t){const n=URL.createObjectURL(e),a=document.createElement("a");a.href=n,a.download=t,a.style.display="none",document.body.appendChild(a),a.click(),document.body.removeChild(a),URL.revokeObjectURL(n)}function ja(){const[e,t]=i.useState(!1),[n,a]=i.useState(0),[r,s]=i.useState(null);return{exportWav:i.useCallback(async(l,c,u={})=>{const{filename:f="export",mode:h="master",trackIndex:p,autoDownload:d=!0,applyEffects:g=!0,effectsFunction:y,createOfflineTrackEffects:b,bitDepth:m=16,onProgress:w}=u;t(!0),a(0),s(null);try{if(l.length===0)throw new Error("No tracks to export");if(h==="individual"&&(p===void 0||p<0||p>=l.length))throw new Error("Invalid track index for individual export");const x=l[0].clips[0]?.sampleRate||44100;let C=0;for(const M of l)for(const W of M.clips){const $=W.startSample+W.durationSamples;C=Math.max(C,$)}C+=Math.round(x*.1);const k=C/x,S=h==="individual"?[{track:l[p],state:c[p],index:p}]:l.map((M,W)=>({track:M,state:c[W],index:W})),I=c.some(M=>M.soloed),A=!!b;let _;if((y||A)&&g)_=await ei(S,c,I,k,x,y,b,M=>{a(M),w?.(M)});else{const M=new OfflineAudioContext(2,C,x);let W=0;const $=S.reduce((B,{track:P})=>B+P.clips.length,0);for(const{track:B,state:P}of S)if(!(P.muted&&!P.soloed)&&!(I&&!P.soloed))for(const N of B.clips){await ni(M,N,P,x,g),W++;const U=W/$*.5;a(U),w?.(U)}a(.5),w?.(.5),_=await M.startRendering()}a(.9),w?.(.9);const T=Jo(_,{bitDepth:m});if(a(1),w?.(1),d){const M=h==="individual"?`${f}_${l[p].name}`:f;Qo(T,`${M}.wav`)}return{audioBuffer:_,blob:T,duration:k}}catch(x){const C=x instanceof Error?x.message:"Export failed";throw s(C),x}finally{t(!1)}},[]),isExporting:e,progress:n,error:r}}async function ei(e,t,n,a,r,s,o,l){const{Offline:c,Volume:u,Gain:f,Panner:h,Player:p,ToneAudioBuffer:d}=await import("tone");l(.1);let g;try{g=await c(async({transport:y,destination:b})=>{const m=new u(0);let w;s?w=s(m,b,!0):m.connect(b);for(const{track:x,state:C}of e){if(C.muted&&!C.soloed||n&&!C.soloed)continue;const k=new u(ti(C.volume)),S=new h(C.pan),I=new f(C.muted?0:1),A=o?.(x.id);A?A(I,m,!0):I.connect(m),S.connect(I),k.connect(S);for(const _ of x.clips){const{audioBuffer:T,startSample:M,durationSamples:W,offsetSamples:$,gain:B,fadeIn:P,fadeOut:N}=_,U=M/r,J=W/r,V=$/r,te=new d(T),se=new p(te),Q=new f(B);if(se.connect(Q),Q.connect(k),P){const le=U,ce=U+P.duration,ue=Dt(Q.gain);ue&&(ue.setValueAtTime(0,le),ue.linearRampToValueAtTime(B,ce))}if(N){const le=U+J-N.duration,ce=U+J,ue=Dt(Q.gain);ue&&(ue.setValueAtTime(B,le),ue.linearRampToValueAtTime(0,ce))}se.start(U,V,J)}}y.start(0)},a,2,r)}catch(y){throw y instanceof Error?y:new Error(`Tone.Offline rendering failed: ${String(y)}`)}return l(.9),g.get()}function ti(e){return 20*Math.log10(Math.max(e,1e-4))}async function ni(e,t,n,a,r){const{audioBuffer:s,startSample:o,durationSamples:l,offsetSamples:c,gain:u,fadeIn:f,fadeOut:h}=t;if(!s){console.warn(`Skipping clip "${t.name||t.id}" - no audioBuffer for export`);return}const p=o/a,d=l/a,g=c/a,y=e.createBufferSource();y.buffer=s;const b=e.createGain(),m=u*n.volume,w=e.createStereoPanner();if(w.pan.value=n.pan,y.connect(b),b.connect(w),w.connect(e.destination),r){if(f?b.gain.setValueAtTime(0,p):b.gain.setValueAtTime(m,p),f){const x=p,C=p+f.duration;ta(b.gain,x,C,0,m,f.type||"linear")}if(h){const x=p+d-h.duration,C=p+d;(!f||f.duration<d-h.duration)&&b.gain.setValueAtTime(m,x),ta(b.gain,x,C,m,0,h.type||"linear")}}else b.gain.setValueAtTime(m,p);y.start(p,g,d)}function ta(e,t,n,a,r,s){const o=n-t;if(!(o<=0))switch(s){case"linear":e.setValueAtTime(a,t),e.linearRampToValueAtTime(r,n);break;case"exponential":{const l=Math.max(a,1e-4),c=Math.max(r,1e-4);e.setValueAtTime(l,t),e.exponentialRampToValueAtTime(c,n),r===0&&e.setValueAtTime(0,n);break}case"logarithmic":{const l=na(a,r,256,"logarithmic");e.setValueCurveAtTime(l,t,o);break}case"sCurve":{const l=na(a,r,256,"sCurve");e.setValueCurveAtTime(l,t,o);break}default:e.setValueAtTime(a,t),e.linearRampToValueAtTime(r,n)}}function na(e,t,n,a){const r=new Float32Array(n),s=t-e;for(let o=0;o<n;o++){const l=o/(n-1);let c;a==="logarithmic"?s>0?c=Math.log10(1+l*9)/Math.log10(10):c=1-Math.log10(1+(1-l)*9)/Math.log10(10):c=l*l*(3-2*l),r[o]=e+s*c}return r}const za=()=>{const e=i.useRef(null),t=i.useCallback(()=>{e.current!==null&&(cancelAnimationFrame(e.current),e.current=null)},[]),n=i.useCallback(a=>{t(),e.current=requestAnimationFrame(a)},[t]);return i.useEffect(()=>()=>{t()},[t]),{animationFrameRef:e,startAnimationFrameLoop:n,stopAnimationFrameLoop:t}},ai=`
799
799
  "use strict";
800
800
 
801
801
  var INT8_MAX = 127;
@@ -942,13 +942,13 @@ self.onmessage = function(e) {
942
942
  self.postMessage({ id: msg.id, error: err.message || String(err) });
943
943
  }
944
944
  };
945
- `;let $s=0;function Ts(){let e;try{const a=new Blob([Es],{type:"application/javascript"}),r=URL.createObjectURL(a);e=new Worker(r),URL.revokeObjectURL(r)}catch(a){return console.warn("[waveform-playlist] Failed to create peaks worker (CSP restriction?):",a),{generate(){return Promise.reject(new Error("Worker creation failed"))},terminate(){}}}const t=new Map;let n=!1;return e.onmessage=a=>{const r=a.data,s=t.get(r.id);if(s)if(t.delete(r.id),r.error)s.reject(new Error(r.error));else try{const i=Ze.create(r.buffer);s.resolve(i)}catch(i){s.reject(i)}},e.onerror=a=>{n=!0,e.terminate();for(const[,r]of t)r.reject(a.error??new Error(a.message));t.clear()},{generate(a){if(n)return Promise.reject(new Error("Worker terminated"));const r=String(++$s);return new Promise((s,i)=>{t.set(r,{resolve:s,reject:i}),e.postMessage({id:r,scale:a.scale,bits:a.bits,amplitude_scale:1,split_channels:a.splitChannels,length:a.length,sample_rate:a.sampleRate,channels:a.channels},a.channels)})},terminate(){n=!0,e.terminate();for(const[,a]of t)a.reject(new Error("Worker terminated"));t.clear()}}}function Rs(e,t){const[n,a]=o.useState(()=>new Map),[r,s]=o.useState(!1),i=o.useRef(null),l=o.useRef(new Set),c=o.useRef(0),u=o.useCallback(()=>(i.current||(i.current=Ts()),i.current),[]);return o.useEffect(()=>{let m=!1;const h=l.current,p=[];for(const w of e)for(const g of w.clips)g.audioBuffer&&!g.waveformData&&!h.has(g.id)&&p.push({clipId:g.id,audioBuffer:g.audioBuffer});if(p.length===0)return;const f=new Set;for(const{clipId:w}of p)h.add(w),f.add(w);c.current+=p.length,s(!0);const b=u();for(const{clipId:w,audioBuffer:g}of p){const d=[];for(let x=0;x<g.numberOfChannels;x++)d.push(g.getChannelData(x).slice().buffer);b.generate({id:w,channels:d,length:g.length,sampleRate:g.sampleRate,scale:t,bits:16,splitChannels:!0}).then(x=>{m||(a(y=>{const C=new Map(y);return C.set(w,x),C}),c.current--,c.current<=0&&(c.current=0,s(!1)))}).catch(x=>{m||(console.warn("[waveform-playlist] Worker peak generation failed:",x),h.delete(w),c.current--,c.current<=0&&(c.current=0,s(!1)))})}return()=>{m=!0;for(const w of f)h.delete(w)}},[e,t,u]),o.useEffect(()=>()=>{i.current?.terminate(),i.current=null},[]),{cache:n,isGenerating:r}}function Ut(e){return e instanceof File?e.name.replace(/\.[^/.]+$/,""):e instanceof Blob?"Untitled":typeof e=="string"?e.split("/").pop()?.replace(/\.[^/.]+$/,"")??"Untitled":e.name??e.src.split("/").pop()?.replace(/\.[^/.]+$/,"")??"Untitled"}async function Ds(e,t,n){const a=Ut(e);if(e instanceof Blob){const c=await e.arrayBuffer();return n?.throwIfAborted(),{audioBuffer:await t.decodeAudioData(c),name:a}}const r=typeof e=="string"?e:e.src,s=await fetch(r,{signal:n});if(!s.ok)throw new Error(`Failed to fetch ${r}: ${s.statusText}`);const i=await s.arrayBuffer();return n?.throwIfAborted(),{audioBuffer:await t.decodeAudioData(i),name:a}}function Bs(){const[e,t]=o.useState([]),[n,a]=o.useState(0),[r,s]=o.useState([]),i=o.useRef(!1),l=o.useRef(new Set),c=o.useRef(new Map);o.useEffect(()=>{const h=c.current;return()=>{i.current=!0;for(const p of h.values())p.abort();h.clear()}},[]);const u=o.useCallback(h=>{if(h.length===0)return;const p=sr(),f=h.map(b=>({track:Nn({name:`${Ut(b)} (loading...)`,clips:[]}),source:b}));t(b=>[...b,...f.map(w=>w.track)]),a(b=>b+h.length);for(const{track:b,source:w}of f){l.current.add(b.id);const g=new AbortController;c.current.set(b.id,g),(async()=>{try{const{audioBuffer:d,name:x}=await Ds(w,p,g.signal),y=Gn({audioBuffer:d,startTime:0,duration:d.duration,offset:0,name:x});!i.current&&l.current.has(b.id)&&t(C=>C.map(k=>k.id===b.id?{...k,name:x,clips:[y]}:k))}catch(d){if(d instanceof DOMException&&d.name==="AbortError")return;console.warn("[waveform-playlist] Error loading audio:",d),!i.current&&l.current.has(b.id)&&(t(x=>x.filter(y=>y.id!==b.id)),s(x=>[...x,{name:Ut(w),error:d instanceof Error?d:new Error(String(d))}]))}finally{c.current.delete(b.id),!i.current&&l.current.delete(b.id)&&a(d=>d-1)}})()}},[]),m=o.useCallback(h=>{t(f=>f.filter(b=>b.id!==h));const p=c.current.get(h);p&&(p.abort(),c.current.delete(h)),l.current.delete(h)&&a(f=>f-1)},[]);return{tracks:e,addTracks:u,removeTrack:m,loadingCount:n,isLoading:n>0,errors:r}}const Aa=o.createContext(null),Ma=o.createContext(null),_a=o.createContext(null),Ea=o.createContext(null),Fs=({tracks:e,timescale:t=!1,mono:n=!1,waveHeight:a=80,samplesPerPixel:r=1024,zoomLevels:s,automaticScroll:i=!1,theme:l,controls:c={show:!1,width:0},annotationList:u,effects:m,onReady:h,onAnnotationUpdate:p,onAnnotationsChange:f,barWidth:b=1,barGap:w=0,progressBarWidth:g,children:d})=>{const x=g??b+w,y=o.useMemo(()=>{if(!u?.annotations)return[];if(process.env.NODE_ENV!=="production"&&u.annotations.length>0){const D=u.annotations[0];if(typeof D.start!="number"||typeof D.end!="number")return console.error("[waveform-playlist] Annotations must have numeric start/end values. In v6, use parseAeneas() from @waveform-playlist/annotations before passing annotations. Received start type: "+typeof D.start),[]}return u.annotations},[u?.annotations]),C=o.useRef(y);C.current=y;const[k,S]=o.useState(null),[M,A]=o.useState(!1),[E,_]=o.useState(0),[I,B]=o.useState(0),[$,W]=o.useState([]),[z,Y]=o.useState([]),[j,N]=o.useState([]),[L,ae]=o.useState(0),[oe,q]=o.useState(0),[fe,ue]=o.useState(null),[le,Ee]=o.useState(i),[P,ee]=o.useState(u?.isContinuousPlay??!1),[U,K]=o.useState(u?.linkEndpoints??!1),[ie,he]=o.useState(u?.editable??!1),[te,Se]=o.useState(!1),[Be,Xe]=o.useState(0),[qe,ne]=o.useState(0),[Ve,Oe]=o.useState(!1),F=o.useRef(null),ye=o.useRef(0),ce=o.useRef(0),je=o.useRef(e),nt=o.useRef(j),Le=o.useRef(0),O=o.useRef(0),se=o.useRef(null),ve=o.useRef(null),$e=o.useRef(!1),Te=o.useRef(u?.isContinuousPlay??!1),Ge=o.useRef(null),at=o.useRef(r),ut=o.useRef(!1),ht=o.useRef(0),V=o.useRef(0),X=o.useRef(0),Q=o.useRef(0),{timeFormat:me,setTimeFormat:pe,formatTime:_e}=wa(),Ce=ya({initialSamplesPerPixel:r,zoomLevels:s}),J=Ce.samplesPerPixel,{masterVolume:Ie,setMasterVolume:Fe}=xa({playoutRef:F,initialVolume:1}),{animationFrameRef:rt,startAnimationFrameLoop:Ne,stopAnimationFrameLoop:Ye}=Ia(),dt=o.useMemo(()=>Math.min(...s??[256,512,1024,2048,4096,8192]),[s]),{cache:ot}=Rs(e,dt),Je=o.useCallback(D=>{Te.current=D,ee(D)},[]),ze=o.useCallback(D=>{Ge.current=D,S(D)},[]),xt=o.useCallback(D=>{ut.current=D,Se(D)},[]),Qe=o.useCallback((D,G)=>{X.current=D,Q.current=G,Xe(D),ne(G)},[]),sn=o.useCallback(()=>{const D=ht.current,G=V.current;D!==G&&G>D&&Qe(D,G)},[Qe]),ln=o.useCallback(()=>{Qe(0,0)},[Qe]);o.useEffect(()=>{$e.current=le},[le]),o.useEffect(()=>{nt.current=j},[j]),je.current=e,o.useEffect(()=>{ht.current=L,V.current=oe},[L,oe]),o.useEffect(()=>{if(!ve.current||!$.length)return;const D=ve.current,G=at.current,re=J;if(G===re)return;const H=c.show?c.width:0,de=D.clientWidth,Ae=D.scrollLeft+de/2-H,et=$[0].sampleRate,xe=Ae*G/et*et/re,We=Math.max(0,xe+H-de/2);D.scrollLeft=We,at.current=re},[J,$,c]);const kt=o.useRef(null);o.useEffect(()=>{if(Oe(!1),e.length===0){W([]),B(0),N([]),Y([]),F.current&&(F.current.dispose(),F.current=null);return}const D=M,G=ce.current;return F.current&&D&&(F.current.stop(),Ye(),kt.current={position:G}),(async()=>{try{const H=[];e.forEach(we=>{we.clips.length>0&&we.clips[0].audioBuffer&&H.push(we.clips[0].audioBuffer)});let de=0;e.forEach(we=>{we.clips.forEach(xe=>{const We=xe.sampleRate,It=(xe.startSample+xe.durationSamples)/We;de=Math.max(de,It)})}),W(H),B(de),N(we=>we.length===e.length?we.map((xe,We)=>({...xe,name:e[We].name})):e.map(xe=>({name:xe.name,muted:xe.muted,soloed:xe.soloed,volume:xe.volume,pan:xe.pan}))),F.current&&F.current.dispose();const ge=new rr({effects:m}),Ae=nt.current;e.forEach((we,xe)=>{const We=we.clips.filter(it=>it.audioBuffer);if(We.length>0){const it=We[0].sampleRate,It=Math.min(...We.map(Pe=>Pe.startSample/it)),Ha=Math.max(...We.map(Pe=>(Pe.startSample+Pe.durationSamples)/it)),At=Ae[xe],Xa={id:we.id,name:we.name,gain:At?.volume??we.volume,muted:At?.muted??we.muted,soloed:At?.soloed??we.soloed,stereoPan:At?.pan??we.pan,startTime:It,endTime:Ha},Oa=We.map(Pe=>{const zt=Pe.sampleRate;return{buffer:Pe.audioBuffer,startTime:Pe.startSample/zt-It,duration:Pe.durationSamples/zt,offset:Pe.offsetSamples/zt,fadeIn:Pe.fadeIn,fadeOut:Pe.fadeOut,gain:Pe.gain}});ge.addTrack({clips:Oa,track:Xa,effects:we.effects})}}),ge.applyInitialSoloState(),F.current=ge,Oe(!0);const et=new CustomEvent("waveform-playlist:ready",{detail:{trackCount:e.length,duration:de}});window.dispatchEvent(et),h?.()}catch(H){console.error("Error loading audio:",H)}})(),()=>{Ye(),F.current&&F.current.dispose()}},[e,h,M,m,Ye]),o.useEffect(()=>{if(e.length===0)return;const D=e.map(G=>G.clips.map(H=>{let de;if(H.waveformData)try{de=Vn(H.waveformData,J,n,H.offsetSamples,H.durationSamples)}catch(ge){console.warn("[waveform-playlist] Failed to extract peaks from waveformData:",ge)}if(!de){const ge=ot.get(H.id);if(ge)try{de=Vn(ge,J,n,H.offsetSamples,H.durationSamples)}catch(Ae){console.warn("[waveform-playlist] Failed to extract peaks from cache:",Ae)}}if(!de){!H.audioBuffer&&!H.waveformData&&console.warn(`[waveform-playlist] Clip "${H.id}" has no audio data or waveform data`);const ge=n?1:H.audioBuffer?.numberOfChannels??1;de={length:0,data:Array.from({length:ge},()=>new Int16Array(0)),bits:16}}return{clipId:H.id,trackName:G.name,peaks:de,startSample:H.startSample,durationSamples:H.durationSamples,fadeIn:H.fadeIn,fadeOut:H.fadeOut}}));Y(D)},[e,J,n,ot]);const st=o.useCallback(()=>{const D=()=>{const G=Z.getContext().currentTime-Le.current,re=O.current+G;ce.current=re;const H=C.current;if(H.length>0){const ge=H.find(Ae=>re>=Ae.start&&re<Ae.end);if(Te.current)ge&&ge.id!==Ge.current?ze(ge.id):!ge&&Ge.current!==null&&ze(null);else if(Ge.current){const Ae=H.find(et=>et.id===Ge.current);if(Ae&&re>=Ae.end){F.current&&F.current.stop(),A(!1),ce.current=ye.current,_(ye.current);return}}else ge&&ze(ge.id)}if($e.current&&ve.current&&$.length>0){const ge=ve.current,Ae=$[0].sampleRate,et=re*Ae/at.current,we=ge.clientWidth,xe=c.show?c.width:0,We=et+xe,it=Math.max(0,We-we/2);ge.scrollLeft=it}if(se.current!==null&&re>=se.current){F.current&&F.current.stop(),A(!1),ce.current=se.current,_(se.current),se.current=null;return}const de=X.current!==Q.current&&Q.current>X.current;if(ut.current&&de&&re>=Q.current){F.current?.stop();const Ae=Z.getContext().currentTime;Le.current=Ae,O.current=X.current,ce.current=X.current,F.current?.play(Ae,X.current),Ne(D);return}if(re>=I){F.current&&F.current.stop(),A(!1),ce.current=ye.current,_(ye.current),ze(null);return}Ne(D)};Ne(D)},[I,$,c.show,c.width,ze,Ne]),Ue=Ye;o.useEffect(()=>{(async()=>{if(M&&rt.current&&F.current)if(P){const G=ce.current;F.current.stop(),Ue(),await F.current.init(),F.current.setOnPlaybackComplete(()=>{});const H=Z.getContext().currentTime;Le.current=H,O.current=G,F.current.play(H,G),st()}else Ue(),st()})()},[P,M,st,Ue,rt]),o.useEffect(()=>{(async()=>{if(kt.current&&F.current){const{position:G}=kt.current;kt.current=null,await F.current.init(),F.current.setOnPlaybackComplete(()=>{});const H=Z.getContext().currentTime;Le.current=H,O.current=G,F.current.play(H,G),A(!0),st()}})()},[e,st]);const St=o.useCallback(async(D,G)=>{if(!F.current||$.length===0)return;await F.current.init();const re=D??ce.current;ye.current=re,ce.current=re,F.current.setOnPlaybackComplete(()=>{}),F.current.stop(),Ue();const de=Z.getContext().currentTime;Le.current=de,O.current=re,se.current=G!==void 0?re+G:null,F.current.play(de,re,G),A(!0),st()},[$.length,st,Ue]),cn=o.useCallback(()=>{if(!F.current)return;const D=Z.getContext().currentTime-Le.current,G=O.current+D;F.current.pause(),A(!1),Ue(),ce.current=G,_(G)},[Ue]),un=o.useCallback(()=>{F.current&&(F.current.stop(),A(!1),Ue(),ce.current=ye.current,_(ye.current),ze(null))},[Ue,ze]),dn=o.useCallback(D=>{const G=Math.max(0,Math.min(D,I));ce.current=G,_(G),M&&F.current&&(F.current.stop(),Ue(),St(G))},[I,M,St,Ue]),fn=o.useCallback((D,G)=>{const re=je.current[D]?.id;if(!re)return;const H=[...j];H[D]={...H[D],muted:G},N(H),F.current&&F.current.setMute(re,G)},[j]),mn=o.useCallback((D,G)=>{const re=je.current[D]?.id;if(!re)return;const H=[...j];H[D]={...H[D],soloed:G},N(H),F.current&&F.current.setSolo(re,G)},[j]),hn=o.useCallback((D,G)=>{const re=je.current[D]?.id;if(!re)return;const H=[...j];if(H[D]={...H[D],volume:G},N(H),F.current){const de=F.current.getTrack(re);de&&de.setVolume(G)}},[j]),pn=o.useCallback((D,G)=>{const re=je.current[D]?.id;if(!re)return;const H=[...j];if(H[D]={...H[D],pan:G},N(H),F.current){const de=F.current.getTrack(re);de&&de.setPan(G)}},[j]),gn=o.useCallback((D,G)=>{ae(D),q(G),ce.current=D,_(D),M&&F.current&&(F.current.stop(),F.current.play(Z.getContext().currentTime,D))},[M]),bn=o.useCallback(D=>{ve.current=D},[]),jt=o.useRef(f);jt.current=f;const vn=o.useCallback(D=>{const G=typeof D=="function"?D(C.current):D;if(!jt.current){process.env.NODE_ENV!=="production"&&console.warn("waveform-playlist: setAnnotations was called but no onAnnotationsChange callback is provided. Annotation edits will not persist. Pass onAnnotationsChange to WaveformPlaylistProvider to handle annotation updates.");return}jt.current(G)},[]),Cn=$[0]?.sampleRate||44100,Lt=t?30:0,wn=e.length*a+Lt,Za=o.useMemo(()=>({isPlaying:M,currentTime:E,currentTimeRef:ce,playbackStartTimeRef:Le,audioStartPositionRef:O}),[M,E,ce,Le,O]),Va=o.useMemo(()=>({continuousPlay:P,linkEndpoints:U,annotationsEditable:ie,isAutomaticScroll:le,isLoopEnabled:te,annotations:y,activeAnnotationId:k,selectionStart:L,selectionEnd:oe,selectedTrackId:fe,loopStart:Be,loopEnd:qe}),[P,U,ie,le,te,y,k,L,oe,fe,Be,qe]),yn=o.useCallback(D=>{ce.current=D,_(D)},[ce]),xn=o.useCallback(D=>{Ee(D)},[]),ja=o.useMemo(()=>({play:St,pause:cn,stop:un,seekTo:dn,setCurrentTime:yn,setTrackMute:fn,setTrackSolo:mn,setTrackVolume:hn,setTrackPan:pn,setSelection:gn,setSelectedTrackId:ue,setTimeFormat:pe,formatTime:_e,zoomIn:Ce.zoomIn,zoomOut:Ce.zoomOut,setMasterVolume:Fe,setAutomaticScroll:xn,setScrollContainer:bn,scrollContainerRef:ve,setContinuousPlay:Je,setLinkEndpoints:K,setAnnotationsEditable:he,setAnnotations:vn,setActiveAnnotationId:ze,setLoopEnabled:xt,setLoopRegion:Qe,setLoopRegionFromSelection:sn,clearLoopRegion:ln}),[St,cn,un,dn,yn,fn,mn,hn,pn,gn,ue,pe,_e,Ce.zoomIn,Ce.zoomOut,Fe,xn,bn,ve,Je,K,he,vn,ze,xt,Qe,sn,ln]),La=o.useMemo(()=>({duration:I,audioBuffers:$,peaksDataArray:z,trackStates:j,tracks:e,sampleRate:Cn,waveHeight:a,timeScaleHeight:Lt,minimumPlaylistHeight:wn,controls:c,playoutRef:F,samplesPerPixel:J,timeFormat:me,masterVolume:Ie,canZoomIn:Ce.canZoomIn,canZoomOut:Ce.canZoomOut,barWidth:b,barGap:w,progressBarWidth:x,isReady:Ve,mono:n}),[I,$,z,j,e,Cn,a,Lt,wn,c,F,J,me,Ie,Ce.canZoomIn,Ce.canZoomOut,b,w,x,Ve,n]),za={...ra,...l};return v.jsx(R.ThemeProvider,{theme:za,children:v.jsx(Aa.Provider,{value:Za,children:v.jsx(Ma.Provider,{value:Va,children:v.jsx(_a.Provider,{value:ja,children:v.jsx(Ea.Provider,{value:La,children:d})})})})})},Re=()=>{const e=o.useContext(Aa);if(!e)throw new Error("usePlaybackAnimation must be used within WaveformPlaylistProvider");return e},De=()=>{const e=o.useContext(Ma);if(!e)throw new Error("usePlaylistState must be used within WaveformPlaylistProvider");return e},be=()=>{const e=o.useContext(_a);if(!e)throw new Error("usePlaylistControls must be used within WaveformPlaylistProvider");return e},Me=()=>{const e=o.useContext(Ea);if(!e)throw new Error("usePlaylistData must be used within WaveformPlaylistProvider");return e};var Ws=class{constructor(e){this._playbackRate=1,this.handleEnded=()=>{this.onStopCallback&&this.onStopCallback()},this.handleTimeUpdate=()=>{this.onTimeUpdateCallback&&this.onTimeUpdateCallback(this.audioElement.currentTime)},this._peaks=e.peaks,this._id=e.id??`track-${Date.now()}`,this._name=e.name??"Track",this._playbackRate=e.playbackRate??1,typeof e.source=="string"?(this.audioElement=new Audio(e.source),this.ownsElement=!0):(this.audioElement=e.source,this.ownsElement=!1),this.audioElement.preload="auto",this.audioElement.volume=e.volume??1,this.audioElement.playbackRate=this._playbackRate;const t=this.audioElement;"preservesPitch"in this.audioElement?t.preservesPitch=!0:"mozPreservesPitch"in this.audioElement?t.mozPreservesPitch=!0:"webkitPreservesPitch"in this.audioElement&&(t.webkitPreservesPitch=!0),this.audioElement.addEventListener("ended",this.handleEnded),this.audioElement.addEventListener("timeupdate",this.handleTimeUpdate)}play(e=0){this.audioElement.currentTime=e,this.audioElement.play().catch(t=>{console.warn("MediaElementTrack: play() failed:",t)})}pause(){this.audioElement.pause()}stop(){this.audioElement.pause(),this.audioElement.currentTime=0}seekTo(e){this.audioElement.currentTime=Math.max(0,Math.min(e,this.duration))}setVolume(e){this.audioElement.volume=Math.max(0,Math.min(1,e))}setPlaybackRate(e){const t=Math.max(.5,Math.min(2,e));this._playbackRate=t,this.audioElement.playbackRate=t}setMuted(e){this.audioElement.muted=e}setOnStopCallback(e){this.onStopCallback=e}setOnTimeUpdateCallback(e){this.onTimeUpdateCallback=e}dispose(){this.audioElement.removeEventListener("ended",this.handleEnded),this.audioElement.removeEventListener("timeupdate",this.handleTimeUpdate),this.audioElement.pause(),this.ownsElement&&(this.audioElement.src="",this.audioElement.load())}get id(){return this._id}get name(){return this._name}get peaks(){return this._peaks}get currentTime(){return this.audioElement.currentTime}get duration(){return this.audioElement.duration||this._peaks.duration}get isPlaying(){return!this.audioElement.paused&&!this.audioElement.ended}get volume(){return this.audioElement.volume}get playbackRate(){return this._playbackRate}get muted(){return this.audioElement.muted}get element(){return this.audioElement}},Ps=class{constructor(e={}){this.track=null,this._isPlaying=!1,this._masterVolume=e.masterVolume??1,this._playbackRate=e.playbackRate??1}async init(){}addTrack(e){return this.track&&(console.warn("MediaElementPlayout: Only one track is supported. Disposing previous track. For multi-track, use TonePlayout."),this.track.dispose()),this.track=new Ws({...e,volume:this._masterVolume*(e.volume??1),playbackRate:this._playbackRate}),this.track.setOnStopCallback(()=>{this._isPlaying=!1,this.onPlaybackCompleteCallback&&this.onPlaybackCompleteCallback()}),this.track}removeTrack(e){this.track&&this.track.id===e&&(this.track.dispose(),this.track=null)}getTrack(e){if(this.track&&this.track.id===e)return this.track}play(e,t,n){if(!this.track){console.warn("MediaElementPlayout: No track to play");return}const a=t??0;if(this._isPlaying=!0,this.track.play(a),n!==void 0){const r=n/this._playbackRate;setTimeout(()=>{this._isPlaying&&(this.pause(),this.onPlaybackCompleteCallback&&this.onPlaybackCompleteCallback())},r*1e3)}}pause(){this.track&&this.track.pause(),this._isPlaying=!1}stop(){this.track&&this.track.stop(),this._isPlaying=!1}seekTo(e){this.track&&this.track.seekTo(e)}getCurrentTime(){return this.track?this.track.currentTime:0}setMasterVolume(e){this._masterVolume=Math.max(0,Math.min(1,e)),this.track&&this.track.setVolume(this._masterVolume)}setPlaybackRate(e){this._playbackRate=Math.max(.5,Math.min(2,e)),this.track&&this.track.setPlaybackRate(this._playbackRate)}setMute(e,t){const n=this.getTrack(e);n&&n.setMuted(t)}setSolo(e,t){console.warn("MediaElementPlayout: Solo is not applicable for single-track playback")}setOnPlaybackComplete(e){this.onPlaybackCompleteCallback=e}dispose(){this.track&&(this.track.dispose(),this.track=null)}get isPlaying(){return this._isPlaying}get masterVolume(){return this._masterVolume}get playbackRate(){return this._playbackRate}get duration(){return this.track?.duration??0}get sampleRate(){return this.track?.peaks.sample_rate??44100}};const $a=o.createContext(null),Ta=o.createContext(null),Ra=o.createContext(null),Da=o.createContext(null),Zs=({track:e,samplesPerPixel:t=1024,waveHeight:n=100,timescale:a=!1,playbackRate:r=1,automaticScroll:s=!1,theme:i,controls:l={show:!1,width:0},annotationList:c,barWidth:u=1,barGap:m=0,progressBarWidth:h,onAnnotationsChange:p,onReady:f,children:b})=>{const w=h??u+m,[g,d]=o.useState(!1),[x,y]=o.useState(0),[C,k]=o.useState(0),[S,M]=o.useState([]),[A,E]=o.useState(r),_=o.useMemo(()=>{if(!c?.annotations)return[];if(process.env.NODE_ENV!=="production"&&c.annotations.length>0){const O=c.annotations[0];if(typeof O.start!="number"||typeof O.end!="number")return console.error("[waveform-playlist] Annotations must have numeric start/end values. In v6, use parseAeneas() from @waveform-playlist/annotations before passing annotations. Received start type: "+typeof O.start),[]}return c.annotations},[c?.annotations]),I=o.useRef(_);I.current=_;const[B,$]=o.useState(null),[W,z]=o.useState(c?.isContinuousPlay??!1),[Y]=o.useState(t),[j,N]=o.useState(s),L=o.useRef(null),ae=o.useRef(0),oe=o.useRef(W),q=o.useRef(null),fe=o.useRef(null),ue=o.useRef(s),le=o.useRef(t),{startAnimationFrameLoop:Ee,stopAnimationFrameLoop:P}=Ia();o.useEffect(()=>{oe.current=W},[W]),o.useEffect(()=>{ue.current=j},[j]);const ee=o.useCallback(O=>{q.current=O,$(O)},[]),U=o.useCallback(O=>{oe.current=O,z(O)},[]),K=o.useCallback(O=>{fe.current=O},[]),ie=e.waveformData.sample_rate;o.useEffect(()=>{const O=new Ps({playbackRate:r});O.addTrack({source:e.source,peaks:e.waveformData,name:e.name});const se=O.getTrack(O.track?.id??"");return se&&se.setOnTimeUpdateCallback(ve=>{ae.current=ve}),O.setOnPlaybackComplete(()=>{P(),d(!1),ee(null),ae.current=0,y(0)}),L.current=O,k(e.waveformData.duration),f?.(),()=>{P(),O.dispose()}},[e.source,e.waveformData,e.name,r,f,P,ee]),o.useEffect(()=>{const O=os(e.waveformData,Y,0,0,Math.ceil(e.waveformData.duration*ie)),se={clipId:"media-element-clip",trackName:e.name??"Track",peaks:{length:O.length,data:[O.data],bits:O.bits},startSample:0,durationSamples:Math.ceil(e.waveformData.duration*ie)};M([[se]])},[e.waveformData,e.name,Y,ie]);const he=o.useCallback(()=>{const O=()=>{const se=L.current?.getCurrentTime()??0;ae.current=se;const ve=I.current;if(ve.length>0){const $e=ve.find(Te=>se>=Te.start&&se<Te.end);if(oe.current)$e&&$e.id!==q.current?ee($e.id):!$e&&q.current!==null&&ee(null);else if(q.current){const Te=ve.find(Ge=>Ge.id===q.current);if(Te&&se>=Te.end){L.current?.stop(),d(!1);return}}else $e&&ee($e.id)}if(ue.current&&fe.current){const $e=fe.current,Te=se*ie/le.current,Ge=$e.clientWidth,at=l.show?l.width:0,ut=Te+at,ht=Math.max(0,ut-Ge/2);$e.scrollLeft=ht}Ee(O)};Ee(O)},[ee,ie,l,Ee]),te=P,Se=o.useCallback(O=>{if(!L.current)return;const se=O??ae.current;L.current.play(void 0,se),d(!0),he()},[he]),Be=o.useCallback(()=>{L.current&&(L.current.pause(),d(!1),te(),y(L.current.getCurrentTime()))},[te]),Xe=o.useCallback(()=>{L.current&&(L.current.stop(),d(!1),te(),ae.current=0,y(0),ee(null))},[te,ee]),qe=o.useCallback(O=>{const se=Math.max(0,Math.min(O,C));ae.current=se,y(se),L.current&&L.current.seekTo(se)},[C]),ne=o.useCallback(O=>{const se=Math.max(.5,Math.min(2,O));E(se),L.current&&L.current.setPlaybackRate(se)},[]),Ve=a?30:0,Oe=o.useMemo(()=>({isPlaying:g,currentTime:x,currentTimeRef:ae}),[g,x]),F=o.useMemo(()=>({continuousPlay:W,annotations:_,activeAnnotationId:B,playbackRate:A,isAutomaticScroll:j}),[W,_,B,A,j]),ye=o.useRef(p);ye.current=p;const ce=o.useCallback(O=>{const se=typeof O=="function"?O(I.current):O;if(!ye.current){process.env.NODE_ENV!=="production"&&console.warn("waveform-playlist: setAnnotations was called but no onAnnotationsChange callback is provided. Annotation edits will not persist. Pass onAnnotationsChange to MediaElementPlaylistProvider to handle annotation updates.");return}ye.current(se)},[]),je=o.useMemo(()=>({play:Se,pause:Be,stop:Xe,seekTo:qe,setPlaybackRate:ne,setContinuousPlay:U,setAnnotations:ce,setActiveAnnotationId:ee,setAutomaticScroll:O=>{N(O)},setScrollContainer:K,scrollContainerRef:fe}),[Se,Be,Xe,qe,ne,U,ce,ee,K]),nt=o.useMemo(()=>({duration:C,peaksDataArray:S,sampleRate:ie,waveHeight:n,timeScaleHeight:Ve,samplesPerPixel:Y,playoutRef:L,controls:l,barWidth:u,barGap:m,progressBarWidth:w}),[C,S,ie,n,Ve,Y,l,u,m,w]),Le={...ra,...i};return v.jsx(R.ThemeProvider,{theme:Le,children:v.jsx($a.Provider,{value:Oe,children:v.jsx(Ta.Provider,{value:F,children:v.jsx(Ra.Provider,{value:je,children:v.jsx(Da.Provider,{value:nt,children:b})})})})})},Wt=()=>{const e=o.useContext($a);if(!e)throw new Error("useMediaElementAnimation must be used within MediaElementPlaylistProvider");return e},Pt=()=>{const e=o.useContext(Ta);if(!e)throw new Error("useMediaElementState must be used within MediaElementPlaylistProvider");return e},rn=()=>{const e=o.useContext(Ra);if(!e)throw new Error("useMediaElementControls must be used within MediaElementPlaylistProvider");return e},Zt=()=>{const e=o.useContext(Da);if(!e)throw new Error("useMediaElementData must be used within MediaElementPlaylistProvider");return e},Vs=({className:e})=>{const{isPlaying:t,currentTimeRef:n}=Re(),{selectionStart:a,selectionEnd:r,isLoopEnabled:s}=De(),{play:i}=be(),l=async()=>{if(a!==r&&r>a)if(s)await i(a);else{const u=r-a;await i(a,u)}else await i(n.current??0)};return v.jsx(He,{onClick:l,disabled:t,className:e,children:"Play"})},js=({className:e})=>{const{isPlaying:t}=Re(),{pause:n}=be();return v.jsx(He,{onClick:n,disabled:!t,className:e,children:"Pause"})},Ls=({className:e})=>{const{isPlaying:t}=Re(),{stop:n}=be();return v.jsx(He,{onClick:n,disabled:!t,className:e,children:"Stop"})},zs=({className:e})=>{const{isPlaying:t}=Re(),{play:n,setCurrentTime:a}=be(),{playoutRef:r}=Me(),s=()=>{a(0),t&&r.current&&(r.current.stop(),n(0))};return v.jsx(He,{onClick:s,className:e,children:"Rewind"})},Hs=({className:e})=>{const{isPlaying:t}=Re(),{play:n,setCurrentTime:a}=be(),{duration:r,playoutRef:s}=Me(),i=()=>{a(r),t&&s.current&&(s.current.stop(),n(r))};return v.jsx(He,{onClick:i,className:e,children:"Fast Forward"})},Xs=({skipAmount:e=5,className:t})=>{const{currentTimeRef:n,isPlaying:a}=Re(),{play:r,setCurrentTime:s}=be(),{playoutRef:i}=Me(),l=()=>{const c=Math.max(0,(n.current??0)-e);s(c),a&&i.current&&(i.current.stop(),r(c))};return v.jsx(He,{onClick:l,className:t,children:"Skip Backward"})},Os=({skipAmount:e=5,className:t})=>{const{currentTimeRef:n,isPlaying:a}=Re(),{play:r,setCurrentTime:s}=be(),{duration:i,playoutRef:l}=Me(),c=()=>{const u=Math.min(i,(n.current??0)+e);s(u),a&&l.current&&(l.current.stop(),r(u))};return v.jsx(He,{onClick:c,className:t,children:"Skip Forward"})},Gs=({className:e})=>{const{isLoopEnabled:t,loopStart:n,loopEnd:a}=De(),{setLoopEnabled:r,setLoopRegion:s}=be(),{duration:i}=Me(),l=n!==a&&a>n,c=()=>{if(!t&&!l){const u=Math.min(10,i*.25);s(0,Math.max(1,u))}r(!t)};return v.jsx(He,{onClick:c,className:e,title:t?"Disable loop":"Enable loop",children:t?"Loop On":"Loop Off"})},Ns=({className:e})=>{const{selectionStart:t,selectionEnd:n,loopStart:a,loopEnd:r}=De(),{setLoopRegionFromSelection:s,clearLoopRegion:i}=be(),l=t!==n&&n>t,c=a!==r&&r>a,u=()=>{c?i():s()};return v.jsx(He,{onClick:u,disabled:!l&&!c,className:e,title:c?"Clear loop region":l?"Set loop region from selection":"Create a selection first",children:c?"Clear Loop":"Set Loop"})},Ys=({className:e,disabled:t})=>{const{zoomIn:n}=be(),{canZoomIn:a}=Me();return v.jsx(He,{onClick:n,disabled:t||!a,className:e,children:"Zoom In"})},Us=({className:e,disabled:t})=>{const{zoomOut:n}=be(),{canZoomOut:a}=Me();return v.jsx(He,{onClick:n,disabled:t||!a,className:e,children:"Zoom Out"})},Ks=({className:e})=>{const{masterVolume:t}=Me(),{setMasterVolume:n}=be();return v.jsx(Lr,{volume:t,onChange:n,className:e})},qs=({className:e})=>{const{timeFormat:t}=Me(),{setTimeFormat:n}=be();return v.jsx(So,{value:t,onChange:n,className:e})},Js=R.span`
945
+ `;let ri=0;function si(){let e;try{const a=new Blob([ai],{type:"application/javascript"}),r=URL.createObjectURL(a);e=new Worker(r),URL.revokeObjectURL(r)}catch(a){return console.warn("[waveform-playlist] Failed to create peaks worker (CSP restriction?):",a),{generate(){return Promise.reject(new Error("Worker creation failed"))},terminate(){}}}const t=new Map;let n=!1;return e.onmessage=a=>{const r=a.data,s=t.get(r.id);if(s)if(t.delete(r.id),r.error)s.reject(new Error(r.error));else try{const o=je.create(r.buffer);s.resolve(o)}catch(o){s.reject(o)}},e.onerror=a=>{n=!0,e.terminate();for(const[,r]of t)r.reject(a.error??new Error(a.message));t.clear()},{generate(a){if(n)return Promise.reject(new Error("Worker terminated"));const r=String(++ri);return new Promise((s,o)=>{t.set(r,{resolve:s,reject:o}),e.postMessage({id:r,scale:a.scale,bits:a.bits,amplitude_scale:1,split_channels:a.splitChannels,length:a.length,sample_rate:a.sampleRate,channels:a.channels},a.channels)})},terminate(){n=!0,e.terminate();for(const[,a]of t)a.reject(new Error("Worker terminated"));t.clear()}}}function oi(e,t){const[n,a]=i.useState(()=>new Map),[r,s]=i.useState(!1),o=i.useRef(null),l=i.useRef(new Set),c=i.useRef(0),u=i.useCallback(()=>(o.current||(o.current=si()),o.current),[]);return i.useEffect(()=>{let f=!1;const h=l.current,p=[];for(const y of e)for(const b of y.clips)b.audioBuffer&&!b.waveformData&&!h.has(b.id)&&p.push({clipId:b.id,audioBuffer:b.audioBuffer});if(p.length===0)return;const d=new Set;for(const{clipId:y}of p)h.add(y),d.add(y);c.current+=p.length,s(!0);const g=u();for(const{clipId:y,audioBuffer:b}of p){const m=[];for(let w=0;w<b.numberOfChannels;w++)m.push(b.getChannelData(w).slice().buffer);g.generate({id:y,channels:m,length:b.length,sampleRate:b.sampleRate,scale:t,bits:16,splitChannels:!0}).then(w=>{f||(a(x=>{const C=new Map(x);return C.set(y,w),C}),c.current--,c.current<=0&&(c.current=0,s(!1)))}).catch(w=>{f||(console.warn("[waveform-playlist] Worker peak generation failed:",w),h.delete(y),c.current--,c.current<=0&&(c.current=0,s(!1)))})}return()=>{f=!0;for(const y of d)h.delete(y)}},[e,t,u]),i.useEffect(()=>()=>{o.current?.terminate(),o.current=null},[]),{cache:n,isGenerating:r}}function en(e){return e instanceof File?e.name.replace(/\.[^/.]+$/,""):e instanceof Blob?"Untitled":typeof e=="string"?e.split("/").pop()?.replace(/\.[^/.]+$/,"")??"Untitled":e.name??e.src.split("/").pop()?.replace(/\.[^/.]+$/,"")??"Untitled"}async function ii(e,t,n){const a=en(e);if(e instanceof Blob){const c=await e.arrayBuffer();return n?.throwIfAborted(),{audioBuffer:await t.decodeAudioData(c),name:a}}const r=typeof e=="string"?e:e.src,s=await fetch(r,{signal:n});if(!s.ok)throw new Error(`Failed to fetch ${r}: ${s.statusText}`);const o=await s.arrayBuffer();return n?.throwIfAborted(),{audioBuffer:await t.decodeAudioData(o),name:a}}function li(){const[e,t]=i.useState([]),[n,a]=i.useState(0),[r,s]=i.useState([]),o=i.useRef(!1),l=i.useRef(new Set),c=i.useRef(new Map);i.useEffect(()=>{const h=c.current;return()=>{o.current=!0;for(const p of h.values())p.abort();h.clear()}},[]);const u=i.useCallback(h=>{if(h.length===0)return;const p=Ir(),d=h.map(g=>({track:la({name:`${en(g)} (loading...)`,clips:[]}),source:g}));t(g=>[...g,...d.map(y=>y.track)]),a(g=>g+h.length);for(const{track:g,source:y}of d){l.current.add(g.id);const b=new AbortController;c.current.set(g.id,b),(async()=>{try{const{audioBuffer:m,name:w}=await ii(y,p,b.signal),x=ia({audioBuffer:m,startTime:0,duration:m.duration,offset:0,name:w});!o.current&&l.current.has(g.id)&&t(C=>C.map(k=>k.id===g.id?{...k,name:w,clips:[x]}:k))}catch(m){if(m instanceof DOMException&&m.name==="AbortError")return;console.warn("[waveform-playlist] Error loading audio:",m),!o.current&&l.current.has(g.id)&&(t(w=>w.filter(x=>x.id!==g.id)),s(w=>[...w,{name:en(y),error:m instanceof Error?m:new Error(String(m))}]))}finally{c.current.delete(g.id),!o.current&&l.current.delete(g.id)&&a(m=>m-1)}})()}},[]),f=i.useCallback(h=>{t(d=>d.filter(g=>g.id!==h));const p=c.current.get(h);p&&(p.abort(),c.current.delete(h)),l.current.delete(h)&&a(d=>d-1)},[]);return{tracks:e,addTracks:u,removeTrack:f,loadingCount:n,isLoading:n>0,errors:r}}const Ha=i.createContext(null),Xa=i.createContext(null),Oa=i.createContext(null),Na=i.createContext(null),ci=({tracks:e,timescale:t=!1,mono:n=!1,waveHeight:a=80,samplesPerPixel:r=1024,zoomLevels:s,automaticScroll:o=!1,theme:l,controls:c={show:!1,width:0},annotationList:u,effects:f,onReady:h,onAnnotationUpdate:p,onAnnotationsChange:d,barWidth:g=1,barGap:y=0,progressBarWidth:b,onTracksChange:m,children:w})=>{const x=b??g+y,C=i.useMemo(()=>s,[s?.join(",")]),k=i.useMemo(()=>{if(!u?.annotations)return[];if(process.env.NODE_ENV!=="production"&&u.annotations.length>0){const F=u.annotations[0];if(typeof F.start!="number"||typeof F.end!="number")return console.error("[waveform-playlist] Annotations must have numeric start/end values. In v6, use parseAeneas() from @waveform-playlist/annotations before passing annotations. Received start type: "+typeof F.start),[]}return u.annotations},[u?.annotations]),S=i.useRef(k);S.current=k;const[I,A]=i.useState(null),[_,T]=i.useState(!1),[M,W]=i.useState(0),[$,B]=i.useState(0),[P,N]=i.useState([]),[U,J]=i.useState([]),[V,te]=i.useState([]),[se,Q]=i.useState(o),[le,ce]=i.useState(u?.isContinuousPlay??!1),[ue,Ae]=i.useState(u?.linkEndpoints??!1),[L,ee]=i.useState(u?.editable??!1),[G,K]=i.useState(!1),D=i.useRef(null),ie=i.useRef(0),z=i.useRef(0),be=i.useRef(e),Ve=i.useRef(V),ye=i.useRef(0),Me=i.useRef(0),q=i.useRef(null),we=i.useRef(null),Xe=i.useRef(!1),ve=i.useRef(u?.isContinuousPlay??!1),Se=i.useRef(null),Ee=i.useRef(null),Oe=i.useRef(0),et=i.useRef(!1),tt=i.useRef(!1),Y=i.useRef(r),{timeFormat:oe,setTimeFormat:Te,formatTime:Fe}=Pa(),ge=Va({engineRef:D,initialSamplesPerPixel:r}),{samplesPerPixel:Ze,onEngineState:ut}=ge,ht=Za({engineRef:D,initialVolume:1}),{masterVolume:pt,setMasterVolume:j,masterVolumeRef:O,onEngineState:ne}=ht,{selectionStart:fe,selectionEnd:he,setSelection:$e,selectionStartRef:Re,selectionEndRef:ae,onEngineState:Ie}=Ro({engineRef:D}),{isLoopEnabled:Le,loopStart:rt,loopEnd:Ke,setLoopEnabled:qe,setLoopRegion:Je,clearLoopRegion:st,isLoopEnabledRef:Ye,loopStartRef:ot,loopEndRef:dt,onEngineState:St}=Do({engineRef:D}),{selectedTrackId:fn,setSelectedTrackId:mn,onEngineState:hn,selectedTrackIdRef:pn}=Bo({engineRef:D}),{animationFrameRef:gn,startAnimationFrameLoop:It,stopAnimationFrameLoop:_t}=za(),tr=i.useMemo(()=>Math.min(...C??[256,512,1024,2048,4096,8192]),[C]),{cache:bn}=oi(e,tr),vn=i.useCallback(F=>{ve.current=F,ce(F)},[]),Qe=i.useCallback(F=>{Se.current=F,A(F)},[]),Cn=i.useCallback(()=>{const F=Re.current??0,X=ae.current??0;F!==X&&X>F&&Je(F,X)},[Je,Re,ae]);i.useEffect(()=>{Xe.current=se},[se]),i.useEffect(()=>{Ve.current=V},[V]),be.current=e;const zt=e===Ee.current;et.current=zt||tt.current,i.useEffect(()=>{if(!we.current||!P.length)return;const F=we.current,X=Y.current,re=Ze;if(X===re)return;const H=c.show?c.width:0,me=F.clientWidth,xe=F.scrollLeft+me/2-H,De=P[0].sampleRate,nt=xe*X/De*De/re,gt=Math.max(0,nt+H-me/2);F.scrollLeft=gt,Y.current=re},[Ze,P,c]);const At=i.useRef(null);i.useEffect(()=>{if(zt||tt.current){zt&&(Ee.current=null);let H=0;e.forEach(me=>{me.clips.forEach(Ce=>{const xe=(Ce.startSample+Ce.durationSamples)/Ce.sampleRate;H=Math.max(H,xe)})}),B(H);return}if(K(!1),e.length===0){N([]),B(0),te([]),J([]),D.current&&(D.current.dispose(),D.current=null);return}const F=_,X=z.current;return D.current&&F&&(D.current.stop(),_t(),At.current={position:X}),(async()=>{try{const H=[];e.forEach(de=>{de.clips.length>0&&de.clips[0].audioBuffer&&H.push(de.clips[0].audioBuffer)});let me=0;e.forEach(de=>{de.clips.forEach(Be=>{const Ue=Be.sampleRate,ir=(Be.startSample+Be.durationSamples)/Ue;me=Math.max(me,ir)})}),N(H),B(me),te(de=>de.length===e.length?de.map((Be,Ue)=>({...Be,name:e[Ue].name})):e.map(Be=>({name:Be.name,muted:Be.muted,soloed:Be.soloed,volume:Be.volume,pan:Be.pan}))),D.current&&D.current.dispose(),Oe.current=0,Ee.current=null;const Ce=_r({effects:f}),xe=new Rr({adapter:Ce,samplesPerPixel:Y.current,zoomLevels:C});xe.setSelection(Re.current??0,ae.current??0),xe.setLoopRegion(ot.current??0,dt.current??0),Ye.current&&xe.setLoopEnabled(!0),xe.setMasterVolume(O.current??1),pn.current&&xe.selectTrack(pn.current);const De=Ve.current,ze=e.map((de,Be)=>{const Ue=De[Be];return{...de,volume:Ue?.volume??de.volume,muted:Ue?.muted??de.muted,soloed:Ue?.soloed??de.soloed,pan:Ue?.pan??de.pan}});let nt=!0;xe.on("statechange",de=>{Ie(de),St(de),hn(de),ut(de),ne(de),!nt&&de.tracksVersion!==Oe.current&&(Oe.current=de.tracksVersion,Ee.current=de.tracks,m?m(de.tracks):console.warn("[waveform-playlist] Engine tracks changed but onTracksChange prop is not set — UI will revert on next render. Pass onTracksChange to WaveformPlaylistProvider."))}),xe.setTracks(ze),nt=!1,Oe.current=xe.getState().tracksVersion,D.current=xe,K(!0);const gt=new CustomEvent("waveform-playlist:ready",{detail:{trackCount:e.length,duration:me}});window.dispatchEvent(gt),h?.()}catch(H){console.error("Error loading audio:",H)}})(),()=>{if(et.current){et.current=!1;return}_t(),D.current&&D.current.dispose()}},[e,h,_,f,_t,Ie,St,hn,ut,ne,m,O,Re,ae,ot,dt,Ye,C]),i.useEffect(()=>{if(e.length===0)return;const F=e.map(X=>X.clips.map(H=>{let me;if(H.waveformData)try{me=ea(H.waveformData,Ze,n,H.offsetSamples,H.durationSamples)}catch(Ce){console.warn("[waveform-playlist] Failed to extract peaks from waveformData:",Ce)}if(!me){const Ce=bn.get(H.id);if(Ce)try{me=ea(Ce,Ze,n,H.offsetSamples,H.durationSamples)}catch(xe){console.warn("[waveform-playlist] Failed to extract peaks from cache:",xe)}}if(!me){!H.audioBuffer&&!H.waveformData&&console.warn(`[waveform-playlist] Clip "${H.id}" has no audio data or waveform data`);const Ce=n?1:H.audioBuffer?.numberOfChannels??1;me={length:0,data:Array.from({length:Ce},()=>new Int16Array(0)),bits:16}}return{clipId:H.id,trackName:X.name,peaks:me,startSample:H.startSample,durationSamples:H.durationSamples,fadeIn:H.fadeIn,fadeOut:H.fadeOut}}));J(F)},[e,Ze,n,bn]);const it=i.useCallback(()=>{const F=()=>{const X=Z.getContext().currentTime-ye.current,re=Me.current+X;z.current=re;const H=S.current;if(H.length>0){const De=H.find(ze=>re>=ze.start&&re<ze.end);if(ve.current)De&&De.id!==Se.current?Qe(De.id):!De&&Se.current!==null&&Qe(null);else if(Se.current){const ze=H.find(nt=>nt.id===Se.current);if(ze&&re>=ze.end){D.current&&D.current.stop(),T(!1),z.current=ie.current,W(ie.current);return}}else De&&Qe(De.id)}if(Xe.current&&we.current&&P.length>0){const De=we.current,ze=P[0].sampleRate,nt=re*ze/Y.current,gt=De.clientWidth,de=c.show?c.width:0,Be=nt+de,Ue=Math.max(0,Be-gt/2);De.scrollLeft=Ue}if(q.current!==null&&re>=q.current){D.current&&D.current.stop(),T(!1),z.current=q.current,W(q.current),q.current=null;return}const me=ot.current??0,Ce=dt.current??0,xe=me!==Ce&&Ce>me;if(Ye.current&&xe&&re>=Ce){D.current?.stop();const ze=Z.getContext().currentTime;ye.current=ze,Me.current=me,z.current=me,D.current?.play(me),It(F);return}if(re>=$){D.current&&D.current.stop(),T(!1),z.current=ie.current,W(ie.current),Qe(null);return}It(F)};It(F)},[$,P,c.show,c.width,Qe,It,Ye,ot,dt]),Ne=_t;i.useEffect(()=>{(async()=>{if(_&&gn.current&&D.current)if(le){const X=z.current;D.current.stop(),Ne();const H=Z.getContext().currentTime;ye.current=H,Me.current=X,await D.current.play(X),it()}else Ne(),it()})()},[le,_,it,Ne,gn]),i.useEffect(()=>{(async()=>{if(At.current&&D.current){const{position:X}=At.current;At.current=null;const H=Z.getContext().currentTime;ye.current=H,Me.current=X,await D.current.play(X),T(!0),it()}})()},[e,it]);const Mt=i.useCallback(async(F,X)=>{if(!D.current||P.length===0)return;const re=F??z.current;ie.current=re,z.current=re,D.current.stop(),Ne();const me=Z.getContext().currentTime;ye.current=me,Me.current=re,q.current=X!==void 0?re+X:null;const Ce=X!==void 0?re+X:void 0;await D.current.play(re,Ce),T(!0),it()},[P.length,it,Ne]),yn=i.useCallback(()=>{if(!D.current)return;const F=Z.getContext().currentTime-ye.current,X=Me.current+F;D.current.pause(),T(!1),Ne(),z.current=X,W(X)},[Ne]),wn=i.useCallback(()=>{D.current&&(D.current.stop(),T(!1),Ne(),z.current=ie.current,W(ie.current),Qe(null))},[Ne,Qe]),xn=i.useCallback(F=>{const X=Math.max(0,Math.min(F,$));z.current=X,W(X),_&&D.current&&(D.current.stop(),Ne(),Mt(X))},[$,_,Mt,Ne]),kn=i.useCallback((F,X)=>{const re=be.current[F]?.id;if(!re)return;const H=[...V];H[F]={...H[F],muted:X},te(H),D.current&&D.current.setTrackMute(re,X)},[V]),Sn=i.useCallback((F,X)=>{const re=be.current[F]?.id;if(!re)return;const H=[...V];H[F]={...H[F],soloed:X},te(H),D.current&&D.current.setTrackSolo(re,X)},[V]),In=i.useCallback((F,X)=>{const re=be.current[F]?.id;if(!re)return;const H=[...V];H[F]={...H[F],volume:X},te(H),D.current&&D.current.setTrackVolume(re,X)},[V]),_n=i.useCallback((F,X)=>{const re=be.current[F]?.id;if(!re)return;const H=[...V];H[F]={...H[F],pan:X},te(H),D.current&&D.current.setTrackPan(re,X)},[V]),An=i.useCallback(async(F,X)=>{$e(F,X),z.current=F,W(F),_&&D.current&&(D.current.stop(),await D.current.play(F))},[_,$e]),Mn=i.useCallback(F=>{we.current=F},[]),Ht=i.useRef(d);Ht.current=d;const En=i.useCallback(F=>{const X=typeof F=="function"?F(S.current):F;if(!Ht.current){process.env.NODE_ENV!=="production"&&console.warn("waveform-playlist: setAnnotations was called but no onAnnotationsChange callback is provided. Annotation edits will not persist. Pass onAnnotationsChange to WaveformPlaylistProvider to handle annotation updates.");return}Ht.current(X)},[]),Tn=P[0]?.sampleRate||44100,Xt=t?30:0,$n=e.length*a+Xt,nr=i.useMemo(()=>({isPlaying:_,currentTime:M,currentTimeRef:z,playbackStartTimeRef:ye,audioStartPositionRef:Me}),[_,M,z,ye,Me]),ar=i.useMemo(()=>({continuousPlay:le,linkEndpoints:ue,annotationsEditable:L,isAutomaticScroll:se,isLoopEnabled:Le,annotations:k,activeAnnotationId:I,selectionStart:fe,selectionEnd:he,selectedTrackId:fn,loopStart:rt,loopEnd:Ke}),[le,ue,L,se,Le,k,I,fe,he,fn,rt,Ke]),Rn=i.useCallback(F=>{z.current=F,W(F)},[z]),Dn=i.useCallback(F=>{Q(F)},[]),rr=i.useMemo(()=>({play:Mt,pause:yn,stop:wn,seekTo:xn,setCurrentTime:Rn,setTrackMute:kn,setTrackSolo:Sn,setTrackVolume:In,setTrackPan:_n,setSelection:An,setSelectedTrackId:mn,setTimeFormat:Te,formatTime:Fe,zoomIn:ge.zoomIn,zoomOut:ge.zoomOut,setMasterVolume:j,setAutomaticScroll:Dn,setScrollContainer:Mn,scrollContainerRef:we,setContinuousPlay:vn,setLinkEndpoints:Ae,setAnnotationsEditable:ee,setAnnotations:En,setActiveAnnotationId:Qe,setLoopEnabled:qe,setLoopRegion:Je,setLoopRegionFromSelection:Cn,clearLoopRegion:st}),[Mt,yn,wn,xn,Rn,kn,Sn,In,_n,An,mn,Te,Fe,ge.zoomIn,ge.zoomOut,j,Dn,Mn,we,vn,Ae,ee,En,Qe,qe,Je,Cn,st]),sr=i.useMemo(()=>({duration:$,audioBuffers:P,peaksDataArray:U,trackStates:V,tracks:e,sampleRate:Tn,waveHeight:a,timeScaleHeight:Xt,minimumPlaylistHeight:$n,controls:c,playoutRef:D,samplesPerPixel:Ze,timeFormat:oe,masterVolume:pt,canZoomIn:ge.canZoomIn,canZoomOut:ge.canZoomOut,barWidth:g,barGap:y,progressBarWidth:x,isReady:G,mono:n,isDraggingRef:tt}),[$,P,U,V,e,Tn,a,Xt,$n,c,D,Ze,oe,pt,ge.canZoomIn,ge.canZoomOut,g,y,x,G,n,tt]),or={...wa,...l};return v.jsx(R.ThemeProvider,{theme:or,children:v.jsx(Ha.Provider,{value:nr,children:v.jsx(Xa.Provider,{value:ar,children:v.jsx(Oa.Provider,{value:rr,children:v.jsx(Na.Provider,{value:sr,children:w})})})})})},We=()=>{const e=i.useContext(Ha);if(!e)throw new Error("usePlaybackAnimation must be used within WaveformPlaylistProvider");return e},Pe=()=>{const e=i.useContext(Xa);if(!e)throw new Error("usePlaylistState must be used within WaveformPlaylistProvider");return e},pe=()=>{const e=i.useContext(Oa);if(!e)throw new Error("usePlaylistControls must be used within WaveformPlaylistProvider");return e},_e=()=>{const e=i.useContext(Na);if(!e)throw new Error("usePlaylistData must be used within WaveformPlaylistProvider");return e};var ui=class{constructor(e){this._playbackRate=1,this.handleEnded=()=>{this.onStopCallback&&this.onStopCallback()},this.handleTimeUpdate=()=>{this.onTimeUpdateCallback&&this.onTimeUpdateCallback(this.audioElement.currentTime)},this._peaks=e.peaks,this._id=e.id??`track-${Date.now()}`,this._name=e.name??"Track",this._playbackRate=e.playbackRate??1,typeof e.source=="string"?(this.audioElement=new Audio(e.source),this.ownsElement=!0):(this.audioElement=e.source,this.ownsElement=!1),this.audioElement.preload="auto",this.audioElement.volume=e.volume??1,this.audioElement.playbackRate=this._playbackRate;const t=this.audioElement;"preservesPitch"in this.audioElement?t.preservesPitch=!0:"mozPreservesPitch"in this.audioElement?t.mozPreservesPitch=!0:"webkitPreservesPitch"in this.audioElement&&(t.webkitPreservesPitch=!0),this.audioElement.addEventListener("ended",this.handleEnded),this.audioElement.addEventListener("timeupdate",this.handleTimeUpdate)}play(e=0){this.audioElement.currentTime=e,this.audioElement.play().catch(t=>{console.warn("MediaElementTrack: play() failed:",t)})}pause(){this.audioElement.pause()}stop(){this.audioElement.pause(),this.audioElement.currentTime=0}seekTo(e){this.audioElement.currentTime=Math.max(0,Math.min(e,this.duration))}setVolume(e){this.audioElement.volume=Math.max(0,Math.min(1,e))}setPlaybackRate(e){const t=Math.max(.5,Math.min(2,e));this._playbackRate=t,this.audioElement.playbackRate=t}setMuted(e){this.audioElement.muted=e}setOnStopCallback(e){this.onStopCallback=e}setOnTimeUpdateCallback(e){this.onTimeUpdateCallback=e}dispose(){this.audioElement.removeEventListener("ended",this.handleEnded),this.audioElement.removeEventListener("timeupdate",this.handleTimeUpdate),this.audioElement.pause(),this.ownsElement&&(this.audioElement.src="",this.audioElement.load())}get id(){return this._id}get name(){return this._name}get peaks(){return this._peaks}get currentTime(){return this.audioElement.currentTime}get duration(){return this.audioElement.duration||this._peaks.duration}get isPlaying(){return!this.audioElement.paused&&!this.audioElement.ended}get volume(){return this.audioElement.volume}get playbackRate(){return this._playbackRate}get muted(){return this.audioElement.muted}get element(){return this.audioElement}},di=class{constructor(e={}){this.track=null,this._isPlaying=!1,this._masterVolume=e.masterVolume??1,this._playbackRate=e.playbackRate??1}async init(){}addTrack(e){return this.track&&(console.warn("MediaElementPlayout: Only one track is supported. Disposing previous track. For multi-track, use TonePlayout."),this.track.dispose()),this.track=new ui({...e,volume:this._masterVolume*(e.volume??1),playbackRate:this._playbackRate}),this.track.setOnStopCallback(()=>{this._isPlaying=!1,this.onPlaybackCompleteCallback&&this.onPlaybackCompleteCallback()}),this.track}removeTrack(e){this.track&&this.track.id===e&&(this.track.dispose(),this.track=null)}getTrack(e){if(this.track&&this.track.id===e)return this.track}play(e,t,n){if(!this.track){console.warn("MediaElementPlayout: No track to play");return}const a=t??0;if(this._isPlaying=!0,this.track.play(a),n!==void 0){const r=n/this._playbackRate;setTimeout(()=>{this._isPlaying&&(this.pause(),this.onPlaybackCompleteCallback&&this.onPlaybackCompleteCallback())},r*1e3)}}pause(){this.track&&this.track.pause(),this._isPlaying=!1}stop(){this.track&&this.track.stop(),this._isPlaying=!1}seekTo(e){this.track&&this.track.seekTo(e)}getCurrentTime(){return this.track?this.track.currentTime:0}setMasterVolume(e){this._masterVolume=Math.max(0,Math.min(1,e)),this.track&&this.track.setVolume(this._masterVolume)}setPlaybackRate(e){this._playbackRate=Math.max(.5,Math.min(2,e)),this.track&&this.track.setPlaybackRate(this._playbackRate)}setMute(e,t){const n=this.getTrack(e);n&&n.setMuted(t)}setSolo(e,t){console.warn("MediaElementPlayout: Solo is not applicable for single-track playback")}setOnPlaybackComplete(e){this.onPlaybackCompleteCallback=e}dispose(){this.track&&(this.track.dispose(),this.track=null)}get isPlaying(){return this._isPlaying}get masterVolume(){return this._masterVolume}get playbackRate(){return this._playbackRate}get duration(){return this.track?.duration??0}get sampleRate(){return this.track?.peaks.sample_rate??44100}};const Ga=i.createContext(null),Ya=i.createContext(null),Ua=i.createContext(null),Ka=i.createContext(null),fi=({track:e,samplesPerPixel:t=1024,waveHeight:n=100,timescale:a=!1,playbackRate:r=1,automaticScroll:s=!1,theme:o,controls:l={show:!1,width:0},annotationList:c,barWidth:u=1,barGap:f=0,progressBarWidth:h,onAnnotationsChange:p,onReady:d,children:g})=>{const y=h??u+f,[b,m]=i.useState(!1),[w,x]=i.useState(0),[C,k]=i.useState(0),[S,I]=i.useState([]),[A,_]=i.useState(r),T=i.useMemo(()=>{if(!c?.annotations)return[];if(process.env.NODE_ENV!=="production"&&c.annotations.length>0){const Y=c.annotations[0];if(typeof Y.start!="number"||typeof Y.end!="number")return console.error("[waveform-playlist] Annotations must have numeric start/end values. In v6, use parseAeneas() from @waveform-playlist/annotations before passing annotations. Received start type: "+typeof Y.start),[]}return c.annotations},[c?.annotations]),M=i.useRef(T);M.current=T;const[W,$]=i.useState(null),[B,P]=i.useState(c?.isContinuousPlay??!1),[N]=i.useState(t),[U,J]=i.useState(s),V=i.useRef(null),te=i.useRef(0),se=i.useRef(B),Q=i.useRef(null),le=i.useRef(null),ce=i.useRef(s),ue=i.useRef(t),{startAnimationFrameLoop:Ae,stopAnimationFrameLoop:L}=za();i.useEffect(()=>{se.current=B},[B]),i.useEffect(()=>{ce.current=U},[U]);const ee=i.useCallback(Y=>{Q.current=Y,$(Y)},[]),G=i.useCallback(Y=>{se.current=Y,P(Y)},[]),K=i.useCallback(Y=>{le.current=Y},[]),D=e.waveformData.sample_rate;i.useEffect(()=>{const Y=new di({playbackRate:r});Y.addTrack({source:e.source,peaks:e.waveformData,name:e.name});const oe=Y.getTrack(Y.track?.id??"");return oe&&oe.setOnTimeUpdateCallback(Te=>{te.current=Te}),Y.setOnPlaybackComplete(()=>{L(),m(!1),ee(null),te.current=0,x(0)}),V.current=Y,k(e.waveformData.duration),d?.(),()=>{L(),Y.dispose()}},[e.source,e.waveformData,e.name,r,d,L,ee]),i.useEffect(()=>{const Y=$o(e.waveformData,N,0,0,Math.ceil(e.waveformData.duration*D)),oe={clipId:"media-element-clip",trackName:e.name??"Track",peaks:{length:Y.length,data:[Y.data],bits:Y.bits},startSample:0,durationSamples:Math.ceil(e.waveformData.duration*D)};I([[oe]])},[e.waveformData,e.name,N,D]);const ie=i.useCallback(()=>{const Y=()=>{const oe=V.current?.getCurrentTime()??0;te.current=oe;const Te=M.current;if(Te.length>0){const Fe=Te.find(ge=>oe>=ge.start&&oe<ge.end);if(se.current)Fe&&Fe.id!==Q.current?ee(Fe.id):!Fe&&Q.current!==null&&ee(null);else if(Q.current){const ge=Te.find(Ze=>Ze.id===Q.current);if(ge&&oe>=ge.end){V.current?.stop(),m(!1);return}}else Fe&&ee(Fe.id)}if(ce.current&&le.current){const Fe=le.current,ge=oe*D/ue.current,Ze=Fe.clientWidth,ut=l.show?l.width:0,ht=ge+ut,pt=Math.max(0,ht-Ze/2);Fe.scrollLeft=pt}Ae(Y)};Ae(Y)},[ee,D,l,Ae]),z=L,be=i.useCallback(Y=>{if(!V.current)return;const oe=Y??te.current;V.current.play(void 0,oe),m(!0),ie()},[ie]),Ve=i.useCallback(()=>{V.current&&(V.current.pause(),m(!1),z(),x(V.current.getCurrentTime()))},[z]),ye=i.useCallback(()=>{V.current&&(V.current.stop(),m(!1),z(),te.current=0,x(0),ee(null))},[z,ee]),Me=i.useCallback(Y=>{const oe=Math.max(0,Math.min(Y,C));te.current=oe,x(oe),V.current&&V.current.seekTo(oe)},[C]),q=i.useCallback(Y=>{const oe=Math.max(.5,Math.min(2,Y));_(oe),V.current&&V.current.setPlaybackRate(oe)},[]),we=a?30:0,Xe=i.useMemo(()=>({isPlaying:b,currentTime:w,currentTimeRef:te}),[b,w]),ve=i.useMemo(()=>({continuousPlay:B,annotations:T,activeAnnotationId:W,playbackRate:A,isAutomaticScroll:U}),[B,T,W,A,U]),Se=i.useRef(p);Se.current=p;const Ee=i.useCallback(Y=>{const oe=typeof Y=="function"?Y(M.current):Y;if(!Se.current){process.env.NODE_ENV!=="production"&&console.warn("waveform-playlist: setAnnotations was called but no onAnnotationsChange callback is provided. Annotation edits will not persist. Pass onAnnotationsChange to MediaElementPlaylistProvider to handle annotation updates.");return}Se.current(oe)},[]),Oe=i.useMemo(()=>({play:be,pause:Ve,stop:ye,seekTo:Me,setPlaybackRate:q,setContinuousPlay:G,setAnnotations:Ee,setActiveAnnotationId:ee,setAutomaticScroll:Y=>{J(Y)},setScrollContainer:K,scrollContainerRef:le}),[be,Ve,ye,Me,q,G,Ee,ee,K]),et=i.useMemo(()=>({duration:C,peaksDataArray:S,sampleRate:D,waveHeight:n,timeScaleHeight:we,samplesPerPixel:N,playoutRef:V,controls:l,barWidth:u,barGap:f,progressBarWidth:y}),[C,S,D,n,we,N,l,u,f,y]),tt={...wa,...o};return v.jsx(R.ThemeProvider,{theme:tt,children:v.jsx(Ga.Provider,{value:Xe,children:v.jsx(Ya.Provider,{value:ve,children:v.jsx(Ua.Provider,{value:Oe,children:v.jsx(Ka.Provider,{value:et,children:g})})})})})},Vt=()=>{const e=i.useContext(Ga);if(!e)throw new Error("useMediaElementAnimation must be used within MediaElementPlaylistProvider");return e},Zt=()=>{const e=i.useContext(Ya);if(!e)throw new Error("useMediaElementState must be used within MediaElementPlaylistProvider");return e},un=()=>{const e=i.useContext(Ua);if(!e)throw new Error("useMediaElementControls must be used within MediaElementPlaylistProvider");return e},Lt=()=>{const e=i.useContext(Ka);if(!e)throw new Error("useMediaElementData must be used within MediaElementPlaylistProvider");return e},mi=({className:e})=>{const{isPlaying:t,currentTimeRef:n}=We(),{selectionStart:a,selectionEnd:r,isLoopEnabled:s}=Pe(),{play:o}=pe(),l=async()=>{if(a!==r&&r>a)if(s)await o(a);else{const u=r-a;await o(a,u)}else await o(n.current??0)};return v.jsx(He,{onClick:l,disabled:t,className:e,children:"Play"})},hi=({className:e})=>{const{isPlaying:t}=We(),{pause:n}=pe();return v.jsx(He,{onClick:n,disabled:!t,className:e,children:"Pause"})},pi=({className:e})=>{const{isPlaying:t}=We(),{stop:n}=pe();return v.jsx(He,{onClick:n,disabled:!t,className:e,children:"Stop"})},gi=({className:e})=>{const{isPlaying:t}=We(),{play:n,setCurrentTime:a}=pe(),{playoutRef:r}=_e(),s=()=>{a(0),t&&r.current&&(r.current.stop(),n(0))};return v.jsx(He,{onClick:s,className:e,children:"Rewind"})},bi=({className:e})=>{const{isPlaying:t}=We(),{play:n,setCurrentTime:a}=pe(),{duration:r,playoutRef:s}=_e(),o=()=>{a(r),t&&s.current&&(s.current.stop(),n(r))};return v.jsx(He,{onClick:o,className:e,children:"Fast Forward"})},vi=({skipAmount:e=5,className:t})=>{const{currentTimeRef:n,isPlaying:a}=We(),{play:r,setCurrentTime:s}=pe(),{playoutRef:o}=_e(),l=()=>{const c=Math.max(0,(n.current??0)-e);s(c),a&&o.current&&(o.current.stop(),r(c))};return v.jsx(He,{onClick:l,className:t,children:"Skip Backward"})},Ci=({skipAmount:e=5,className:t})=>{const{currentTimeRef:n,isPlaying:a}=We(),{play:r,setCurrentTime:s}=pe(),{duration:o,playoutRef:l}=_e(),c=()=>{const u=Math.min(o,(n.current??0)+e);s(u),a&&l.current&&(l.current.stop(),r(u))};return v.jsx(He,{onClick:c,className:t,children:"Skip Forward"})},yi=({className:e})=>{const{isLoopEnabled:t,loopStart:n,loopEnd:a}=Pe(),{setLoopEnabled:r,setLoopRegion:s}=pe(),{duration:o}=_e(),l=n!==a&&a>n,c=()=>{if(!t&&!l){const u=Math.min(10,o*.25);s(0,Math.max(1,u))}r(!t)};return v.jsx(He,{onClick:c,className:e,title:t?"Disable loop":"Enable loop",children:t?"Loop On":"Loop Off"})},wi=({className:e})=>{const{selectionStart:t,selectionEnd:n,loopStart:a,loopEnd:r}=Pe(),{setLoopRegionFromSelection:s,clearLoopRegion:o}=pe(),l=t!==n&&n>t,c=a!==r&&r>a,u=()=>{c?o():s()};return v.jsx(He,{onClick:u,disabled:!l&&!c,className:e,title:c?"Clear loop region":l?"Set loop region from selection":"Create a selection first",children:c?"Clear Loop":"Set Loop"})},xi=({className:e,disabled:t})=>{const{zoomIn:n}=pe(),{canZoomIn:a}=_e();return v.jsx(He,{onClick:n,disabled:t||!a,className:e,children:"Zoom In"})},ki=({className:e,disabled:t})=>{const{zoomOut:n}=pe(),{canZoomOut:a}=_e();return v.jsx(He,{onClick:n,disabled:t||!a,className:e,children:"Zoom Out"})},Si=({className:e})=>{const{masterVolume:t}=_e(),{setMasterVolume:n}=pe();return v.jsx(ms,{volume:t,onChange:n,className:e})},Ii=({className:e})=>{const{timeFormat:t}=_e(),{setTimeFormat:n}=pe();return v.jsx(Us,{value:t,onChange:n,className:e})},_i=R.span`
946
946
  font-family: 'Courier New', Monaco, monospace;
947
947
  font-size: 1rem;
948
948
  font-weight: 600;
949
949
  color: ${e=>e.theme?.textColor||"#333"};
950
950
  user-select: none;
951
- `,Qs=({className:e})=>{const t=o.useRef(null),n=o.useRef(null),{isPlaying:a,currentTimeRef:r,playbackStartTimeRef:s,audioStartPositionRef:i}=Re(),{timeFormat:l}=Me();return o.useEffect(()=>{const c=()=>{if(t.current){let u;if(a){const m=Z.getContext().currentTime-(s.current??0);u=(i.current??0)+m}else u=r.current??0;t.current.textContent=mt(u,l)}a&&(n.current=requestAnimationFrame(c))};return a?n.current=requestAnimationFrame(c):c(),()=>{n.current&&(cancelAnimationFrame(n.current),n.current=null)}},[a,l,r,s,i]),o.useEffect(()=>{!a&&t.current&&(t.current.textContent=mt(r.current??0,l))}),v.jsx(Js,{ref:t,className:e,"aria-label":"Audio position",children:mt(r.current??0,l)})},ei=({className:e})=>{const{selectionStart:t,selectionEnd:n}=De(),{setSelection:a}=be();return v.jsx(Jr,{selectionStart:t,selectionEnd:n,onSelectionChange:a,className:e})},ti=({className:e})=>{const{isAutomaticScroll:t}=De(),{setAutomaticScroll:n}=be();return v.jsx(vr,{checked:t,onChange:n,className:e})},Vt=o.createContext(null),ni=Vt.Provider;function ct(){const e=o.useContext(Vt);if(!e)throw new Error("useAnnotationIntegration must be used within <AnnotationProvider>. Install @waveform-playlist/annotations and wrap your app with <AnnotationProvider>. See: https://waveform-playlist.naomiaro.com/docs/guides/annotations");return e}const ai=({className:e})=>{const{ContinuousPlayCheckbox:t}=ct(),{continuousPlay:n}=De(),{setContinuousPlay:a}=be();return v.jsx(t,{checked:n,onChange:a,className:e})},ri=({className:e})=>{const{LinkEndpointsCheckbox:t}=ct(),{linkEndpoints:n}=De(),{setLinkEndpoints:a}=be();return v.jsx(t,{checked:n,onChange:a,className:e})},oi=({className:e})=>{const{EditableCheckbox:t}=ct(),{annotationsEditable:n}=De(),{setAnnotationsEditable:a}=be();return v.jsx(t,{checked:n,onChange:a,className:e})},si=({filename:e,className:t})=>{const{DownloadAnnotationsButton:n}=ct(),{annotations:a}=De();return v.jsx(n,{annotations:a,filename:e,className:t})},ii=({label:e="Export WAV",filename:t="export",mode:n="master",trackIndex:a,bitDepth:r=16,applyEffects:s=!0,effectsFunction:i,createOfflineTrackEffects:l,className:c,onExportComplete:u,onExportError:m})=>{const{tracks:h,trackStates:p}=Me(),{exportWav:f,isExporting:b,progress:w}=Sa(),g=async()=>{try{const x=await f(h,p,{filename:t,mode:n,trackIndex:a,bitDepth:r,applyEffects:s,effectsFunction:i,createOfflineTrackEffects:l,autoDownload:!0});u?.(x.blob)}catch(x){m?.(x instanceof Error?x:new Error("Export failed"))}},d=b?`Exporting ${Math.round(w*100)}%`:e;return v.jsx(He,{onClick:g,disabled:b||h.length===0,className:c,children:d})},li=R.div.attrs(e=>({style:{width:`${e.$width}px`,background:e.$color}}))`
951
+ `,Ai=({className:e})=>{const t=i.useRef(null),n=i.useRef(null),{isPlaying:a,currentTimeRef:r,playbackStartTimeRef:s,audioStartPositionRef:o}=We(),{timeFormat:l}=_e();return i.useEffect(()=>{const c=()=>{if(t.current){let u;if(a){const f=Z.getContext().currentTime-(s.current??0);u=(o.current??0)+f}else u=r.current??0;t.current.textContent=mt(u,l)}a&&(n.current=requestAnimationFrame(c))};return a?n.current=requestAnimationFrame(c):c(),()=>{n.current&&(cancelAnimationFrame(n.current),n.current=null)}},[a,l,r,s,o]),i.useEffect(()=>{!a&&t.current&&(t.current.textContent=mt(r.current??0,l))}),v.jsx(_i,{ref:t,className:e,"aria-label":"Audio position",children:mt(r.current??0,l)})},Mi=({className:e})=>{const{selectionStart:t,selectionEnd:n}=Pe(),{setSelection:a}=pe();return v.jsx(Ss,{selectionStart:t,selectionEnd:n,onSelectionChange:a,className:e})},Ei=({className:e})=>{const{isAutomaticScroll:t}=Pe(),{setAutomaticScroll:n}=pe();return v.jsx(Xr,{checked:t,onChange:n,className:e})},jt=i.createContext(null),Ti=jt.Provider;function ct(){const e=i.useContext(jt);if(!e)throw new Error("useAnnotationIntegration must be used within <AnnotationProvider>. Install @waveform-playlist/annotations and wrap your app with <AnnotationProvider>. See: https://waveform-playlist.naomiaro.com/docs/guides/annotations");return e}const $i=({className:e})=>{const{ContinuousPlayCheckbox:t}=ct(),{continuousPlay:n}=Pe(),{setContinuousPlay:a}=pe();return v.jsx(t,{checked:n,onChange:a,className:e})},Ri=({className:e})=>{const{LinkEndpointsCheckbox:t}=ct(),{linkEndpoints:n}=Pe(),{setLinkEndpoints:a}=pe();return v.jsx(t,{checked:n,onChange:a,className:e})},Di=({className:e})=>{const{EditableCheckbox:t}=ct(),{annotationsEditable:n}=Pe(),{setAnnotationsEditable:a}=pe();return v.jsx(t,{checked:n,onChange:a,className:e})},Bi=({filename:e,className:t})=>{const{DownloadAnnotationsButton:n}=ct(),{annotations:a}=Pe();return v.jsx(n,{annotations:a,filename:e,className:t})},Fi=({label:e="Export WAV",filename:t="export",mode:n="master",trackIndex:a,bitDepth:r=16,applyEffects:s=!0,effectsFunction:o,createOfflineTrackEffects:l,className:c,onExportComplete:u,onExportError:f})=>{const{tracks:h,trackStates:p}=_e(),{exportWav:d,isExporting:g,progress:y}=ja(),b=async()=>{try{const w=await d(h,p,{filename:t,mode:n,trackIndex:a,bitDepth:r,applyEffects:s,effectsFunction:o,createOfflineTrackEffects:l,autoDownload:!0});u?.(w.blob)}catch(w){f?.(w instanceof Error?w:new Error("Export failed"))}},m=g?`Exporting ${Math.round(y*100)}%`:e;return v.jsx(He,{onClick:b,disabled:g||h.length===0,className:c,children:m})},Wi=R.div.attrs(e=>({style:{width:`${e.$width}px`,background:e.$color}}))`
952
952
  position: absolute;
953
953
  top: 0;
954
954
  left: 0;
@@ -956,9 +956,9 @@ self.onmessage = function(e) {
956
956
  z-index: 100; /* Below sticky controls (z-index: 101) so playhead is hidden when scrolled behind controls */
957
957
  pointer-events: none;
958
958
  will-change: transform;
959
- `,ci=({color:e="#ff0000",controlsOffset:t=0})=>{const n=o.useRef(null),a=o.useRef(null),{isPlaying:r,currentTimeRef:s,playbackStartTimeRef:i,audioStartPositionRef:l}=Re(),{samplesPerPixel:c,sampleRate:u,progressBarWidth:m}=Me();return o.useEffect(()=>{const h=()=>{if(n.current){let p;if(r){const b=Z.getContext().currentTime-(i.current??0);p=(l.current??0)+b}else p=s.current??0;const f=p*u/c+t;n.current.style.transform=`translate3d(${f}px, 0, 0)`}r&&(a.current=requestAnimationFrame(h))};return r?a.current=requestAnimationFrame(h):h(),()=>{a.current&&(cancelAnimationFrame(a.current),a.current=null)}},[r,u,c,t,s,i,l]),o.useEffect(()=>{if(!r&&n.current){const p=(s.current??0)*u/c+t;n.current.style.transform=`translate3d(${p}px, 0, 0)`}}),v.jsx(li,{ref:n,$color:e,$width:m,"data-playhead":!0})},ui=R.div`
959
+ `,Pi=({color:e="#ff0000",controlsOffset:t=0})=>{const n=i.useRef(null),a=i.useRef(null),{isPlaying:r,currentTimeRef:s,playbackStartTimeRef:o,audioStartPositionRef:l}=We(),{samplesPerPixel:c,sampleRate:u,progressBarWidth:f}=_e();return i.useEffect(()=>{const h=()=>{if(n.current){let p;if(r){const g=Z.getContext().currentTime-(o.current??0);p=(l.current??0)+g}else p=s.current??0;const d=p*u/c+t;n.current.style.transform=`translate3d(${d}px, 0, 0)`}r&&(a.current=requestAnimationFrame(h))};return r?a.current=requestAnimationFrame(h):h(),()=>{a.current&&(cancelAnimationFrame(a.current),a.current=null)}},[r,u,c,t,s,o,l]),i.useEffect(()=>{if(!r&&n.current){const p=(s.current??0)*u/c+t;n.current.style.transform=`translate3d(${p}px, 0, 0)`}}),v.jsx(Wi,{ref:n,$color:e,$width:f,"data-playhead":!0})},Vi=R.div`
960
960
  position: relative;
961
- `,Ot=R.div.attrs(e=>({style:{top:`${e.$top}px`,width:`${e.$width}px`,height:`${e.$height}px`,background:e.$color}}))`
961
+ `,Yt=R.div.attrs(e=>({style:{top:`${e.$top}px`,width:`${e.$width}px`,height:`${e.$height}px`,background:e.$color}}))`
962
962
  position: absolute;
963
963
  left: 0;
964
964
  z-index: 0;
@@ -966,7 +966,7 @@ self.onmessage = function(e) {
966
966
  transform: translateZ(0);
967
967
  backface-visibility: hidden;
968
968
  will-change: transform;
969
- `,di=R.div.attrs(e=>({style:{top:`${e.$top}px`,height:`${e.$height}px`,width:`${e.$width}px`,background:e.$color,transform:"scaleX(0)"}}))`
969
+ `,Zi=R.div.attrs(e=>({style:{top:`${e.$top}px`,height:`${e.$height}px`,width:`${e.$width}px`,background:e.$color,transform:"scaleX(0)"}}))`
970
970
  position: absolute;
971
971
  left: 0;
972
972
  pointer-events: none;
@@ -974,10 +974,10 @@ self.onmessage = function(e) {
974
974
  transform-origin: left;
975
975
  /* scaleX changes are composite-only (GPU) — no layout reflow per frame */
976
976
  will-change: transform;
977
- `,fi=R.div`
977
+ `,Li=R.div`
978
978
  position: relative;
979
979
  z-index: 2;
980
- `,zn=({clipStartSample:e,clipDurationSamples:t,...n})=>{const a=o.useRef(null),r=o.useRef(null),s=wt(),{waveHeight:i}=Bt(),{isPlaying:l,currentTimeRef:c,playbackStartTimeRef:u,audioStartPositionRef:m}=Re(),{samplesPerPixel:h,sampleRate:p}=Me(),f=s?.waveProgressColor||"rgba(0, 0, 0, 0.1)";o.useEffect(()=>{const M=()=>{if(a.current){let A;if(l){const B=Z.getContext().currentTime-(u.current??0);A=(m.current??0)+B}else A=c.current??0;const E=A*p,_=e+t;let I=0;E<=e?I=0:E>=_?I=1:I=(E-e)/t,a.current.style.transform=`scaleX(${I})`}l&&(r.current=requestAnimationFrame(M))};return l?r.current=requestAnimationFrame(M):M(),()=>{r.current&&(cancelAnimationFrame(r.current),r.current=null)}},[l,p,h,e,t,n.length,c,u,m]),o.useEffect(()=>{if(!l&&a.current){const A=(c.current??0)*p,E=e+t;let _=0;A<=e?_=0:A>=E?_=1:_=(A-e)/t,a.current.style.transform=`scaleX(${_})`}});const b=s?.waveformDrawMode||"inverted";let w;b==="inverted"?w=n.isSelected&&s?s.selectedWaveFillColor:s?.waveFillColor||"white":w=n.isSelected&&s?s.selectedWaveOutlineColor:s?.waveOutlineColor||"grey";const g=n.renderMode==="spectrogram"||n.renderMode==="both",d=n.renderMode==="both",x=g?"#000":tt(w),y=Math.floor(i/2),C=i,k=n.index*i,S=tt(w);return v.jsxs(ui,{children:[d?v.jsxs(v.Fragment,{children:[v.jsx(Ot,{$color:"#000",$height:y,$top:k,$width:n.length}),v.jsx(Ot,{$color:S,$height:y,$top:k+y,$width:n.length})]}):v.jsx(Ot,{$color:x,$height:C,$top:k,$width:n.length}),v.jsx(di,{ref:a,$color:f,$height:C,$top:k,$width:n.length}),v.jsx(fi,{children:v.jsx(pa,{...n,transparentBackground:!0})})]})},on=o.createContext(null),mi=on.Provider;function hi(){const e=o.useContext(on);if(!e)throw new Error("useSpectrogramIntegration must be used within <SpectrogramProvider>. Install @waveform-playlist/spectrogram and wrap your app with <SpectrogramProvider>.");return e}const pi=60,Ba=({renderTrackControls:e,renderTimestamp:t,renderPlayhead:n,annotationControls:a,getAnnotationBoxLabel:r,className:s,showClipHeaders:i=!1,interactiveClips:l=!1,showFades:c=!1,touchOptimized:u=!1,onRemoveTrack:m,recordingState:h})=>{const p=wt(),{isPlaying:f,currentTimeRef:b,playbackStartTimeRef:w,audioStartPositionRef:g}=Re(),{selectionStart:d,selectionEnd:x,annotations:y,activeAnnotationId:C,annotationsEditable:k,linkEndpoints:S,continuousPlay:M,selectedTrackId:A,loopStart:E,loopEnd:_,isLoopEnabled:I}=De(),B=o.useContext(Vt),{setAnnotations:$,setActiveAnnotationId:W,setTrackMute:z,setTrackSolo:Y,setTrackVolume:j,setTrackPan:N,setSelection:L,play:ae,setScrollContainer:oe,setSelectedTrackId:q,setCurrentTime:fe,setLoopRegion:ue}=be(),{peaksDataArray:le,trackStates:Ee,tracks:P,duration:ee,samplesPerPixel:U,sampleRate:K,waveHeight:ie,timeScaleHeight:he,controls:te,playoutRef:Se,barWidth:Be,barGap:Xe,isReady:qe}=Me(),ne=o.useContext(on),Ve=o.useMemo(()=>{if(!ne)return new Map;const V=new Map;return P.forEach(X=>{if((ne.trackSpectrogramOverrides.get(X.id)?.renderMode??X.renderMode??"waveform")==="waveform")return;const me=ne.trackSpectrogramOverrides.get(X.id),pe=me?.colorMap??X.spectrogramColorMap??ne.spectrogramColorMap??"viridis",_e=me?.config??X.spectrogramConfig??ne.spectrogramConfig;V.set(X.id,{colorLUT:ne.getColorMap(pe),frequencyScaleFn:ne.getFrequencyScale(_e?.frequencyScale??"mel"),config:_e})}),V},[P,ne]),Oe=o.useMemo(()=>{if(ne?.spectrogramWorkerApi)return{registerCanvas:ne.spectrogramWorkerApi.registerCanvas.bind(ne.spectrogramWorkerApi),unregisterCanvas:ne.spectrogramWorkerApi.unregisterCanvas.bind(ne.spectrogramWorkerApi)}},[ne?.spectrogramWorkerApi]),[F,ye]=o.useState(null),[ce,je]=o.useState(!1),nt=o.useRef(null),Le=o.useCallback(V=>{nt.current=V,oe(V)},[oe]),O=P.reduce((V,X)=>X.clips.reduce((Q,me)=>{const pe=(me.startSample+me.durationSamples)/me.sampleRate;return Math.max(Q,pe)},V),0);let se=O>0?O:ee>0?ee:pi;if(h?.isRecording){const X=(h.startSample+h.durationSamples)/K;se=Math.max(se,X+10)}const ve=Math.floor(se*K/U),$e=async V=>{W(V.id);const X=M?void 0:V.end-V.start;try{await ae(V.start,X)}catch(Q){console.error("waveform-playlist: Failed to start playback for annotation",V.id,Q)}},Te=o.useCallback(V=>{if(V>=0&&V<P.length){const X=P[V];q(X.id)}},[P,q]),Ge=V=>{const X=V.currentTarget.getBoundingClientRect(),Q=te.show?te.width:0,pe=(V.clientX-X.left-Q)*U/K,Ce=V.clientY-X.top;let J=0,Ie=-1;for(let Fe=0;Fe<le.length;Fe++){const rt=le[Fe],Ne=rt.length>0?Math.max(1,...rt.map(Je=>Je.peaks.data.length)):1,ot=((ne?.trackSpectrogramOverrides.get(P[Fe]?.id)?.renderMode??P[Fe]?.renderMode??"waveform")==="both"?Ne*2:Ne)*ie+(i?22:0);if(Ce>=J&&Ce<J+ot){Ie=Fe;break}J+=ot}Ie!==-1&&Te(Ie),je(!0),fe(pe),L(pe,pe)},at=V=>{if(!ce)return;const X=V.currentTarget.getBoundingClientRect(),Q=te.show?te.width:0,pe=(V.clientX-X.left-Q)*U/K,_e=Math.min(d,pe),Ce=Math.max(d,pe);L(_e,Ce)},ut=V=>{if(!ce)return;je(!1);const X=V.currentTarget.getBoundingClientRect(),Q=te.show?te.width:0,pe=(V.clientX-X.left-Q)*U/K,_e=Math.min(d,pe),Ce=Math.max(d,pe);Math.abs(Ce-_e)<.1?(fe(_e),f&&Se.current?(Se.current.stop(),ae(_e)):Se.current&&Se.current.stop()):L(_e,Ce)};return P.some(V=>V.clips.length>0)&&le.length===0?v.jsx("div",{className:s,children:"Loading waveform..."}):v.jsxs(ha,{children:[v.jsx(Ct.Provider,{value:{samplesPerPixel:U,sampleRate:K,zoomLevels:[U],waveHeight:ie,timeScaleHeight:he,duration:se*1e3,controls:te,barWidth:Be,barGap:Xe},children:v.jsx(Qt,{theme:p,backgroundColor:tt(p.waveOutlineColor),timescaleBackgroundColor:p.timescaleBackgroundColor,scrollContainerWidth:ve+(te.show?te.width:0),timescaleWidth:ve,tracksWidth:ve,controlsWidth:te.show?te.width:0,onTracksMouseDown:Ge,onTracksMouseMove:at,onTracksMouseUp:ut,scrollContainerRef:Le,isSelecting:ce,"data-playlist-state":qe?"ready":"loading",timescale:he>0?v.jsxs(v.Fragment,{children:[v.jsx(ga,{renderTimestamp:t}),I&&v.jsx(qr,{startPosition:Math.min(E,_)*K/U,endPosition:Math.max(E,_)*K/U,markerColor:p.loopMarkerColor,regionColor:p.loopRegionColor,minPosition:0,maxPosition:ve,controlsOffset:te.show?te.width:0,onLoopRegionChange:(V,X)=>{const Q=V*U/K,me=X*U/K;ue(Q,me)}})]}):void 0,children:v.jsxs(v.Fragment,{children:[le.map((V,X)=>{const Q=P[X];if(!Q)return null;const me=Ee[X]||{name:`Track ${X+1}`,muted:!1,soloed:!1,volume:1,pan:0},pe=ne?.trackSpectrogramOverrides.get(Q.id)?.renderMode??Q.renderMode??"waveform",_e=e?e(X):v.jsxs(To,{onClick:()=>Te(X),children:[v.jsxs(Ro,{style:{justifyContent:"center",position:"relative"},children:[m&&v.jsx($o,{onClick:J=>{J.stopPropagation(),m(X)}}),v.jsx("span",{style:{overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",padding:"0 24px",display:"block"},children:me.name||`Track ${X+1}`}),ne?.renderMenuItems&&v.jsx("span",{style:{position:"absolute",right:0,top:0},children:v.jsx(jo,{items:J=>ne.renderMenuItems({renderMode:pe,onRenderModeChange:Ie=>ne.setTrackRenderMode(Q.id,Ie),onOpenSettings:()=>ye(Q.id),onClose:J})})})]}),v.jsxs(_o,{children:[v.jsx(Wn,{$variant:me.muted?"danger":"outline",onClick:()=>z(X,!me.muted),children:"Mute"}),v.jsx(Wn,{$variant:me.soloed?"info":"outline",onClick:()=>Y(X,!me.soloed),children:"Solo"})]}),v.jsxs(Zn,{children:[v.jsx(Do,{}),v.jsx(Pn,{min:"0",max:"1",step:"0.01",value:me.volume,onChange:J=>j(X,parseFloat(J.target.value))}),v.jsx(Bo,{})]}),v.jsxs(Zn,{children:[v.jsx("span",{children:"L"}),v.jsx(Pn,{min:"-1",max:"1",step:"0.01",value:me.pan,onChange:J=>N(X,parseFloat(J.target.value))}),v.jsx("span",{children:"R"})]})]}),Ce=V.length>0?Math.max(1,...V.map(J=>J.peaks.data.length)):1;return v.jsx(tn.Provider,{value:_e,children:v.jsxs(ba,{numChannels:Ce,backgroundColor:tt(p.waveOutlineColor),offset:0,width:ve,hasClipHeaders:i,trackId:Q.id,isSelected:Q.id===A,children:[pe!=="waveform"&&(()=>{const J=Ve.get(Q.id),Ie=J?.config;return!Ie?.labels||!J?null:v.jsx(mo,{waveHeight:ie,numChannels:Ce,frequencyScaleFn:J.frequencyScaleFn,minFrequency:Ie.minFrequency??0,maxFrequency:Ie.maxFrequency??K/2,labelsColor:Ie.labelsColor,labelsBackground:Ie.labelsBackground,renderMode:pe,hasClipHeaders:i})})(),V.map((J,Ie)=>{const Fe=J.peaks,rt=Fe.length;return v.jsx(Yt,{clipId:J.clipId,trackIndex:X,clipIndex:Ie,trackName:J.trackName,startSample:J.startSample,durationSamples:J.durationSamples,samplesPerPixel:U,showHeader:i,disableHeaderDrag:!l,isSelected:Q.id===A,trackId:Q.id,fadeIn:J.fadeIn,fadeOut:J.fadeOut,sampleRate:K,showFades:c,touchOptimized:u,onMouseDown:Ne=>{Ne.target.closest('[role="button"][aria-roledescription="draggable"]')||Te(X)},children:Fe.data.map((Ne,Ye)=>{const dt=ne?.spectrogramDataMap.get(J.clipId),ot=dt?.[Ye]??dt?.[0],Je=Ve.get(Q.id),ze=Je?.config;return v.jsx(zn,{index:Ye,data:Ne,bits:Fe.bits,length:rt,isSelected:Q.id===A,clipStartSample:J.startSample,clipDurationSamples:J.durationSamples,renderMode:pe,spectrogramData:ot,samplesPerPixel:U,spectrogramColorLUT:Je?.colorLUT,spectrogramFrequencyScaleFn:Je?.frequencyScaleFn,spectrogramMinFrequency:ze?.minFrequency,spectrogramMaxFrequency:ze?.maxFrequency,spectrogramWorkerApi:Oe,spectrogramClipId:J.clipId,spectrogramOnCanvasesReady:ne?(xt,Qe)=>{ne.registerSpectrogramCanvases(J.clipId,Ye,xt,Qe)}:void 0},`${J.clipId}-${Ye}`)})},J.clipId)}),h?.isRecording&&h.trackId===Q.id&&h.peaks.length>0&&v.jsx(Yt,{clipId:"recording-preview",trackIndex:X,clipIndex:V.length,trackName:"Recording...",startSample:h.startSample,durationSamples:h.durationSamples,samplesPerPixel:U,showHeader:i,disableHeaderDrag:!0,isSelected:Q.id===A,trackId:Q.id,children:v.jsx(zn,{index:0,data:h.peaks,bits:16,length:Math.floor(h.peaks.length/2),isSelected:Q.id===A,clipStartSample:h.startSample,clipDurationSamples:h.durationSamples},`${Q.id}-recording-0`)},`${Q.id}-recording`)]})},Q.id)}),y.length>0&&B&&v.jsx(B.AnnotationBoxesWrapper,{height:30,width:ve,children:y.map((V,X)=>{const Q=V.start*K/U,me=V.end*K/U,pe=r?r(V,X):V.id;return v.jsx(B.AnnotationBox,{annotationId:V.id,annotationIndex:X,startPosition:Q,endPosition:me,label:pe,color:"#ff9800",isActive:V.id===C,onClick:()=>$e(V),editable:k},V.id)})}),d!==x&&v.jsx(da,{startPosition:Math.min(d,x)*K/U+(te.show?te.width:0),endPosition:Math.max(d,x)*K/U+(te.show?te.width:0),color:p.selectionColor}),(f||d===x)&&(n?n({position:(b.current??0)*K/U+(te.show?te.width:0),color:p.playheadColor,isPlaying:f,currentTimeRef:b,playbackStartTimeRef:w,audioStartPositionRef:g,samplesPerPixel:U,sampleRate:K,controlsOffset:te.show?te.width:0,getAudioContextTime:()=>Z.getContext().currentTime}):v.jsx(ci,{color:p.playheadColor,controlsOffset:te.show?te.width:0}))]})})}),ne?.SettingsModal&&typeof document<"u"&&Hn.createPortal(v.jsx(ne.SettingsModal,{open:F!==null,onClose:()=>ye(null),config:F!==null?ne.trackSpectrogramOverrides.get(F)?.config??P.find(V=>V.id===F)?.spectrogramConfig??ne.spectrogramConfig??{}:{},colorMap:F!==null?ne.trackSpectrogramOverrides.get(F)?.colorMap??P.find(V=>V.id===F)?.spectrogramColorMap??ne.spectrogramColorMap??"viridis":"viridis",onApply:(V,X)=>{F!==null&&ne.setTrackSpectrogramConfig(F,V,X)}}),document.body)]})},Fa=({height:e,renderAnnotationItem:t,onAnnotationUpdate:n,controls:a,annotationListConfig:r,scrollActivePosition:s="center",scrollActiveContainer:i="nearest"})=>{const{annotations:l,activeAnnotationId:c,annotationsEditable:u,linkEndpoints:m,continuousPlay:h}=De(),p=ct(),{setAnnotations:f}=be(),b=r??{linkEndpoints:m,continuousPlay:h},w=o.useCallback(d=>{f(d),n?.(d)},[f,n]),{AnnotationText:g}=p;return v.jsx(g,{annotations:l,activeAnnotationId:c??void 0,shouldScrollToActive:!0,scrollActivePosition:s,scrollActiveContainer:i,editable:u,controls:u?a:void 0,annotationListConfig:b,height:e,onAnnotationUpdate:w,renderAnnotationItem:t})},gi=({renderTrackControls:e,renderTimestamp:t,renderPlayhead:n,annotationControls:a,annotationListConfig:r,annotationTextHeight:s,renderAnnotationItem:i,getAnnotationBoxLabel:l,scrollActivePosition:c="center",scrollActiveContainer:u="nearest",className:m,showClipHeaders:h=!1,interactiveClips:p=!1,showFades:f=!1,touchOptimized:b=!1,onRemoveTrack:w,recordingState:g})=>{const{annotations:d}=De();return v.jsxs(v.Fragment,{children:[v.jsx(Ba,{renderTrackControls:e,renderTimestamp:t,renderPlayhead:n,annotationControls:a,getAnnotationBoxLabel:l,className:m,showClipHeaders:h,interactiveClips:p,showFades:f,touchOptimized:b,onRemoveTrack:w,recordingState:g}),d.length>0&&v.jsx(Fa,{height:s,renderAnnotationItem:i,controls:a,annotationListConfig:r,scrollActivePosition:c,scrollActiveContainer:u})]})},bi=R.div`
980
+ `,aa=({clipStartSample:e,clipDurationSamples:t,...n})=>{const a=i.useRef(null),r=i.useRef(null),s=xt(),{waveHeight:o}=Wt(),{isPlaying:l,currentTimeRef:c,playbackStartTimeRef:u,audioStartPositionRef:f}=We(),{samplesPerPixel:h,sampleRate:p}=_e(),d=s?.waveProgressColor||"rgba(0, 0, 0, 0.1)";i.useEffect(()=>{const I=()=>{if(a.current){let A;if(l){const W=Z.getContext().currentTime-(u.current??0);A=(f.current??0)+W}else A=c.current??0;const _=A*p,T=e+t;let M=0;_<=e?M=0:_>=T?M=1:M=(_-e)/t,a.current.style.transform=`scaleX(${M})`}l&&(r.current=requestAnimationFrame(I))};return l?r.current=requestAnimationFrame(I):I(),()=>{r.current&&(cancelAnimationFrame(r.current),r.current=null)}},[l,p,h,e,t,n.length,c,u,f]),i.useEffect(()=>{if(!l&&a.current){const A=(c.current??0)*p,_=e+t;let T=0;A<=e?T=0:A>=_?T=1:T=(A-e)/t,a.current.style.transform=`scaleX(${T})`}});const g=s?.waveformDrawMode||"inverted";let y;g==="inverted"?y=n.isSelected&&s?s.selectedWaveFillColor:s?.waveFillColor||"white":y=n.isSelected&&s?s.selectedWaveOutlineColor:s?.waveOutlineColor||"grey";const b=n.renderMode==="spectrogram"||n.renderMode==="both",m=n.renderMode==="both",w=b?"#000":at(y),x=Math.floor(o/2),C=o,k=n.index*o,S=at(y);return v.jsxs(Vi,{children:[m?v.jsxs(v.Fragment,{children:[v.jsx(Yt,{$color:"#000",$height:x,$top:k,$width:n.length}),v.jsx(Yt,{$color:S,$height:x,$top:k+x,$width:n.length})]}):v.jsx(Yt,{$color:w,$height:C,$top:k,$width:n.length}),v.jsx(Zi,{ref:a,$color:d,$height:C,$top:k,$width:n.length}),v.jsx(Li,{children:v.jsx(Ra,{...n,transparentBackground:!0})})]})},dn=i.createContext(null),ji=dn.Provider;function zi(){const e=i.useContext(dn);if(!e)throw new Error("useSpectrogramIntegration must be used within <SpectrogramProvider>. Install @waveform-playlist/spectrogram and wrap your app with <SpectrogramProvider>.");return e}const Hi=60,qa=({renderTrackControls:e,renderTimestamp:t,renderPlayhead:n,annotationControls:a,getAnnotationBoxLabel:r,className:s,showClipHeaders:o=!1,interactiveClips:l=!1,showFades:c=!1,touchOptimized:u=!1,onRemoveTrack:f,recordingState:h})=>{const p=xt(),{isPlaying:d,currentTimeRef:g,playbackStartTimeRef:y,audioStartPositionRef:b}=We(),{selectionStart:m,selectionEnd:w,annotations:x,activeAnnotationId:C,annotationsEditable:k,linkEndpoints:S,continuousPlay:I,selectedTrackId:A,loopStart:_,loopEnd:T,isLoopEnabled:M}=Pe(),W=i.useContext(jt),{setAnnotations:$,setActiveAnnotationId:B,setTrackMute:P,setTrackSolo:N,setTrackVolume:U,setTrackPan:J,setSelection:V,play:te,setScrollContainer:se,setSelectedTrackId:Q,setCurrentTime:le,setLoopRegion:ce}=pe(),{peaksDataArray:ue,trackStates:Ae,tracks:L,duration:ee,samplesPerPixel:G,sampleRate:K,waveHeight:D,timeScaleHeight:ie,controls:z,playoutRef:be,barWidth:Ve,barGap:ye,isReady:Me}=_e(),q=i.useContext(dn),we=i.useMemo(()=>{if(!q)return new Map;const j=new Map;return L.forEach(O=>{if((q.trackSpectrogramOverrides.get(O.id)?.renderMode??O.renderMode??"waveform")==="waveform")return;const fe=q.trackSpectrogramOverrides.get(O.id),he=fe?.colorMap??O.spectrogramColorMap??q.spectrogramColorMap??"viridis",$e=fe?.config??O.spectrogramConfig??q.spectrogramConfig;j.set(O.id,{colorLUT:q.getColorMap(he),frequencyScaleFn:q.getFrequencyScale($e?.frequencyScale??"mel"),config:$e})}),j},[L,q]),Xe=i.useMemo(()=>{if(q?.spectrogramWorkerApi)return{registerCanvas:q.spectrogramWorkerApi.registerCanvas.bind(q.spectrogramWorkerApi),unregisterCanvas:q.spectrogramWorkerApi.unregisterCanvas.bind(q.spectrogramWorkerApi)}},[q?.spectrogramWorkerApi]),[ve,Se]=i.useState(null),[Ee,Oe]=i.useState(!1),et=i.useRef(null),tt=i.useCallback(j=>{et.current=j,se(j)},[se]),Y=L.reduce((j,O)=>O.clips.reduce((ne,fe)=>{const he=(fe.startSample+fe.durationSamples)/fe.sampleRate;return Math.max(ne,he)},j),0);let oe=Y>0?Y:ee>0?ee:Hi;if(h?.isRecording){const O=(h.startSample+h.durationSamples)/K;oe=Math.max(oe,O+10)}const Te=Math.floor(oe*K/G),Fe=async j=>{B(j.id);const O=I?void 0:j.end-j.start;try{await te(j.start,O)}catch(ne){console.error("waveform-playlist: Failed to start playback for annotation",j.id,ne)}},ge=i.useCallback(j=>{if(j>=0&&j<L.length){const O=L[j];Q(O.id)}},[L,Q]),Ze=j=>{const O=j.currentTarget.getBoundingClientRect(),ne=z.show?z.width:0,he=(j.clientX-O.left-ne)*G/K,Re=j.clientY-O.top;let ae=0,Ie=-1;for(let Le=0;Le<ue.length;Le++){const rt=ue[Le],Ke=rt.length>0?Math.max(1,...rt.map(Ye=>Ye.peaks.data.length)):1,st=((q?.trackSpectrogramOverrides.get(L[Le]?.id)?.renderMode??L[Le]?.renderMode??"waveform")==="both"?Ke*2:Ke)*D+(o?22:0);if(Re>=ae&&Re<ae+st){Ie=Le;break}ae+=st}Ie!==-1&&ge(Ie),Oe(!0),le(he),V(he,he)},ut=j=>{if(!Ee)return;const O=j.currentTarget.getBoundingClientRect(),ne=z.show?z.width:0,he=(j.clientX-O.left-ne)*G/K,$e=Math.min(m,he),Re=Math.max(m,he);V($e,Re)},ht=j=>{if(!Ee)return;Oe(!1);const O=j.currentTarget.getBoundingClientRect(),ne=z.show?z.width:0,he=(j.clientX-O.left-ne)*G/K,$e=Math.min(m,he),Re=Math.max(m,he);Math.abs(Re-$e)<.1?(le($e),d&&be.current?(be.current.stop(),te($e)):be.current&&be.current.stop()):V($e,Re)};return L.some(j=>j.clips.length>0)&&ue.length===0?v.jsx("div",{className:s,children:"Loading waveform..."}):v.jsxs($a,{children:[v.jsx(wt.Provider,{value:{samplesPerPixel:G,sampleRate:K,zoomLevels:[G],waveHeight:D,timeScaleHeight:ie,duration:oe*1e3,controls:z,barWidth:Ve,barGap:ye},children:v.jsx(rn,{theme:p,backgroundColor:at(p.waveOutlineColor),timescaleBackgroundColor:p.timescaleBackgroundColor,scrollContainerWidth:Te+(z.show?z.width:0),timescaleWidth:Te,tracksWidth:Te,controlsWidth:z.show?z.width:0,onTracksMouseDown:Ze,onTracksMouseMove:ut,onTracksMouseUp:ht,scrollContainerRef:tt,isSelecting:Ee,"data-playlist-state":Me?"ready":"loading",timescale:ie>0?v.jsxs(v.Fragment,{children:[v.jsx(Da,{renderTimestamp:t}),M&&v.jsx(ks,{startPosition:Math.min(_,T)*K/G,endPosition:Math.max(_,T)*K/G,markerColor:p.loopMarkerColor,regionColor:p.loopRegionColor,minPosition:0,maxPosition:Te,controlsOffset:z.show?z.width:0,onLoopRegionChange:(j,O)=>{const ne=j*G/K,fe=O*G/K;ce(ne,fe)}})]}):void 0,children:v.jsxs(v.Fragment,{children:[ue.map((j,O)=>{const ne=L[O];if(!ne)return null;const fe=Ae[O]||{name:`Track ${O+1}`,muted:!1,soloed:!1,volume:1,pan:0},he=q?.trackSpectrogramOverrides.get(ne.id)?.renderMode??ne.renderMode??"waveform",$e=e?e(O):v.jsxs(no,{onClick:()=>ge(O),children:[v.jsxs(ao,{style:{justifyContent:"center",position:"relative"},children:[f&&v.jsx(to,{onClick:ae=>{ae.stopPropagation(),f(O)}}),v.jsx("span",{style:{overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",padding:"0 24px",display:"block"},children:fe.name||`Track ${O+1}`}),q?.renderMenuItems&&v.jsx("span",{style:{position:"absolute",right:0,top:0},children:v.jsx(fo,{items:ae=>q.renderMenuItems({renderMode:he,onRenderModeChange:Ie=>q.setTrackRenderMode(ne.id,Ie),onOpenSettings:()=>Se(ne.id),onClose:ae})})})]}),v.jsxs(Qs,{children:[v.jsx(qn,{$variant:fe.muted?"danger":"outline",onClick:()=>P(O,!fe.muted),children:"Mute"}),v.jsx(qn,{$variant:fe.soloed?"info":"outline",onClick:()=>N(O,!fe.soloed),children:"Solo"})]}),v.jsxs(Qn,{children:[v.jsx(ro,{}),v.jsx(Jn,{min:"0",max:"1",step:"0.01",value:fe.volume,onChange:ae=>U(O,parseFloat(ae.target.value))}),v.jsx(so,{})]}),v.jsxs(Qn,{children:[v.jsx("span",{children:"L"}),v.jsx(Jn,{min:"-1",max:"1",step:"0.01",value:fe.pan,onChange:ae=>J(O,parseFloat(ae.target.value))}),v.jsx("span",{children:"R"})]})]}),Re=j.length>0?Math.max(1,...j.map(ae=>ae.peaks.data.length)):1;return v.jsx(on.Provider,{value:$e,children:v.jsxs(Ba,{numChannels:Re,backgroundColor:at(p.waveOutlineColor),offset:0,width:Te,hasClipHeaders:o,trackId:ne.id,isSelected:ne.id===A,children:[he!=="waveform"&&(()=>{const ae=we.get(ne.id),Ie=ae?.config;return!Ie?.labels||!ae?null:v.jsx(Vs,{waveHeight:D,numChannels:Re,frequencyScaleFn:ae.frequencyScaleFn,minFrequency:Ie.minFrequency??0,maxFrequency:Ie.maxFrequency??K/2,labelsColor:Ie.labelsColor,labelsBackground:Ie.labelsBackground,renderMode:he,hasClipHeaders:o})})(),j.map((ae,Ie)=>{const Le=ae.peaks,rt=Le.length;return v.jsx(Qt,{clipId:ae.clipId,trackIndex:O,clipIndex:Ie,trackName:ae.trackName,startSample:ae.startSample,durationSamples:ae.durationSamples,samplesPerPixel:G,showHeader:o,disableHeaderDrag:!l,isSelected:ne.id===A,trackId:ne.id,fadeIn:ae.fadeIn,fadeOut:ae.fadeOut,sampleRate:K,showFades:c,touchOptimized:u,onMouseDown:Ke=>{Ke.target.closest('[role="button"][aria-roledescription="draggable"]')||ge(O)},children:Le.data.map((Ke,qe)=>{const Je=q?.spectrogramDataMap.get(ae.clipId),st=Je?.[qe]??Je?.[0],Ye=we.get(ne.id),ot=Ye?.config;return v.jsx(aa,{index:qe,data:Ke,bits:Le.bits,length:rt,isSelected:ne.id===A,clipStartSample:ae.startSample,clipDurationSamples:ae.durationSamples,renderMode:he,spectrogramData:st,samplesPerPixel:G,spectrogramColorLUT:Ye?.colorLUT,spectrogramFrequencyScaleFn:Ye?.frequencyScaleFn,spectrogramMinFrequency:ot?.minFrequency,spectrogramMaxFrequency:ot?.maxFrequency,spectrogramWorkerApi:Xe,spectrogramClipId:ae.clipId,spectrogramOnCanvasesReady:q?(dt,St)=>{q.registerSpectrogramCanvases(ae.clipId,qe,dt,St)}:void 0},`${ae.clipId}-${qe}`)})},ae.clipId)}),h?.isRecording&&h.trackId===ne.id&&h.peaks.length>0&&v.jsx(Qt,{clipId:"recording-preview",trackIndex:O,clipIndex:j.length,trackName:"Recording...",startSample:h.startSample,durationSamples:h.durationSamples,samplesPerPixel:G,showHeader:o,disableHeaderDrag:!0,isSelected:ne.id===A,trackId:ne.id,children:v.jsx(aa,{index:0,data:h.peaks,bits:16,length:Math.floor(h.peaks.length/2),isSelected:ne.id===A,clipStartSample:h.startSample,clipDurationSamples:h.durationSamples},`${ne.id}-recording-0`)},`${ne.id}-recording`)]})},ne.id)}),x.length>0&&W&&v.jsx(W.AnnotationBoxesWrapper,{height:30,width:Te,children:x.map((j,O)=>{const ne=j.start*K/G,fe=j.end*K/G,he=r?r(j,O):j.id;return v.jsx(W.AnnotationBox,{annotationId:j.id,annotationIndex:O,startPosition:ne,endPosition:fe,label:he,color:"#ff9800",isActive:j.id===C,onClick:()=>Fe(j),editable:k},j.id)})}),m!==w&&v.jsx(Ma,{startPosition:Math.min(m,w)*K/G+(z.show?z.width:0),endPosition:Math.max(m,w)*K/G+(z.show?z.width:0),color:p.selectionColor}),(d||m===w)&&(n?n({position:(g.current??0)*K/G+(z.show?z.width:0),color:p.playheadColor,isPlaying:d,currentTimeRef:g,playbackStartTimeRef:y,audioStartPositionRef:b,samplesPerPixel:G,sampleRate:K,controlsOffset:z.show?z.width:0,getAudioContextTime:()=>Z.getContext().currentTime}):v.jsx(Pi,{color:p.playheadColor,controlsOffset:z.show?z.width:0}))]})})}),q?.SettingsModal&&typeof document<"u"&&ra.createPortal(v.jsx(q.SettingsModal,{open:ve!==null,onClose:()=>Se(null),config:ve!==null?q.trackSpectrogramOverrides.get(ve)?.config??L.find(j=>j.id===ve)?.spectrogramConfig??q.spectrogramConfig??{}:{},colorMap:ve!==null?q.trackSpectrogramOverrides.get(ve)?.colorMap??L.find(j=>j.id===ve)?.spectrogramColorMap??q.spectrogramColorMap??"viridis":"viridis",onApply:(j,O)=>{ve!==null&&q.setTrackSpectrogramConfig(ve,j,O)}}),document.body)]})},Ja=({height:e,renderAnnotationItem:t,onAnnotationUpdate:n,controls:a,annotationListConfig:r,scrollActivePosition:s="center",scrollActiveContainer:o="nearest"})=>{const{annotations:l,activeAnnotationId:c,annotationsEditable:u,linkEndpoints:f,continuousPlay:h}=Pe(),p=ct(),{setAnnotations:d}=pe(),g=r??{linkEndpoints:f,continuousPlay:h},y=i.useCallback(m=>{d(m),n?.(m)},[d,n]),{AnnotationText:b}=p;return v.jsx(b,{annotations:l,activeAnnotationId:c??void 0,shouldScrollToActive:!0,scrollActivePosition:s,scrollActiveContainer:o,editable:u,controls:u?a:void 0,annotationListConfig:g,height:e,onAnnotationUpdate:y,renderAnnotationItem:t})},Xi=({renderTrackControls:e,renderTimestamp:t,renderPlayhead:n,annotationControls:a,annotationListConfig:r,annotationTextHeight:s,renderAnnotationItem:o,getAnnotationBoxLabel:l,scrollActivePosition:c="center",scrollActiveContainer:u="nearest",className:f,showClipHeaders:h=!1,interactiveClips:p=!1,showFades:d=!1,touchOptimized:g=!1,onRemoveTrack:y,recordingState:b})=>{const{annotations:m}=Pe();return v.jsxs(v.Fragment,{children:[v.jsx(qa,{renderTrackControls:e,renderTimestamp:t,renderPlayhead:n,annotationControls:a,getAnnotationBoxLabel:l,className:f,showClipHeaders:h,interactiveClips:p,showFades:d,touchOptimized:g,onRemoveTrack:y,recordingState:b}),m.length>0&&v.jsx(Ja,{height:s,renderAnnotationItem:o,controls:a,annotationListConfig:r,scrollActivePosition:c,scrollActiveContainer:u})]})},Oi=R.div`
981
981
  position: absolute;
982
982
  top: 0;
983
983
  left: 0;
@@ -987,9 +987,9 @@ self.onmessage = function(e) {
987
987
  z-index: 100;
988
988
  pointer-events: none;
989
989
  will-change: transform;
990
- `,vi=({color:e="#ff0000",controlsOffset:t=0})=>{const n=o.useRef(null),a=o.useRef(null),{isPlaying:r,currentTimeRef:s}=Wt(),{samplesPerPixel:i,sampleRate:l,progressBarWidth:c}=Zt();return o.useEffect(()=>{const u=()=>{if(n.current){const h=(s.current??0)*l/i+t;n.current.style.transform=`translate3d(${h}px, 0, 0)`}r&&(a.current=requestAnimationFrame(u))};return r?a.current=requestAnimationFrame(u):u(),()=>{a.current&&(cancelAnimationFrame(a.current),a.current=null)}},[r,l,i,t,s]),o.useEffect(()=>{if(!r&&n.current){const m=(s.current??0)*l/i+t;n.current.style.transform=`translate3d(${m}px, 0, 0)`}}),v.jsx(bi,{ref:n,$color:e,$width:c,"data-playhead":!0})},Ci=R.div`
990
+ `,Ni=({color:e="#ff0000",controlsOffset:t=0})=>{const n=i.useRef(null),a=i.useRef(null),{isPlaying:r,currentTimeRef:s}=Vt(),{samplesPerPixel:o,sampleRate:l,progressBarWidth:c}=Lt();return i.useEffect(()=>{const u=()=>{if(n.current){const h=(s.current??0)*l/o+t;n.current.style.transform=`translate3d(${h}px, 0, 0)`}r&&(a.current=requestAnimationFrame(u))};return r?a.current=requestAnimationFrame(u):u(),()=>{a.current&&(cancelAnimationFrame(a.current),a.current=null)}},[r,l,o,t,s]),i.useEffect(()=>{if(!r&&n.current){const f=(s.current??0)*l/o+t;n.current.style.transform=`translate3d(${f}px, 0, 0)`}}),v.jsx(Oi,{ref:n,$color:e,$width:c,"data-playhead":!0})},Gi=R.div`
991
991
  position: relative;
992
- `,wi=R.div`
992
+ `,Yi=R.div`
993
993
  position: absolute;
994
994
  top: ${e=>e.$top}px;
995
995
  left: 0;
@@ -1000,7 +1000,7 @@ self.onmessage = function(e) {
1000
1000
  transform: translateZ(0);
1001
1001
  backface-visibility: hidden;
1002
1002
  will-change: transform;
1003
- `,yi=R.div`
1003
+ `,Ui=R.div`
1004
1004
  position: absolute;
1005
1005
  top: ${e=>e.$top}px;
1006
1006
  left: 0;
@@ -1009,8 +1009,8 @@ self.onmessage = function(e) {
1009
1009
  pointer-events: none;
1010
1010
  z-index: 1;
1011
1011
  will-change: width;
1012
- `,xi=R.div`
1012
+ `,Ki=R.div`
1013
1013
  position: relative;
1014
1014
  z-index: 2;
1015
- `,ki=({clipStartSample:e,clipDurationSamples:t,...n})=>{const a=o.useRef(null),r=o.useRef(null),s=wt(),{waveHeight:i}=Bt(),{isPlaying:l,currentTimeRef:c}=Wt(),{samplesPerPixel:u,sampleRate:m}=Zt(),h=s?.waveProgressColor||"rgba(0, 0, 0, 0.1)";o.useEffect(()=>{const w=()=>{if(a.current){const d=(c.current??0)*m,x=e+t;let y=0;if(d<=e)y=0;else if(d>=x)y=n.length;else{const C=d-e;y=Math.floor(C/u)}a.current.style.width=`${y}px`}l&&(r.current=requestAnimationFrame(w))};return l?r.current=requestAnimationFrame(w):w(),()=>{r.current&&(cancelAnimationFrame(r.current),r.current=null)}},[l,m,u,e,t,n.length,c]),o.useEffect(()=>{if(!l&&a.current){const g=(c.current??0)*m,d=e+t;let x=0;if(g<=e)x=0;else if(g>=d)x=n.length;else{const y=g-e;x=Math.floor(y/u)}a.current.style.width=`${x}px`}});const p=s?.waveformDrawMode||"inverted";let f;p==="inverted"?f=s?.selectedWaveFillColor||s?.waveFillColor||"white":f=s?.selectedWaveOutlineColor||s?.waveOutlineColor||"grey";const b=tt(f);return v.jsxs(Ci,{children:[v.jsx(wi,{$color:b,$height:i,$top:n.index*i,$width:n.length}),v.jsx(yi,{ref:a,$color:h,$height:i,$top:n.index*i}),v.jsx(xi,{children:v.jsx(pa,{...n,isSelected:!0,transparentBackground:!0})})]})},Wa=({getAnnotationBoxLabel:e,editable:t=!1,linkEndpoints:n=!1,onAnnotationUpdate:a,className:r})=>{const s=wt(),{isPlaying:i}=Wt(),{annotations:l,activeAnnotationId:c}=Pt(),u=o.useContext(Vt),{play:m,seekTo:h,setActiveAnnotationId:p,setAnnotations:f,setScrollContainer:b}=rn(),{duration:w,peaksDataArray:g,sampleRate:d,waveHeight:x,timeScaleHeight:y,samplesPerPixel:C,controls:k,playoutRef:S,barWidth:M,barGap:A}=Zt(),[E,_]=o.useState(0),[I,B]=o.useState(0),[$,W]=o.useState(!1),z=o.useRef(null),Y=o.useCallback(P=>{z.current=P,b(P)},[b]),j=Math.floor(w*d/C),N=o.useCallback(async P=>{p(P.id);try{await m(P.start)}catch(ee){console.error("waveform-playlist: Failed to start playback for annotation",P.id,ee)}},[p,m]),L=o.useCallback(P=>{f(P),a?.(P)},[f,a]),{onDragStart:ae,onDragMove:oe,onDragEnd:q}=ka({annotations:l,onAnnotationsChange:L,samplesPerPixel:C,sampleRate:d,duration:w,linkEndpoints:n}),fe=o.useCallback(P=>{const ee=P.currentTarget.getBoundingClientRect(),U=k.show?k.width:0,ie=(P.clientX-ee.left-U)*C/d;W(!0),_(ie),B(ie)},[k,C,d]),ue=o.useCallback(P=>{if(!$)return;const ee=P.currentTarget.getBoundingClientRect(),U=k.show?k.width:0,ie=(P.clientX-ee.left-U)*C/d;B(ie)},[$,k,C,d]),le=o.useCallback(P=>{if(!$)return;W(!1);const ee=P.currentTarget.getBoundingClientRect(),U=k.show?k.width:0,ie=(P.clientX-ee.left-U)*C/d,he=Math.min(E,ie),te=Math.max(E,ie);Math.abs(te-he)<.1?(h(he),_(he),B(he),i&&S.current&&(S.current.stop(),m(he))):(_(he),B(te))},[$,E,C,d,k,h,i,S,m]);if(g.length===0)return v.jsx("div",{className:r,children:"Loading waveform..."});const Ee=null;return v.jsx(ha,{children:v.jsx(Ct.Provider,{value:{samplesPerPixel:C,sampleRate:d,zoomLevels:[C],waveHeight:x,timeScaleHeight:y,duration:w*1e3,controls:k,barWidth:M,barGap:A},children:v.jsx(Qt,{theme:s,backgroundColor:tt(s.waveOutlineColor),timescaleBackgroundColor:s.timescaleBackgroundColor,scrollContainerWidth:j+(k.show?k.width:0),timescaleWidth:j,tracksWidth:j,controlsWidth:k.show?k.width:0,onTracksMouseDown:fe,onTracksMouseMove:ue,onTracksMouseUp:le,scrollContainerRef:Y,isSelecting:$,timescale:y>0?v.jsx(ga,{}):void 0,children:v.jsxs(v.Fragment,{children:[g.map((P,ee)=>{const U=P.length>0?Math.max(...P.map(K=>K.peaks.data.length)):1;return v.jsx(tn.Provider,{value:Ee,children:v.jsx(ba,{numChannels:U,backgroundColor:tt(s.waveOutlineColor),offset:0,width:j,hasClipHeaders:!1,trackId:`media-element-track-${ee}`,isSelected:!0,children:P.map((K,ie)=>{const he=K.peaks,te=he.length;return v.jsx(Yt,{clipId:K.clipId,trackIndex:ee,clipIndex:ie,trackName:K.trackName,startSample:K.startSample,durationSamples:K.durationSamples,samplesPerPixel:C,showHeader:!1,disableHeaderDrag:!0,isSelected:!0,trackId:`media-element-track-${ee}`,children:he.data.map((Se,Be)=>v.jsx(ki,{index:Be,data:Se,bits:he.bits,length:te,clipStartSample:K.startSample,clipDurationSamples:K.durationSamples},`${ee}-${ie}-${Be}`))},`${ee}-${ie}`)})})},ee)}),l.length>0&&u&&v.jsx(Ke.DndContext,{onDragStart:ae,onDragMove:oe,onDragEnd:q,modifiers:t?[Qa.restrictToHorizontalAxis]:[],children:v.jsx(u.AnnotationBoxesWrapper,{height:30,width:j,children:l.map((P,ee)=>{const U=P.start*d/C,K=P.end*d/C,ie=e?e(P,ee):P.id;return v.jsx(u.AnnotationBox,{annotationId:P.id,annotationIndex:ee,startPosition:U,endPosition:K,label:ie,color:"#ff9800",isActive:P.id===c,onClick:()=>N(P),editable:t},P.id)})})}),E!==I&&v.jsx(da,{startPosition:Math.min(E,I)*d/C+(k.show?k.width:0),endPosition:Math.max(E,I)*d/C+(k.show?k.width:0),color:s.selectionColor}),v.jsx(vi,{color:s.playheadColor,controlsOffset:k.show?k.width:0})]})})})})},Pa=({height:e,renderAnnotationItem:t,onAnnotationUpdate:n,editable:a=!1,controls:r,annotationListConfig:s,scrollActivePosition:i="center",scrollActiveContainer:l="nearest"})=>{const{annotations:c,activeAnnotationId:u,continuousPlay:m}=Pt(),h=ct(),{setAnnotations:p}=rn(),f=s??{linkEndpoints:!1,continuousPlay:m},b=o.useCallback(g=>{p(g),n?.(g)},[p,n]),{AnnotationText:w}=h;return v.jsx(w,{annotations:c,activeAnnotationId:u??void 0,shouldScrollToActive:!0,scrollActivePosition:i,scrollActiveContainer:l,editable:a,controls:a?r:void 0,annotationListConfig:f,height:e,onAnnotationUpdate:b,renderAnnotationItem:t})},Si=({annotationTextHeight:e,getAnnotationBoxLabel:t,renderAnnotationItem:n,editable:a=!1,linkEndpoints:r=!1,onAnnotationUpdate:s,scrollActivePosition:i="center",scrollActiveContainer:l="nearest",className:c})=>{const{annotations:u}=Pt();return v.jsxs(v.Fragment,{children:[v.jsx(Wa,{getAnnotationBoxLabel:t,editable:a,linkEndpoints:r,onAnnotationUpdate:s,className:c}),u.length>0&&v.jsx(Pa,{height:e,renderAnnotationItem:n,onAnnotationUpdate:s,editable:a,annotationListConfig:{linkEndpoints:r,continuousPlay:!1},scrollActivePosition:i,scrollActiveContainer:l})]})};exports.Tone=On;exports.AnnotationIntegrationProvider=ni;exports.AudioPosition=Qs;exports.AutomaticScrollCheckbox=ti;exports.ContinuousPlayCheckbox=ai;exports.DownloadAnnotationsButton=si;exports.EditableCheckbox=oi;exports.ExportWavButton=ii;exports.FastForwardButton=Hs;exports.LinkEndpointsCheckbox=ri;exports.LoopButton=Gs;exports.MasterVolumeControl=Ks;exports.MediaElementAnnotationList=Pa;exports.MediaElementPlaylist=Wa;exports.MediaElementPlaylistProvider=Zs;exports.MediaElementWaveform=Si;exports.PauseButton=js;exports.PlayButton=Vs;exports.PlaylistAnnotationList=Fa;exports.PlaylistVisualization=Ba;exports.RewindButton=zs;exports.SelectionTimeInputs=ei;exports.SetLoopRegionButton=Ns;exports.SkipBackwardButton=Xs;exports.SkipForwardButton=Os;exports.SpectrogramIntegrationProvider=mi;exports.StopButton=Ls;exports.TimeFormatSelect=qs;exports.Waveform=gi;exports.WaveformPlaylistProvider=Fs;exports.ZoomInButton=Ys;exports.ZoomOutButton=Us;exports.createEffectChain=ys;exports.createEffectInstance=bt;exports.effectCategories=bs;exports.effectDefinitions=yt;exports.getEffectDefinition=an;exports.getEffectsByCategory=gs;exports.getShortcutLabel=ms;exports.getWaveformDataMetadata=rs;exports.loadPeaksFromWaveformData=as;exports.loadWaveformData=nn;exports.useAnnotationDragHandlers=ka;exports.useAnnotationIntegration=ct;exports.useAnnotationKeyboardControls=ps;exports.useAudioTracks=ls;exports.useClipDragHandlers=cs;exports.useClipSplitting=fs;exports.useDragSensors=ds;exports.useDynamicEffects=xs;exports.useDynamicTracks=Bs;exports.useExportWav=Sa;exports.useKeyboardShortcuts=Dt;exports.useMasterAnalyser=is;exports.useMasterVolume=xa;exports.useMediaElementAnimation=Wt;exports.useMediaElementControls=rn;exports.useMediaElementData=Zt;exports.useMediaElementState=Pt;exports.usePlaybackAnimation=Re;exports.usePlaybackShortcuts=hs;exports.usePlaylistControls=be;exports.usePlaylistData=Me;exports.usePlaylistState=De;exports.useSpectrogramIntegration=hi;exports.useTimeFormat=wa;exports.useTrackDynamicEffects=ks;exports.useZoomControls=ya;exports.waveformDataToPeaks=Ca;
1015
+ `,qi=({clipStartSample:e,clipDurationSamples:t,...n})=>{const a=i.useRef(null),r=i.useRef(null),s=xt(),{waveHeight:o}=Wt(),{isPlaying:l,currentTimeRef:c}=Vt(),{samplesPerPixel:u,sampleRate:f}=Lt(),h=s?.waveProgressColor||"rgba(0, 0, 0, 0.1)";i.useEffect(()=>{const y=()=>{if(a.current){const m=(c.current??0)*f,w=e+t;let x=0;if(m<=e)x=0;else if(m>=w)x=n.length;else{const C=m-e;x=Math.floor(C/u)}a.current.style.width=`${x}px`}l&&(r.current=requestAnimationFrame(y))};return l?r.current=requestAnimationFrame(y):y(),()=>{r.current&&(cancelAnimationFrame(r.current),r.current=null)}},[l,f,u,e,t,n.length,c]),i.useEffect(()=>{if(!l&&a.current){const b=(c.current??0)*f,m=e+t;let w=0;if(b<=e)w=0;else if(b>=m)w=n.length;else{const x=b-e;w=Math.floor(x/u)}a.current.style.width=`${w}px`}});const p=s?.waveformDrawMode||"inverted";let d;p==="inverted"?d=s?.selectedWaveFillColor||s?.waveFillColor||"white":d=s?.selectedWaveOutlineColor||s?.waveOutlineColor||"grey";const g=at(d);return v.jsxs(Gi,{children:[v.jsx(Yi,{$color:g,$height:o,$top:n.index*o,$width:n.length}),v.jsx(Ui,{ref:a,$color:h,$height:o,$top:n.index*o}),v.jsx(Ki,{children:v.jsx(Ra,{...n,isSelected:!0,transparentBackground:!0})})]})},Qa=({getAnnotationBoxLabel:e,editable:t=!1,linkEndpoints:n=!1,onAnnotationUpdate:a,className:r})=>{const s=xt(),{isPlaying:o}=Vt(),{annotations:l,activeAnnotationId:c}=Zt(),u=i.useContext(jt),{play:f,seekTo:h,setActiveAnnotationId:p,setAnnotations:d,setScrollContainer:g}=un(),{duration:y,peaksDataArray:b,sampleRate:m,waveHeight:w,timeScaleHeight:x,samplesPerPixel:C,controls:k,playoutRef:S,barWidth:I,barGap:A}=Lt(),[_,T]=i.useState(0),[M,W]=i.useState(0),[$,B]=i.useState(!1),P=i.useRef(null),N=i.useCallback(L=>{P.current=L,g(L)},[g]),U=Math.floor(y*m/C),J=i.useCallback(async L=>{p(L.id);try{await f(L.start)}catch(ee){console.error("waveform-playlist: Failed to start playback for annotation",L.id,ee)}},[p,f]),V=i.useCallback(L=>{d(L),a?.(L)},[d,a]),{onDragStart:te,onDragMove:se,onDragEnd:Q}=La({annotations:l,onAnnotationsChange:V,samplesPerPixel:C,sampleRate:m,duration:y,linkEndpoints:n}),le=i.useCallback(L=>{const ee=L.currentTarget.getBoundingClientRect(),G=k.show?k.width:0,D=(L.clientX-ee.left-G)*C/m;B(!0),T(D),W(D)},[k,C,m]),ce=i.useCallback(L=>{if(!$)return;const ee=L.currentTarget.getBoundingClientRect(),G=k.show?k.width:0,D=(L.clientX-ee.left-G)*C/m;W(D)},[$,k,C,m]),ue=i.useCallback(L=>{if(!$)return;B(!1);const ee=L.currentTarget.getBoundingClientRect(),G=k.show?k.width:0,D=(L.clientX-ee.left-G)*C/m,ie=Math.min(_,D),z=Math.max(_,D);Math.abs(z-ie)<.1?(h(ie),T(ie),W(ie),o&&S.current&&(S.current.stop(),f(ie))):(T(ie),W(z))},[$,_,C,m,k,h,o,S,f]);if(b.length===0)return v.jsx("div",{className:r,children:"Loading waveform..."});const Ae=null;return v.jsx($a,{children:v.jsx(wt.Provider,{value:{samplesPerPixel:C,sampleRate:m,zoomLevels:[C],waveHeight:w,timeScaleHeight:x,duration:y*1e3,controls:k,barWidth:I,barGap:A},children:v.jsx(rn,{theme:s,backgroundColor:at(s.waveOutlineColor),timescaleBackgroundColor:s.timescaleBackgroundColor,scrollContainerWidth:U+(k.show?k.width:0),timescaleWidth:U,tracksWidth:U,controlsWidth:k.show?k.width:0,onTracksMouseDown:le,onTracksMouseMove:ce,onTracksMouseUp:ue,scrollContainerRef:N,isSelecting:$,timescale:x>0?v.jsx(Da,{}):void 0,children:v.jsxs(v.Fragment,{children:[b.map((L,ee)=>{const G=L.length>0?Math.max(...L.map(K=>K.peaks.data.length)):1;return v.jsx(on.Provider,{value:Ae,children:v.jsx(Ba,{numChannels:G,backgroundColor:at(s.waveOutlineColor),offset:0,width:U,hasClipHeaders:!1,trackId:`media-element-track-${ee}`,isSelected:!0,children:L.map((K,D)=>{const ie=K.peaks,z=ie.length;return v.jsx(Qt,{clipId:K.clipId,trackIndex:ee,clipIndex:D,trackName:K.trackName,startSample:K.startSample,durationSamples:K.durationSamples,samplesPerPixel:C,showHeader:!1,disableHeaderDrag:!0,isSelected:!0,trackId:`media-element-track-${ee}`,children:ie.data.map((be,Ve)=>v.jsx(qi,{index:Ve,data:be,bits:ie.bits,length:z,clipStartSample:K.startSample,clipDurationSamples:K.durationSamples},`${ee}-${D}-${Ve}`))},`${ee}-${D}`)})})},ee)}),l.length>0&&u&&v.jsx(Ge.DndContext,{onDragStart:te,onDragMove:se,onDragEnd:Q,modifiers:t?[pr.restrictToHorizontalAxis]:[],children:v.jsx(u.AnnotationBoxesWrapper,{height:30,width:U,children:l.map((L,ee)=>{const G=L.start*m/C,K=L.end*m/C,D=e?e(L,ee):L.id;return v.jsx(u.AnnotationBox,{annotationId:L.id,annotationIndex:ee,startPosition:G,endPosition:K,label:D,color:"#ff9800",isActive:L.id===c,onClick:()=>J(L),editable:t},L.id)})})}),_!==M&&v.jsx(Ma,{startPosition:Math.min(_,M)*m/C+(k.show?k.width:0),endPosition:Math.max(_,M)*m/C+(k.show?k.width:0),color:s.selectionColor}),v.jsx(Ni,{color:s.playheadColor,controlsOffset:k.show?k.width:0})]})})})})},er=({height:e,renderAnnotationItem:t,onAnnotationUpdate:n,editable:a=!1,controls:r,annotationListConfig:s,scrollActivePosition:o="center",scrollActiveContainer:l="nearest"})=>{const{annotations:c,activeAnnotationId:u,continuousPlay:f}=Zt(),h=ct(),{setAnnotations:p}=un(),d=s??{linkEndpoints:!1,continuousPlay:f},g=i.useCallback(b=>{p(b),n?.(b)},[p,n]),{AnnotationText:y}=h;return v.jsx(y,{annotations:c,activeAnnotationId:u??void 0,shouldScrollToActive:!0,scrollActivePosition:o,scrollActiveContainer:l,editable:a,controls:a?r:void 0,annotationListConfig:d,height:e,onAnnotationUpdate:g,renderAnnotationItem:t})},Ji=({annotationTextHeight:e,getAnnotationBoxLabel:t,renderAnnotationItem:n,editable:a=!1,linkEndpoints:r=!1,onAnnotationUpdate:s,scrollActivePosition:o="center",scrollActiveContainer:l="nearest",className:c})=>{const{annotations:u}=Zt();return v.jsxs(v.Fragment,{children:[v.jsx(Qa,{getAnnotationBoxLabel:t,editable:a,linkEndpoints:r,onAnnotationUpdate:s,className:c}),u.length>0&&v.jsx(er,{height:e,renderAnnotationItem:n,onAnnotationUpdate:s,editable:a,annotationListConfig:{linkEndpoints:r,continuousPlay:!1},scrollActivePosition:o,scrollActiveContainer:l})]})};exports.Tone=oa;exports.AnnotationIntegrationProvider=Ti;exports.AudioPosition=Ai;exports.AutomaticScrollCheckbox=Ei;exports.ContinuousPlayCheckbox=$i;exports.DownloadAnnotationsButton=Bi;exports.EditableCheckbox=Di;exports.ExportWavButton=Fi;exports.FastForwardButton=bi;exports.LinkEndpointsCheckbox=Ri;exports.LoopButton=yi;exports.MasterVolumeControl=Si;exports.MediaElementAnnotationList=er;exports.MediaElementPlaylist=Qa;exports.MediaElementPlaylistProvider=fi;exports.MediaElementWaveform=Ji;exports.PauseButton=hi;exports.PlayButton=mi;exports.PlaylistAnnotationList=Ja;exports.PlaylistVisualization=qa;exports.RewindButton=gi;exports.SelectionTimeInputs=Mi;exports.SetLoopRegionButton=wi;exports.SkipBackwardButton=vi;exports.SkipForwardButton=Ci;exports.SpectrogramIntegrationProvider=ji;exports.StopButton=pi;exports.TimeFormatSelect=Ii;exports.Waveform=Xi;exports.WaveformPlaylistProvider=ci;exports.ZoomInButton=xi;exports.ZoomOutButton=ki;exports.createEffectChain=Uo;exports.createEffectInstance=Ct;exports.effectCategories=Oo;exports.effectDefinitions=kt;exports.getEffectDefinition=cn;exports.getEffectsByCategory=Xo;exports.getShortcutLabel=jo;exports.getWaveformDataMetadata=To;exports.loadPeaksFromWaveformData=Eo;exports.loadWaveformData=ln;exports.useAnnotationDragHandlers=La;exports.useAnnotationIntegration=ct;exports.useAnnotationKeyboardControls=Ho;exports.useAudioTracks=Wo;exports.useClipDragHandlers=Po;exports.useClipSplitting=Lo;exports.useDragSensors=Zo;exports.useDynamicEffects=Ko;exports.useDynamicTracks=li;exports.useExportWav=ja;exports.useKeyboardShortcuts=Ft;exports.useMasterAnalyser=Fo;exports.useMasterVolume=Za;exports.useMediaElementAnimation=Vt;exports.useMediaElementControls=un;exports.useMediaElementData=Lt;exports.useMediaElementState=Zt;exports.usePlaybackAnimation=We;exports.usePlaybackShortcuts=zo;exports.usePlaylistControls=pe;exports.usePlaylistData=_e;exports.usePlaylistState=Pe;exports.useSpectrogramIntegration=zi;exports.useTimeFormat=Pa;exports.useTrackDynamicEffects=qo;exports.useZoomControls=Va;exports.waveformDataToPeaks=Wa;
1016
1016
  //# sourceMappingURL=index.js.map