@waveform-playlist/browser 5.3.1 → 5.3.2
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 +4 -13
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +23 -14
- package/dist/index.mjs.map +1 -1
- package/package.json +9 -9
package/dist/index.js
CHANGED
|
@@ -1224,42 +1224,33 @@
|
|
|
1224
1224
|
width: 1px;
|
|
1225
1225
|
height: ${e=>e.$height}px;
|
|
1226
1226
|
background: rgba(255, 255, 255, 0.2);
|
|
1227
|
-
`,zs=({level:e,peakLevel:t,width:n=200,height:r=20,className:a})=>{const s=Math.max(0,Math.min(1,e)),o=t!==void 0?Math.max(0,Math.min(1,t)):0;return h.jsxs(_s,{$width:n,$height:r,className:a,children:[h.jsx(Ps,{$level:s,$height:r}),t!==void 0&&o>0&&h.jsx(Vs,{$peakLevel:o,$height:r}),h.jsxs(js,{$height:r,children:[h.jsx(In,{$position:60,$height:r}),h.jsx(In,{$position:85,$height:r})]})]})};i.memo(zs);function Hs(e,t,n,r={}){const{currentTime:a=0,audioConstraints:s,...o}=r,[l,c]=i.useState(!1),[u,d]=i.useState(null),{stream:v,devices:p,hasPermission:f,requestAccess:C,error:x}=Ws(),{level:b,peakLevel:g}=Fs(v),{isRecording:S,isPaused:w,duration:m,peaks:y,startRecording:k,stopRecording:I,pauseRecording:A,resumeRecording:E,error:M}=Bs(v,o),R=i.useCallback(async()=>{n&&(l||(await jt(),c(!0)),await k())},[n,l,k]),F=i.useCallback(async()=>{const j=await I();if(j&&n){const O=e.findIndex(te=>te.id===n);if(O===-1)return;const z=e[O],Y=Math.floor(a*j.sampleRate);let B=0;if(z.clips.length>0){const te=z.clips.map(re=>re.startSample+re.durationSamples);B=Math.max(...te)}const G=Math.max(Y,B),K={id:`clip-${Date.now()}`,audioBuffer:j,startSample:G,durationSamples:j.length,offsetSamples:0,sampleRate:j.sampleRate,sourceDurationSamples:j.length,gain:1,name:`Recording ${new Date().toLocaleTimeString()}`},ie=e.map((te,re)=>re===O?{...te,clips:[...te.clips,K]}:te);t(ie)}},[n,e,t,a,I]);i.useEffect(()=>{f&&p.length>0&&u===null&&d(p[0].deviceId)},[f,p.length]);const T=i.useCallback(async()=>{await C(void 0,s),await jt(),c(!0)},[C,s]),P=i.useCallback(async j=>{d(j),await C(j,s),await jt(),c(!0)},[C,s]);return{isRecording:S,isPaused:w,duration:m,level:b,peakLevel:g,error:x||M,stream:v,devices:p,hasPermission:f,selectedDevice:u,startRecording:R,stopRecording:F,pauseRecording:A,resumeRecording:E,requestMicAccess:T,changeDevice:P,recordingPeaks:y}}const Ct=[{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}]}],Qt=e=>Ct.find(t=>t.id===e),Ls=e=>Ct.filter(t=>t.category===e),Xs=[{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"}],Gs={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 Ns=0;const Os=()=>`effect_${Date.now()}_${++Ns}`;function ht(e,t){const n=Gs[e.id];if(!n)throw new Error(`Unknown effect type: ${e.id}`);const r={};e.parameters.forEach(o=>{const l=t?.[o.name]??o.default;r[o.name]=l});const a=new n(r),s=Os();return{effect:a,id:e.id,instanceId:s,dispose(){try{a.disconnect(),a.dispose()}catch{}},setParameter(o,l){o==="wet"&&a.wet?a.wet.value=l:a[o]!==void 0&&(a[o]?.value!==void 0?a[o].value=l:a[o]=l)},getParameter(o){if(o==="wet"&&a.wet)return a.wet.value;if(a[o]!==void 0)return a[o]?.value!==void 0?a[o].value:a[o]},connect(o){a.connect(o)},disconnect(){try{a.disconnect()}catch{}}}}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 Ks(e=256){const[t,n]=i.useState([]),r=i.useRef(t);r.current=t;const a=i.useRef(new Map),s=i.useRef(null),o=i.useRef(null),l=i.useCallback(b=>{const g=o.current;if(!g)return;const{masterGainNode:S,destination:w,analyserNode:m}=g;try{S.disconnect()}catch{}const y=b.map(k=>a.current.get(k.instanceId)).filter(k=>k!==void 0);if(y.length===0)S.connect(m),m.connect(w);else{let k=S;y.forEach(I=>{try{I.disconnect()}catch{}k.connect(I.effect),k=I.effect}),k.connect(m),m.connect(w)}},[]),c=i.useCallback(b=>{const g=Qt(b);if(!g){console.error(`Unknown effect: ${b}`);return}const S={};g.parameters.forEach(y=>{S[y.name]=y.default});const w=ht(g,S);a.current.set(w.instanceId,w);const m={instanceId:w.instanceId,effectId:g.id,definition:g,params:S,bypassed:!1};n(y=>[...y,m])},[]),u=i.useCallback(b=>{const g=a.current.get(b);g&&(g.dispose(),a.current.delete(b)),n(S=>S.filter(w=>w.instanceId!==b))},[]),d=i.useCallback((b,g,S)=>{const w=a.current.get(b);w&&w.setParameter(g,S),n(m=>m.map(y=>y.instanceId===b?{...y,params:{...y.params,[g]:S}}:y))},[]),v=i.useCallback(b=>{const g=r.current.find(m=>m.instanceId===b);if(!g)return;const S=!g.bypassed,w=a.current.get(b);if(w){const m=g.params.wet??1;w.setParameter("wet",S?0:m)}n(m=>m.map(y=>y.instanceId===b?{...y,bypassed:S}:y))},[]),p=i.useCallback((b,g)=>{n(S=>{const w=[...S],[m]=w.splice(b,1);return w.splice(g,0,m),w})},[]),f=i.useCallback(()=>{a.current.forEach(b=>b.dispose()),a.current.clear(),n([])},[]);i.useEffect(()=>{l(t)},[t,l]);const C=i.useCallback((b,g,S)=>{const w=new Z.Analyser("fft",e);s.current=w,o.current={masterGainNode:b,destination:g,analyserNode:w};const y=r.current.map(k=>a.current.get(k.instanceId)).filter(k=>k!==void 0);if(y.length===0)b.connect(w),w.connect(g);else{let k=b;y.forEach(I=>{k.connect(I.effect),k=I.effect}),k.connect(w),w.connect(g)}return function(){w.dispose(),s.current=null,o.current=null}},[e]);i.useEffect(()=>()=>{a.current.forEach(b=>b.dispose()),a.current.clear()},[]);const x=i.useCallback(()=>{const b=t.filter(g=>!g.bypassed);if(b.length!==0)return(g,S,w)=>{const m=[];for(const y of b){const k=ht(y.definition,y.params);m.push(k)}if(m.length===0)g.connect(S);else{let y=g;m.forEach(k=>{y.connect(k.effect),y=k.effect}),y.connect(S)}return function(){m.forEach(k=>k.dispose())}}},[t]);return{activeEffects:t,availableEffects:Ct,addEffect:c,removeEffect:u,updateParameter:d,toggleBypass:v,reorderEffects:p,clearAllEffects:f,masterEffects:C,createOfflineEffectsFunction:x,analyserRef:s}}function Us(){const[e,t]=i.useState(new Map),n=i.useRef(new Map),r=i.useRef(new Map),a=i.useCallback((f,C)=>{const x=r.current.get(f);if(!x)return;const{graphEnd:b,masterGainNode:g}=x,S=n.current.get(f);try{b.disconnect()}catch{}const w=C.map(m=>S?.get(m.instanceId)).filter(m=>m!==void 0);if(w.length===0)b.connect(g);else{let m=b;w.forEach(y=>{try{y.disconnect()}catch{}m.connect(y.effect),m=y.effect}),m.connect(g)}},[]),s=i.useCallback((f,C)=>{const x=Qt(C);if(!x){console.error(`Unknown effect: ${C}`);return}const b={};x.parameters.forEach(w=>{b[w.name]=w.default});const g=ht(x,b);n.current.has(f)||n.current.set(f,new Map),n.current.get(f).set(g.instanceId,g);const S={instanceId:g.instanceId,effectId:x.id,definition:x,params:b,bypassed:!1};t(w=>{const m=new Map(w),y=m.get(f)||[];return m.set(f,[...y,S]),m})},[]),o=i.useCallback((f,C)=>{const x=n.current.get(f),b=x?.get(C);b&&(b.dispose(),x?.delete(C)),t(g=>{const S=new Map(g),w=S.get(f)||[];return S.set(f,w.filter(m=>m.instanceId!==C)),S})},[]),l=i.useCallback((f,C,x,b)=>{const S=n.current.get(f)?.get(C);S&&S.setParameter(x,b),t(w=>{const m=new Map(w),y=m.get(f)||[];return m.set(f,y.map(k=>k.instanceId===C?{...k,params:{...k.params,[x]:b}}:k)),m})},[]),c=i.useCallback((f,C)=>{const b=(d.current.get(f)||[]).find(m=>m.instanceId===C);if(!b)return;const g=!b.bypassed,w=n.current.get(f)?.get(C);if(w){const m=b.params.wet??1;w.setParameter("wet",g?0:m)}t(m=>{const y=new Map(m),k=y.get(f)||[];return y.set(f,k.map(I=>I.instanceId===C?{...I,bypassed:g}:I)),y})},[]),u=i.useCallback(f=>{const C=n.current.get(f);C&&(C.forEach(x=>x.dispose()),C.clear()),t(x=>{const b=new Map(x);return b.set(f,[]),b})},[]),d=i.useRef(e);d.current=e;const v=i.useCallback(f=>(C,x,b)=>{r.current.set(f,{graphEnd:C,masterGainNode:x});const g=d.current.get(f)||[],S=n.current.get(f),w=g.map(m=>S?.get(m.instanceId)).filter(m=>m!==void 0);if(w.length===0)C.connect(x);else{let m=C;w.forEach(y=>{m.connect(y.effect),m=y.effect}),m.connect(x)}return function(){r.current.delete(f)}},[]);i.useEffect(()=>{e.forEach((f,C)=>{a(C,f)})},[e,a]),i.useEffect(()=>()=>{n.current.forEach(f=>{f.forEach(C=>C.dispose()),f.clear()}),n.current.clear()},[]);const p=i.useCallback(f=>{const x=(e.get(f)||[]).filter(b=>!b.bypassed);if(x.length!==0)return(b,g,S)=>{const w=[];for(const m of x){const y=ht(m.definition,m.params);w.push(y)}if(w.length===0)b.connect(g);else{let m=b;w.forEach(y=>{m.connect(y.effect),m=y.effect}),m.connect(g)}return function(){w.forEach(y=>y.dispose())}}},[e]);return{trackEffectsState:e,addEffectToTrack:s,removeEffectFromTrack:o,updateTrackEffectParameter:l,toggleBypass:c,clearTrackEffects:u,getTrackEffectsFunction:v,createOfflineTrackEffectsFunction:p,availableEffects:Ct}}function Js(e,t={}){const{bitDepth:n=16}=t,r=e.numberOfChannels,a=e.sampleRate,s=e.length,o=n/8,l=r*o,c=a*l,u=s*l,d=44,v=d+u,p=new ArrayBuffer(v),f=new DataView(p);At(f,0,"RIFF"),f.setUint32(4,v-8,!0),At(f,8,"WAVE"),At(f,12,"fmt "),f.setUint32(16,16,!0),f.setUint16(20,n===32?3:1,!0),f.setUint16(22,r,!0),f.setUint32(24,a,!0),f.setUint32(28,c,!0),f.setUint16(32,l,!0),f.setUint16(34,n,!0),At(f,36,"data"),f.setUint32(40,u,!0);const C=[];for(let b=0;b<r;b++)C.push(e.getChannelData(b));let x=d;if(n===16)for(let b=0;b<s;b++)for(let g=0;g<r;g++){const S=C[g][b],w=Math.max(-1,Math.min(1,S)),m=w<0?w*32768:w*32767;f.setInt16(x,m,!0),x+=2}else for(let b=0;b<s;b++)for(let g=0;g<r;g++)f.setFloat32(x,C[g][b],!0),x+=4;return new Blob([p],{type:"audio/wav"})}function At(e,t,n){for(let r=0;r<n.length;r++)e.setUint8(t+r,n.charCodeAt(r))}function qs(e,t){const n=URL.createObjectURL(e),r=document.createElement("a");r.href=n,r.download=t,r.style.display="none",document.body.appendChild(r),r.click(),document.body.removeChild(r),URL.revokeObjectURL(n)}function fr(){const[e,t]=i.useState(!1),[n,r]=i.useState(0),[a,s]=i.useState(null);return{exportWav:i.useCallback(async(l,c,u={})=>{const{filename:d="export",mode:v="master",trackIndex:p,autoDownload:f=!0,applyEffects:C=!0,effectsFunction:x,createOfflineTrackEffects:b,bitDepth:g=16,onProgress:S}=u;t(!0),r(0),s(null);try{if(l.length===0)throw new Error("No tracks to export");if(v==="individual"&&(p===void 0||p<0||p>=l.length))throw new Error("Invalid track index for individual export");const w=l[0].clips[0]?.sampleRate||44100;let m=0;for(const R of l)for(const F of R.clips){const T=F.startSample+F.durationSamples;m=Math.max(m,T)}m+=Math.round(w*.1);const y=m/w,k=v==="individual"?[{track:l[p],state:c[p],index:p}]:l.map((R,F)=>({track:R,state:c[F],index:F})),I=c.some(R=>R.soloed),A=!!b;let E;if((x||A)&&C)E=await Qs(k,c,I,y,w,x,b,R=>{r(R),S?.(R)});else{const R=new OfflineAudioContext(2,m,w);let F=0;const T=k.reduce((P,{track:j})=>P+j.clips.length,0);for(const{track:P,state:j}of k)if(!(j.muted&&!j.soloed)&&!(I&&!j.soloed))for(const O of P.clips){await ti(R,O,j,w,C),F++;const z=F/T*.5;r(z),S?.(z)}r(.5),S?.(.5),E=await R.startRendering()}r(.9),S?.(.9);const M=Js(E,{bitDepth:g});if(r(1),S?.(1),f){const R=v==="individual"?`${d}_${l[p].name}`:d;qs(M,`${R}.wav`)}return{audioBuffer:E,blob:M,duration:y}}catch(w){const m=w instanceof Error?w.message:"Export failed";throw s(m),w}finally{t(!1)}},[]),isExporting:e,progress:n,error:a}}async function Qs(e,t,n,r,a,s,o,l){const{Offline:c,Volume:u,Gain:d,Panner:v,Player:p,ToneAudioBuffer:f}=await import("tone");l(.1);let C;try{C=await c(async({transport:x,destination:b})=>{const g=new u(0);let S;s?S=s(g,b,!0):g.connect(b);for(const{track:w,state:m}of e){if(m.muted&&!m.soloed||n&&!m.soloed)continue;const y=new u(ei(m.volume)),k=new v(m.pan),I=new d(m.muted?0:1),A=o?.(w.id);A?A(I,g,!0):I.connect(g),k.connect(I),y.connect(k);for(const E of w.clips){const{audioBuffer:M,startSample:R,durationSamples:F,offsetSamples:T,gain:P,fadeIn:j,fadeOut:O}=E,z=R/a,Y=F/a,B=T/a,G=new f(M),K=new p(G),ie=new d(P);if(K.connect(ie),ie.connect(y),j){const te=z,re=z+j.duration,le=ie.gain._param;le.setValueAtTime(0,te),le.linearRampToValueAtTime(P,re)}if(O){const te=z+Y-O.duration,re=z+Y,le=ie.gain._param;le.setValueAtTime(P,te),le.linearRampToValueAtTime(0,re)}K.start(z,B,Y)}}x.start(0)},r,2,a)}catch(x){throw x instanceof Error?x:new Error(`Tone.Offline rendering failed: ${String(x)}`)}return l(.9),C.get()}function ei(e){return 20*Math.log10(Math.max(e,1e-4))}async function ti(e,t,n,r,a){const{audioBuffer:s,startSample:o,durationSamples:l,offsetSamples:c,gain:u,fadeIn:d,fadeOut:v}=t;if(!s){console.warn(`Skipping clip "${t.name||t.id}" - no audioBuffer for export`);return}const p=o/r,f=l/r,C=c/r,x=e.createBufferSource();x.buffer=s;const b=e.createGain(),g=u*n.volume,S=e.createStereoPanner();if(S.pan.value=n.pan,x.connect(b),b.connect(S),S.connect(e.destination),a){if(d?b.gain.setValueAtTime(0,p):b.gain.setValueAtTime(g,p),d){const w=p,m=p+d.duration;$n(b.gain,w,m,0,g,d.type||"linear")}if(v){const w=p+f-v.duration,m=p+f;(!d||d.duration<f-v.duration)&&b.gain.setValueAtTime(g,w),$n(b.gain,w,m,g,0,v.type||"linear")}}else b.gain.setValueAtTime(g,p);x.start(p,C,f)}function $n(e,t,n,r,a,s){const o=n-t;if(!(o<=0))switch(s){case"linear":e.setValueAtTime(r,t),e.linearRampToValueAtTime(a,n);break;case"exponential":const l=Math.max(r,1e-4),c=Math.max(a,1e-4);e.setValueAtTime(l,t),e.exponentialRampToValueAtTime(c,n),a===0&&e.setValueAtTime(0,n);break;case"logarithmic":const u=Mn(r,a,256,"logarithmic");e.setValueCurveAtTime(u,t,o);break;case"sCurve":const d=Mn(r,a,256,"sCurve");e.setValueCurveAtTime(d,t,o);break;default:e.setValueAtTime(r,t),e.linearRampToValueAtTime(a,n)}}function Mn(e,t,n,r){const a=new Float32Array(n),s=t-e;for(let o=0;o<n;o++){const l=o/(n-1);let c;r==="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),a[o]=e+s*c}return a}const mr=i.createContext(null),hr=i.createContext(null),pr=i.createContext(null),gr=i.createContext(null),br=i.createContext(null),ni=({tracks:e,timescale:t=!1,mono:n=!1,waveHeight:r=80,samplesPerPixel:a=1024,zoomLevels:s,automaticScroll:o=!1,theme:l,controls:c={show:!1,width:0},annotationList:u,effects:d,onReady:v,onAnnotationUpdate:p,onAnnotationsChange:f,barWidth:C=1,barGap:x=0,progressBarWidth:b,children:g})=>{const S=b??C+x,w=i.useMemo(()=>u?.annotations?u.annotations.map(W=>typeof W.start=="number"?W:rr(W)):[],[u?.annotations]),m=i.useRef(w);m.current=w;const[y,k]=i.useState(null),[I,A]=i.useState(!1),[E,M]=i.useState(0),[R,F]=i.useState(0),[T,P]=i.useState([]),[j,O]=i.useState([]),[z,Y]=i.useState([]),[B,G]=i.useState(0),[K,ie]=i.useState(0),[te,re]=i.useState(null),[le,ze]=i.useState(o),[V,ce]=i.useState(u?.isContinuousPlay??!1),[ae,L]=i.useState(u?.linkEndpoints??!1),[de,fe]=i.useState(u?.editable??!1),[oe,Ee]=i.useState(!1),[De,He]=i.useState(0),[Le,ne]=i.useState(0),[Ge,Ke]=i.useState(!1),_=i.useRef(null),Te=i.useRef(0),pe=i.useRef(0),ge=i.useRef(null),ot=i.useRef(z),N=i.useRef(0),se=i.useRef(0),ve=i.useRef(null),xe=i.useRef(null),Ie=i.useRef(!1),Ue=i.useRef(u?.isContinuousPlay??!1),Oe=i.useRef(null),tt=i.useRef(a),ct=i.useRef(!1),H=i.useRef(0),U=i.useRef(0),ee=i.useRef(0),me=i.useRef(0),{timeFormat:be,setTimeFormat:$e,formatTime:Ne}=ir(),Ze=lr({initialSamplesPerPixel:a,zoomLevels:s}),Q=Ze.samplesPerPixel,{masterVolume:we,setMasterVolume:Je}=cr({playoutRef:_,initialVolume:1}),st=i.useCallback(W=>{Ue.current=W,ce(W)},[]),Xe=i.useCallback(W=>{Oe.current=W,k(W)},[]),qe=i.useCallback(W=>{ct.current=W,Ee(W)},[]),Pe=i.useCallback((W,X)=>{ee.current=W,me.current=X,He(W),ne(X)},[]),ut=i.useCallback(()=>{const W=H.current,X=U.current;W!==X&&X>W&&Pe(W,X)},[Pe]),dt=i.useCallback(()=>{Pe(0,0)},[Pe]);i.useEffect(()=>{Ie.current=le},[le]),i.useEffect(()=>{ot.current=z},[z]),i.useEffect(()=>{H.current=B,U.current=K},[B,K]),i.useEffect(()=>{if(!xe.current||!T.length)return;const W=xe.current,X=tt.current,q=Q;if(X===q)return;const ue=c.show?c.width:0,J=W.clientWidth,ye=W.scrollLeft+J/2-ue,Qe=T[0].sampleRate,ke=ye*X/Qe*Qe/q,We=Math.max(0,ke+ue-J/2);W.scrollLeft=We,tt.current=q},[Q,T,c]);const nt=i.useRef(null);i.useEffect(()=>{if(Ke(!1),e.length===0){P([]),F(0),Y([]),O([]),_.current&&(_.current.dispose(),_.current=null);return}const W=I,X=pe.current;return _.current&&W&&(_.current.stop(),ge.current&&(cancelAnimationFrame(ge.current),ge.current=null),nt.current={position:X}),(async()=>{try{const ue=[];e.forEach(Ce=>{Ce.clips.length>0&&Ce.clips[0].audioBuffer&&ue.push(Ce.clips[0].audioBuffer)});let J=0;e.forEach(Ce=>{Ce.clips.forEach(ke=>{const We=ke.sampleRate,xt=(ke.startSample+ke.durationSamples)/We;J=Math.max(J,xt)})}),P(ue),F(J),Y(Ce=>Ce.length===e.length?Ce.map((ke,We)=>({...ke,name:e[We].name})):e.map(ke=>({name:ke.name,muted:ke.muted,soloed:ke.soloed,volume:ke.volume,pan:ke.pan}))),_.current&&_.current.dispose();const Se=new ra({effects:d}),ye=ot.current;e.forEach((Ce,ke)=>{const We=Ce.clips.filter(rt=>rt.audioBuffer);if(We.length>0){const rt=We[0].sampleRate,xt=Math.min(...We.map(Fe=>Fe.startSample/rt)),Hr=Math.max(...We.map(Fe=>(Fe.startSample+Fe.durationSamples)/rt)),wt=ye[ke],Lr={id:`track-${ke}`,name:Ce.name,gain:wt?.volume??Ce.volume,muted:wt?.muted??Ce.muted,soloed:wt?.soloed??Ce.soloed,stereoPan:wt?.pan??Ce.pan,startTime:xt,endTime:Hr},Xr=We.map(Fe=>{const Pt=Fe.sampleRate;return{buffer:Fe.audioBuffer,startTime:Fe.startSample/Pt-xt,duration:Fe.durationSamples/Pt,offset:Fe.offsetSamples/Pt,fadeIn:Fe.fadeIn,fadeOut:Fe.fadeOut,gain:Fe.gain}});Se.addTrack({clips:Xr,track:Lr,effects:Ce.effects})}}),Se.applyInitialSoloState(),_.current=Se,Ke(!0);const Qe=new CustomEvent("waveform-playlist:ready",{detail:{trackCount:e.length,duration:J}});window.dispatchEvent(Qe),v?.()}catch(ue){console.error("Error loading audio:",ue)}})(),()=>{ge.current&&cancelAnimationFrame(ge.current),_.current&&_.current.dispose()}},[e,v,I]),i.useEffect(()=>{if(e.length===0)return;const W=16,X=e.map(q=>q.clips.map(J=>{if(J.waveformData){const ye=nr(J.waveformData,Q,0,J.offsetSamples,J.durationSamples);return{clipId:J.id,trackName:q.name,peaks:{length:ye.length,data:[ye.data],bits:ye.bits},startSample:J.startSample,durationSamples:J.durationSamples,fadeIn:J.fadeIn,fadeOut:J.fadeOut}}if(!J.audioBuffer)return console.warn(`Clip "${J.name||J.id}" has neither waveformData nor audioBuffer - rendering empty`),{clipId:J.id,trackName:q.name,peaks:{length:0,data:[],bits:W},startSample:J.startSample,durationSamples:J.durationSamples,fadeIn:J.fadeIn,fadeOut:J.fadeOut};const Se=Do(J.audioBuffer,Q,n,W,J.offsetSamples,J.durationSamples);return{clipId:J.id,trackName:q.name,peaks:Se,startSample:J.startSample,durationSamples:J.durationSamples,fadeIn:J.fadeIn,fadeOut:J.fadeOut}}));O(X)},[e,Q,n]);const Ye=i.useCallback(()=>{ge.current&&(cancelAnimationFrame(ge.current),ge.current=null);const W=()=>{const X=Z.getContext().currentTime-N.current,q=se.current+X;pe.current=q,M(q);const ue=m.current;if(ue.length>0){const Se=ue.find(ye=>q>=ye.start&&q<ye.end);if(Ue.current)Se&&Se.id!==Oe.current?Xe(Se.id):!Se&&Oe.current!==null&&Xe(null);else if(Oe.current){const ye=ue.find(Qe=>Qe.id===Oe.current);if(ye&&q>=ye.end){_.current&&_.current.stop(),A(!1),pe.current=Te.current,M(Te.current);return}}else Se&&Xe(Se.id)}if(Ie.current&&xe.current&&T.length>0){const Se=xe.current,ye=T[0].sampleRate,Qe=q*ye/tt.current,Ce=Se.clientWidth,ke=c.show?c.width:0,We=Qe+ke,rt=Math.max(0,We-Ce/2);Se.scrollLeft=rt}if(ve.current!==null&&q>=ve.current){_.current&&_.current.stop(),A(!1),pe.current=ve.current,M(ve.current),ve.current=null;return}const J=ee.current!==me.current&&me.current>ee.current;if(ct.current&&J&&q>=me.current){_.current?.stop();const ye=Z.getContext().currentTime;N.current=ye,se.current=ee.current,pe.current=ee.current,_.current?.play(ye,ee.current),ge.current=requestAnimationFrame(W);return}if(q>=R){_.current&&_.current.stop(),A(!1),pe.current=Te.current,M(Te.current),Xe(null);return}ge.current=requestAnimationFrame(W)};ge.current=requestAnimationFrame(W)},[R,T,Q,V]),Be=i.useCallback(()=>{ge.current&&(cancelAnimationFrame(ge.current),ge.current=null)},[]);i.useEffect(()=>{(async()=>{if(I&&ge.current&&_.current)if(V){const X=pe.current;_.current.stop(),Be(),await _.current.init(),_.current.setOnPlaybackComplete(()=>{});const ue=Z.getContext().currentTime;N.current=ue,se.current=X,_.current.play(ue,X),Ye()}else Be(),Ye()})()},[V,I,Ye,Be]),i.useEffect(()=>{(async()=>{if(nt.current&&_.current){const{position:X}=nt.current;nt.current=null,await _.current.init(),_.current.setOnPlaybackComplete(()=>{});const ue=Z.getContext().currentTime;N.current=ue,se.current=X,_.current.play(ue,X),A(!0),Ye()}})()},[e,Ye]);const _t=i.useCallback(async(W,X)=>{if(!_.current||T.length===0)return;await _.current.init(),await Z.start();const q=W??pe.current;Te.current=q,pe.current=q,_.current.setOnPlaybackComplete(()=>{}),_.current.stop(),Be();const J=Z.getContext().currentTime;N.current=J,se.current=q,ve.current=X!==void 0?q+X:null,_.current.play(J,q,X),A(!0),Ye()},[T.length,Ye,Be]),Mr=i.useCallback(()=>{if(!_.current)return;const W=Z.getContext().currentTime-N.current,X=se.current+W;_.current.pause(),A(!1),Be(),pe.current=X,M(X)},[Be]),Rr=i.useCallback(()=>{_.current&&(_.current.stop(),A(!1),Be(),pe.current=Te.current,M(Te.current),Xe(null))},[Be]),Er=i.useCallback(W=>{const X=Math.max(0,Math.min(W,R));pe.current=X,M(X),I&&_.current&&(_.current.stop(),Be(),_t(X))},[R,I,_t,Be]),Dr=i.useCallback((W,X)=>{const q=[...z];if(q[W]={...q[W],muted:X},Y(q),_.current){const ue=`track-${W}`;_.current.setMute(ue,X)}},[z]),Tr=i.useCallback((W,X)=>{const q=[...z];if(q[W]={...q[W],soloed:X},Y(q),_.current){const ue=`track-${W}`;_.current.setSolo(ue,X)}},[z]),Br=i.useCallback((W,X)=>{const q=[...z];if(q[W]={...q[W],volume:X},Y(q),_.current){const ue=`track-${W}`,J=_.current.getTrack(ue);J&&J.setVolume(X)}},[z]),Wr=i.useCallback((W,X)=>{const q=[...z];if(q[W]={...q[W],pan:X},Y(q),_.current){const ue=`track-${W}`,J=_.current.getTrack(ue);J&&J.setPan(X)}},[z]),Fr=i.useCallback((W,X)=>{G(W),ie(X),pe.current=W,M(W),I&&_.current&&(_.current.stop(),_.current.play(Z.getContext().currentTime,W))},[I]),_r=i.useCallback(W=>{xe.current=W},[]),Zt=i.useRef(f);Zt.current=f;const Zr=i.useCallback(W=>{const X=typeof W=="function"?W(m.current):W;if(!Zt.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}Zt.current(X)},[]),Pr=T[0]?.sampleRate||44100,tn=t?30:0,Vr=e.length*r+tn,nn={isPlaying:I,currentTime:E,currentTimeRef:pe,playbackStartTimeRef:N,audioStartPositionRef:se},rn={continuousPlay:V,linkEndpoints:ae,annotationsEditable:de,isAutomaticScroll:le,isLoopEnabled:oe,annotations:w,activeAnnotationId:y,selectionStart:B,selectionEnd:K,selectedTrackId:te,loopStart:De,loopEnd:Le},an={play:_t,pause:Mr,stop:Rr,seekTo:Er,setCurrentTime:W=>{pe.current=W,M(W)},setTrackMute:Dr,setTrackSolo:Tr,setTrackVolume:Br,setTrackPan:Wr,setSelection:Fr,setSelectedTrackId:re,setTimeFormat:$e,formatTime:Ne,zoomIn:Ze.zoomIn,zoomOut:Ze.zoomOut,setMasterVolume:Je,setAutomaticScroll:W=>{ze(W)},setScrollContainer:_r,scrollContainerRef:xe,setContinuousPlay:st,setLinkEndpoints:L,setAnnotationsEditable:fe,setAnnotations:Zr,setActiveAnnotationId:Xe,setLoopEnabled:qe,setLoopRegion:Pe,setLoopRegionFromSelection:ut,clearLoopRegion:dt},on={duration:R,audioBuffers:T,peaksDataArray:j,trackStates:z,tracks:e,sampleRate:Pr,waveHeight:r,timeScaleHeight:tn,minimumPlaylistHeight:Vr,controls:c,playoutRef:_,samplesPerPixel:Q,timeFormat:be,masterVolume:we,canZoomIn:Ze.canZoomIn,canZoomOut:Ze.canZoomOut,barWidth:C,barGap:x,progressBarWidth:S,isReady:Ge,mono:n},jr={...nn,...rn,...an,...on},zr={...Hn,...l};return h.jsx($.ThemeProvider,{theme:zr,children:h.jsx(mr.Provider,{value:nn,children:h.jsx(hr.Provider,{value:rn,children:h.jsx(pr.Provider,{value:an,children:h.jsx(gr.Provider,{value:on,children:h.jsx(br.Provider,{value:jr,children:g})})})})})})},Me=()=>{const e=i.useContext(mr);if(!e)throw new Error("usePlaybackAnimation must be used within WaveformPlaylistProvider");return e},Re=()=>{const e=i.useContext(hr);if(!e)throw new Error("usePlaylistState must be used within WaveformPlaylistProvider");return e},he=()=>{const e=i.useContext(pr);if(!e)throw new Error("usePlaylistControls must be used within WaveformPlaylistProvider");return e},Ae=()=>{const e=i.useContext(gr);if(!e)throw new Error("usePlaylistData must be used within WaveformPlaylistProvider");return e},ri=()=>{const e=i.useContext(br);if(!e)throw new Error("useWaveformPlaylist must be used within WaveformPlaylistProvider");return e};var ai=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,"preservesPitch"in this.audioElement?this.audioElement.preservesPitch=!0:"mozPreservesPitch"in this.audioElement?this.audioElement.mozPreservesPitch=!0:"webkitPreservesPitch"in this.audioElement&&(this.audioElement.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}},oi=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 ai({...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 r=t??0;if(this._isPlaying=!0,this.track.play(r),n!==void 0){const a=n/this._playbackRate;setTimeout(()=>{this._isPlaying&&(this.pause(),this.onPlaybackCompleteCallback&&this.onPlaybackCompleteCallback())},a*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 vr=i.createContext(null),Cr=i.createContext(null),xr=i.createContext(null),wr=i.createContext(null),si=({track:e,samplesPerPixel:t=1024,waveHeight:n=100,timescale:r=!1,playbackRate:a=1,automaticScroll:s=!1,theme:o,controls:l={show:!1,width:0},annotationList:c,barWidth:u=1,barGap:d=0,progressBarWidth:v,onAnnotationsChange:p,onReady:f,children:C})=>{const x=v??u+d,[b,g]=i.useState(!1),[S,w]=i.useState(0),[m,y]=i.useState(0),[k,I]=i.useState([]),[A,E]=i.useState(a),M=i.useMemo(()=>c?.annotations?c.annotations.map(N=>typeof N.start=="number"?N:rr(N)):[],[c?.annotations]),R=i.useRef(M);R.current=M;const[F,T]=i.useState(null),[P,j]=i.useState(c?.isContinuousPlay??!1),[O]=i.useState(t),[z,Y]=i.useState(s),B=i.useRef(null),G=i.useRef(0),K=i.useRef(null),ie=i.useRef(P),te=i.useRef(null),re=i.useRef(null),le=i.useRef(s),ze=i.useRef(t);i.useEffect(()=>{ie.current=P},[P]),i.useEffect(()=>{le.current=z},[z]);const V=i.useCallback(N=>{te.current=N,T(N)},[]),ce=i.useCallback(N=>{ie.current=N,j(N)},[]),ae=i.useCallback(N=>{re.current=N},[]),L=e.waveformData.sample_rate;i.useEffect(()=>{const N=new oi({playbackRate:a});N.addTrack({source:e.source,peaks:e.waveformData,name:e.name});const se=N.getTrack(N.track?.id??"");return se&&se.setOnTimeUpdateCallback(ve=>{G.current=ve}),N.setOnPlaybackComplete(()=>{K.current&&(cancelAnimationFrame(K.current),K.current=null),g(!1),V(null),G.current=0,w(0)}),B.current=N,y(e.waveformData.duration),f?.(),()=>{K.current&&cancelAnimationFrame(K.current),N.dispose()}},[e.source,e.waveformData,e.name,a,f]),i.useEffect(()=>{const N=nr(e.waveformData,O,0,0,Math.ceil(e.waveformData.duration*L)),se={clipId:"media-element-clip",trackName:e.name??"Track",peaks:{length:N.length,data:[N.data],bits:N.bits},startSample:0,durationSamples:Math.ceil(e.waveformData.duration*L)};I([[se]])},[e.waveformData,e.name,O,L]);const de=i.useCallback(()=>{K.current&&cancelAnimationFrame(K.current);const N=()=>{const se=B.current?.getCurrentTime()??0;G.current=se,w(se);const ve=R.current;if(ve.length>0){const xe=ve.find(Ie=>se>=Ie.start&&se<Ie.end);if(ie.current)xe&&xe.id!==te.current?V(xe.id):!xe&&te.current!==null&&V(null);else if(te.current){const Ie=ve.find(Ue=>Ue.id===te.current);if(Ie&&se>=Ie.end){B.current?.stop(),g(!1);return}}else xe&&V(xe.id)}if(le.current&&re.current){const xe=re.current,Ie=se*L/ze.current,Ue=xe.clientWidth,Oe=l.show?l.width:0,tt=Ie+Oe,ct=Math.max(0,tt-Ue/2);xe.scrollLeft=ct}K.current=requestAnimationFrame(N)};K.current=requestAnimationFrame(N)},[V,L,l]),fe=i.useCallback(()=>{K.current&&(cancelAnimationFrame(K.current),K.current=null)},[]),oe=i.useCallback(N=>{if(!B.current)return;const se=N??G.current;B.current.play(void 0,se),g(!0),de()},[de]),Ee=i.useCallback(()=>{B.current&&(B.current.pause(),g(!1),fe(),w(B.current.getCurrentTime()))},[fe]),De=i.useCallback(()=>{B.current&&(B.current.stop(),g(!1),fe(),G.current=0,w(0),V(null))},[fe,V]),He=i.useCallback(N=>{const se=Math.max(0,Math.min(N,m));G.current=se,w(se),B.current&&B.current.seekTo(se)},[m]),Le=i.useCallback(N=>{const se=Math.max(.5,Math.min(2,N));E(se),B.current&&B.current.setPlaybackRate(se)},[]),ne=r?30:0,Ge=i.useMemo(()=>({isPlaying:b,currentTime:S,currentTimeRef:G}),[b,S]),Ke=i.useMemo(()=>({continuousPlay:P,annotations:M,activeAnnotationId:F,playbackRate:A,isAutomaticScroll:z}),[P,M,F,A,z]),_=i.useRef(p);_.current=p;const Te=i.useCallback(N=>{const se=typeof N=="function"?N(R.current):N;if(!_.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}_.current(se)},[]),pe=i.useMemo(()=>({play:oe,pause:Ee,stop:De,seekTo:He,setPlaybackRate:Le,setContinuousPlay:ce,setAnnotations:Te,setActiveAnnotationId:V,setAutomaticScroll:N=>{Y(N)},setScrollContainer:ae,scrollContainerRef:re}),[oe,Ee,De,He,Le,ce,Te,V,ae]),ge=i.useMemo(()=>({duration:m,peaksDataArray:k,sampleRate:L,waveHeight:n,timeScaleHeight:ne,samplesPerPixel:O,playoutRef:B,controls:l,barWidth:u,barGap:d,progressBarWidth:x}),[m,k,L,n,ne,O,l,u,d,x]),ot={...Hn,...o};return h.jsx($.ThemeProvider,{theme:ot,children:h.jsx(vr.Provider,{value:Ge,children:h.jsx(Cr.Provider,{value:Ke,children:h.jsx(xr.Provider,{value:pe,children:h.jsx(wr.Provider,{value:ge,children:C})})})})})},Bt=()=>{const e=i.useContext(vr);if(!e)throw new Error("useMediaElementAnimation must be used within MediaElementPlaylistProvider");return e},Wt=()=>{const e=i.useContext(Cr);if(!e)throw new Error("useMediaElementState must be used within MediaElementPlaylistProvider");return e},en=()=>{const e=i.useContext(xr);if(!e)throw new Error("useMediaElementControls must be used within MediaElementPlaylistProvider");return e},Ft=()=>{const e=i.useContext(wr);if(!e)throw new Error("useMediaElementData must be used within MediaElementPlaylistProvider");return e},ii=({className:e})=>{const{isPlaying:t,currentTimeRef:n}=Me(),{selectionStart:r,selectionEnd:a,isLoopEnabled:s}=Re(),{play:o}=he(),l=async()=>{if(r!==a&&a>r)if(s)await o(r);else{const u=a-r;await o(r,u)}else await o(n.current??0)};return h.jsx(je,{onClick:l,disabled:t,className:e,children:"Play"})},li=({className:e})=>{const{isPlaying:t}=Me(),{pause:n}=he();return h.jsx(je,{onClick:n,disabled:!t,className:e,children:"Pause"})},ci=({className:e})=>{const{isPlaying:t}=Me(),{stop:n}=he();return h.jsx(je,{onClick:n,disabled:!t,className:e,children:"Stop"})},ui=({className:e})=>{const{isPlaying:t}=Me(),{play:n,setCurrentTime:r}=he(),{playoutRef:a}=Ae(),s=()=>{r(0),t&&a.current&&(a.current.stop(),n(0))};return h.jsx(je,{onClick:s,className:e,children:"Rewind"})},di=({className:e})=>{const{isPlaying:t}=Me(),{play:n,setCurrentTime:r}=he(),{duration:a,playoutRef:s}=Ae(),o=()=>{r(a),t&&s.current&&(s.current.stop(),n(a))};return h.jsx(je,{onClick:o,className:e,children:"Fast Forward"})},fi=({skipAmount:e=5,className:t})=>{const{currentTimeRef:n,isPlaying:r}=Me(),{play:a,setCurrentTime:s}=he(),{playoutRef:o}=Ae(),l=()=>{const c=Math.max(0,(n.current??0)-e);s(c),r&&o.current&&(o.current.stop(),a(c))};return h.jsx(je,{onClick:l,className:t,children:"Skip Backward"})},mi=({skipAmount:e=5,className:t})=>{const{currentTimeRef:n,isPlaying:r}=Me(),{play:a,setCurrentTime:s}=he(),{duration:o,playoutRef:l}=Ae(),c=()=>{const u=Math.min(o,(n.current??0)+e);s(u),r&&l.current&&(l.current.stop(),a(u))};return h.jsx(je,{onClick:c,className:t,children:"Skip Forward"})},hi=({className:e})=>{const{isLoopEnabled:t,loopStart:n,loopEnd:r}=Re(),{setLoopEnabled:a,setLoopRegion:s}=he(),{duration:o}=Ae(),l=n!==r&&r>n,c=()=>{if(!t&&!l){const u=Math.min(10,o*.25);s(0,Math.max(1,u))}a(!t)};return h.jsx(je,{onClick:c,className:e,title:t?"Disable loop":"Enable loop",children:t?"Loop On":"Loop Off"})},pi=({className:e})=>{const{selectionStart:t,selectionEnd:n,loopStart:r,loopEnd:a}=Re(),{setLoopRegionFromSelection:s,clearLoopRegion:o}=he(),l=t!==n&&n>t,c=r!==a&&a>r,u=()=>{c?o():s()};return h.jsx(je,{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"})},gi=({className:e,disabled:t})=>{const{zoomIn:n}=he(),{canZoomIn:r}=Ae();return h.jsx(je,{variant:"success",onClick:n,disabled:t||!r,className:e,children:"Zoom In"})},bi=({className:e,disabled:t})=>{const{zoomOut:n}=he(),{canZoomOut:r}=Ae();return h.jsx(je,{variant:"success",onClick:n,disabled:t||!r,className:e,children:"Zoom Out"})},vi=({className:e})=>{const{masterVolume:t}=Ae(),{setMasterVolume:n}=he();return h.jsx(Ea,{volume:t,onChange:n,className:e})},Ci=({className:e})=>{const{timeFormat:t}=Ae(),{setTimeFormat:n}=he();return h.jsx(uo,{value:t,onChange:n,className:e})},xi=$.span`
|
|
1227
|
+
`,zs=({level:e,peakLevel:t,width:n=200,height:r=20,className:a})=>{const s=Math.max(0,Math.min(1,e)),o=t!==void 0?Math.max(0,Math.min(1,t)):0;return h.jsxs(_s,{$width:n,$height:r,className:a,children:[h.jsx(Ps,{$level:s,$height:r}),t!==void 0&&o>0&&h.jsx(Vs,{$peakLevel:o,$height:r}),h.jsxs(js,{$height:r,children:[h.jsx(In,{$position:60,$height:r}),h.jsx(In,{$position:85,$height:r})]})]})};i.memo(zs);function Hs(e,t,n,r={}){const{currentTime:a=0,audioConstraints:s,...o}=r,[l,c]=i.useState(!1),[u,d]=i.useState(null),{stream:v,devices:p,hasPermission:f,requestAccess:C,error:x}=Ws(),{level:b,peakLevel:g}=Fs(v),{isRecording:S,isPaused:w,duration:m,peaks:y,startRecording:k,stopRecording:I,pauseRecording:A,resumeRecording:E,error:M}=Bs(v,o),R=i.useCallback(async()=>{n&&(l||(await jt(),c(!0)),await k())},[n,l,k]),F=i.useCallback(async()=>{const j=await I();if(j&&n){const O=e.findIndex(te=>te.id===n);if(O===-1)return;const z=e[O],Y=Math.floor(a*j.sampleRate);let B=0;if(z.clips.length>0){const te=z.clips.map(re=>re.startSample+re.durationSamples);B=Math.max(...te)}const G=Math.max(Y,B),K={id:`clip-${Date.now()}`,audioBuffer:j,startSample:G,durationSamples:j.length,offsetSamples:0,sampleRate:j.sampleRate,sourceDurationSamples:j.length,gain:1,name:`Recording ${new Date().toLocaleTimeString()}`},ie=e.map((te,re)=>re===O?{...te,clips:[...te.clips,K]}:te);t(ie)}},[n,e,t,a,I]);i.useEffect(()=>{f&&p.length>0&&u===null&&d(p[0].deviceId)},[f,p.length]);const T=i.useCallback(async()=>{await C(void 0,s),await jt(),c(!0)},[C,s]),P=i.useCallback(async j=>{d(j),await C(j,s),await jt(),c(!0)},[C,s]);return{isRecording:S,isPaused:w,duration:m,level:b,peakLevel:g,error:x||M,stream:v,devices:p,hasPermission:f,selectedDevice:u,startRecording:R,stopRecording:F,pauseRecording:A,resumeRecording:E,requestMicAccess:T,changeDevice:P,recordingPeaks:y}}const Ct=[{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}]}],Qt=e=>Ct.find(t=>t.id===e),Ls=e=>Ct.filter(t=>t.category===e),Xs=[{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"}],Gs={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 Ns=0;const Os=()=>`effect_${Date.now()}_${++Ns}`;function ht(e,t){const n=Gs[e.id];if(!n)throw new Error(`Unknown effect type: ${e.id}`);const r={};e.parameters.forEach(o=>{const l=t?.[o.name]??o.default;r[o.name]=l});const a=new n(r),s=Os();return{effect:a,id:e.id,instanceId:s,dispose(){try{a.disconnect(),a.dispose()}catch{}},setParameter(o,l){o==="wet"&&a.wet?a.wet.value=l:a[o]!==void 0&&(a[o]?.value!==void 0?a[o].value=l:a[o]=l)},getParameter(o){if(o==="wet"&&a.wet)return a.wet.value;if(a[o]!==void 0)return a[o]?.value!==void 0?a[o].value:a[o]},connect(o){a.connect(o)},disconnect(){try{a.disconnect()}catch{}}}}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 Ks(e=256){const[t,n]=i.useState([]),r=i.useRef(t);r.current=t;const a=i.useRef(new Map),s=i.useRef(null),o=i.useRef(null),l=i.useCallback(b=>{const g=o.current;if(!g)return;const{masterGainNode:S,destination:w,analyserNode:m}=g;try{S.disconnect()}catch{}const y=b.map(k=>a.current.get(k.instanceId)).filter(k=>k!==void 0);if(y.length===0)S.connect(m),m.connect(w);else{let k=S;y.forEach(I=>{try{I.disconnect()}catch{}k.connect(I.effect),k=I.effect}),k.connect(m),m.connect(w)}},[]),c=i.useCallback(b=>{const g=Qt(b);if(!g){console.error(`Unknown effect: ${b}`);return}const S={};g.parameters.forEach(y=>{S[y.name]=y.default});const w=ht(g,S);a.current.set(w.instanceId,w);const m={instanceId:w.instanceId,effectId:g.id,definition:g,params:S,bypassed:!1};n(y=>[...y,m])},[]),u=i.useCallback(b=>{const g=a.current.get(b);g&&(g.dispose(),a.current.delete(b)),n(S=>S.filter(w=>w.instanceId!==b))},[]),d=i.useCallback((b,g,S)=>{const w=a.current.get(b);w&&w.setParameter(g,S),n(m=>m.map(y=>y.instanceId===b?{...y,params:{...y.params,[g]:S}}:y))},[]),v=i.useCallback(b=>{const g=r.current.find(m=>m.instanceId===b);if(!g)return;const S=!g.bypassed,w=a.current.get(b);if(w){const m=g.params.wet??1;w.setParameter("wet",S?0:m)}n(m=>m.map(y=>y.instanceId===b?{...y,bypassed:S}:y))},[]),p=i.useCallback((b,g)=>{n(S=>{const w=[...S],[m]=w.splice(b,1);return w.splice(g,0,m),w})},[]),f=i.useCallback(()=>{a.current.forEach(b=>b.dispose()),a.current.clear(),n([])},[]);i.useEffect(()=>{l(t)},[t,l]);const C=i.useCallback((b,g,S)=>{const w=new Z.Analyser("fft",e);s.current=w,o.current={masterGainNode:b,destination:g,analyserNode:w};const y=r.current.map(k=>a.current.get(k.instanceId)).filter(k=>k!==void 0);if(y.length===0)b.connect(w),w.connect(g);else{let k=b;y.forEach(I=>{k.connect(I.effect),k=I.effect}),k.connect(w),w.connect(g)}return function(){w.dispose(),s.current=null,o.current=null}},[e]);i.useEffect(()=>()=>{a.current.forEach(b=>b.dispose()),a.current.clear()},[]);const x=i.useCallback(()=>{const b=t.filter(g=>!g.bypassed);if(b.length!==0)return(g,S,w)=>{const m=[];for(const y of b){const k=ht(y.definition,y.params);m.push(k)}if(m.length===0)g.connect(S);else{let y=g;m.forEach(k=>{y.connect(k.effect),y=k.effect}),y.connect(S)}return function(){m.forEach(k=>k.dispose())}}},[t]);return{activeEffects:t,availableEffects:Ct,addEffect:c,removeEffect:u,updateParameter:d,toggleBypass:v,reorderEffects:p,clearAllEffects:f,masterEffects:C,createOfflineEffectsFunction:x,analyserRef:s}}function Us(){const[e,t]=i.useState(new Map),n=i.useRef(new Map),r=i.useRef(new Map),a=i.useCallback((f,C)=>{const x=r.current.get(f);if(!x)return;const{graphEnd:b,masterGainNode:g}=x,S=n.current.get(f);try{b.disconnect()}catch{}const w=C.map(m=>S?.get(m.instanceId)).filter(m=>m!==void 0);if(w.length===0)b.connect(g);else{let m=b;w.forEach(y=>{try{y.disconnect()}catch{}m.connect(y.effect),m=y.effect}),m.connect(g)}},[]),s=i.useCallback((f,C)=>{const x=Qt(C);if(!x){console.error(`Unknown effect: ${C}`);return}const b={};x.parameters.forEach(w=>{b[w.name]=w.default});const g=ht(x,b);n.current.has(f)||n.current.set(f,new Map),n.current.get(f).set(g.instanceId,g);const S={instanceId:g.instanceId,effectId:x.id,definition:x,params:b,bypassed:!1};t(w=>{const m=new Map(w),y=m.get(f)||[];return m.set(f,[...y,S]),m})},[]),o=i.useCallback((f,C)=>{const x=n.current.get(f),b=x?.get(C);b&&(b.dispose(),x?.delete(C)),t(g=>{const S=new Map(g),w=S.get(f)||[];return S.set(f,w.filter(m=>m.instanceId!==C)),S})},[]),l=i.useCallback((f,C,x,b)=>{const S=n.current.get(f)?.get(C);S&&S.setParameter(x,b),t(w=>{const m=new Map(w),y=m.get(f)||[];return m.set(f,y.map(k=>k.instanceId===C?{...k,params:{...k.params,[x]:b}}:k)),m})},[]),c=i.useCallback((f,C)=>{const b=(d.current.get(f)||[]).find(m=>m.instanceId===C);if(!b)return;const g=!b.bypassed,w=n.current.get(f)?.get(C);if(w){const m=b.params.wet??1;w.setParameter("wet",g?0:m)}t(m=>{const y=new Map(m),k=y.get(f)||[];return y.set(f,k.map(I=>I.instanceId===C?{...I,bypassed:g}:I)),y})},[]),u=i.useCallback(f=>{const C=n.current.get(f);C&&(C.forEach(x=>x.dispose()),C.clear()),t(x=>{const b=new Map(x);return b.set(f,[]),b})},[]),d=i.useRef(e);d.current=e;const v=i.useCallback(f=>(C,x,b)=>{r.current.set(f,{graphEnd:C,masterGainNode:x});const g=d.current.get(f)||[],S=n.current.get(f),w=g.map(m=>S?.get(m.instanceId)).filter(m=>m!==void 0);if(w.length===0)C.connect(x);else{let m=C;w.forEach(y=>{m.connect(y.effect),m=y.effect}),m.connect(x)}return function(){r.current.delete(f)}},[]);i.useEffect(()=>{e.forEach((f,C)=>{a(C,f)})},[e,a]),i.useEffect(()=>()=>{n.current.forEach(f=>{f.forEach(C=>C.dispose()),f.clear()}),n.current.clear()},[]);const p=i.useCallback(f=>{const x=(e.get(f)||[]).filter(b=>!b.bypassed);if(x.length!==0)return(b,g,S)=>{const w=[];for(const m of x){const y=ht(m.definition,m.params);w.push(y)}if(w.length===0)b.connect(g);else{let m=b;w.forEach(y=>{m.connect(y.effect),m=y.effect}),m.connect(g)}return function(){w.forEach(y=>y.dispose())}}},[e]);return{trackEffectsState:e,addEffectToTrack:s,removeEffectFromTrack:o,updateTrackEffectParameter:l,toggleBypass:c,clearTrackEffects:u,getTrackEffectsFunction:v,createOfflineTrackEffectsFunction:p,availableEffects:Ct}}function Js(e,t={}){const{bitDepth:n=16}=t,r=e.numberOfChannels,a=e.sampleRate,s=e.length,o=n/8,l=r*o,c=a*l,u=s*l,d=44,v=d+u,p=new ArrayBuffer(v),f=new DataView(p);At(f,0,"RIFF"),f.setUint32(4,v-8,!0),At(f,8,"WAVE"),At(f,12,"fmt "),f.setUint32(16,16,!0),f.setUint16(20,n===32?3:1,!0),f.setUint16(22,r,!0),f.setUint32(24,a,!0),f.setUint32(28,c,!0),f.setUint16(32,l,!0),f.setUint16(34,n,!0),At(f,36,"data"),f.setUint32(40,u,!0);const C=[];for(let b=0;b<r;b++)C.push(e.getChannelData(b));let x=d;if(n===16)for(let b=0;b<s;b++)for(let g=0;g<r;g++){const S=C[g][b],w=Math.max(-1,Math.min(1,S)),m=w<0?w*32768:w*32767;f.setInt16(x,m,!0),x+=2}else for(let b=0;b<s;b++)for(let g=0;g<r;g++)f.setFloat32(x,C[g][b],!0),x+=4;return new Blob([p],{type:"audio/wav"})}function At(e,t,n){for(let r=0;r<n.length;r++)e.setUint8(t+r,n.charCodeAt(r))}function qs(e,t){const n=URL.createObjectURL(e),r=document.createElement("a");r.href=n,r.download=t,r.style.display="none",document.body.appendChild(r),r.click(),document.body.removeChild(r),URL.revokeObjectURL(n)}function fr(){const[e,t]=i.useState(!1),[n,r]=i.useState(0),[a,s]=i.useState(null);return{exportWav:i.useCallback(async(l,c,u={})=>{const{filename:d="export",mode:v="master",trackIndex:p,autoDownload:f=!0,applyEffects:C=!0,effectsFunction:x,createOfflineTrackEffects:b,bitDepth:g=16,onProgress:S}=u;t(!0),r(0),s(null);try{if(l.length===0)throw new Error("No tracks to export");if(v==="individual"&&(p===void 0||p<0||p>=l.length))throw new Error("Invalid track index for individual export");const w=l[0].clips[0]?.sampleRate||44100;let m=0;for(const R of l)for(const F of R.clips){const T=F.startSample+F.durationSamples;m=Math.max(m,T)}m+=Math.round(w*.1);const y=m/w,k=v==="individual"?[{track:l[p],state:c[p],index:p}]:l.map((R,F)=>({track:R,state:c[F],index:F})),I=c.some(R=>R.soloed),A=!!b;let E;if((x||A)&&C)E=await Qs(k,c,I,y,w,x,b,R=>{r(R),S?.(R)});else{const R=new OfflineAudioContext(2,m,w);let F=0;const T=k.reduce((P,{track:j})=>P+j.clips.length,0);for(const{track:P,state:j}of k)if(!(j.muted&&!j.soloed)&&!(I&&!j.soloed))for(const O of P.clips){await ti(R,O,j,w,C),F++;const z=F/T*.5;r(z),S?.(z)}r(.5),S?.(.5),E=await R.startRendering()}r(.9),S?.(.9);const M=Js(E,{bitDepth:g});if(r(1),S?.(1),f){const R=v==="individual"?`${d}_${l[p].name}`:d;qs(M,`${R}.wav`)}return{audioBuffer:E,blob:M,duration:y}}catch(w){const m=w instanceof Error?w.message:"Export failed";throw s(m),w}finally{t(!1)}},[]),isExporting:e,progress:n,error:a}}async function Qs(e,t,n,r,a,s,o,l){const{Offline:c,Volume:u,Gain:d,Panner:v,Player:p,ToneAudioBuffer:f}=await import("tone");l(.1);let C;try{C=await c(async({transport:x,destination:b})=>{const g=new u(0);let S;s?S=s(g,b,!0):g.connect(b);for(const{track:w,state:m}of e){if(m.muted&&!m.soloed||n&&!m.soloed)continue;const y=new u(ei(m.volume)),k=new v(m.pan),I=new d(m.muted?0:1),A=o?.(w.id);A?A(I,g,!0):I.connect(g),k.connect(I),y.connect(k);for(const E of w.clips){const{audioBuffer:M,startSample:R,durationSamples:F,offsetSamples:T,gain:P,fadeIn:j,fadeOut:O}=E,z=R/a,Y=F/a,B=T/a,G=new f(M),K=new p(G),ie=new d(P);if(K.connect(ie),ie.connect(y),j){const te=z,re=z+j.duration,le=ie.gain._param;le.setValueAtTime(0,te),le.linearRampToValueAtTime(P,re)}if(O){const te=z+Y-O.duration,re=z+Y,le=ie.gain._param;le.setValueAtTime(P,te),le.linearRampToValueAtTime(0,re)}K.start(z,B,Y)}}x.start(0)},r,2,a)}catch(x){throw x instanceof Error?x:new Error(`Tone.Offline rendering failed: ${String(x)}`)}return l(.9),C.get()}function ei(e){return 20*Math.log10(Math.max(e,1e-4))}async function ti(e,t,n,r,a){const{audioBuffer:s,startSample:o,durationSamples:l,offsetSamples:c,gain:u,fadeIn:d,fadeOut:v}=t;if(!s){console.warn(`Skipping clip "${t.name||t.id}" - no audioBuffer for export`);return}const p=o/r,f=l/r,C=c/r,x=e.createBufferSource();x.buffer=s;const b=e.createGain(),g=u*n.volume,S=e.createStereoPanner();if(S.pan.value=n.pan,x.connect(b),b.connect(S),S.connect(e.destination),a){if(d?b.gain.setValueAtTime(0,p):b.gain.setValueAtTime(g,p),d){const w=p,m=p+d.duration;$n(b.gain,w,m,0,g,d.type||"linear")}if(v){const w=p+f-v.duration,m=p+f;(!d||d.duration<f-v.duration)&&b.gain.setValueAtTime(g,w),$n(b.gain,w,m,g,0,v.type||"linear")}}else b.gain.setValueAtTime(g,p);x.start(p,C,f)}function $n(e,t,n,r,a,s){const o=n-t;if(!(o<=0))switch(s){case"linear":e.setValueAtTime(r,t),e.linearRampToValueAtTime(a,n);break;case"exponential":const l=Math.max(r,1e-4),c=Math.max(a,1e-4);e.setValueAtTime(l,t),e.exponentialRampToValueAtTime(c,n),a===0&&e.setValueAtTime(0,n);break;case"logarithmic":const u=Mn(r,a,256,"logarithmic");e.setValueCurveAtTime(u,t,o);break;case"sCurve":const d=Mn(r,a,256,"sCurve");e.setValueCurveAtTime(d,t,o);break;default:e.setValueAtTime(r,t),e.linearRampToValueAtTime(a,n)}}function Mn(e,t,n,r){const a=new Float32Array(n),s=t-e;for(let o=0;o<n;o++){const l=o/(n-1);let c;r==="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),a[o]=e+s*c}return a}const mr=i.createContext(null),hr=i.createContext(null),pr=i.createContext(null),gr=i.createContext(null),br=i.createContext(null),ni=({tracks:e,timescale:t=!1,mono:n=!1,waveHeight:r=80,samplesPerPixel:a=1024,zoomLevels:s,automaticScroll:o=!1,theme:l,controls:c={show:!1,width:0},annotationList:u,effects:d,onReady:v,onAnnotationUpdate:p,onAnnotationsChange:f,barWidth:C=1,barGap:x=0,progressBarWidth:b,children:g})=>{const S=b??C+x,w=i.useMemo(()=>u?.annotations?u.annotations.map(W=>typeof W.start=="number"?W:rr(W)):[],[u?.annotations]),m=i.useRef(w);m.current=w;const[y,k]=i.useState(null),[I,A]=i.useState(!1),[E,M]=i.useState(0),[R,F]=i.useState(0),[T,P]=i.useState([]),[j,O]=i.useState([]),[z,Y]=i.useState([]),[B,G]=i.useState(0),[K,ie]=i.useState(0),[te,re]=i.useState(null),[le,ze]=i.useState(o),[V,ce]=i.useState(u?.isContinuousPlay??!1),[ae,L]=i.useState(u?.linkEndpoints??!1),[de,fe]=i.useState(u?.editable??!1),[oe,Ee]=i.useState(!1),[De,He]=i.useState(0),[Le,ne]=i.useState(0),[Ge,Ke]=i.useState(!1),_=i.useRef(null),Te=i.useRef(0),pe=i.useRef(0),ge=i.useRef(null),ot=i.useRef(z),N=i.useRef(0),se=i.useRef(0),ve=i.useRef(null),xe=i.useRef(null),Ie=i.useRef(!1),Ue=i.useRef(u?.isContinuousPlay??!1),Oe=i.useRef(null),tt=i.useRef(a),ct=i.useRef(!1),H=i.useRef(0),U=i.useRef(0),ee=i.useRef(0),me=i.useRef(0),{timeFormat:be,setTimeFormat:$e,formatTime:Ne}=ir(),Ze=lr({initialSamplesPerPixel:a,zoomLevels:s}),Q=Ze.samplesPerPixel,{masterVolume:we,setMasterVolume:Je}=cr({playoutRef:_,initialVolume:1}),st=i.useCallback(W=>{Ue.current=W,ce(W)},[]),Xe=i.useCallback(W=>{Oe.current=W,k(W)},[]),qe=i.useCallback(W=>{ct.current=W,Ee(W)},[]),Pe=i.useCallback((W,X)=>{ee.current=W,me.current=X,He(W),ne(X)},[]),ut=i.useCallback(()=>{const W=H.current,X=U.current;W!==X&&X>W&&Pe(W,X)},[Pe]),dt=i.useCallback(()=>{Pe(0,0)},[Pe]);i.useEffect(()=>{Ie.current=le},[le]),i.useEffect(()=>{ot.current=z},[z]),i.useEffect(()=>{H.current=B,U.current=K},[B,K]),i.useEffect(()=>{if(!xe.current||!T.length)return;const W=xe.current,X=tt.current,q=Q;if(X===q)return;const ue=c.show?c.width:0,J=W.clientWidth,ye=W.scrollLeft+J/2-ue,Qe=T[0].sampleRate,ke=ye*X/Qe*Qe/q,We=Math.max(0,ke+ue-J/2);W.scrollLeft=We,tt.current=q},[Q,T,c]);const nt=i.useRef(null);i.useEffect(()=>{if(Ke(!1),e.length===0){P([]),F(0),Y([]),O([]),_.current&&(_.current.dispose(),_.current=null);return}const W=I,X=pe.current;return _.current&&W&&(_.current.stop(),ge.current&&(cancelAnimationFrame(ge.current),ge.current=null),nt.current={position:X}),(async()=>{try{const ue=[];e.forEach(Ce=>{Ce.clips.length>0&&Ce.clips[0].audioBuffer&&ue.push(Ce.clips[0].audioBuffer)});let J=0;e.forEach(Ce=>{Ce.clips.forEach(ke=>{const We=ke.sampleRate,xt=(ke.startSample+ke.durationSamples)/We;J=Math.max(J,xt)})}),P(ue),F(J),Y(Ce=>Ce.length===e.length?Ce.map((ke,We)=>({...ke,name:e[We].name})):e.map(ke=>({name:ke.name,muted:ke.muted,soloed:ke.soloed,volume:ke.volume,pan:ke.pan}))),_.current&&_.current.dispose();const Se=new ra({effects:d}),ye=ot.current;e.forEach((Ce,ke)=>{const We=Ce.clips.filter(rt=>rt.audioBuffer);if(We.length>0){const rt=We[0].sampleRate,xt=Math.min(...We.map(Fe=>Fe.startSample/rt)),Hr=Math.max(...We.map(Fe=>(Fe.startSample+Fe.durationSamples)/rt)),wt=ye[ke],Lr={id:`track-${ke}`,name:Ce.name,gain:wt?.volume??Ce.volume,muted:wt?.muted??Ce.muted,soloed:wt?.soloed??Ce.soloed,stereoPan:wt?.pan??Ce.pan,startTime:xt,endTime:Hr},Xr=We.map(Fe=>{const Pt=Fe.sampleRate;return{buffer:Fe.audioBuffer,startTime:Fe.startSample/Pt-xt,duration:Fe.durationSamples/Pt,offset:Fe.offsetSamples/Pt,fadeIn:Fe.fadeIn,fadeOut:Fe.fadeOut,gain:Fe.gain}});Se.addTrack({clips:Xr,track:Lr,effects:Ce.effects})}}),Se.applyInitialSoloState(),_.current=Se,Ke(!0);const Qe=new CustomEvent("waveform-playlist:ready",{detail:{trackCount:e.length,duration:J}});window.dispatchEvent(Qe),v?.()}catch(ue){console.error("Error loading audio:",ue)}})(),()=>{ge.current&&cancelAnimationFrame(ge.current),_.current&&_.current.dispose()}},[e,v,I]),i.useEffect(()=>{if(e.length===0)return;const W=16,X=e.map(q=>q.clips.map(J=>{if(J.waveformData){const ye=nr(J.waveformData,Q,0,J.offsetSamples,J.durationSamples);return{clipId:J.id,trackName:q.name,peaks:{length:ye.length,data:[ye.data],bits:ye.bits},startSample:J.startSample,durationSamples:J.durationSamples,fadeIn:J.fadeIn,fadeOut:J.fadeOut}}if(!J.audioBuffer)return console.warn(`Clip "${J.name||J.id}" has neither waveformData nor audioBuffer - rendering empty`),{clipId:J.id,trackName:q.name,peaks:{length:0,data:[],bits:W},startSample:J.startSample,durationSamples:J.durationSamples,fadeIn:J.fadeIn,fadeOut:J.fadeOut};const Se=Do(J.audioBuffer,Q,n,W,J.offsetSamples,J.durationSamples);return{clipId:J.id,trackName:q.name,peaks:Se,startSample:J.startSample,durationSamples:J.durationSamples,fadeIn:J.fadeIn,fadeOut:J.fadeOut}}));O(X)},[e,Q,n]);const Ye=i.useCallback(()=>{ge.current&&(cancelAnimationFrame(ge.current),ge.current=null);const W=()=>{const X=Z.getContext().currentTime-N.current,q=se.current+X;pe.current=q,M(q);const ue=m.current;if(ue.length>0){const Se=ue.find(ye=>q>=ye.start&&q<ye.end);if(Ue.current)Se&&Se.id!==Oe.current?Xe(Se.id):!Se&&Oe.current!==null&&Xe(null);else if(Oe.current){const ye=ue.find(Qe=>Qe.id===Oe.current);if(ye&&q>=ye.end){_.current&&_.current.stop(),A(!1),pe.current=Te.current,M(Te.current);return}}else Se&&Xe(Se.id)}if(Ie.current&&xe.current&&T.length>0){const Se=xe.current,ye=T[0].sampleRate,Qe=q*ye/tt.current,Ce=Se.clientWidth,ke=c.show?c.width:0,We=Qe+ke,rt=Math.max(0,We-Ce/2);Se.scrollLeft=rt}if(ve.current!==null&&q>=ve.current){_.current&&_.current.stop(),A(!1),pe.current=ve.current,M(ve.current),ve.current=null;return}const J=ee.current!==me.current&&me.current>ee.current;if(ct.current&&J&&q>=me.current){_.current?.stop();const ye=Z.getContext().currentTime;N.current=ye,se.current=ee.current,pe.current=ee.current,_.current?.play(ye,ee.current),ge.current=requestAnimationFrame(W);return}if(q>=R){_.current&&_.current.stop(),A(!1),pe.current=Te.current,M(Te.current),Xe(null);return}ge.current=requestAnimationFrame(W)};ge.current=requestAnimationFrame(W)},[R,T,Q,V]),Be=i.useCallback(()=>{ge.current&&(cancelAnimationFrame(ge.current),ge.current=null)},[]);i.useEffect(()=>{(async()=>{if(I&&ge.current&&_.current)if(V){const X=pe.current;_.current.stop(),Be(),await _.current.init(),_.current.setOnPlaybackComplete(()=>{});const ue=Z.getContext().currentTime;N.current=ue,se.current=X,_.current.play(ue,X),Ye()}else Be(),Ye()})()},[V,I,Ye,Be]),i.useEffect(()=>{(async()=>{if(nt.current&&_.current){const{position:X}=nt.current;nt.current=null,await _.current.init(),_.current.setOnPlaybackComplete(()=>{});const ue=Z.getContext().currentTime;N.current=ue,se.current=X,_.current.play(ue,X),A(!0),Ye()}})()},[e,Ye]);const _t=i.useCallback(async(W,X)=>{if(!_.current||T.length===0)return;await _.current.init(),await Z.start();const q=W??pe.current;Te.current=q,pe.current=q,_.current.setOnPlaybackComplete(()=>{}),_.current.stop(),Be();const J=Z.getContext().currentTime;N.current=J,se.current=q,ve.current=X!==void 0?q+X:null,_.current.play(J,q,X),A(!0),Ye()},[T.length,Ye,Be]),Mr=i.useCallback(()=>{if(!_.current)return;const W=Z.getContext().currentTime-N.current,X=se.current+W;_.current.pause(),A(!1),Be(),pe.current=X,M(X)},[Be]),Rr=i.useCallback(()=>{_.current&&(_.current.stop(),A(!1),Be(),pe.current=Te.current,M(Te.current),Xe(null))},[Be]),Er=i.useCallback(W=>{const X=Math.max(0,Math.min(W,R));pe.current=X,M(X),I&&_.current&&(_.current.stop(),Be(),_t(X))},[R,I,_t,Be]),Dr=i.useCallback((W,X)=>{const q=[...z];if(q[W]={...q[W],muted:X},Y(q),_.current){const ue=`track-${W}`;_.current.setMute(ue,X)}},[z]),Tr=i.useCallback((W,X)=>{const q=[...z];if(q[W]={...q[W],soloed:X},Y(q),_.current){const ue=`track-${W}`;_.current.setSolo(ue,X)}},[z]),Br=i.useCallback((W,X)=>{const q=[...z];if(q[W]={...q[W],volume:X},Y(q),_.current){const ue=`track-${W}`,J=_.current.getTrack(ue);J&&J.setVolume(X)}},[z]),Wr=i.useCallback((W,X)=>{const q=[...z];if(q[W]={...q[W],pan:X},Y(q),_.current){const ue=`track-${W}`,J=_.current.getTrack(ue);J&&J.setPan(X)}},[z]),Fr=i.useCallback((W,X)=>{G(W),ie(X),pe.current=W,M(W),I&&_.current&&(_.current.stop(),_.current.play(Z.getContext().currentTime,W))},[I]),_r=i.useCallback(W=>{xe.current=W},[]),Zt=i.useRef(f);Zt.current=f;const Zr=i.useCallback(W=>{const X=typeof W=="function"?W(m.current):W;if(!Zt.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}Zt.current(X)},[]),Pr=T[0]?.sampleRate||44100,tn=t?30:0,Vr=e.length*r+tn,nn={isPlaying:I,currentTime:E,currentTimeRef:pe,playbackStartTimeRef:N,audioStartPositionRef:se},rn={continuousPlay:V,linkEndpoints:ae,annotationsEditable:de,isAutomaticScroll:le,isLoopEnabled:oe,annotations:w,activeAnnotationId:y,selectionStart:B,selectionEnd:K,selectedTrackId:te,loopStart:De,loopEnd:Le},an={play:_t,pause:Mr,stop:Rr,seekTo:Er,setCurrentTime:W=>{pe.current=W,M(W)},setTrackMute:Dr,setTrackSolo:Tr,setTrackVolume:Br,setTrackPan:Wr,setSelection:Fr,setSelectedTrackId:re,setTimeFormat:$e,formatTime:Ne,zoomIn:Ze.zoomIn,zoomOut:Ze.zoomOut,setMasterVolume:Je,setAutomaticScroll:W=>{ze(W)},setScrollContainer:_r,scrollContainerRef:xe,setContinuousPlay:st,setLinkEndpoints:L,setAnnotationsEditable:fe,setAnnotations:Zr,setActiveAnnotationId:Xe,setLoopEnabled:qe,setLoopRegion:Pe,setLoopRegionFromSelection:ut,clearLoopRegion:dt},on={duration:R,audioBuffers:T,peaksDataArray:j,trackStates:z,tracks:e,sampleRate:Pr,waveHeight:r,timeScaleHeight:tn,minimumPlaylistHeight:Vr,controls:c,playoutRef:_,samplesPerPixel:Q,timeFormat:be,masterVolume:we,canZoomIn:Ze.canZoomIn,canZoomOut:Ze.canZoomOut,barWidth:C,barGap:x,progressBarWidth:S,isReady:Ge,mono:n},jr={...nn,...rn,...an,...on},zr={...Hn,...l};return h.jsx($.ThemeProvider,{theme:zr,children:h.jsx(mr.Provider,{value:nn,children:h.jsx(hr.Provider,{value:rn,children:h.jsx(pr.Provider,{value:an,children:h.jsx(gr.Provider,{value:on,children:h.jsx(br.Provider,{value:jr,children:g})})})})})})},Me=()=>{const e=i.useContext(mr);if(!e)throw new Error("usePlaybackAnimation must be used within WaveformPlaylistProvider");return e},Re=()=>{const e=i.useContext(hr);if(!e)throw new Error("usePlaylistState must be used within WaveformPlaylistProvider");return e},he=()=>{const e=i.useContext(pr);if(!e)throw new Error("usePlaylistControls must be used within WaveformPlaylistProvider");return e},Ae=()=>{const e=i.useContext(gr);if(!e)throw new Error("usePlaylistData must be used within WaveformPlaylistProvider");return e},ri=()=>{const e=i.useContext(br);if(!e)throw new Error("useWaveformPlaylist must be used within WaveformPlaylistProvider");return e};var ai=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,"preservesPitch"in this.audioElement?this.audioElement.preservesPitch=!0:"mozPreservesPitch"in this.audioElement?this.audioElement.mozPreservesPitch=!0:"webkitPreservesPitch"in this.audioElement&&(this.audioElement.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}},oi=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 ai({...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 r=t??0;if(this._isPlaying=!0,this.track.play(r),n!==void 0){const a=n/this._playbackRate;setTimeout(()=>{this._isPlaying&&(this.pause(),this.onPlaybackCompleteCallback&&this.onPlaybackCompleteCallback())},a*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 vr=i.createContext(null),Cr=i.createContext(null),xr=i.createContext(null),wr=i.createContext(null),si=({track:e,samplesPerPixel:t=1024,waveHeight:n=100,timescale:r=!1,playbackRate:a=1,automaticScroll:s=!1,theme:o,controls:l={show:!1,width:0},annotationList:c,barWidth:u=1,barGap:d=0,progressBarWidth:v,onAnnotationsChange:p,onReady:f,children:C})=>{const x=v??u+d,[b,g]=i.useState(!1),[S,w]=i.useState(0),[m,y]=i.useState(0),[k,I]=i.useState([]),[A,E]=i.useState(a),M=i.useMemo(()=>c?.annotations?c.annotations.map(N=>typeof N.start=="number"?N:rr(N)):[],[c?.annotations]),R=i.useRef(M);R.current=M;const[F,T]=i.useState(null),[P,j]=i.useState(c?.isContinuousPlay??!1),[O]=i.useState(t),[z,Y]=i.useState(s),B=i.useRef(null),G=i.useRef(0),K=i.useRef(null),ie=i.useRef(P),te=i.useRef(null),re=i.useRef(null),le=i.useRef(s),ze=i.useRef(t);i.useEffect(()=>{ie.current=P},[P]),i.useEffect(()=>{le.current=z},[z]);const V=i.useCallback(N=>{te.current=N,T(N)},[]),ce=i.useCallback(N=>{ie.current=N,j(N)},[]),ae=i.useCallback(N=>{re.current=N},[]),L=e.waveformData.sample_rate;i.useEffect(()=>{const N=new oi({playbackRate:a});N.addTrack({source:e.source,peaks:e.waveformData,name:e.name});const se=N.getTrack(N.track?.id??"");return se&&se.setOnTimeUpdateCallback(ve=>{G.current=ve}),N.setOnPlaybackComplete(()=>{K.current&&(cancelAnimationFrame(K.current),K.current=null),g(!1),V(null),G.current=0,w(0)}),B.current=N,y(e.waveformData.duration),f?.(),()=>{K.current&&cancelAnimationFrame(K.current),N.dispose()}},[e.source,e.waveformData,e.name,a,f]),i.useEffect(()=>{const N=nr(e.waveformData,O,0,0,Math.ceil(e.waveformData.duration*L)),se={clipId:"media-element-clip",trackName:e.name??"Track",peaks:{length:N.length,data:[N.data],bits:N.bits},startSample:0,durationSamples:Math.ceil(e.waveformData.duration*L)};I([[se]])},[e.waveformData,e.name,O,L]);const de=i.useCallback(()=>{K.current&&cancelAnimationFrame(K.current);const N=()=>{const se=B.current?.getCurrentTime()??0;G.current=se,w(se);const ve=R.current;if(ve.length>0){const xe=ve.find(Ie=>se>=Ie.start&&se<Ie.end);if(ie.current)xe&&xe.id!==te.current?V(xe.id):!xe&&te.current!==null&&V(null);else if(te.current){const Ie=ve.find(Ue=>Ue.id===te.current);if(Ie&&se>=Ie.end){B.current?.stop(),g(!1);return}}else xe&&V(xe.id)}if(le.current&&re.current){const xe=re.current,Ie=se*L/ze.current,Ue=xe.clientWidth,Oe=l.show?l.width:0,tt=Ie+Oe,ct=Math.max(0,tt-Ue/2);xe.scrollLeft=ct}K.current=requestAnimationFrame(N)};K.current=requestAnimationFrame(N)},[V,L,l]),fe=i.useCallback(()=>{K.current&&(cancelAnimationFrame(K.current),K.current=null)},[]),oe=i.useCallback(N=>{if(!B.current)return;const se=N??G.current;B.current.play(void 0,se),g(!0),de()},[de]),Ee=i.useCallback(()=>{B.current&&(B.current.pause(),g(!1),fe(),w(B.current.getCurrentTime()))},[fe]),De=i.useCallback(()=>{B.current&&(B.current.stop(),g(!1),fe(),G.current=0,w(0),V(null))},[fe,V]),He=i.useCallback(N=>{const se=Math.max(0,Math.min(N,m));G.current=se,w(se),B.current&&B.current.seekTo(se)},[m]),Le=i.useCallback(N=>{const se=Math.max(.5,Math.min(2,N));E(se),B.current&&B.current.setPlaybackRate(se)},[]),ne=r?30:0,Ge=i.useMemo(()=>({isPlaying:b,currentTime:S,currentTimeRef:G}),[b,S]),Ke=i.useMemo(()=>({continuousPlay:P,annotations:M,activeAnnotationId:F,playbackRate:A,isAutomaticScroll:z}),[P,M,F,A,z]),_=i.useRef(p);_.current=p;const Te=i.useCallback(N=>{const se=typeof N=="function"?N(R.current):N;if(!_.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}_.current(se)},[]),pe=i.useMemo(()=>({play:oe,pause:Ee,stop:De,seekTo:He,setPlaybackRate:Le,setContinuousPlay:ce,setAnnotations:Te,setActiveAnnotationId:V,setAutomaticScroll:N=>{Y(N)},setScrollContainer:ae,scrollContainerRef:re}),[oe,Ee,De,He,Le,ce,Te,V,ae]),ge=i.useMemo(()=>({duration:m,peaksDataArray:k,sampleRate:L,waveHeight:n,timeScaleHeight:ne,samplesPerPixel:O,playoutRef:B,controls:l,barWidth:u,barGap:d,progressBarWidth:x}),[m,k,L,n,ne,O,l,u,d,x]),ot={...Hn,...o};return h.jsx($.ThemeProvider,{theme:ot,children:h.jsx(vr.Provider,{value:Ge,children:h.jsx(Cr.Provider,{value:Ke,children:h.jsx(xr.Provider,{value:pe,children:h.jsx(wr.Provider,{value:ge,children:C})})})})})},Bt=()=>{const e=i.useContext(vr);if(!e)throw new Error("useMediaElementAnimation must be used within MediaElementPlaylistProvider");return e},Wt=()=>{const e=i.useContext(Cr);if(!e)throw new Error("useMediaElementState must be used within MediaElementPlaylistProvider");return e},en=()=>{const e=i.useContext(xr);if(!e)throw new Error("useMediaElementControls must be used within MediaElementPlaylistProvider");return e},Ft=()=>{const e=i.useContext(wr);if(!e)throw new Error("useMediaElementData must be used within MediaElementPlaylistProvider");return e},ii=({className:e})=>{const{isPlaying:t,currentTimeRef:n}=Me(),{selectionStart:r,selectionEnd:a,isLoopEnabled:s}=Re(),{play:o}=he(),l=async()=>{if(r!==a&&a>r)if(s)await o(r);else{const u=a-r;await o(r,u)}else await o(n.current??0)};return h.jsx(je,{onClick:l,disabled:t,className:e,children:"Play"})},li=({className:e})=>{const{isPlaying:t}=Me(),{pause:n}=he();return h.jsx(je,{onClick:n,disabled:!t,className:e,children:"Pause"})},ci=({className:e})=>{const{isPlaying:t}=Me(),{stop:n}=he();return h.jsx(je,{onClick:n,disabled:!t,className:e,children:"Stop"})},ui=({className:e})=>{const{isPlaying:t}=Me(),{play:n,setCurrentTime:r}=he(),{playoutRef:a}=Ae(),s=()=>{r(0),t&&a.current&&(a.current.stop(),n(0))};return h.jsx(je,{onClick:s,className:e,children:"Rewind"})},di=({className:e})=>{const{isPlaying:t}=Me(),{play:n,setCurrentTime:r}=he(),{duration:a,playoutRef:s}=Ae(),o=()=>{r(a),t&&s.current&&(s.current.stop(),n(a))};return h.jsx(je,{onClick:o,className:e,children:"Fast Forward"})},fi=({skipAmount:e=5,className:t})=>{const{currentTimeRef:n,isPlaying:r}=Me(),{play:a,setCurrentTime:s}=he(),{playoutRef:o}=Ae(),l=()=>{const c=Math.max(0,(n.current??0)-e);s(c),r&&o.current&&(o.current.stop(),a(c))};return h.jsx(je,{onClick:l,className:t,children:"Skip Backward"})},mi=({skipAmount:e=5,className:t})=>{const{currentTimeRef:n,isPlaying:r}=Me(),{play:a,setCurrentTime:s}=he(),{duration:o,playoutRef:l}=Ae(),c=()=>{const u=Math.min(o,(n.current??0)+e);s(u),r&&l.current&&(l.current.stop(),a(u))};return h.jsx(je,{onClick:c,className:t,children:"Skip Forward"})},hi=({className:e})=>{const{isLoopEnabled:t,loopStart:n,loopEnd:r}=Re(),{setLoopEnabled:a,setLoopRegion:s}=he(),{duration:o}=Ae(),l=n!==r&&r>n,c=()=>{if(!t&&!l){const u=Math.min(10,o*.25);s(0,Math.max(1,u))}a(!t)};return h.jsx(je,{onClick:c,className:e,title:t?"Disable loop":"Enable loop",children:t?"Loop On":"Loop Off"})},pi=({className:e})=>{const{selectionStart:t,selectionEnd:n,loopStart:r,loopEnd:a}=Re(),{setLoopRegionFromSelection:s,clearLoopRegion:o}=he(),l=t!==n&&n>t,c=r!==a&&a>r,u=()=>{c?o():s()};return h.jsx(je,{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"})},gi=({className:e,disabled:t})=>{const{zoomIn:n}=he(),{canZoomIn:r}=Ae();return h.jsx(je,{onClick:n,disabled:t||!r,className:e,children:"Zoom In"})},bi=({className:e,disabled:t})=>{const{zoomOut:n}=he(),{canZoomOut:r}=Ae();return h.jsx(je,{onClick:n,disabled:t||!r,className:e,children:"Zoom Out"})},vi=({className:e})=>{const{masterVolume:t}=Ae(),{setMasterVolume:n}=he();return h.jsx(Ea,{volume:t,onChange:n,className:e})},Ci=({className:e})=>{const{timeFormat:t}=Ae(),{setTimeFormat:n}=he();return h.jsx(uo,{value:t,onChange:n,className:e})},xi=$.span`
|
|
1228
1228
|
font-family: 'Courier New', Monaco, monospace;
|
|
1229
1229
|
font-size: 1rem;
|
|
1230
1230
|
font-weight: 600;
|
|
1231
1231
|
color: ${e=>e.theme?.textColor||"#333"};
|
|
1232
1232
|
user-select: none;
|
|
1233
|
-
`,wi=({className:e})=>{const t=i.useRef(null),n=i.useRef(null),{isPlaying:r,currentTimeRef:a,playbackStartTimeRef:s,audioStartPositionRef:o}=Me(),{timeFormat:l}=Ae(),c=l;return i.useEffect(()=>{const u=()=>{if(t.current){let d;if(r){const v=Z.getContext().currentTime-(s.current??0);d=(o.current??0)+v}else d=a.current??0;t.current.textContent=lt(d,c)}r&&(n.current=requestAnimationFrame(u))};return r?n.current=requestAnimationFrame(u):u(),()=>{n.current&&(cancelAnimationFrame(n.current),n.current=null)}},[r,c,a,s,o]),i.useEffect(()=>{!r&&t.current&&(t.current.textContent=lt(a.current??0,c))}),h.jsx(xi,{ref:t,className:e,"aria-label":"Audio position",children:lt(a.current??0,c)})},yi=({className:e})=>{const{selectionStart:t,selectionEnd:n}=Re(),{setSelection:r}=he();return h.jsx(za,{selectionStart:t,selectionEnd:n,onSelectionChange:r,className:e})},ki=({className:e})=>{const{isAutomaticScroll:t}=Re(),{setAutomaticScroll:n}=he();return h.jsx(fa,{checked:t,onChange:n,className:e})},Si=({className:e})=>{const{continuousPlay:t}=Re(),{setContinuousPlay:n}=he();return h.jsx(ms,{checked:t,onChange:n,className:e})},Ai=({className:e})=>{const{linkEndpoints:t}=Re(),{setLinkEndpoints:n}=he();return h.jsx(hs,{checked:t,onChange:n,className:e})},Ii=({className:e})=>{const{annotationsEditable:t}=Re(),{setAnnotationsEditable:n}=he();return h.jsx(ps,{checked:t,onChange:n,className:e})},$i=({filename:e,className:t})=>{const{annotations:n}=Re();return h.jsx(bs,{annotations:n,filename:e,className:t})},Mi=({label:e="Export WAV",filename:t="export",mode:n="master",trackIndex:r,bitDepth:a=16,applyEffects:s=!0,effectsFunction:o,createOfflineTrackEffects:l,className:c,onExportComplete:u,onExportError:d})=>{const{tracks:v,trackStates:p}=Ae(),{exportWav:f,isExporting:C,progress:x}=fr(),b=async()=>{try{const S=await f(v,p,{filename:t,mode:n,trackIndex:r,bitDepth:a,applyEffects:s,effectsFunction:o,createOfflineTrackEffects:l,autoDownload:!0});u?.(S.blob)}catch(S){d?.(S instanceof Error?S:new Error("Export failed"))}},g=C?`Exporting ${Math.round(x*100)}%`:e;return h.jsx(je,{onClick:b,disabled:C||v.length===0,className:c,children:g})},Ri=$.div`
|
|
1233
|
+
`,wi=({className:e})=>{const t=i.useRef(null),n=i.useRef(null),{isPlaying:r,currentTimeRef:a,playbackStartTimeRef:s,audioStartPositionRef:o}=Me(),{timeFormat:l}=Ae(),c=l;return i.useEffect(()=>{const u=()=>{if(t.current){let d;if(r){const v=Z.getContext().currentTime-(s.current??0);d=(o.current??0)+v}else d=a.current??0;t.current.textContent=lt(d,c)}r&&(n.current=requestAnimationFrame(u))};return r?n.current=requestAnimationFrame(u):u(),()=>{n.current&&(cancelAnimationFrame(n.current),n.current=null)}},[r,c,a,s,o]),i.useEffect(()=>{!r&&t.current&&(t.current.textContent=lt(a.current??0,c))}),h.jsx(xi,{ref:t,className:e,"aria-label":"Audio position",children:lt(a.current??0,c)})},yi=({className:e})=>{const{selectionStart:t,selectionEnd:n}=Re(),{setSelection:r}=he();return h.jsx(za,{selectionStart:t,selectionEnd:n,onSelectionChange:r,className:e})},ki=({className:e})=>{const{isAutomaticScroll:t}=Re(),{setAutomaticScroll:n}=he();return h.jsx(fa,{checked:t,onChange:n,className:e})},Si=({className:e})=>{const{continuousPlay:t}=Re(),{setContinuousPlay:n}=he();return h.jsx(ms,{checked:t,onChange:n,className:e})},Ai=({className:e})=>{const{linkEndpoints:t}=Re(),{setLinkEndpoints:n}=he();return h.jsx(hs,{checked:t,onChange:n,className:e})},Ii=({className:e})=>{const{annotationsEditable:t}=Re(),{setAnnotationsEditable:n}=he();return h.jsx(ps,{checked:t,onChange:n,className:e})},$i=({filename:e,className:t})=>{const{annotations:n}=Re();return h.jsx(bs,{annotations:n,filename:e,className:t})},Mi=({label:e="Export WAV",filename:t="export",mode:n="master",trackIndex:r,bitDepth:a=16,applyEffects:s=!0,effectsFunction:o,createOfflineTrackEffects:l,className:c,onExportComplete:u,onExportError:d})=>{const{tracks:v,trackStates:p}=Ae(),{exportWav:f,isExporting:C,progress:x}=fr(),b=async()=>{try{const S=await f(v,p,{filename:t,mode:n,trackIndex:r,bitDepth:a,applyEffects:s,effectsFunction:o,createOfflineTrackEffects:l,autoDownload:!0});u?.(S.blob)}catch(S){d?.(S instanceof Error?S:new Error("Export failed"))}},g=C?`Exporting ${Math.round(x*100)}%`:e;return h.jsx(je,{onClick:b,disabled:C||v.length===0,className:c,children:g})},Ri=$.div.attrs(e=>({style:{width:`${e.$width}px`,background:e.$color}}))`
|
|
1234
1234
|
position: absolute;
|
|
1235
1235
|
top: 0;
|
|
1236
1236
|
left: 0;
|
|
1237
|
-
width: ${e=>e.$width}px;
|
|
1238
|
-
background: ${e=>e.$color};
|
|
1239
1237
|
height: 100%;
|
|
1240
1238
|
z-index: 100; /* Below sticky controls (z-index: 101) so playhead is hidden when scrolled behind controls */
|
|
1241
1239
|
pointer-events: none;
|
|
1242
1240
|
will-change: transform;
|
|
1243
1241
|
`,Ei=({color:e="#ff0000",controlsOffset:t=0})=>{const n=i.useRef(null),r=i.useRef(null),{isPlaying:a,currentTimeRef:s,playbackStartTimeRef:o,audioStartPositionRef:l}=Me(),{samplesPerPixel:c,sampleRate:u,progressBarWidth:d}=Ae();return i.useEffect(()=>{const v=()=>{if(n.current){let p;if(a){const C=Z.getContext().currentTime-(o.current??0);p=(l.current??0)+C}else p=s.current??0;const f=p*u/c+t;n.current.style.transform=`translate3d(${f}px, 0, 0)`}a&&(r.current=requestAnimationFrame(v))};return a?r.current=requestAnimationFrame(v):v(),()=>{r.current&&(cancelAnimationFrame(r.current),r.current=null)}},[a,u,c,t,s,o,l]),i.useEffect(()=>{if(!a&&n.current){const p=(s.current??0)*u/c+t;n.current.style.transform=`translate3d(${p}px, 0, 0)`}}),h.jsx(Ri,{ref:n,$color:e,$width:d,"data-playhead":!0})},Di=$.div`
|
|
1244
1242
|
position: relative;
|
|
1245
|
-
`,Lt=$.div`
|
|
1243
|
+
`,Lt=$.div.attrs(e=>({style:{top:`${e.$top}px`,width:`${e.$width}px`,height:`${e.$height}px`,background:e.$color}}))`
|
|
1246
1244
|
position: absolute;
|
|
1247
|
-
top: ${e=>e.$top}px;
|
|
1248
1245
|
left: 0;
|
|
1249
|
-
width: ${e=>e.$width}px;
|
|
1250
|
-
height: ${e=>e.$height}px;
|
|
1251
|
-
background: ${e=>e.$color};
|
|
1252
1246
|
z-index: 0;
|
|
1253
1247
|
/* Force GPU compositing layer to prevent gradient flickering during scroll */
|
|
1254
1248
|
transform: translateZ(0);
|
|
1255
1249
|
backface-visibility: hidden;
|
|
1256
1250
|
will-change: transform;
|
|
1257
|
-
`,Ti=$.div`
|
|
1251
|
+
`,Ti=$.div.attrs(e=>({style:{top:`${e.$top}px`,height:`${e.$height}px`,background:e.$color}}))`
|
|
1258
1252
|
position: absolute;
|
|
1259
|
-
top: ${e=>e.$top}px;
|
|
1260
1253
|
left: 0;
|
|
1261
|
-
height: ${e=>e.$height}px;
|
|
1262
|
-
background: ${e=>e.$color};
|
|
1263
1254
|
pointer-events: none;
|
|
1264
1255
|
z-index: 1;
|
|
1265
1256
|
will-change: width;
|