timeline-canvas 1.4.0 → 1.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/README.md +183 -183
  2. package/README_CN.md +185 -185
  3. package/dist/ContextMenuPlugin-DkjzERie.mjs +1 -0
  4. package/dist/{ContextMenuPlugin-Ce29-J1v.d.mts → ContextMenuPlugin-erWC3clR.d.mts} +1 -1
  5. package/dist/{DarkThemePlugin-CLhvSrRp.d.mts → DarkThemePlugin-DSeernWS.d.mts} +1 -1
  6. package/dist/DarkThemePlugin-oE6DVEib.mjs +1 -0
  7. package/dist/EventMediaPlugin-Co_Fr3CX.mjs +1 -0
  8. package/dist/{EventMediaPlugin-DOIU5CZW.d.mts → EventMediaPlugin-DpK2xquj.d.mts} +1 -1
  9. package/dist/{EventTooltipPlugin-BtU0ZtyW.d.mts → EventTooltipPlugin-B2lXP9uu.d.mts} +1 -1
  10. package/dist/EventTooltipPlugin-mbadM95i.mjs +1 -0
  11. package/dist/LightThemePlugin-BigH_oWz.mjs +1 -0
  12. package/dist/{LightThemePlugin-KFUJdO1V.d.mts → LightThemePlugin-CXkW_Wpg.d.mts} +1 -1
  13. package/dist/{PerformanceOverlayPlugin-BmjL92Bg.d.mts → PerformanceOverlayPlugin-CnfsbiMK.d.mts} +1 -1
  14. package/dist/PerformanceOverlayPlugin-o5al1GSm.mjs +1 -0
  15. package/dist/builtin-plugin/ContextMenuPlugin.d.mts +1 -2
  16. package/dist/builtin-plugin/ContextMenuPlugin.mjs +1 -1
  17. package/dist/builtin-plugin/DarkThemePlugin.d.mts +1 -2
  18. package/dist/builtin-plugin/DarkThemePlugin.mjs +1 -1
  19. package/dist/builtin-plugin/EventMediaPlugin.d.mts +1 -2
  20. package/dist/builtin-plugin/EventMediaPlugin.mjs +1 -1
  21. package/dist/builtin-plugin/EventTooltipPlugin.d.mts +1 -2
  22. package/dist/builtin-plugin/EventTooltipPlugin.mjs +1 -1
  23. package/dist/builtin-plugin/LightThemePlugin.d.mts +1 -2
  24. package/dist/builtin-plugin/LightThemePlugin.mjs +1 -1
  25. package/dist/builtin-plugin/MutexGuardPlugin.d.mts +1 -1
  26. package/dist/builtin-plugin/MutexGuardPlugin.mjs +1 -1
  27. package/dist/builtin-plugin/PerformanceOverlayPlugin.d.mts +1 -2
  28. package/dist/builtin-plugin/PerformanceOverlayPlugin.mjs +1 -1
  29. package/dist/index.d.mts +8 -8
  30. package/dist/index.mjs +1 -1
  31. package/dist/{types-BovVI9wC.d.mts → types-Do4sfz9k.d.mts} +15 -18
  32. package/package.json +2 -2
  33. package/dist/ContextMenuPlugin-1N7od2I9.mjs +0 -1
  34. package/dist/DarkThemePlugin-CqLyur3d.mjs +0 -1
  35. package/dist/EventMediaPlugin-C2MC2ruT.mjs +0 -1
  36. package/dist/EventTooltipPlugin-Ch_xSklt.mjs +0 -1
  37. package/dist/LightThemePlugin-pQcTWONZ.mjs +0 -1
  38. package/dist/PerformanceOverlayPlugin-BjEF-I5h.mjs +0 -1
  39. /package/dist/{Logger-CfVK3yFL.mjs → Logger-BTKQPGDj.mjs} +0 -0
  40. /package/dist/{performanceMonitor-BBherdD8.mjs → performanceMonitor-Cb_v1gAo.mjs} +0 -0
  41. /package/dist/{types-Dc2ct_CM.mjs → types-NnKZYB1U.mjs} +0 -0
package/dist/index.mjs CHANGED
@@ -1 +1 @@
1
- import{_ as e,a as t,b as n,c as r,d as i,f as a,g as o,h as s,i as c,l,m as u,n as d,o as f,p,r as m,s as h,t as g,u as _,v,x as y,y as b}from"./EventMediaPlugin-C2MC2ruT.mjs";import{i as x,n as S,r as C,t as w}from"./Logger-CfVK3yFL.mjs";import{n as T,t as ee}from"./types-Dc2ct_CM.mjs";import{t as E}from"./LightThemePlugin-pQcTWONZ.mjs";import{t as D}from"./DarkThemePlugin-CqLyur3d.mjs";import{t as O}from"./ContextMenuPlugin-1N7od2I9.mjs";import{t as k}from"./PerformanceOverlayPlugin-BjEF-I5h.mjs";import{t as te}from"./EventTooltipPlugin-Ch_xSklt.mjs";var A=class{constructor(e,t){this.H_SCROLLBAR_PADDING=13,this.config=e,this.state=t}getContentWidth(e){if(this.cwZoom===e&&this.cwValue!==void 0)return this.cwValue;let t=this.config.endTime+this.config.endPaddingTime-this.config.startTime,n=this.config.startPaddingTime+t*this.config.secondWidth*e;return this.cwZoom=e,this.cwValue=n,n}invalidateCache(){this.cwZoom=void 0,this.cwValue=void 0}getContentHeight(){return this.config.timelineHeight+this.config.firstTrackTopMargin+this.state.tracks.length*(this.config.trackHeight+this.config.trackMargin)}computeMaxScrollX(e,t){let n=this.getContentWidth(e);return Math.max(0,n-t)}computeMaxScrollY(e){let t=this.getContentHeight();return Math.max(0,t-e)}hasHorizontalScrollbar(e,t){return this.getContentWidth(t)>e}getAvailableHeight(e,t,n){return e-(this.hasHorizontalScrollbar(t,n)?this.H_SCROLLBAR_PADDING:0)}computeMaxScrollYWithPadding(e,t,n){let r=this.getContentHeight(),i=this.getAvailableHeight(e,t,n);return Math.max(0,r-i)}};const j=x(`RenderPipeline`);let M=0;function N(e){return e!==`background`&&e!==`overlay`}var P=class{constructor(){this.renderers=new Map,this.renderOrder=[`background`,`tracks`,`timeline`,`guideLines`,`indicator`,`interaction`,`scrollbar`,`overlay`],this.stats={layerTimes:{},totalTime:0,renderedLayers:0,skippedLayers:0}}registerRenderer(e,t){this.renderers.set(e,t)}unregisterRenderer(e){this.renderers.delete(e)}setRenderOrder(e){this.renderOrder=e}render(e,t={}){let n=performance.now(),{forceFullRender:r=!1,dirtyLayers:a,skipPerfMeasure:o=!1}=t,s=n-M>=250;s&&(M=n,j.debugStyled(w.pipeline,`▶ Render Start`,`forceFullRender=${r}`,a?`dirtyLayers=[${Array.from(a).join(`, `)}]`:`dirtyLayers=all`)),this.stats.renderedLayers=0,this.stats.skippedLayers=0,this.stats.layerTimes={};for(let t of this.renderOrder){let n=this.renderers.get(t);if(!n)continue;if(!this.shouldRenderLayer(t,n,e,r,a)){this.stats.skippedLayers++;continue}let s=o?0:performance.now();try{let r=N(t)?e.pluginManager?.getCoreLayerHooks(t):void 0;r&&r.length>0?this.executeWithHooks(e,n,r):n.render(e),this.stats.renderedLayers++}catch(n){j.error(`${i(e.config,`errorRenderLayer`,{layer:t})}:`,n)}o||(this.stats.layerTimes[t]=performance.now()-s)}return this.stats.totalTime=performance.now()-n,s&&j.debugStyled(w.pipeline,`◀ Render End`,`rendered=${this.stats.renderedLayers}, skipped=${this.stats.skippedLayers}, time=${this.stats.totalTime.toFixed(2)}ms`),{...this.stats}}executeWithHooks(e,t,n){let r={width:e.width,height:e.height,getContext:e.canvas.getContext.bind(e.canvas)},a=()=>t.render(e);for(let t=n.length-1;t>=0;t--){let o=n[t],s=a;a=()=>{try{o.handler(e.ctx,r,e.config,e.state,s)}catch(t){j.error(`${i(e.config,`errorCoreLayerHook`,{hook:o.name})}:`,t),s()}}}a()}shouldRenderLayer(e,t,n,r,i){return r||!i?!0:i.has(e)}getStats(){return{...this.stats}}clearPrevContext(){}getRegisteredRenderers(){return this.renderers}},ne=class{constructor(){this.name=`Timeline`,this.layer=`timeline`}render(e){let{ctx:t,config:n,state:r,width:i}=e;t.fillStyle=n.colors.timelineBackground,t.fillRect(0,0,i,n.timelineHeight),t.strokeStyle=n.colors.timelineGrid,t.lineWidth=1,t.globalAlpha=.4,t.beginPath(),t.moveTo(0,n.timelineHeight-.5),t.lineTo(i,n.timelineHeight-.5),t.stroke(),t.globalAlpha=1;let a=n.startTime+(r.scrollX-n.startPaddingTime)/(n.secondWidth*r.zoomLevel),o=a+i/(n.secondWidth*r.zoomLevel),s=Math.max(n.startTime,Math.floor(a)),c=Math.min(n.endTime+n.endPaddingTime,Math.ceil(o));this.isCustomScaleMode(n)?this.renderCustomScale(t,n,r,s,c,i):this.renderAutoScale(t,n,r,s,c,i)}isCustomScaleMode(e){return e.scale!=null&&e.scale>0}renderCustomScale(e,t,n,r,i,a){let o=t.scale,s=Math.max(1,Math.floor(t.scaleSplitCount)),c=o/s;this.renderCustomMainTicks(e,t,n,o,r,i,a),s>1&&this.renderCustomSubTicks(e,t,n,o,c,r,i,a)}renderCustomMainTicks(e,t,n,r,i,a,o){let s=t.timelineHeight,c=Math.floor(i/r)*r,l=-80;e.strokeStyle=t.colors.timelineGrid,e.lineWidth=1.5,e.fillStyle=t.colors.timelineText,e.font=`12px Arial`,e.textBaseline=`top`;for(let i=c;i<=a;i+=r){let a=this.timeToX(i,t,n);if(a>=-50&&a<=o+50){let n=i>t.endTime;if(a-l>=80){e.strokeStyle=n?`rgba(150, 155, 165, 0.3)`:t.colors.timelineGrid,e.beginPath(),e.moveTo(a,s),e.lineTo(a,s-14),e.stroke(),e.fillStyle=n?`rgba(150, 155, 165, 0.4)`:t.colors.timelineText,e.textAlign=`center`;let o=t.getScaleRender?t.getScaleRender(i):this.formatTime(i,this.autoDetectFormat(r));e.fillText(o,a,5),l=a}}}e.textBaseline=`alphabetic`}renderCustomSubTicks(e,t,n,r,i,a,o,s){let c=t.timelineHeight,l=Math.floor(a/i)*i;e.lineWidth=1,e.strokeStyle=t.colors.timelineSubGrid;for(let a=l;a<=o;a+=i){let i=a/r;if(Math.abs(i-Math.round(i))<1e-9)continue;let o=this.timeToX(a,t,n);o>=0&&o<=s&&(e.globalAlpha=a>t.endTime?.3:.75,e.beginPath(),e.moveTo(o,c),e.lineTo(o,c-6),e.stroke(),e.globalAlpha=1)}}renderAutoScale(e,t,n,r,i,a){let o=[{threshold:10,main:10,sub:2,format:`HMS`},{threshold:8,main:30,sub:10,format:`HMS`},{threshold:5,main:60,sub:15,format:`HMS`},{threshold:3,main:300,sub:60,format:`HM`},{threshold:2,main:600,sub:120,format:`HM`},{threshold:1,main:1800,sub:600,format:`HM`},{threshold:.5,main:3600,sub:900,format:`H`},{threshold:0,main:7200,sub:1800,format:`H`}],s=o.find(e=>n.zoomLevel>=e.threshold)||o[o.length-1];this.renderAutoMainTicks(e,t,n,s,r,i,a),this.renderAutoSubTicks(e,t,n,s,r,i,a),n.zoomLevel>=10&&this.renderAutoMicroTicks(e,t,n,s,r,i,a)}renderAutoMainTicks(e,t,n,r,i,a,o){let s=t.timelineHeight,c=r.main,l=Math.floor(i/c)*c,u=-80;e.strokeStyle=t.colors.timelineGrid,e.lineWidth=1.5,e.fillStyle=t.colors.timelineText,e.font=`12px Arial`,e.textBaseline=`top`;for(let i=l;i<=a;i+=c){let a=this.timeToX(i,t,n);if(a>=-50&&a<=o+50){let n=i>t.endTime;if(a-u>=80){e.strokeStyle=n?`rgba(150, 155, 165, 0.3)`:t.colors.timelineGrid,e.beginPath(),e.moveTo(a,s),e.lineTo(a,s-14),e.stroke(),e.fillStyle=n?`rgba(150, 155, 165, 0.4)`:t.colors.timelineText,e.textAlign=`center`;let o=t.getScaleRender?t.getScaleRender(i):this.formatTime(i,r.format);e.fillText(o,a,5),u=a}}}e.textBaseline=`alphabetic`}renderAutoSubTicks(e,t,n,r,i,a,o){let s=t.timelineHeight,c=r.sub,l=r.main,u=Math.floor(i/c)*c;e.lineWidth=1,e.strokeStyle=t.colors.timelineSubGrid;for(let r=u;r<=a;r+=c){if(r%l===0)continue;let i=this.timeToX(r,t,n);i>=0&&i<=o&&(e.globalAlpha=r>t.endTime?.3:.75,e.beginPath(),e.moveTo(i,s),e.lineTo(i,s-6),e.stroke(),e.globalAlpha=1)}}renderAutoMicroTicks(e,t,n,r,i,a,o){let s=t.timelineHeight,c=r.sub/2,l=Math.floor(i/c)*c;e.lineWidth=1,e.strokeStyle=t.colors.timelineSubGrid,e.globalAlpha=.3;for(let i=l;i<=a;i+=c){if(i%r.sub===0)continue;let a=this.timeToX(i,t,n);a>=0&&a<=o&&(e.beginPath(),e.moveTo(a,s),e.lineTo(a,s-3),e.stroke())}e.globalAlpha=1}timeToX(e,t,n){let r=e-t.startTime;return t.startPaddingTime+r*t.secondWidth*n.zoomLevel-n.scrollX}autoDetectFormat(e){return e<60?`HMS`:e<3600?`HM`:`H`}formatTime(e,t){let n=Math.floor(e/3600),r=Math.floor(e%3600/60),i=Math.floor(e%60);switch(t){case`HMS`:return`${n.toString().padStart(2,`0`)}:${r.toString().padStart(2,`0`)}:${i.toString().padStart(2,`0`)}`;case`HM`:return`${n.toString().padStart(2,`0`)}:${r.toString().padStart(2,`0`)}`;case`H`:return`${n.toString().padStart(2,`0`)}:00`;default:return`${n.toString().padStart(2,`0`)}:${r.toString().padStart(2,`0`)}`}}shouldRender(e,t){if(!t)return!0;let{config:n,state:r}=e,{config:i,state:a}=t;return r.zoomLevel!==a.zoomLevel||r.scrollX!==a.scrollX||n.startTime!==i.startTime||n.endTime!==i.endTime||n.timelineHeight!==i.timelineHeight||n.scale!==i.scale||n.scaleSplitCount!==i.scaleSplitCount||n.getScaleRender!==i.getScaleRender}};const re=x(`EventsRenderer`),F=new Map;var ie=class{renderEvents(e,t,n,r,i,a,o,s){let c=s??a.width,l=n.tracks[r],u=Math.max(5,t.trackHeight*.0625),d=t.trackHeight-u*2,f=t.eventTextStyle,m=f.titleFontSize===`auto`?Math.max(10,Math.min(14,t.trackHeight*.175)):f.titleFontSize,h=f.timeFontSize===`auto`?Math.max(8,Math.min(12,t.trackHeight*.15)):f.timeFontSize,g=performance.now();g-(F.get(r)??0)>=500&&(F.set(r,g),re.debugStyled(w.eventRender,`Track ${r}: ${l.events.length} events`));for(let s=0;s<l.events.length;s++){let g=l.events[s];if(n.draggingEvent&&n.draggingEvent.isDragging&&n.draggingEvent.trackIndex===r&&n.draggingEvent.eventIndex===s)continue;let _=t.startPaddingTime+(g.startTime-t.startTime)*t.secondWidth*n.zoomLevel-n.scrollX,v=g.duration*t.secondWidth*n.zoomLevel;if(_+v<0||_>c)continue;let y=n.selectedEvent&&n.selectedEvent.trackIndex===r&&n.selectedEvent.eventIndex===s,b=n.highlightedEvent&&n.highlightedEvent.trackIndex===r&&n.highlightedEvent.eventIndex===s,x=n.timeIndicatorPosition,S=t.enableTimeIndicator&&!n.isManualSelection&&x>g.startTime&&x<g.endTime,C=y||b||S;e.save();let w=t.eventBlockStyle.borderRadius;e.fillStyle=g.color,w>0?(p(e,_,i+u,v,d,w),e.fill()):e.fillRect(_,i+u,v,d),e.restore(),o&&o.emitEvent(`render:event:media`,e,a,t,n,r,s,_,i,v,u,d),C&&(e.save(),e.strokeStyle=t.colors.eventBorderSelected,e.lineWidth=2,t.eventBlockStyle.enableSelectionGlow&&(e.shadowColor=t.colors.eventBorderSelected,e.shadowBlur=t.eventBlockStyle.selectionGlowBlur),w>0?p(e,_,i+u,v,d,w,!0):e.strokeRect(_,i+u,v,d),e.shadowBlur=0,e.restore()),this.drawEventText(e,t,g,_,i,v,u,m,h,f),t.enableEventResize&&this.drawResizeHandles(e,t,n,r,s,_,i,v,d,u),t.showEventDurationLabel&&C&&this.drawEventDurationLabel(e,t,g,_,i,v,u),t.enableEventSplit&&n.hoveredSplitLine&&!n.draggingEvent&&!n.resizingEvent&&!n.draggingTimeIndicator&&this.drawSplitLine(e,t,n,r,s,i,u,d)}}truncateText(e,t,n){if(n<=0)return``;if(e.measureText(t).width<=n)return t;if(e.measureText(`...`).width>=n)return`...`;let r=0,i=t.length,a=``;for(;r<i;){let o=Math.floor((r+i+1)/2),s=t.substring(0,o)+`...`;e.measureText(s).width<=n?(a=s,r=o):i=o-1}return a||`...`}drawEventText(e,t,n,r,i,a,o,s,c,l){let u=l.titleColor||t.colors.eventText,d=l.timeColor||t.colors.eventText,f={left:r+10,right:r+a-10,center:r+a/2}[l.textAlign]??r+a/2,p={top:i+o+s,middle:i+t.trackHeight/2,bottom:i+t.trackHeight-o}[l.verticalAlign]??i+o;e.textAlign=l.textAlign;let m=l.showTitle&&t.trackHeight>=l.minHeightForTitle,h=l.showTime&&t.trackHeight>=l.minHeightForTime,g=v(n.startTime,n.endTime),_=a-20;if(m){e.fillStyle=u,e.font=`${l.titleFontWeight} ${s}px ${l.titleFontFamily}`;let t=h?p-s/2+l.titleOffsetY:p+l.titleOffsetY,r=this.truncateText(e,n.title,_);e.fillText(r,f,t)}if(h){e.fillStyle=d,e.font=`${l.timeFontWeight} ${c}px ${l.timeFontFamily}`;let t=m?p+c+l.timeOffsetY:p+l.timeOffsetY,n=this.truncateText(e,g,_);e.fillText(n,f,t)}}drawResizeHandles(e,t,n,r,i,a,o,s,c,l){let u=n.hoveredResizeHandle&&n.hoveredResizeHandle.trackIndex===r&&n.hoveredResizeHandle.eventIndex===i,d=n.resizingEvent&&n.resizingEvent.trackIndex===r&&n.resizingEvent.eventIndex===i;if(n.selectedEvent&&n.selectedEvent.trackIndex===r&&n.selectedEvent.eventIndex===i||u||d){let r=t.resizeHandleWidth,i=`rgba(255, 255, 255, 0.8)`,f=`rgba(255, 255, 255, 1)`,p=u&&n.hoveredResizeHandle.edge===`left`,m=d&&n.resizingEvent.edge===`left`;e.fillStyle=p||m?f:i,e.fillRect(a-r/2,o+l,r,c);let h=u&&n.hoveredResizeHandle.edge===`right`,g=d&&n.resizingEvent.edge===`right`;e.fillStyle=h||g?f:i,e.fillRect(a+s-r/2,o+l,r,c)}}drawSplitLine(t,n,r,i,a,o,s,c){let l=r.hoveredSplitLine;if(l.trackIndex===i&&l.eventIndex===a){let i=(l.splitTime+n.startPaddingTime-n.startTime)*n.secondWidth*r.zoomLevel-r.scrollX;t.save(),t.strokeStyle=`rgba(255, 255, 0, 0.8)`,t.lineWidth=2,t.setLineDash([5,5]),t.beginPath(),t.moveTo(i,o+s),t.lineTo(i,o+s+c),t.stroke(),t.setLineDash([]),t.fillStyle=`rgba(255, 255, 0, 1)`,t.beginPath(),t.arc(i,o+s,4,0,Math.PI*2),t.fill(),t.beginPath(),t.arc(i,o+s+c,4,0,Math.PI*2),t.fill();let a=e(l.splitTime);t.font=`bold 11px Arial`,t.fillStyle=`rgba(255, 255, 0, 1)`,t.textAlign=`center`,t.fillText(`Split: ${a}`,i,o+s-5),t.restore()}}drawEventDurationLabel(e,t,n,r,i,a,s){e.save();let c=Math.round(n.duration*1e3)/1e3,l;l=t.formatEventDuration?t.formatEventDuration(c):o(c,t.eventDurationPrefix),e.font=`bold 11px Arial`,e.fillStyle=t.colors.eventDurationLabel,e.textAlign=`center`;let u=r+a/2,d=i+s-8;e.fillText(l,u,d),e.restore()}},ae=class{constructor(){this.name=`Tracks`,this.layer=`tracks`,this.eventsRenderer=new ie}render(e){let{ctx:t,canvas:n,config:r,state:i,pluginManager:a,width:o,height:s}=e,c=r.startPaddingTime-i.scrollX,l=this.eventsRenderer;for(let e=0;e<i.tracks.length;e++){let u=r.timelineHeight+r.firstTrackTopMargin+e*(r.trackHeight+r.trackMargin)-i.scrollY;if(u+r.trackHeight<r.timelineHeight||u>s)continue;let d;d=e===i.selectedTrack||i.highlightedEvent&&i.highlightedEvent.trackIndex===e||i.selectedEvent&&i.selectedEvent.trackIndex===e?r.colors.trackBackgroundSelected:r.colors.trackBackgroundOdd&&r.colors.trackBackgroundEven?e%2==0?r.colors.trackBackgroundOdd:r.colors.trackBackgroundEven:r.colors.trackBackground,t.fillStyle=d;let f=o-c;f>0&&t.fillRect(c,u,f,r.trackHeight),l.renderEvents(t,r,i,e,u,n,a,o)}}shouldRender(e,t){if(!t)return!0;let{config:n,state:r}=e,{config:i,state:a}=t;return r.tracks!==a.tracks||r.scrollY!==a.scrollY||r.scrollX!==a.scrollX||r.zoomLevel!==a.zoomLevel||r.selectedEvent!==a.selectedEvent||r.highlightedEvent!==a.highlightedEvent||n.trackHeight!==i.trackHeight||n.trackMargin!==i.trackMargin}},oe=class{constructor(){this.name=`Scrollbar`,this.layer=`scrollbar`}render(e){let{ctx:t,config:n,state:r,width:i,height:a}=e;this.drawVerticalScrollbar(t,n,r,i,a),this.drawHorizontalScrollbar(t,n,r,i,a)}drawVerticalScrollbar(e,t,n,r,i){let a=t.startPaddingTime+(t.endTime+t.endPaddingTime-t.startTime)*t.secondWidth*n.zoomLevel>r?13:0,o=t.timelineHeight+t.firstTrackTopMargin+n.tracks.length*(t.trackHeight+t.trackMargin);if(o>i-a){let s=r-8-5,c=t.timelineHeight,l=i-t.timelineHeight-a-5;e.fillStyle=t.colors.scrollbarTrack,p(e,s,c,8,l,4);let u=(i-a-5)/o,d=Math.max(30,l*u),f=o-i+a+5,m=n.scrollY/f,h=c+(l-d)*m;e.fillStyle=n.draggingScrollbar?t.colors.scrollbarHandleHover:t.colors.scrollbarHandle,p(e,s,h,8,d,4),e.fillStyle=t.colors.scrollbarHandleHighlight,p(e,s,h,8,d/2,4),n.draggingScrollbar&&(e.strokeStyle=t.colors.scrollbarBorder,e.lineWidth=1,p(e,s,h,8,d,4,!0))}}drawHorizontalScrollbar(e,t,n,r,i){let a=t.startPaddingTime+(t.endTime+t.endPaddingTime-t.startTime)*t.secondWidth*n.zoomLevel;if(a<=r)return;let o=t.timelineHeight+t.firstTrackTopMargin+n.tracks.length*(t.trackHeight+t.trackMargin)>i?13:0,s=i-8-5,c=r-o;e.fillStyle=t.colors.scrollbarTrack,p(e,0,s,c,8,4);let l=r/a,u=Math.max(30,c*l),d=a-r,f=n.scrollX/d,m=0+(c-u)*f;e.fillStyle=n.draggingHorizontalScrollbar?t.colors.scrollbarHandleHover:t.colors.scrollbarHandle,p(e,m,s,u,8,4),e.fillStyle=t.colors.scrollbarHandleHighlight,p(e,m,s,u/2,8,4),n.draggingHorizontalScrollbar&&(e.strokeStyle=t.colors.scrollbarBorder,e.lineWidth=1,p(e,m,s,u,8,4,!0))}shouldRender(e,t){if(!t)return!0;let{state:n}=e,{state:r}=t;return n.scrollY!==r.scrollY||n.scrollX!==r.scrollX||n.draggingScrollbar!==r.draggingScrollbar||n.draggingHorizontalScrollbar!==r.draggingHorizontalScrollbar}},se=class{constructor(){this.name=`Indicator`,this.layer=`indicator`}render(e){let{ctx:t,config:n,state:r,width:i,height:a}=e;if(!n.enableTimeIndicator)return;let o=n.startPaddingTime+(r.timeIndicatorPosition-n.startTime)*n.secondWidth*r.zoomLevel-r.scrollX;if(o<-10||o>i+10)return;t.strokeStyle=n.colors.timeIndicator,t.lineWidth=n.timeIndicatorWidth,t.beginPath(),t.moveTo(o,n.timelineHeight),t.lineTo(o,a),t.stroke();let s=n.timeIndicatorHeadSize,c=n.timeIndicatorTriangleHeight,l=n.timelineHeight-s-c;t.fillStyle=n.colors.timeIndicator,t.fillRect(o-s/2,l,s,s),t.beginPath(),t.moveTo(o-s/2,l+s),t.lineTo(o+s/2,l+s),t.lineTo(o,l+s+c),t.closePath(),t.fill()}shouldRender(e,t){if(!t)return!0;let{config:n,state:r}=e,{config:i,state:a}=t;return n.enableTimeIndicator?r.timeIndicatorPosition!==a.timeIndicatorPosition||r.draggingTimeIndicator!==a.draggingTimeIndicator||r.scrollX!==a.scrollX||r.zoomLevel!==a.zoomLevel||n.timelineHeight!==i.timelineHeight:!1}},I=class{constructor(){this.name=`GuideLines`,this.layer=`guideLines`}render(t){let{ctx:n,config:r,state:i,width:a,height:o}=t;if(n.save(),i.guideLines.length>0){n.strokeStyle=r.colors.guideLine,n.lineWidth=2,n.setLineDash([5,5]);for(let t of i.guideLines){let s=r.startPaddingTime+(t.time-r.startTime)*r.secondWidth*i.zoomLevel-i.scrollX;s<-10||s>a+10||(n.beginPath(),n.moveTo(s,r.timelineHeight),n.lineTo(s,o),n.stroke(),n.setLineDash([]),n.fillStyle=r.colors.guideLineLabel,n.font=`bold 11px Arial`,n.textAlign=`center`,n.fillText(e(t.time),s,r.timelineHeight-5),n.setLineDash([5,5]))}}if(i.dragTimeReference){let t=r.startPaddingTime+(i.dragTimeReference.time-r.startTime)*r.secondWidth*i.zoomLevel-i.scrollX;if(t>=-10&&t<=a+10){let a=i.dragTimeReference.y-i.scrollY;n.strokeStyle=r.colors.dragTimeReferenceLine,n.lineWidth=2,n.setLineDash([8,4]),n.beginPath(),n.moveTo(t,r.timelineHeight),n.lineTo(t,a),n.stroke(),n.setLineDash([]),n.fillStyle=r.colors.dragTimeReferenceLabel,n.font=`bold 12px Arial`,n.textAlign=`center`;let o=e(i.dragTimeReference.time),s=n.measureText(o).width;n.fillStyle=r.colors.dragTimeReferenceLabelBackground,n.fillRect(t-s/2-4,r.timelineHeight-14-4-5,s+8,22),n.fillStyle=r.colors.dragTimeReferenceLabel,n.fillText(o,t,r.timelineHeight-5)}}n.restore()}shouldRender(e,t){if(!t)return!0;let{state:n}=e,{state:r}=t;return n.guideLines!==r.guideLines||n.dragTimeReference!==r.dragTimeReference||n.scrollX!==r.scrollX||n.scrollY!==r.scrollY||n.zoomLevel!==r.zoomLevel}},L=class{constructor(){this.name=`Interaction`,this.layer=`interaction`}render(e){let{ctx:t,config:n,state:r}=e;!r.draggingEvent||!r.draggingEvent.isDragging||(this.renderDragPreview(t,n,r),this.renderDraggingEvent(t,n,r))}renderDragPreview(e,t,n){if(!n.draggingEvent||!n.tracks[n.draggingEvent.trackIndex])return;let r=n.tracks[n.draggingEvent.trackIndex].events[n.draggingEvent.eventIndex];if(!r)return;let i=n.draggingEvent.currentMouseY||0,a=n.draggingEvent.canMove!==!1,o=Math.floor((i-t.timelineHeight-t.firstTrackTopMargin)/(t.trackHeight+t.trackMargin)),s=Math.max(0,Math.min(n.tracks.length-1,o)),c=t.timelineHeight+t.firstTrackTopMargin+s*(t.trackHeight+t.trackMargin),l=(n.draggingEvent.currentMouseX||0)-n.dragOffsetX,u=r.duration*t.secondWidth*n.zoomLevel,d=Math.max(5,t.trackHeight*.0625),f=t.trackHeight-d*2,m=t.eventBlockStyle.borderRadius;e.save(),a?(e.fillStyle=t.colors.dragPreviewValid,e.strokeStyle=t.colors.dragPreviewBorderValid):(e.fillStyle=t.colors.dragPreviewInvalid,e.strokeStyle=t.colors.dragPreviewBorderInvalid),e.lineWidth=2,e.setLineDash([5,5]),e.globalAlpha=.6,m>0?(p(e,l,c-n.scrollY+d,u,f,m),e.fill(),e.stroke()):(e.fillRect(l,c-n.scrollY+d,u,f),e.strokeRect(l,c-n.scrollY+d,u,f)),e.restore()}renderDraggingEvent(e,t,n){if(!n.draggingEvent||!n.tracks[n.draggingEvent.trackIndex].events)return;let r=n.tracks[n.draggingEvent.trackIndex].events[n.draggingEvent.eventIndex];if(!r)return;let i=n.draggingEvent.currentMouseX||0,a=n.draggingEvent.currentMouseY||0,o=i-n.dragOffsetX,s=a-n.dragOffsetY-n.scrollY,c=r.duration*t.secondWidth*n.zoomLevel,l=Math.max(5,t.trackHeight*.0625),u=t.trackHeight-l*2;e.save();let d=t.eventBlockStyle.borderRadius;e.fillStyle=r.color,d>0?(p(e,o,s+l,c,u,d),e.fill()):e.fillRect(o,s+l,c,u),e.strokeStyle=t.colors.eventBorderSelected,e.lineWidth=2,t.eventBlockStyle.enableSelectionGlow&&(e.shadowColor=t.colors.eventBorderSelected,e.shadowBlur=t.eventBlockStyle.selectionGlowBlur),d>0?(p(e,o,s+l,c,u,d),e.stroke()):e.strokeRect(o,s+l,c,u),e.shadowBlur=0,e.restore(),this.renderEventText(e,t,r,o,s,c,l)}renderEventText(t,n,r,i,a,o,s){let c=n.eventTextStyle,l=c.titleColor||n.colors.eventText,u=c.timeColor||n.colors.eventText,d={left:i+10,right:i+o-10,center:i+o/2}[c.textAlign]??i+o/2,f={top:a+s,middle:a+n.trackHeight/2,bottom:a+n.trackHeight-s}[c.verticalAlign]??a+s;t.textAlign=c.textAlign;let p=c.showTitle&&n.trackHeight>=c.minHeightForTitle,m=c.showTime&&n.trackHeight>=c.minHeightForTime,h=c.titleFontSize===`auto`?Math.max(10,Math.min(14,n.trackHeight*.175)):c.titleFontSize,g=c.timeFontSize===`auto`?Math.max(8,Math.min(12,n.trackHeight*.15)):c.timeFontSize,_=`${e(r.startTime)} - ${e(r.endTime)}`;if(p){t.fillStyle=l,t.font=`${c.titleFontWeight} ${h}px ${c.titleFontFamily}`;let e=m?f-(typeof h==`number`?h:14)/2+c.titleOffsetY:f+c.titleOffsetY;t.fillText(r.title,d,e)}if(m){t.fillStyle=u,t.font=`${c.timeFontWeight} ${g}px ${c.timeFontFamily}`;let e=p?f+(typeof g==`number`?g:12)+c.timeOffsetY:f+c.timeOffsetY;t.fillText(_,d,e)}}shouldRender(e,t){if(!t)return!0;let{state:n}=e,{state:r}=t;return!!(n.draggingEvent!==r.draggingEvent||n.draggingEvent&&r.draggingEvent&&(n.draggingEvent.currentMouseX!==r.draggingEvent.currentMouseX||n.draggingEvent.currentMouseY!==r.draggingEvent.currentMouseY))}};function R(e,t,n,r,i,a){return{ctx:e,canvas:t,config:n,state:r,dpr:i,width:t.width/i,height:t.height/i,pluginManager:a}}const z=x(`LayerBuffer`),B={background:`background`,tracks:`main`,timeline:`main`,guideLines:`main`,indicator:`main`,scrollbar:`main`,interaction:`interaction`,overlay:`overlay`},V=[`background`,`main`,`media`,`interaction`,`overlay`];function H(e,t){if(typeof OffscreenCanvas<`u`)try{let n=new OffscreenCanvas(e,t),r=n.getContext(`2d`);if(r)return{canvas:n,ctx:r}}catch(e){z.debug(`Failed to create OffscreenCanvas buffer, fallback to DOM canvas`,e)}let n=document.createElement(`canvas`);return n.width=e,n.height=t,{canvas:n,ctx:n.getContext(`2d`)}}var U=class{constructor(){this.buffers=new Map,this.width=0,this.height=0,this.dpr=1}initialize(e,t,n){this.width=e,this.height=t,this.dpr=n;let r=Math.max(1,Math.floor(e*n)),i=Math.max(1,Math.floor(t*n));for(let e of V){let t=this.buffers.get(e);if(t)t.canvas.width=r,t.canvas.height=i,t.dirty=!0;else{let{canvas:t,ctx:n}=H(r,i);this.buffers.set(e,{canvas:t,ctx:n,dirty:!0})}}z.debugStyled(w.pipeline,`LayerBufferManager initialized: ${r}x${i} (dpr=${n})`)}markDirtyFromLayers(e){for(let t of e){let e=B[t];if(e){let t=this.buffers.get(e);t&&(t.dirty=!0)}}}markDirty(e){let t=this.buffers.get(e);t&&(t.dirty=!0)}markAllDirty(){for(let e of this.buffers.values())e.dirty=!0}getBuffer(e){return this.buffers.get(e)}isDirty(e){return this.buffers.get(e)?.dirty??!0}clearDirty(e){let t=this.buffers.get(e);t&&(t.dirty=!1)}compositeToMain(e,t,n){e.save(),e.setTransform(1,0,0,1,0,0),e.clearRect(0,0,t,n);for(let t of V){let n=this.buffers.get(t);n&&e.drawImage(n.canvas,0,0)}e.restore()}isInitialized(){return this.buffers.size>0}getSize(){return{width:this.width,height:this.height,dpr:this.dpr}}dispose(){this.buffers.clear(),this.width=0,this.height=0}};const W=x(`DirtyCheck`);var G=class{constructor(e,t,n,r,i){this.cachedLogicalWidth=0,this.cachedLogicalHeight=0,this.cacheValid=!1,this.dirtyLayers=new Set([`background`,`tracks`,`timeline`,`guideLines`,`indicator`,`scrollbar`,`overlay`,`interaction`]),this.lastLayerTimes={},this.isFirstRender=!0,this.canvas=e,this.ctx=t,this.config=n,this.state=r,this.pluginManager=i,this.dpr=window.devicePixelRatio||1,this.logicalCanvas={width:0,height:0,getContext:this.canvas.getContext.bind(this.canvas)},this.viewport=new A(this.config,this.state),this.layerBufferManager=new U,this.renderPipeline=new P,this.renderPipeline.registerRenderer(`timeline`,new ne),this.renderPipeline.registerRenderer(`tracks`,new ae),this.renderPipeline.registerRenderer(`guideLines`,new I),this.renderPipeline.registerRenderer(`indicator`,new se),this.renderPipeline.registerRenderer(`scrollbar`,new oe),this.renderPipeline.registerRenderer(`interaction`,new L)}setCanvasSize(e,t){let n=Math.floor(e*this.dpr),r=Math.floor(t*this.dpr);if(Math.abs(this.canvas.width-n)<1&&Math.abs(this.canvas.height-r)<1)return;this.canvas.width=n,this.canvas.height=r,this.canvas.style.width=`${e}px`,this.canvas.style.height=`${t}px`,this.invalidateCache();let i=this.getContentHeight(),a=Math.max(0,i-this.getCachedLogicalHeight());this.state.scrollY=Math.max(0,Math.min(a,this.state.scrollY)),this.state.zoomLevel<this.config.minAutoFitZoom&&(this.state.zoomLevel=this.config.minAutoFitZoom,this.state.scrollX=0),this.markAllDirty(),this.draw()}getCanvasLogicalWidth(){return this.canvas.width/this.dpr}getCanvasLogicalHeight(){return this.canvas.height/this.dpr}getCachedLogicalWidth(){return this.cacheValid||=(this.cachedLogicalWidth=this.canvas.width/this.dpr,this.cachedLogicalHeight=this.canvas.height/this.dpr,!0),this.cachedLogicalWidth}getCachedLogicalHeight(){return this.cacheValid||=(this.cachedLogicalWidth=this.canvas.width/this.dpr,this.cachedLogicalHeight=this.canvas.height/this.dpr,!0),this.cachedLogicalHeight}invalidateCache(){this.cacheValid=!1}draw(){if(this.dirtyLayers.size===0&&!this.isFirstRender)return;this.pluginManager.measureStart(`draw`);let e=this.canvas.width/this.dpr,t=this.canvas.height/this.dpr;this.logicalCanvas.width=e,this.logicalCanvas.height=t;let n=this.logicalCanvas,r=this.layerBufferManager.getSize();if((!this.layerBufferManager.isInitialized()||r.width!==e||r.height!==t||r.dpr!==this.dpr)&&this.layerBufferManager.initialize(e,t,this.dpr),this.isFirstRender?this.layerBufferManager.markAllDirty():this.layerBufferManager.markDirtyFromLayers(this.dirtyLayers),this.layerBufferManager.isDirty(`background`)){let e=this.layerBufferManager.getBuffer(`background`),t=performance.now();e.ctx.clearRect(0,0,e.canvas.width,e.canvas.height),e.ctx.save(),e.ctx.scale(this.dpr,this.dpr),this.pluginManager.renderBackground(e.ctx,n,this.config,this.state),e.ctx.restore(),this.layerBufferManager.clearDirty(`background`),this.lastLayerTimes.background=performance.now()-t}if(this.layerBufferManager.isDirty(`main`)){let e=this.layerBufferManager.getBuffer(`main`);e.ctx.clearRect(0,0,e.canvas.width,e.canvas.height),e.ctx.save(),e.ctx.scale(this.dpr,this.dpr);let t=R(e.ctx,this.canvas,this.config,this.state,this.dpr,this.pluginManager);this.renderPipeline.render(t,{forceFullRender:!1,dirtyLayers:new Set([`tracks`,`timeline`,`guideLines`,`indicator`,`scrollbar`])}),e.ctx.restore(),this.layerBufferManager.clearDirty(`main`);let n=this.renderPipeline.getStats();this.lastLayerTimes={...this.lastLayerTimes,...n.layerTimes}}if(this.layerBufferManager.isDirty(`media`)&&this.layerBufferManager.clearDirty(`media`),this.layerBufferManager.isDirty(`interaction`)){let e=this.layerBufferManager.getBuffer(`interaction`);e.ctx.clearRect(0,0,e.canvas.width,e.canvas.height),e.ctx.save(),e.ctx.scale(this.dpr,this.dpr);let t=R(e.ctx,this.canvas,this.config,this.state,this.dpr,this.pluginManager);this.renderPipeline.render(t,{forceFullRender:!1,dirtyLayers:new Set([`interaction`])}),e.ctx.restore(),this.layerBufferManager.clearDirty(`interaction`)}if(this.layerBufferManager.isDirty(`overlay`)){let e=this.layerBufferManager.getBuffer(`overlay`),t=performance.now();e.ctx.clearRect(0,0,e.canvas.width,e.canvas.height),e.ctx.save(),e.ctx.scale(this.dpr,this.dpr),this.pluginManager.renderOverlay(e.ctx,n,this.config,this.state),e.ctx.restore(),this.layerBufferManager.clearDirty(`overlay`),this.lastLayerTimes.overlay=performance.now()-t}this.layerBufferManager.compositeToMain(this.ctx,this.canvas.width,this.canvas.height),this.isFirstRender&&=!1,this.pluginManager.measureEnd(`draw`),this.dirtyLayers.clear()}getContentWidth(e){return this.viewport.getContentWidth(e)}getContentHeight(){return this.viewport.getContentHeight()}computeMaxScrollX(e){return this.viewport.computeMaxScrollX(e,this.getCachedLogicalWidth())}computeMaxScrollY(){return this.viewport.computeMaxScrollYWithPadding(this.getCachedLogicalHeight(),this.getCachedLogicalWidth(),this.state.zoomLevel)}hasHorizontalScrollbar(){return this.viewport.hasHorizontalScrollbar(this.getCachedLogicalWidth(),this.state.zoomLevel)}getAvailableHeight(){return this.viewport.getAvailableHeight(this.getCachedLogicalHeight(),this.getCachedLogicalWidth(),this.state.zoomLevel)}invalidateLayoutCache(){this.viewport.invalidateCache()}markDirty(e){W.debugStyled(w.dataUpdate,`✓ Marking layers dirty: [${e.join(`, `)}]`);for(let t of e)this.dirtyLayers.add(t)}markAllDirty(){W.debugStyled(w.dataUpdate,`✓ Marking ALL layers dirty`),this.dirtyLayers=new Set([`background`,`tracks`,`timeline`,`guideLines`,`indicator`,`scrollbar`,`overlay`,`interaction`]),this.layerBufferManager.markAllDirty()}getLastLayerTimes(){return{...this.lastLayerTimes}}},K=class{constructor(e){this.timeline=e}createContext(e){let t=this.timeline.getCanvas().getBoundingClientRect(),n=this.timeline.state;return{canvasX:e.clientX-t.left,canvasY:e.clientY-t.top,logicalX:e.clientX-t.left+n.scrollX,logicalY:e.clientY-t.top+n.scrollY,originalEvent:e,canvasWidth:t.width,canvasHeight:t.height}}handleMouseDown(e){return null}handleMouseMove(e){return null}handleMouseUp(e){return null}handleContextMenu(e){return null}};const q=x(`DraggingState`);var ce=class extends K{constructor(e){super(e),this.name=`Dragging`,this.MOVE_THRESHOLD=5,this.isSnappedToGuideLine=!1,this.snappedTime=null}onEnter(){this.timeline.beginIndexBatch()}onExit(){let e=this.timeline.state;e.guideLines=[],e.dragTimeReference=null,this.timeline.endIndexBatch(),this.timeline.autoRemoveEmptyLastTrack()}handleMouseMove(e){let{logicalX:t,logicalY:r}=e,i=this.timeline.config,a=this.timeline.state,o=this.timeline.getCanvas();if(!a.draggingEvent)return this.createIdleState();if(Math.sqrt((t-a.draggingEvent.startX)**2+(r-a.draggingEvent.startY)**2)>this.MOVE_THRESHOLD&&(a.draggingEvent.isDragging=!0),!a.draggingEvent.isDragging)return o.style.cursor=`move`,null;let{trackIndex:c,eventIndex:l}=a.draggingEvent;if(c<0||c>=a.tracks.length||l<0||l>=a.tracks[c].events.length)return q.warn(this.timeline.t(`warningInvalidDraggingState`),{value:a.draggingEvent}),a.draggingEvent=null,this.createIdleState();let d=a.tracks[c].events[l];this.timeline.setStatus(this.timeline.t(`statusDragging`,{title:d.title}));let f=(t-a.draggingEvent.startX)/(i.secondWidth*a.zoomLevel),p=a.draggingEvent.originalStartTime+f,m=Math.floor((r-i.timelineHeight-i.firstTrackTopMargin)/(i.trackHeight+i.trackMargin));if(i.autoAddTrack&&m>=a.tracks.length){let e={id:a.tracks.length,events:[]};a.tracks.push(e),this.timeline.setStatus(this.timeline.t(`statusAutoTrackAdded`,{count:a.tracks.length})),this.timeline.callbacks.onTrackAdd&&this.timeline.callbacks.onTrackAdd(e)}m=Math.max(0,Math.min(a.tracks.length-1,m)),a.guideLines=this.timeline.calculateGuideLines(c,l,m,p,d.duration);let h=this.timeline.snapToGuideLines(p,d.duration);if(h!==null)if(this.isSnappedToGuideLine&&this.snappedTime!==null){let e=this.timeline.config.guideLineSnapThreshold*1.5;Math.abs(p-this.snappedTime)<e?p=this.snappedTime:(this.isSnappedToGuideLine=!1,this.snappedTime=null,p=h,this.isSnappedToGuideLine=!0,this.snappedTime=h)}else p=h,this.isSnappedToGuideLine=!0,this.snappedTime=h;else if(this.isSnappedToGuideLine=!1,this.snappedTime=null,a.snapEnabled)if(i.enableTimeIndicator&&a.timeIndicatorSnapEnabled){let e=u(a.timeIndicatorPosition,i.startTime,i.startPaddingTime,i.secondWidth,a.zoomLevel,a.scrollX),t=i.startPaddingTime+(p-i.startTime)*i.secondWidth*a.zoomLevel-a.scrollX;if(Math.abs(t-e)<i.timeIndicatorSnapThreshold)p=a.timeIndicatorPosition;else{let e=n(a.zoomLevel,i.snapInterval,i.snapToSeconds,i.secondPrecisionZoomThreshold,i.scale,i.scaleSplitCount);p=y(p,e)}}else{let e=n(a.zoomLevel,i.snapInterval,i.snapToSeconds,i.secondPrecisionZoomThreshold,i.scale,i.scaleSplitCount);p=y(p,e)}p=Math.max(i.startTime,Math.min(i.endTime-d.duration,p));let g=i.timelineHeight+i.firstTrackTopMargin+m*(i.trackHeight+i.trackMargin)+i.trackHeight/2;a.dragTimeReference={time:p,y:g};let _=this.timeline.canMoveEvent(c,l,m,p,d.duration);if(_&&(d.startTime=p,d.endTime=s(p+d.duration),this.timeline.invalidateIndexTrack(c),m!==c)){let e=a.tracks[c].events.splice(l,1)[0];a.tracks[m].events.push(e),a.draggingEvent.trackIndex=m,a.draggingEvent.eventIndex=a.tracks[m].events.length-1,a.selectedTrack=m,a.selectedEvent&&a.selectedEvent.trackIndex===c&&(a.selectedEvent.eventIndex===l?a.selectedEvent={trackIndex:m,eventIndex:a.tracks[m].events.length-1}:a.selectedEvent.eventIndex>l&&(a.selectedEvent={...a.selectedEvent,eventIndex:a.selectedEvent.eventIndex-1})),this.timeline.invalidateIndexTrack(m),this.timeline.invalidateIndexTrack(c)}return a.draggingEvent&&(a.draggingEvent.currentMouseX=t,a.draggingEvent.currentMouseY=r,a.draggingEvent.canMove=_),this.timeline.notifyChange(`events:move`),null}handleMouseUp(e){let t=this.timeline.state;if(!t.draggingEvent)return this.createIdleState();let{trackIndex:n,eventIndex:r,originalTrackIndex:i,originalEventIndex:a}=t.draggingEvent;if(n<0||n>=t.tracks.length)return q.warn(this.timeline.t(`warningDraggingEventMissing`),{trackIndex:n,eventIndex:r}),t.draggingEvent=null,this.createIdleState();let o=t.tracks[n]?.events[r];if(!o)return q.warn(this.timeline.t(`warningDraggingEventMissing`),{trackIndex:n,eventIndex:r}),t.draggingEvent=null,this.createIdleState();let s=t.selectedEvent&&t.selectedEvent.trackIndex===i&&t.selectedEvent.eventIndex===a;return t.draggingEvent.isDragging?(this.timeline.setStatus(this.timeline.t(`statusEventPlaced`,{title:o.title,start:this.timeline.formatTime(o.startTime),end:this.timeline.formatTime(o.endTime)})),s&&(t.selectedEvent={trackIndex:n,eventIndex:r}),this.timeline.callbacks.onEventMove&&this.timeline.callbacks.onEventMove({trackIndex:n,eventIndex:r,event:d(o),fromTrackIndex:i})):(t.selectedEvent={trackIndex:n,eventIndex:r},this.timeline.setStatus(this.timeline.t(`statusEventSelected`,{title:o.title})),this.timeline.callbacks.onEventClick&&this.timeline.callbacks.onEventClick({trackIndex:n,eventIndex:r,event:d(o),trackName:this.timeline.t(`labelTrackName`,{index:n+1}),formattedTimeRange:`${this.timeline.formatTime(o.startTime)} - ${this.timeline.formatTime(o.endTime)}`})),t.draggingEvent=null,this.timeline.notifyChange(`events:move`),this.createIdleState()}createIdleState(){return new J(this.timeline)}},le=class extends K{constructor(e){super(e),this.name=`Resizing`}onEnter(){this.timeline.beginIndexBatch()}onExit(){let e=this.timeline.state;e.guideLines=[],this.timeline.endIndexBatch()}handleMouseMove(e){let{logicalX:t}=e,r=this.timeline.config,i=this.timeline.state;if(!i.resizingEvent)return this.createIdleState();let{trackIndex:a,eventIndex:o,edge:c,originalStartTime:l,originalDuration:u}=i.resizingEvent;if(a<0||a>=i.tracks.length||o<0||o>=i.tracks[a].events.length)return i.resizingEvent=null,this.createIdleState();let d=i.tracks[a].events[o],f=(t-i.resizingEvent.startX)/(r.secondWidth*i.zoomLevel);if(c===`left`){let e=l+f,t=s(l+u),c=t-e;i.guideLines=this.timeline.calculateGuideLines(a,o,a,e,c>0?c:u);let p=this.timeline.snapEdgeToGuideLines(e);if(p!==null)e=p;else if(i.snapEnabled){let t=n(i.zoomLevel,r.snapInterval,r.snapToSeconds,r.secondPrecisionZoomThreshold,r.scale,r.scaleSplitCount);e=y(e,t)}e=s(Math.max(r.startTime,e)),e=s(Math.min(e,t-r.minEventDuration));let m=s(t-e),h=!0;for(let n=0;n<i.tracks[a].events.length;n++){if(n===o)continue;let r=i.tracks[a].events[n],s=r.startTime,c=s+r.duration;if(e<c&&t>s){h=!1;break}}if(h){if(!this.timeline.canMoveEvent(a,o,a,e,m))return this.timeline.notifyChange(`events:update`),null;d.startTime=e,d.duration=s(m),d.endTime=t,this.timeline.invalidateIndexTrack(a)}}else{let e=u+f,t=l+e;i.guideLines=this.timeline.calculateGuideLines(a,o,a,l,e>0?e:u);let c=this.timeline.snapEdgeToGuideLines(t);if(c!==null)e=s(c-l);else if(i.snapEnabled){let a=n(i.zoomLevel,r.snapInterval,r.snapToSeconds,r.secondPrecisionZoomThreshold,r.scale,r.scaleSplitCount);e=s(y(t,a)-l)}else e=s(e);t=l+e,e=s(Math.max(r.minEventDuration,e)),e=s(Math.min(e,r.endTime-l)),t=l+e;let p=!0;for(let e=0;e<i.tracks[a].events.length;e++){if(e===o)continue;let n=i.tracks[a].events[e],r=n.startTime;if(l<r+n.duration&&t>r){p=!1;break}}if(p){if(!this.timeline.canMoveEvent(a,o,a,l,e))return this.timeline.notifyChange(`events:update`),null;d.duration=s(e),d.endTime=s(l+e),this.timeline.invalidateIndexTrack(a)}}return this.timeline.notifyChange(`events:update`),this.timeline.setStatus(this.timeline.t(`statusEventResizing`,{start:this.timeline.formatTime(d.startTime),end:this.timeline.formatTime(d.endTime)})),null}handleMouseUp(e){let t=this.timeline.state;if(!t.resizingEvent)return this.createIdleState();let{trackIndex:n,eventIndex:r}=t.resizingEvent;if(n<0||n>=t.tracks.length||r<0||r>=t.tracks[n].events.length)return t.resizingEvent=null,this.createIdleState();let i=t.tracks[n].events[r];return t.resizingEvent=null,this.timeline.getCanvas().style.cursor=`default`,this.timeline.setStatus(this.timeline.t(`statusEventResized`,{title:i.title})),this.timeline.callbacks.onEventUpdate&&this.timeline.callbacks.onEventUpdate({type:`resize`,trackIndex:n,eventIndex:r,event:d(i)}),this.timeline.notifyChange(`events:update`),this.createIdleState()}createIdleState(){return new J(this.timeline)}},ue=class extends K{constructor(e){super(e),this.name=`Scrolling`}handleMouseMove(e){let{canvasX:t,canvasY:n,canvasWidth:r,canvasHeight:i}=e,a=this.timeline.config,o=this.timeline.state;if(o.draggingScrollbar){let e=a.timelineHeight+a.firstTrackTopMargin+o.tracks.length*(a.trackHeight+a.trackMargin),t=i-(a.startPaddingTime+(a.endTime+a.endPaddingTime-a.startTime)*a.secondWidth*o.zoomLevel>r?13:0),s=t-a.timelineHeight-5,c=t/e,l=Math.max(30,s*c),u=Math.max(0,e-t),d=(n-a.timelineHeight-o.scrollbarDragOffset)/(s-l);return o.scrollY=Math.max(0,Math.min(u,d*u)),this.timeline.notifyChange(`scroll:y`),null}if(o.draggingHorizontalScrollbar){let e=a.startPaddingTime+(a.endTime+a.endPaddingTime-a.startTime)*a.secondWidth*o.zoomLevel,n=r,i=r/e,s=Math.max(30,n*i),c=Math.max(0,e-r),l=(t-o.horizontalScrollbarDragOffset)/(n-s);return o.scrollX=Math.max(0,Math.min(c,l*c)),this.timeline.notifyChange(`scroll:x`),null}return null}handleMouseUp(e){let t=this.timeline.state;return t.draggingScrollbar&&(t.draggingScrollbar=!1,this.timeline.setStatus(this.timeline.t(`statusReady`))),t.draggingHorizontalScrollbar&&(t.draggingHorizontalScrollbar=!1,this.timeline.setStatus(this.timeline.t(`statusReady`))),this.createIdleState()}createIdleState(){return new J(this.timeline)}},de=class extends K{constructor(e){super(e),this.name=`TimeIndicatorDrag`}handleMouseMove(e){let{canvasX:t}=e,r=this.timeline.config,i=this.timeline.state,a=this.timeline.getCanvas();if(!i.draggingTimeIndicator)return this.createIdleState();a.style.cursor=r.readOnly?`not-allowed`:`ew-resize`;let o=(t-i.timeIndicatorDragOffsetX+i.scrollX-r.startPaddingTime)/(r.secondWidth*i.zoomLevel)+r.startTime;if(i.snapEnabled){let e=n(i.zoomLevel,r.snapInterval,r.snapToSeconds,r.secondPrecisionZoomThreshold,r.scale,r.scaleSplitCount);o=y(o,e)}return o=Math.max(r.startTime,Math.min(r.endTime,o)),this.timeline.setTimeIndicatorDuringDrag(o),null}handleMouseUp(e){let t=this.timeline.state;return t.draggingTimeIndicator&&(t.draggingTimeIndicator=!1,this.timeline.setTimeIndicator(t.timeIndicatorPosition,!1)),this.createIdleState()}createIdleState(){return new J(this.timeline)}},fe=class{constructor(e){this.delegate=e}handleMouseMove(e){let t=this.delegate.getTimeline(),{config:n,state:r}=t,{canvasX:i,canvasY:a,logicalX:o,logicalY:s}=e,c=t.getCanvas();if(this.handleContextMenuHover(i,a))return null;let l=t.getInteractionTarget(i,a);if(s>=n.timelineHeight&&!n.readOnly&&this.handleContentHover(l,o,c)||this.handleTimeIndicatorHover(i,a))return null;if(l.eventIndex!==null&&l.trackIndex!==null&&!l.resizeEdge){let e=r.tracks[l.trackIndex].events[l.eventIndex];return c.style.cursor=`pointer`,t.setStatus(t.t(`statusHoverEventTimeRange`,{title:e.title,start:t.formatTime(e.startTime),end:t.formatTime(e.endTime)})),null}return c.style.cursor=`default`,null}handleContextMenuHover(e,t){let n=this.delegate.getTimeline(),{config:r,state:i}=n,a=n.getCanvas();if(!i.contextMenuVisible||!i.contextMenuBounds)return!1;let o=i.contextMenuBounds;if(!(e>=o.x&&e<=o.x+o.width&&t>=o.y&&t<=o.y+o.height))return i.hoveredContextMenuItem!==-1&&(i.hoveredContextMenuItem=-1,n.notifyChange(`interaction:contextMenu`)),!1;let s=Math.floor((t-o.y-o.padding)/o.itemHeight);return s>=0&&s<r.contextMenuItems.length?(i.hoveredContextMenuItem!==s&&(i.hoveredContextMenuItem=s,n.notifyChange(`interaction:contextMenu`)),a.style.cursor=`pointer`,!0):(i.hoveredContextMenuItem!==-1&&(i.hoveredContextMenuItem=-1,n.notifyChange(`interaction:contextMenu`)),!0)}handleContentHover(e,t,r){let i=this.delegate.getTimeline(),{config:a,state:o}=i;if(a.enableEventResize&&e.resizeEdge)return o.tracks[e.trackIndex].events[e.eventIndex].readonly?(o.hoveredResizeHandle=null,r.style.cursor=`not-allowed`,i.hideSplitLine(),i.notifyChange(`interaction:hover`),!0):(o.hoveredResizeHandle={trackIndex:e.trackIndex,eventIndex:e.eventIndex,edge:e.resizeEdge},r.style.cursor=`ew-resize`,i.hideSplitLine(),i.notifyChange(`interaction:hover`),!0);if(o.hoveredResizeHandle=null,!a.enableEventSplit||e.eventIndex===null||e.trackIndex===null||e.resizeEdge)return i.hideSplitLine(),!1;let s=e.trackIndex,c=e.eventIndex,l=o.tracks[s].events[c];if(l.readonly)return i.hideSplitLine(),r.style.cursor=`not-allowed`,i.notifyChange(`interaction:hover`),!0;let u=(t-a.startPaddingTime)/(a.secondWidth*o.zoomLevel)+a.startTime;if(o.snapEnabled){let e=n(o.zoomLevel,a.snapInterval,a.snapToSeconds,a.secondPrecisionZoomThreshold,a.scale,a.scaleSplitCount);u=y(u,e)}let d=u-l.startTime,f=l.duration-d;return u>l.startTime&&u<l.startTime+l.duration&&d>=a.minEventDuration&&f>=a.minEventDuration?(i.showSplitLine(s,c,u),r.style.cursor=`pointer`,i.notifyChange(`interaction:splitLine`),!0):(i.hideSplitLine(),!1)}handleTimeIndicatorHover(e,t){let n=this.delegate.getTimeline(),{config:r,state:i}=n,a=n.getCanvas();if(!r.enableTimeIndicator||t>r.timelineHeight)return!1;let o=u(i.timeIndicatorPosition,r.startTime,r.startPaddingTime,r.secondWidth,i.zoomLevel,i.scrollX),s=r.timeIndicatorHeadSize;return e>=o-s/2&&e<=o+s/2&&t>=0&&t<=r.timeIndicatorHeadSize?(a.style.cursor=r.readOnly?`not-allowed`:`ew-resize`,!0):!1}},pe=class{constructor(e){this.delegate=e}handleMouseDown(e){let t=this.delegate.getTimeline(),{config:n,state:r}=t,{canvasX:i,canvasY:a,logicalX:o,logicalY:s,canvasWidth:c,canvasHeight:l}=e,u=t.getCanvas(),d=n.readOnly;if(e.originalEvent.button===2)return null;let f=this.handleContextMenuClick(e);if(f.handled)return f.nextState;let p=this.handleScrollbarMouseDown(i,a,c,l);if(p)return p;let m=this.handleTimeIndicatorMouseDown(i,a);if(m)return m;if(s<n.timelineHeight)return null;let h=t.getInteractionTarget(i,a);if(n.enableEventResize&&!d&&h.resizeEdge){let e=r.tracks[h.trackIndex].events[h.eventIndex];return e.readonly?(u.style.cursor=`not-allowed`,null):(r.resizingEvent={trackIndex:h.trackIndex,eventIndex:h.eventIndex,edge:h.resizeEdge,startX:o,originalStartTime:e.startTime,originalDuration:e.duration},this.delegate.createResizingState())}return h.eventIndex!==null&&h.trackIndex!==null?this.handleEventMouseDown(h.trackIndex,h.eventIndex,o,s):(r.selectedEvent=null,r.highlightedEvent=null,r.selectedTrack=null,r.isManualSelection=!1,t.callbacks.onEventHighlight&&t.callbacks.onEventHighlight({trackIndex:null,eventIndex:null,event:null}),t.notifyChange(`selection:change`),null)}handleContextMenuClick(e){let t=this.delegate.getTimeline(),{config:n,state:r}=t,{canvasX:i,canvasY:a}=e;if(!r.contextMenuVisible||!r.contextMenuBounds)return{handled:!1,nextState:null};let o=r.contextMenuBounds;if(!(i>=o.x&&i<=o.x+o.width&&a>=o.y&&a<=o.y+o.height))return r.contextMenuVisible=!1,r.contextMenuEvent=null,t.notifyChange(`interaction:contextMenu`),{handled:!1,nextState:null};let s=Math.floor((a-o.y-o.padding)/o.itemHeight);if(s>=0&&s<n.contextMenuItems.length&&r.contextMenuEvent){let e=n.contextMenuItems[s],{trackIndex:i,eventIndex:a}=r.contextMenuEvent,o=r.tracks[i].events[a];if(o.readonly&&(e.type===`delete`||e.type===`edit`))return t.setStatus(t.t(`statusReadOnlyEditDeleteBlocked`)),r.contextMenuVisible=!1,r.contextMenuEvent=null,t.notifyChange(`interaction:contextMenu`),{handled:!0,nextState:null};t.callbacks.onContextMenu&&t.callbacks.onContextMenu({menuType:e.type,trackIndex:i,eventIndex:a,event:d(o)}),r.contextMenuVisible=!1,r.contextMenuEvent=null,t.notifyChange(`interaction:contextMenu`)}return{handled:!0,nextState:null}}handleScrollbarMouseDown(e,t,n,r){let i=this.delegate.getTimeline(),{config:a,state:o}=i,s=a.timelineHeight+a.firstTrackTopMargin+o.tracks.length*(a.trackHeight+a.trackMargin),c=i.getAvailableHeight();if(s>c){let r=n-8-5,i=a.timelineHeight,l=c-a.timelineHeight-5;if(e>=r&&e<=r+8&&t>=i&&t<=i+l){o.draggingScrollbar=!0;let e=c/s,n=Math.max(30,l*e),r=s-c,a=o.scrollY/r;return o.scrollbarDragOffset=t-(i+(l-n)*a),this.delegate.createScrollingState()}}let l=i.getContentWidthForZoom(o.zoomLevel);if(l<=n)return null;let u=r-8-5,d=n;if(t>=u&&t<=u+8&&e>=0&&e<=d){o.draggingHorizontalScrollbar=!0;let t=n/l,r=Math.max(30,d*t),i=l-n,a=o.scrollX/i;return o.horizontalScrollbarDragOffset=e-(d-r)*a,this.delegate.createScrollingState()}return null}handleTimeIndicatorMouseDown(e,t){let{config:n,state:r}=this.delegate.getTimeline();if(!n.enableTimeIndicator||n.readOnly)return null;let i=u(r.timeIndicatorPosition,n.startTime,n.startPaddingTime,n.secondWidth,r.zoomLevel,r.scrollX),a=n.timeIndicatorHeadSize,o=n.timeIndicatorTriangleHeight,s=n.timelineHeight-a-o;return e>=i-a/2&&e<=i+a/2&&t>=s&&t<=n.timelineHeight?(r.draggingTimeIndicator=!0,r.timeIndicatorDragOffsetX=e-i,this.delegate.createTimeIndicatorDragState()):null}handleEventMouseDown(e,t,n,r){let i=this.delegate.getTimeline(),{config:a,state:o}=i,s=i.getCanvas(),c=o.tracks[e].events[t],l=Date.now();if(o.lastClickEvent&&o.lastClickEvent.trackIndex===e&&o.lastClickEvent.eventIndex===t&&l-o.lastClickTime<300&&a.enableEventSplit){if(c.readonly)return i.setStatus(i.t(`statusReadOnlySplitBlocked`)),o.lastClickTime=0,o.lastClickEvent=null,null;let r=(n-a.startPaddingTime)/(a.secondWidth*o.zoomLevel)+a.startTime;return i.splitEvent(e,t,r),o.lastClickTime=0,o.lastClickEvent=null,i.hideSplitLine(),null}if(o.lastClickEvent={trackIndex:e,eventIndex:t},o.lastClickTime=l,o.selectedEvent={trackIndex:e,eventIndex:t},o.isManualSelection=!0,o.highlightedEvent=null,o.selectedTrack=null,c.readonly||a.readOnly)return s.style.cursor=`not-allowed`,i.setStatus(i.t(`statusEventSelected`,{title:c.title})),i.callbacks.onEventHighlight&&i.callbacks.onEventHighlight({trackIndex:e,eventIndex:t,event:d(c)}),i.callbacks.onEventClick&&i.callbacks.onEventClick({trackIndex:e,eventIndex:t,event:d(c),trackName:i.t(`labelTrackName`,{index:e+1}),formattedTimeRange:v(c.startTime,c.endTime)}),i.notifyChange(`selection:change`),null;let u=a.startPaddingTime+(c.startTime-a.startTime)*a.secondWidth*o.zoomLevel-o.scrollX,f=a.timelineHeight+a.firstTrackTopMargin+e*(a.trackHeight+a.trackMargin);return o.draggingEvent={trackIndex:e,eventIndex:t,eventX:u,eventY:f,originalTrackIndex:e,originalEventIndex:t,originalStartTime:c.startTime,startX:n,startY:r,isDragging:!1},o.dragOffsetX=n-u,o.dragOffsetY=r-f,i.callbacks.onEventHighlight&&i.callbacks.onEventHighlight({trackIndex:e,eventIndex:t,event:d(c)}),i.notifyChange(`selection:change`),this.delegate.createDraggingState()}},J=class extends K{constructor(e){super(e),this.name=`Idle`,this.hoverController=new fe(this),this.mouseDownRouter=new pe(this)}getTimeline(){return this.timeline}handleMouseDown(e){return this.mouseDownRouter.handleMouseDown(e)}handleMouseMove(e){return this.hoverController.handleMouseMove(e)}handleContextMenu(e){e.originalEvent.preventDefault();let{canvasX:t,canvasY:n}=e,r=this.timeline.config,i=this.timeline.state;if(!r.enableContextMenu||r.readOnly||!this.timeline.isPluginLoaded(`context-menu`))return null;let a=this.timeline.getEventAtPosition(t,n);if(a){let{trackIndex:e,eventIndex:r}=a;i.contextMenuEvent={trackIndex:e,eventIndex:r},i.contextMenuVisible=!0,i.contextMenuX=t,i.contextMenuY=n,i.hoveredContextMenuItem=-1,this.timeline.notifyChange(`interaction:contextMenu`)}else i.contextMenuVisible=!1,i.contextMenuEvent=null,this.timeline.notifyChange(`interaction:contextMenu`);return null}createDraggingState(){return new ce(this.timeline)}createResizingState(){return new le(this.timeline)}createScrollingState(){return new ue(this.timeline)}createTimeIndicatorDragState(){return new de(this.timeline)}};const Y=x(`StateMachine`);var me=class{constructor(e){this.timeline=e,this.rafId=null,this.pendingMouseMove=null,this.currentState=new J(e)}getCurrentStateName(){return this.currentState.name}transitionTo(e){if(!e||e===this.currentState)return;let t=this.currentState;t.onExit&&(Y.debugStyled(w.stateExit,`◁ Exit: ${t.name}`),t.onExit(e)),this.currentState=e,e.onEnter&&(Y.debugStyled(w.stateEnter,`▷ Enter: ${e.name}`),e.onEnter(t)),Y.debugStyled(w.stateTransition,`⟳ Transition: ${t.name} → ${e.name}`)}createContext(e){let t=this.timeline.getCanvas().getBoundingClientRect(),n=this.timeline.state;return{canvasX:e.clientX-t.left,canvasY:e.clientY-t.top,logicalX:e.clientX-t.left+n.scrollX,logicalY:e.clientY-t.top+n.scrollY,originalEvent:e,canvasWidth:t.width,canvasHeight:t.height}}handleMouseDown(e){let t=this.createContext(e),n=this.currentState.handleMouseDown(t);this.transitionTo(n)}handleMouseMove(e){if(this.rafId!==null){this.pendingMouseMove=e;return}this.pendingMouseMove=e,this.rafId=requestAnimationFrame(()=>{this.pendingMouseMove&&=(this.handleMouseMoveImpl(this.pendingMouseMove),null),this.rafId=null})}handleMouseMoveImpl(e){let t=this.createContext(e),n=this.currentState.handleMouseMove(t);this.transitionTo(n)}handleMouseUp(e){this.rafId!==null&&(cancelAnimationFrame(this.rafId),this.rafId=null,this.pendingMouseMove=null);let t=e||new MouseEvent(`mouseup`),n=this.createContext(t),r=this.currentState.handleMouseUp(n);this.transitionTo(r)}handleContextMenu(e){let t=this.createContext(e),n=this.currentState.handleContextMenu(t);this.transitionTo(n)}destroy(){this.rafId!==null&&(cancelAnimationFrame(this.rafId),this.rafId=null),this.pendingMouseMove=null}},he=class{constructor(e){this.timeline=e}handleWheel(e){if(e.preventDefault(),e.ctrlKey||e.metaKey){let t=e.deltaY>0?.9:1.1;this.timeline.zoom(t)}else this.timeline.state.scrollY+=e.deltaY,this.timeline.adjustCanvasSize(),this.timeline.notifyChange(`scroll:y`)}},X=class{constructor(e){this.logger=e}throw(e){throw this.logger.error(e),Error(e)}debug(e,t){this.logger.error(e,t)}debugIf(e,t,n){e&&this.debug(t,n)}fail(e,t,n){return this.debugIf(e,t,n),!1}error(e){this.logger.error(e)}warn(e){this.logger.warn(e)}},ge=class{constructor(e,t=new X(x(`PluginManager`))){this.baseContext=e,this.errorHandler=t,this.pluginResources=new Map,this.pluginMetadata=new Map,this.plugins=new Map,this.eventHandlers=new Map,this.renderLayers=new Map,this.renderLayerOwners=new Map,this.renderLayerOrder=new Map,this.coreLayerHooks=new Map,this.coreLayerHookOwners=new Map,this.coreLayerHookOrder=new Map,this.pluginData=new Map,this.registrationOrder=0}async loadPlugin(e){let{name:t,version:n}=e.metadata,r=`${t}@${n}`;if(this.plugins.has(r))return!1;if(!this.areDependenciesLoaded(e.metadata.dependencies))return this.errorHandler.fail(this.baseContext.config.debug,i(this.baseContext.config,`errorPluginDependenciesMissing`,{pluginId:r}),Error(`Missing dependencies: ${e.metadata.dependencies?.join(`, `)}`));this.pluginMetadata.set(r,e.metadata);let a=this.createPluginContext(r),o=!1,s=!1;try{return e.init&&(o=!0,await e.init(a)),e.activate&&(s=!0,await e.activate(a)),this.plugins.set(r,{plugin:e,context:a,active:!0}),!0}catch(t){return await this.rollbackFailedLoad(r,e,a,o,s),this.cleanupPluginResources(r),this.errorHandler.fail(this.baseContext.config.debug,i(this.baseContext.config,`errorPluginLoadFailed`,{pluginId:r}),t)}}async unloadPlugin(e){let t=this.plugins.get(e);if(!t)return!1;let n=await this.runLifecycleStep(e,`deactivate`,t.plugin.deactivate,t.context);await this.runLifecycleStep(e,`destroy`,t.plugin.destroy,t.context)||(n=!1);try{return n}finally{this.cleanupPluginResources(e),this.plugins.delete(e)}}async rollbackFailedLoad(e,t,n,r,i){i&&await this.runLifecycleStep(e,`rollback deactivate`,t.deactivate,n),(r||i)&&await this.runLifecycleStep(e,`rollback destroy`,t.destroy,n)}async runLifecycleStep(e,t,n,r){if(!n)return!0;try{return await n(r),!0}catch(n){return this.errorHandler.fail(this.baseContext.config.debug,i(this.baseContext.config,`errorPluginLifecycleFailed`,{step:t,pluginId:e}),n)}}createPluginContext(e){let t=new Map;this.pluginData.set(e,t),this.pluginResources.set(e,this.createPluginResources());let n={registerRenderLayer:t=>this.registerRenderLayer(e,t),unregisterRenderLayer:t=>this.unregisterRenderLayer(e,t),registerCoreLayerHook:t=>this.registerCoreLayerHook(e,t),unregisterCoreLayerHook:t=>this.unregisterCoreLayerHook(e,t),registerEventHandler:(t,n)=>this.registerEventHandler(e,t,n),unregisterEventHandler:(t,n)=>this.unregisterEventHandler(e,t,n),showNotification:(t,n=`info`)=>{let r=x(`plugin:${e}`);switch(n){case`error`:r.error(t);break;case`warning`:r.warn(t);break;default:r.info(t)}},getData:e=>t.get(e),setData:(e,n)=>t.set(e,n),setPerformanceProvider:t=>{this.performanceProvider=t,this.performanceProviderOwner=e},getPerformanceStats:()=>this.performanceProvider?this.performanceProvider.getAllStats():new Map,getFPS:()=>this.performanceProvider?this.performanceProvider.getFPS():0};return{...this.baseContext,api:n}}registerEventHandler(e,t,n){let r=this.eventHandlers.get(t)||[];r.push({pluginId:e,handler:n,priority:this.getPluginPriority(e),order:this.nextRegistrationOrder()}),r.sort((e,t)=>t.priority===e.priority?e.order-t.order:t.priority-e.priority),this.eventHandlers.set(t,r);let i=this.getPluginResources(e),a=i.eventHandlers.get(t)??new Set;a.add(n),i.eventHandlers.set(t,a)}unregisterEventHandler(e,t,n){let r=this.eventHandlers.get(t);if(!r)return;let i=r.filter(t=>!(t.pluginId===e&&t.handler===n));i.length===0?this.eventHandlers.delete(t):this.eventHandlers.set(t,i);let a=this.pluginResources.get(e),o=a?.eventHandlers.get(t);o&&(o.delete(n),o.size===0&&a?.eventHandlers.delete(t))}registerRenderLayer(e,t){this.reassignRenderLayerOwner(t.name,e),this.renderLayers.set(t.name,t),this.renderLayerOwners.set(t.name,e),this.renderLayerOrder.set(t.name,this.nextRegistrationOrder()),this.getPluginResources(e).renderLayers.add(t.name)}unregisterRenderLayer(e,t){this.renderLayerOwners.get(t)===e&&(this.renderLayers.delete(t),this.renderLayerOwners.delete(t),this.renderLayerOrder.delete(t),this.pluginResources.get(e)?.renderLayers.delete(t))}registerCoreLayerHook(e,t){this.reassignCoreLayerHookOwner(t.name,e),this.coreLayerHooks.set(t.name,t),this.coreLayerHookOwners.set(t.name,e),this.coreLayerHookOrder.set(t.name,this.nextRegistrationOrder()),this.getPluginResources(e).coreLayerHooks.add(t.name)}unregisterCoreLayerHook(e,t){this.coreLayerHookOwners.get(t)===e&&(this.coreLayerHooks.delete(t),this.coreLayerHookOwners.delete(t),this.coreLayerHookOrder.delete(t),this.pluginResources.get(e)?.coreLayerHooks.delete(t))}getCoreLayerHooks(e){return Array.from(this.coreLayerHooks.entries()).filter(([,t])=>t.target===e).sort(([e],[t])=>this.compareOwnedResources(e,t)).map(([,e])=>e)}hasCoreLayerHooks(e){for(let t of this.coreLayerHooks.values())if(t.target===e)return!0;return!1}cleanupPluginResources(e){let t=this.pluginResources.get(e);if(t){for(let[n,r]of t.eventHandlers){let t=this.eventHandlers.get(n);if(!t)continue;let i=t.filter(t=>!(t.pluginId===e&&r.has(t.handler)));i.length===0?this.eventHandlers.delete(n):this.eventHandlers.set(n,i)}for(let n of t.renderLayers)this.renderLayerOwners.get(n)===e&&(this.renderLayers.delete(n),this.renderLayerOwners.delete(n),this.renderLayerOrder.delete(n));for(let n of t.coreLayerHooks)this.coreLayerHookOwners.get(n)===e&&(this.coreLayerHooks.delete(n),this.coreLayerHookOwners.delete(n),this.coreLayerHookOrder.delete(n))}this.performanceProviderOwner===e&&(this.performanceProvider=void 0,this.performanceProviderOwner=void 0),this.pluginData.delete(e),this.pluginMetadata.delete(e),this.pluginResources.delete(e)}emitEvent(e,...t){let n=this.eventHandlers.get(e);if(!(!n||n.length===0))for(let r of n)try{r.handler(...t)}catch(t){this.errorHandler.debugIf(this.baseContext.config.debug,i(this.baseContext.config,`errorPluginEventFailed`,{event:e}),t)}}validateEvent(e,...t){let n=this.eventHandlers.get(e);if(!n||n.length===0)return!0;for(let r of n)try{if(r.handler(...t)===!1)return!1}catch(t){return this.errorHandler.debugIf(this.baseContext.config.debug,i(this.baseContext.config,`errorPluginValidationFailed`,{event:e}),t),!1}return!0}renderBackground(e,t,n,r){for(let i of this.layersByPosition(`background`))i.render(e,t,n,r)}renderOverlay(e,t,n,r){for(let i of this.layersByPosition(`overlay`))i.render(e,t,n,r)}layersByPosition(e){return Array.from(this.renderLayers.entries()).filter(([,t])=>t.position===e).sort(([e],[t])=>this.compareOwnedResources(e,t)).map(([,e])=>e)}getLoadedPlugins(){return Array.from(this.plugins.values()).map(e=>e.plugin)}isPluginLoaded(e){for(let[t]of this.plugins)if(t.startsWith(`${e}@`))return!0;return!1}measureStart(e){this.performanceProvider&&this.performanceProvider.startMeasurement(e)}measureEnd(e){this.performanceProvider&&this.performanceProvider.endMeasurement(e)}createPluginResources(){return{eventHandlers:new Map,renderLayers:new Set,coreLayerHooks:new Set}}getPluginResources(e){let t=this.pluginResources.get(e);return t||(t=this.createPluginResources(),this.pluginResources.set(e,t),t)}reassignRenderLayerOwner(e,t){let n=this.renderLayerOwners.get(e);!n||n===t||this.pluginResources.get(n)?.renderLayers.delete(e)}reassignCoreLayerHookOwner(e,t){let n=this.coreLayerHookOwners.get(e);!n||n===t||this.pluginResources.get(n)?.coreLayerHooks.delete(e)}areDependenciesLoaded(e){return!e||e.length===0?!0:e.every(e=>this.plugins.has(e)?!0:this.isPluginLoaded(e))}getPluginPriority(e){return this.pluginMetadata.get(e)?.priority??0}nextRegistrationOrder(){let e=this.registrationOrder;return this.registrationOrder+=1,e}compareOwnedResources(e,t){let n=this.renderLayerOwners.get(e)??this.coreLayerHookOwners.get(e),r=this.renderLayerOwners.get(t)??this.coreLayerHookOwners.get(t),i=n?this.getPluginPriority(n):0,a=r?this.getPluginPriority(r):0;return a===i?(this.renderLayerOrder.get(e)??this.coreLayerHookOrder.get(e)??0)-(this.renderLayerOrder.get(t)??this.coreLayerHookOrder.get(t)??0):a-i}},_e=class{constructor(e){this.state={tracks:[],selectedTrack:null,selectedEvent:null,highlightedEvent:null,draggingEvent:null,dragOffsetX:0,dragOffsetY:0,resizingEvent:null,draggingTimeIndicator:!1,timeIndicatorDragOffsetX:0,draggingScrollbar:!1,scrollbarDragOffset:0,draggingHorizontalScrollbar:!1,horizontalScrollbarDragOffset:0,zoomLevel:1,scrollX:0,scrollY:0,snapEnabled:!0,timeIndicatorSnapEnabled:!0,contextMenuEvent:null,contextMenuVisible:!1,contextMenuX:0,contextMenuY:0,hoveredContextMenuItem:-1,timeIndicatorPosition:e.startTime,timeIndicatorHighlightedEvents:[],isManualSelection:!1,guideLines:[],dragTimeReference:null,hoveredResizeHandle:null,lastClickTime:0,lastClickEvent:null,hoveredSplitLine:null,statusText:i(e,`statusReady`),contextMenuBounds:null,lastDrawTime:0}}setStatus(e,t){this.state.statusText=e,t&&t(e)}},Z=class{constructor(e){this.sortedIndices=new Map,this.dirtyTracks=new Set,this.batching=!1,this.state=e}invalidateTrack(e){this.dirtyTracks.add(e)}invalidateAll(){this.sortedIndices.clear(),this.dirtyTracks.clear()}beginBatch(){this.batching=!0}endBatch(){if(this.batching){for(let e of Array.from(this.dirtyTracks)){let t=this.state.tracks[e],n=t.events.map((e,t)=>t);n.sort((e,n)=>t.events[e].startTime-t.events[n].startTime),this.sortedIndices.set(e,n)}this.dirtyTracks.clear(),this.batching=!1}}ensureSorted(e){if(this.batching&&this.sortedIndices.has(e)&&!this.dirtyTracks.has(e))return this.sortedIndices.get(e);if(this.dirtyTracks.has(e)||!this.sortedIndices.has(e)){let t=this.state.tracks[e],n=t.events.map((e,t)=>t);n.sort((e,n)=>t.events[e].startTime-t.events[n].startTime),this.sortedIndices.set(e,n),this.dirtyTracks.delete(e)}return this.sortedIndices.get(e)}getCandidatesByTime(e,t,n=0){let r=this.ensureSorted(e),i=this.state.tracks[e],a=0,o=r.length-1,s=-1,c=t+n;for(;a<=o;){let e=a+o>>1,t=r[e];i.events[t].startTime<=c?(s=e,a=e+1):o=e-1}if(s===-1)return[];let l=[];for(let e=s;e>=0;e--){let a=r[e],o=i.events[a];o.startTime>t+n||o.endTime<t-n||l.push(a)}for(let e=s+1;e<r.length;e++){let a=r[e];if(i.events[a].startTime>t+n)break;l.push(a)}return l}};const Q=x(`ChangeScheduler`);var ve=class{constructor(e,t,n){this.renderManager=null,this.eventIndexManager=null,this.drawFn=null,this.handlers=new Map,this.batchContext=null,this.isBatching=!1,this.highlightChanged=!1,this.state=e,this.config=t,this.callbacks=n,this.initializeHandlers()}setRenderManager(e){this.renderManager=e}setEventIndexManager(e){this.eventIndexManager=e}setDrawFunction(e){this.drawFn=e}initializeHandlers(){this.handlers.set(`events:add`,{layers:[`tracks`,`timeline`,`scrollbar`,`indicator`],derive:()=>this.refreshHighlightList(),needsDraw:!0}),this.handlers.set(`events:update`,{layers:[`tracks`,`timeline`,`scrollbar`,`indicator`],derive:()=>this.refreshHighlightList(),needsDraw:!0}),this.handlers.set(`events:delete`,{layers:[`tracks`,`timeline`,`scrollbar`,`indicator`],derive:()=>this.refreshHighlightList(),needsDraw:!0}),this.handlers.set(`events:move`,{layers:[`tracks`,`timeline`,`scrollbar`,`guideLines`,`indicator`,`interaction`],derive:()=>this.refreshHighlightList(),needsDraw:!0}),this.handlers.set(`events:split`,{layers:[`tracks`,`timeline`,`scrollbar`,`indicator`],derive:()=>this.refreshHighlightList(),needsDraw:!0}),this.handlers.set(`tracks:add`,{layers:[`tracks`,`timeline`,`scrollbar`],derive:()=>this.refreshHighlightList(),needsDraw:!0}),this.handlers.set(`tracks:remove`,{layers:[`tracks`,`timeline`,`scrollbar`],derive:()=>this.refreshHighlightList(),needsDraw:!0}),this.handlers.set(`timeIndicator:move`,{layers:[`indicator`,`tracks`,`timeline`,`interaction`],derive:()=>this.computeHighlightList(),notify:()=>this.emitTimeIndicatorHighlight(),needsDraw:!0}),this.handlers.set(`timeIndicator:drag`,{layers:[`indicator`,`tracks`,`interaction`],derive:()=>this.computeHighlightList(),needsDraw:!0}),this.handlers.set(`scroll:x`,{layers:[`tracks`,`timeline`,`guideLines`,`indicator`,`scrollbar`,`interaction`],needsDraw:!0}),this.handlers.set(`scroll:y`,{layers:[`tracks`,`timeline`,`guideLines`,`indicator`,`scrollbar`,`interaction`,`overlay`],needsDraw:!0}),this.handlers.set(`zoom:change`,{layers:[`background`,`tracks`,`timeline`,`guideLines`,`indicator`,`scrollbar`,`interaction`,`overlay`],needsDraw:!0}),this.handlers.set(`selection:change`,{layers:[`tracks`,`interaction`,`indicator`],needsDraw:!0}),this.handlers.set(`highlight:change`,{layers:[`tracks`,`indicator`],needsDraw:!0}),this.handlers.set(`canvas:resize`,{layers:[`background`,`tracks`,`timeline`,`guideLines`,`indicator`,`scrollbar`,`interaction`,`overlay`],needsDraw:!0}),this.handlers.set(`data:load`,{layers:[`tracks`,`timeline`,`scrollbar`,`guideLines`],derive:()=>this.refreshHighlightList(),needsDraw:!0}),this.handlers.set(`theme:change`,{layers:[`background`,`tracks`,`timeline`,`indicator`,`scrollbar`,`overlay`],needsDraw:!0}),this.handlers.set(`interaction:hover`,{layers:[`tracks`,`interaction`,`overlay`],needsDraw:!0}),this.handlers.set(`interaction:contextMenu`,{layers:[`overlay`,`interaction`],needsDraw:!0}),this.handlers.set(`interaction:splitLine`,{layers:[`tracks`],needsDraw:!0}),this.handlers.set(`config:debug`,{layers:[`overlay`],needsDraw:!0}),this.handlers.set(`config:timeIndicator`,{layers:[`indicator`,`tracks`,`interaction`],derive:()=>this.refreshHighlightList(),needsDraw:!0}),this.handlers.set(`config:endTime`,{layers:[`background`,`tracks`,`timeline`,`guideLines`,`indicator`,`scrollbar`,`interaction`,`overlay`],needsDraw:!0}),this.handlers.set(`config:readOnly`,{layers:[`tracks`,`interaction`,`overlay`],needsDraw:!0})}notify(e){let t=this.handlers.get(e);if(!t){Q.warn(i(this.config,`warningUnknownChangeType`,{change:e}));return}if(this.isBatching&&this.batchContext){this.batchContext.changes.add(e);for(let e of t.layers)this.batchContext.dirtyLayers.add(e);t.derive&&this.batchContext.pendingDerives.push(t.derive),t.notify&&this.batchContext.pendingNotifications.push(t.notify)}else this.processChange(t)}notifyMultiple(e){this.beginBatch();for(let t of e)this.notify(t);this.endBatch()}beginBatch(){if(this.isBatching){Q.warn(i(this.config,`warningAlreadyInBatchMode`));return}this.isBatching=!0,this.batchContext={changes:new Set,dirtyLayers:new Set,pendingNotifications:[],pendingDerives:[]}}endBatch(){if(!this.isBatching||!this.batchContext){Q.warn(i(this.config,`warningNotInBatchMode`));return}let e=this.batchContext;if(this.isBatching=!1,this.batchContext=null,e.changes.size===0)return;let t=[...new Set(e.pendingDerives)];for(let e of t)e();this.renderManager&&e.dirtyLayers.size>0&&this.renderManager.markDirty(Array.from(e.dirtyLayers)),this.drawFn&&this.drawFn();let n=[...new Set(e.pendingNotifications)];for(let e of n)e()}processChange(e){e.derive&&e.derive(),this.renderManager&&e.layers.length>0&&this.renderManager.markDirty(e.layers),e.needsDraw&&this.drawFn&&this.drawFn(),e.notify&&e.notify()}refreshHighlightList(){this.state.timeIndicatorHighlightedEvents=this.detectHighlightedEvents(this.state.timeIndicatorPosition)}computeHighlightList(){let e=this.state.timeIndicatorPosition,t=this.detectHighlightedEvents(e),n=this.hasHighlightChanged(this.state.timeIndicatorHighlightedEvents,t);this.state.timeIndicatorHighlightedEvents=t,this.highlightChanged=n}hasHighlightChanged(e,t){if(e.length!==t.length)return!0;for(let n=0;n<e.length;n++)if(e[n].trackIndex!==t[n].trackIndex||e[n].eventIndex!==t[n].eventIndex)return!0;return!1}detectHighlightedEvents(e){if(!this.config.enableTimeIndicator)return[];let t=[];if(this.eventIndexManager)for(let n=0;n<this.state.tracks.length;n++){let r=this.eventIndexManager.getCandidatesByTime(n,e,0),i=this.state.tracks[n];for(let a of r){let r=i.events[a];r&&e>r.startTime&&e<r.endTime&&t.push({trackIndex:n,eventIndex:a})}}else for(let n=0;n<this.state.tracks.length;n++){let r=this.state.tracks[n];for(let i=0;i<r.events.length;i++){let a=r.events[i];e>a.startTime&&e<a.endTime&&t.push({trackIndex:n,eventIndex:i})}}return t}emitTimeIndicatorHighlight(){if(this.highlightChanged){if(this.callbacks.onTimeIndicatorHighlight){let e=this.state.timeIndicatorPosition,t=this.state.timeIndicatorHighlightedEvents.filter(({trackIndex:e,eventIndex:t})=>{let n=this.state.tracks[e];return n&&t<n.events.length}).map(({trackIndex:e,eventIndex:t})=>{let n=this.state.tracks[e].events[t];return{trackIndex:e,eventIndex:t,event:d(n)}});this.callbacks.onTimeIndicatorHighlight({position:e,highlightedEvents:t})}this.highlightChanged=!1}}registerHandler(e,t){this.handlers.set(e,t)}getLayersForChange(e){return this.handlers.get(e)?.layers||[]}updateCallbacks(e){this.callbacks=e}};function $(e,t,n){return n||e.colors.eventColors[t%e.colors.eventColors.length]}var ye=class{constructor(e){this.config=e.config,this.state=e.state,this.eventIndexManager=e.eventIndexManager,this.logger=e.logger,this.onMutate=e.onMutate}validateEventTime(e,t){let n=this.config.endTime+this.config.endPaddingTime,r,a;if(t>e&&t<=n)r=e,a=s(t-e);else if(t<=this.config.endTime-this.config.startTime&&e+t<=n)r=e,a=t;else return this.logger.error(i(this.config,`errorInvalidTimeRange`,{startTime:e,endTime:t})),null;return r<this.config.startTime?(this.logger.error(i(this.config,`errorStartTimeBeforeMin`,{startTime:r,minAllowed:this.config.startTime})),null):{startSec:r,duration:a}}addEvent(e,t,n,r,i=``,a,o=!1){if(!this.isValidTrackIndex(e))return null;let c=this.validateEventTime(t,n);if(!c)return null;let{startSec:l,duration:u}=c,d=this.state.tracks[e],f=s(u),p={id:d.events.length,startTime:l,endTime:s(l+f),duration:f,title:r,description:i,color:$(this.config,d.events.length),...o?{readonly:o}:{},...a?{customData:a}:{}};return d.events.push(p),this.invalidateTrack(e),p}updateEvent(e,t,n){let r=this.getEvent(e,t);if(!r)return null;let i=d(r);return Object.assign(r,n),this.invalidateTrack(e),{event:r,oldEvent:i}}updateEventData(e,t,n){let r=this.getEvent(e,t);if(!r)return null;let i=d(r);return n.title!==void 0&&(r.title=n.title),n.startTime!==void 0&&(r.startTime=n.startTime,r.endTime=s(r.startTime+r.duration)),n.duration!==void 0&&(r.duration=s(n.duration),r.endTime=s(r.startTime+r.duration)),n.description!==void 0&&(r.description=n.description),this.invalidateTrack(e),{event:r,oldEvent:i}}deleteEvent(e,t){if(!this.isValidTrackIndex(e))return null;let n=this.state.tracks[e];if(!this.isValidEventIndex(n,t))return null;let r=d(n.events[t]);return n.events.splice(t,1),this.invalidateTrack(e),r}loadData(e){if(!e||typeof e!=`object`)return this.logger.error(i(this.config,`errorInvalidDataFormat`)),!1;this.state.tracks=[],this.state.selectedTrack=null,this.state.selectedEvent=null;let t=e.tracks||[];for(let e=0;e<t.length;e++){let n=t[e],r={id:this.state.tracks.length,events:[]},i=n.events||[];for(let e=0;e<i.length;e++){let t=i[e];if(!t.title)continue;let n=this.resolveLoadEventTiming(t);if(!n)continue;let a={id:r.events.length,startTime:n.startTime,endTime:n.endTime,duration:n.duration,title:t.title,description:t.description||``,color:$(this.config,r.events.length,t.color),...t.readonly?{readonly:t.readonly}:{},...t.customData?{customData:t.customData}:{},...t.media?{media:t.media}:{}};r.events.push(a)}this.state.tracks.push(r)}return this.eventIndexManager.invalidateAll(),this.onMutate?.(),!0}getEvent(e,t){if(!this.isValidTrackIndex(e))return this.logger.error(i(this.config,`errorInvalidTrackIndex`)),null;let n=this.state.tracks[e];return this.isValidEventIndex(n,t)?n.events[t]:(this.logger.error(i(this.config,`errorInvalidEventIndex`)),null)}resolveLoadEventTiming(e){let t,n;if(e.endTime!==void 0)t=e.startTime||0,n=s(e.endTime-t);else if(e.duration!==void 0)t=e.startTime||0,n=e.duration;else return null;let r=s(n);return{startTime:t,duration:r,endTime:s(t+r)}}invalidateTrack(e){this.eventIndexManager.invalidateTrack(e),this.onMutate?.()}isValidTrackIndex(e){return e>=0&&e<this.state.tracks.length}isValidEventIndex(e,t){return t>=0&&t<e.events.length}};function be(e,t,n,r,i){return`${e}-${t}-${n}-${r.toFixed(3)}-${i.toFixed(3)}`}var xe=class{constructor(e,t,n=500){this.config=e,this.state=t,this.cacheTtl=n,this.guideLinesCache=new Map,this.guideLinesCacheTimestamp=0}calculateGuideLines(e,t,n,r,i){let a=be(e,t,n,r,i),o=Date.now();if(o-this.guideLinesCacheTimestamp<this.cacheTtl){let e=this.guideLinesCache.get(a);if(e)return e}else this.clearCache(),this.guideLinesCacheTimestamp=o;let s=[],c=this.config.guideLineSnapThreshold,l=r+i;for(let n=0;n<this.state.tracks.length;n++){let i=this.state.tracks[n];if(!(!i||i.events.length===0))for(let a=0;a<i.events.length;a++){if(n===e&&a===t)continue;let o=i.events[a];o.endTime<r-c||o.startTime>l+c||(this.addGuideLineIfMatched(s,o.startTime,r,`start`,n,c),this.addGuideLineIfMatched(s,o.endTime,l,`end`,n,c),this.addGuideLineIfMatched(s,o.endTime,r,`end`,n,c),this.addGuideLineIfMatched(s,o.startTime,l,`start`,n,c))}}return this.guideLinesCache.set(a,s),s}clearCache(){this.guideLinesCache.clear()}addGuideLineIfMatched(e,t,n,r,i,a){if(Math.abs(t-n)>=a)return;let o=e.find(e=>Math.abs(e.time-t)<1e-4&&e.type===r);if(!o){e.push({time:t,type:r,trackIndices:[i]});return}o.trackIndices.includes(i)||o.trackIndices.push(i)}},Se=class{constructor(e,t,n){this.config=e,this.state=t,this.eventIndexManager=n}getInteractionTarget(e,t){let n={trackIndex:null,eventIndex:null,resizeEdge:null},r=this.resolveTrackIndex(t);if(r===null||(n.trackIndex=r,!this.isWithinEventVerticalBounds(r,t)))return n;let{eventIndex:i,resizeEdge:a}=this.resolveCandidateHit(r,e,this.getResizeMargin());return n.eventIndex=i,n.resizeEdge=a,n}getEventAtPosition(e,t){let n=this.resolveTrackIndex(t);if(n===null||!this.isWithinEventVerticalBounds(n,t))return null;let{eventIndex:r}=this.resolveCandidateHit(n,e,0);return r===null?null:{trackIndex:n,eventIndex:r}}getResizeHandle(e,t){let n=this.resolveTrackIndex(t);if(n===null||!this.isWithinEventVerticalBounds(n,t))return null;let{eventIndex:r,resizeEdge:i}=this.resolveCandidateHit(n,e,this.getResizeMargin());return r===null||i===null?null:{trackIndex:n,eventIndex:r,edge:i}}resolveTrackIndex(e){let t=e+this.state.scrollY;if(t<this.config.timelineHeight)return null;let n=Math.floor((t-this.config.timelineHeight-this.config.firstTrackTopMargin)/(this.config.trackHeight+this.config.trackMargin));return n<0||n>=this.state.tracks.length?null:n}isWithinEventVerticalBounds(e,t){let{trackY:n,eventVerticalPadding:r}=this.getTrackHitContext(e);return!(t<n+r||t>n+this.config.trackHeight-r)}getTrackHitContext(e){return{trackIndex:e,trackY:this.config.timelineHeight+this.config.firstTrackTopMargin+e*(this.config.trackHeight+this.config.trackMargin)-this.state.scrollY,eventVerticalPadding:Math.max(5,this.config.trackHeight*.0625)}}resolveCandidateHit(e,t,n){let r=this.getMouseTime(t),i=this.eventIndexManager.getCandidatesByTime(e,r,n);if(i.length===0)return{eventIndex:null,resizeEdge:null};let a=null,o=null,s=null;for(let n of i){let r=this.state.tracks[e].events[n],{eventX:i,eventWidth:c}=this.getEventGeometry(r),l=this.config.resizeHandleWidth;t>=i-l/2&&t<=i+l/2?(a===null||n>a)&&(a=n,o=`left`):t>=i+c-l/2&&t<=i+c+l/2&&(a===null||n>a)&&(a=n,o=`right`),t>=i&&t<=i+c&&(s===null||n>s)&&(s=n)}return a===null?{eventIndex:s,resizeEdge:null}:{eventIndex:a,resizeEdge:o}}getMouseTime(e){return(e+this.state.scrollX-this.config.startPaddingTime)/(this.config.secondWidth*this.state.zoomLevel)+this.config.startTime}getResizeMargin(){return this.config.resizeHandleWidth/(this.config.secondWidth*this.state.zoomLevel)}getEventGeometry(e){return{eventX:this.config.startPaddingTime+(e.startTime-this.config.startTime)*this.config.secondWidth*this.state.zoomLevel-this.state.scrollX,eventWidth:e.duration*this.config.secondWidth*this.state.zoomLevel}}},Ce=class{constructor(e,n={}){this.eventListeners=null,this.currentThemePluginId=null,this._lastEdgeScrollTime=0;let i=_(n.locale),o=l(i,n.messages);this.logger=new S({enabled:!0,level:n.debug?`debug`:`info`,prefix:`Timeline`,useGlobalConfig:!1}),C({enabled:!0,level:n.debug?`debug`:`info`}),this.errorHandler=new X(this.logger);let s=document.getElementById(e);(!s||!(s instanceof HTMLCanvasElement))&&this.errorHandler.throw(a(o,`errorCanvasNotFound`,{canvasId:e})),this.canvas=s;let u=this.canvas.getContext(`2d`);if(u||this.errorHandler.throw(a(o,`errorCanvasContextUnavailable`)),this.ctx=u,n.startPaddingTime===void 0&&(n.startPaddingTime=10),this.config={...c,...n,locale:i,messages:o,colors:{...m,...n.colors},eventTextStyle:{...h,...n.eventTextStyle},eventBlockStyle:{...f,...n.eventBlockStyle},eventDurationPrefix:n.eventDurationPrefix??o.labelDurationPrefix,contextMenuItems:n.contextMenuItems||r(o),contextMenuStyle:{...t,...n.contextMenuStyle}},this.logger.setLevel(this.config.debug?`debug`:`info`),this.callbacks={onEventAdd:n.onEventAdd||null,onEventUpdate:n.onEventUpdate||null,onEventDelete:n.onEventDelete||null,onEventMove:n.onEventMove||null,onEventClick:n.onEventClick||null,onEventEdit:n.onEventEdit||null,onContextMenu:n.onContextMenu||null,onTrackAdd:n.onTrackAdd||null,onTrackRemove:n.onTrackRemove||null,onTimeIndicatorMove:n.onTimeIndicatorMove||null,onZoom:n.onZoom||null,onStatusChange:n.onStatusChange||null,onEventHighlight:n.onEventHighlight||null,onTimeIndicatorHighlight:n.onTimeIndicatorHighlight||null},this.stateManager=new _e(this.config),this.state=this.stateManager.state,this.eventIndexManager=new Z(this.state),this.eventMutationService=new ye({config:this.config,state:this.state,eventIndexManager:this.eventIndexManager,logger:this.logger,onMutate:()=>this.clearGuideLineCache()}),this.guideLineService=new xe(this.config,this.state),this.hitTestService=new Se(this.config,this.state,this.eventIndexManager),this.mouseHandler=new me(this),this.wheelHandler=new he(this),this.pluginManager=new ge({timeline:this,config:this.config,state:this.state}),n.theme){let e=`${n.theme.metadata.name}@${n.theme.metadata.version}`;this.pluginManager.loadPlugin(n.theme).then(t=>{t&&(this.currentThemePluginId=e,this.notifyChange(`theme:change`))})}this.renderManager=new G(this.canvas,this.ctx,this.config,this.state,this.pluginManager),this.changeScheduler=new ve(this.state,this.config,this.callbacks),this.changeScheduler.setRenderManager(this.renderManager),this.changeScheduler.setEventIndexManager(this.eventIndexManager),this.changeScheduler.setDrawFunction(()=>this.draw()),this.init(),this.setupEventListeners()}getCanvas(){return this.canvas}async usePlugin(e){return this.isThemePlugin(e)?this.switchTheme(e):await this.pluginManager.loadPlugin(e)?(this.redrawAfterPluginChange(),!0):!1}getLoadedPlugins(){return this.pluginManager.getLoadedPlugins()}isPluginLoaded(e){return this.pluginManager.isPluginLoaded(e)}async removePlugin(e){return await this.pluginManager.unloadPlugin(e)?this.currentThemePluginId===e?(this.currentThemePluginId=null,this.notifyChange(`theme:change`),!0):(this.redrawAfterPluginChange(),!0):!1}async setTheme(e){let t=e===`dark`?D:E;return this.switchTheme(t)}async switchTheme(e){let t=this.getPluginId(e);if(this.currentThemePluginId===t)return!0;if(this.currentThemePluginId){if(!await this.pluginManager.unloadPlugin(this.currentThemePluginId))return!1;this.currentThemePluginId=null}let n=await this.pluginManager.loadPlugin(e);return n&&(this.currentThemePluginId=t,this.notifyChange(`theme:change`)),n}init(){this.config.autoFitOnInit&&this.autoFitZoomToCanvas(),this.notifyChange(`data:load`)}getContentWidthForZoom(e){return this.renderManager.getContentWidth(e)}hasHorizontalScrollbar(){return this.renderManager.hasHorizontalScrollbar()}getAvailableHeight(){return this.renderManager.getAvailableHeight()}notifyChange(e){this.changeScheduler.notify(e)}beginChangeBatch(){this.changeScheduler.beginBatch()}endChangeBatch(){this.changeScheduler.endBatch()}setDebug(e){this.config.debug!==e&&(this.config.debug=e,this.logger.setLevel(e?`debug`:`info`),C({level:e?`debug`:`info`}),this.notifyChange(`config:debug`))}setEnableTimeIndicator(e){this.config.enableTimeIndicator!==e&&(this.config.enableTimeIndicator=e,e||(this.state.draggingTimeIndicator=!1,this.state.timeIndicatorHighlightedEvents=[]),this.notifyChange(`config:timeIndicator`))}markDirty(e){this.renderManager.markDirty(e)}getLastLayerTimes(){return this.renderManager.getLastLayerTimes()}beginIndexBatch(){this.eventIndexManager.beginBatch()}endIndexBatch(){this.eventIndexManager.endBatch()}invalidateIndexTrack(e){this.eventIndexManager.invalidateTrack(e)}invalidateIndexAll(){this.eventIndexManager.invalidateAll()}autoFitZoomToCanvas(){this.adjustCanvasSize();let e=this.renderManager.getCanvasLogicalWidth(),t=Math.max(this.config.minAutoFitZoom,this.state.zoomLevel,1),n=Math.max(this.config.maxAutoFitZoom,t);if(this.renderManager.getContentWidth(t)>=e){this.state.zoomLevel=t;return}for(;t<=n&&this.renderManager.getContentWidth(t)<e;)t+=.05;if(t<=n&&this.renderManager.getContentWidth(t)>=e){this.state.zoomLevel=parseFloat(t.toFixed(3)),this.setStatus(this.t(`statusAutoFit`,{percentage:Math.round(this.state.zoomLevel*100)}));return}if(this.config.endPaddingTime===0){let t=e,r=this.renderManager.getContentWidth(n);if(r<t){let e=(t-r)/(this.config.secondWidth*n);this.config.endPaddingTime=Math.ceil(e),this.state.zoomLevel=n,this.setStatus(this.t(`statusAutoFitCappedWithPadding`,{percentage:Math.round(n*100),seconds:this.config.endPaddingTime}));return}}this.state.zoomLevel=n,this.setStatus(this.t(`statusAutoFitCappedContentShort`,{percentage:Math.round(n*100)})),this.markDirty([`background`,`tracks`,`timeline`,`guideLines`,`indicator`,`scrollbar`,`interaction`,`overlay`])}setupEventListeners(){this.eventListeners={mousedown:e=>this.mouseHandler.handleMouseDown(e),mousemove:e=>this.mouseHandler.handleMouseMove(e),mouseup:e=>this.mouseHandler.handleMouseUp(e),mouseleave:()=>this.mouseHandler.handleMouseUp(),contextmenu:e=>this.mouseHandler.handleContextMenu(e),wheel:e=>this.wheelHandler.handleWheel(e)},this.canvas.addEventListener(`mousedown`,this.eventListeners.mousedown),this.canvas.addEventListener(`mousemove`,this.eventListeners.mousemove),this.canvas.addEventListener(`mouseup`,this.eventListeners.mouseup),this.canvas.addEventListener(`mouseleave`,this.eventListeners.mouseleave),this.canvas.addEventListener(`contextmenu`,this.eventListeners.contextmenu),this.canvas.addEventListener(`wheel`,this.eventListeners.wheel,{passive:!1}),this.setInitialCanvasSize()}setInitialCanvasSize(){let e=this.canvas.parentElement;if(!e){this.setCanvasSize(this.renderManager.getCanvasLogicalWidth(),this.config.canvasHeight||500);return}let t=e.getBoundingClientRect();this.setCanvasSize(t.width,t.height||this.config.canvasHeight||500)}setCanvasSize(e,t){this.renderManager.setCanvasSize(e,t)}getCanvasLogicalHeight(){return this.renderManager.getCanvasLogicalHeight()}getCachedLogicalHeight(){return this.renderManager.getCachedLogicalHeight()}adjustCanvasSize(){let e=this.renderManager.computeMaxScrollY();this.state.scrollY=Math.max(0,Math.min(e,this.state.scrollY)),this.notifyChange(`canvas:resize`)}addTrack(){let e={id:this.state.tracks.length,events:[]};this.state.tracks.push(e),this.clearGuideLineCache(),this.adjustCanvasSize(),this.setStatus(this.t(`statusTrackAdded`,{count:this.state.tracks.length})),this.callbacks.onTrackAdd&&this.callbacks.onTrackAdd(e)}removeTrack(){if(this.state.tracks.length<=1){this.setStatus(this.t(`statusAtLeastOneTrackRequired`));return}let e=this.state.tracks.pop();this.state.selectedTrack!==null&&this.state.selectedTrack>=this.state.tracks.length&&(this.state.selectedTrack=this.state.tracks.length>0?this.state.tracks.length-1:null),this.clearGuideLineCache(),this.adjustCanvasSize(),this.setStatus(this.t(`statusTrackRemoved`,{count:this.state.tracks.length})),this.callbacks.onTrackRemove&&this.callbacks.onTrackRemove(e)}autoRemoveEmptyLastTrack(){if(this.config.autoRemoveEmptyLastTrack&&!(this.state.tracks.length<=1)&&this.state.tracks[this.state.tracks.length-1].events.length===0){let e=this.state.tracks.pop();this.state.selectedTrack!==null&&this.state.selectedTrack>=this.state.tracks.length&&(this.state.selectedTrack=this.state.tracks.length>0?this.state.tracks.length-1:null),this.clearGuideLineCache(),this.setStatus(this.t(`statusEmptyTrackRemoved`,{count:this.state.tracks.length})),this.callbacks.onTrackRemove&&this.callbacks.onTrackRemove(e),this.adjustCanvasSize(),this.autoRemoveEmptyLastTrack()}}addEvent(e,t,n,r,i=``,a,o=!1){let s=this.eventMutationService.addEvent(e,t,n,r,i,a,o);s&&(this.notifyChange(`events:add`),this.callbacks.onEventAdd&&this.callbacks.onEventAdd({trackIndex:e,event:d(s)}))}updateEvent(e,t,n){let r=this.eventMutationService.updateEvent(e,t,n);return r?(this.notifyChange(`events:update`),this.setStatus(this.t(`statusEventUpdated`,{title:r.event.title})),this.callbacks.onEventUpdate&&this.callbacks.onEventUpdate({trackIndex:e,eventIndex:t,event:d(r.event),oldEvent:r.oldEvent}),!0):!1}updateEventData(e,t,n){let r=this.eventMutationService.updateEventData(e,t,n);return r?(this.notifyChange(`events:update`),this.setStatus(this.t(`statusEventUpdated`,{title:r.event.title})),this.callbacks.onEventUpdate&&this.callbacks.onEventUpdate({trackIndex:e,eventIndex:t,event:d(r.event),oldEvent:r.oldEvent}),!0):!1}deleteEvent(e,t){let n=this.eventMutationService.deleteEvent(e,t);return n?(this.autoRemoveEmptyLastTrack(),this.notifyChange(`events:delete`),this.setStatus(this.t(`statusEventDeleted`,{title:n.title})),this.callbacks.onEventDelete&&this.callbacks.onEventDelete({trackIndex:e,eventIndex:t,event:n}),!0):!1}loadData(e){return this.eventMutationService.loadData(e)?(this.state.tracks.length===0&&this.addTrack(),e.timeIndicatorPosition!==void 0&&this.setTimeIndicator(e.timeIndicatorPosition),this.notifyChange(`data:load`),this.setStatus(this.t(`statusDataLoaded`,{count:this.state.tracks.length})),!0):!1}setTimeIndicator(t,r=!1){if(typeof t!=`number`||isNaN(t))return this.logger.error(this.t(`errorTimeIndicatorInvalid`)),!1;if(r&&this.state.snapEnabled){let e=n(this.state.zoomLevel,this.config.snapInterval,this.config.snapToSeconds,this.config.secondPrecisionZoomThreshold,this.config.scale,this.config.scaleSplitCount);t=y(t,e)}return t=Math.max(this.config.startTime,Math.min(this.config.endTime,t)),t===this.state.timeIndicatorPosition?!0:(this.state.timeIndicatorPosition=t,this.scrollToTimeIndicator(t),this.notifyChange(`timeIndicator:move`),this.setStatus(this.t(`statusTimeIndicatorMoved`,{time:e(t)})),this.callbacks.onTimeIndicatorMove&&this.callbacks.onTimeIndicatorMove({position:t,time:e(t)}),!0)}setTimeIndicatorDuringDrag(e){e=Math.max(this.config.startTime,Math.min(this.config.endTime,e)),this.state.timeIndicatorPosition=e,this.scrollToTimeIndicatorThrottled(e),this.notifyChange(`timeIndicator:drag`)}scrollToTimeIndicatorThrottled(e){let t=performance.now();if(t-this._lastEdgeScrollTime<this.getEdgeScrollThrottle())return;let n=u(e,this.config.startTime,this.config.startPaddingTime,this.config.secondWidth,this.state.zoomLevel,this.state.scrollX),r=this.renderManager.getCanvasLogicalWidth(),i=this.getEdgeScrollTriggerMargin();if(n>=i&&n<=r-i)return;this._lastEdgeScrollTime=t;let a=this.getEdgeScrollViewportMargin(),o=u(e,this.config.startTime,this.config.startPaddingTime,this.config.secondWidth,this.state.zoomLevel,0),s=this.renderManager.computeMaxScrollX(this.state.zoomLevel);n<i?this.state.scrollX=Math.max(0,Math.min(s,o-a)):this.state.scrollX=Math.max(0,Math.min(s,o-(r-a))),this.markDirty([`background`,`tracks`,`timeline`,`guideLines`,`indicator`,`scrollbar`,`interaction`,`overlay`])}scrollToTimeIndicator(e){let t=u(e,this.config.startTime,this.config.startPaddingTime,this.config.secondWidth,this.state.zoomLevel,this.state.scrollX),n=this.renderManager.getCanvasLogicalWidth(),r=this.getEdgeScrollViewportMargin(),i=!1;if(t<r){let t=u(e,this.config.startTime,this.config.startPaddingTime,this.config.secondWidth,this.state.zoomLevel,0)-r,n=this.renderManager.computeMaxScrollX(this.state.zoomLevel);this.state.scrollX=Math.max(0,Math.min(n,t)),i=!0}else if(t>n-r){let t=u(e,this.config.startTime,this.config.startPaddingTime,this.config.secondWidth,this.state.zoomLevel,0)-(n-r),a=this.renderManager.computeMaxScrollX(this.state.zoomLevel);this.state.scrollX=Math.max(0,Math.min(a,t)),i=!0}i&&this.markDirty([`background`,`tracks`,`timeline`,`guideLines`,`indicator`,`scrollbar`,`interaction`,`overlay`])}zoom(e){let t=this.state.zoomLevel,n=this.state.scrollX,r=this.renderManager.getCachedLogicalWidth()/2,i=(r+n)/(this.config.secondWidth*t);if(this.state.zoomLevel*=e,this.state.zoomLevel=Math.max(1,Math.min(1e3,this.state.zoomLevel)),t!==this.state.zoomLevel){let e=i*this.config.secondWidth*this.state.zoomLevel;this.state.scrollX=e-r;let t=this.renderManager.computeMaxScrollX(this.state.zoomLevel);this.state.scrollX=Math.max(0,Math.min(t,this.state.scrollX))}this.notifyChange(`zoom:change`),this.setStatus(this.t(`statusZoomChanged`,{percentage:Math.round(this.state.zoomLevel*100)})),this.callbacks.onZoom&&t!==this.state.zoomLevel&&this.callbacks.onZoom({zoomLevel:this.state.zoomLevel,percentage:Math.round(this.state.zoomLevel*100)})}setZoomLevel(e){if(typeof e!=`number`||isNaN(e))return this.logger.error(this.t(`errorZoomLevelInvalid`)),!1;if(e<1||e>1e3)return this.logger.error(this.t(`errorZoomLevelOutOfRange`)),!1;let t=this.state.zoomLevel,n=this.state.scrollX,r=this.renderManager.getCachedLogicalWidth()/2,i=(r+n)/(this.config.secondWidth*t);this.state.zoomLevel=e;let a=i*this.config.secondWidth*this.state.zoomLevel;this.state.scrollX=a-r;let o=this.renderManager.computeMaxScrollX(this.state.zoomLevel);return this.state.scrollX=Math.max(0,Math.min(o,this.state.scrollX)),this.notifyChange(`zoom:change`),this.setStatus(this.t(`statusZoomChanged`,{percentage:Math.round(this.state.zoomLevel*100)})),this.callbacks.onZoom&&t!==this.state.zoomLevel&&this.callbacks.onZoom({zoomLevel:this.state.zoomLevel,percentage:Math.round(this.state.zoomLevel*100)}),!0}getZoomLevel(){return this.state.zoomLevel}setEndTime(t){if(typeof t!=`number`||isNaN(t))return this.logger.error(this.t(`errorEndTimeInvalid`)),!1;if(t<=this.config.startTime)return this.logger.error(this.t(`errorEndTimeNotAfterStart`)),!1;this.state.tracks.some(e=>e.events.some(e=>e.endTime>t))&&this.logger.warn(this.t(`warningEventsExceedEndTime`));let n=this.config.endTime;this.config.endTime=t,this.clearGuideLineCache(),this.renderManager.invalidateLayoutCache(),this.state.timeIndicatorPosition>t&&(this.state.timeIndicatorPosition=t);let r=this.renderManager.getContentWidth(this.state.zoomLevel),i=Math.max(0,r-this.renderManager.getCachedLogicalWidth());return this.state.scrollX=Math.max(0,Math.min(i,this.state.scrollX)),this.notifyChange(`config:endTime`),this.setStatus(this.t(`statusEndTimeUpdated`,{from:e(n),to:e(t)})),!0}getEndTime(){return this.config.endTime}formatTime(t){return e(t)}t(e,t={}){return a(this.config.messages,e,t)}setStatus(e){this.stateManager.setStatus(e,this.callbacks.onStatusChange||void 0)}getStatus(){return this.state.statusText}getInteractionTarget(e,t){return this.hitTestService.getInteractionTarget(e,t)}getEventAtPosition(e,t){return this.hitTestService.getEventAtPosition(e,t)}getResizeHandle(e,t){return this.hitTestService.getResizeHandle(e,t)}getEdgeScrollThrottle(){return this.resolveEdgeScrollValue(this.config.edgeScrollThrottle,c.edgeScrollThrottle)}getEdgeScrollTriggerMargin(){return this.resolveEdgeScrollValue(this.config.edgeScrollTriggerMargin,c.edgeScrollTriggerMargin)}getEdgeScrollViewportMargin(){return this.resolveEdgeScrollValue(this.config.edgeScrollViewportMargin,c.edgeScrollViewportMargin)}resolveEdgeScrollValue(e,t){return!Number.isFinite(e)||e<0?t:e}calculateGuideLines(e,t,n,r,i){return this.guideLineService.calculateGuideLines(e,t,n,r,i)}snapToGuideLines(e,t){if(this.state.guideLines.length===0)return null;let n=this.config.guideLineSnapThreshold,r=e+t,i=null,a=2**53-1;for(let o of this.state.guideLines)if(o.type===`start`){let t=Math.abs(o.time-e);t<n&&t<a&&(a=t,i=o.time)}else if(o.type===`end`){let e=Math.abs(o.time-r);e<n&&e<a&&(a=e,i=o.time-t)}return i}snapEdgeToGuideLines(e){if(this.state.guideLines.length===0)return null;let t=this.config.guideLineSnapThreshold,n=null,r=2**53-1;for(let i of this.state.guideLines){let a=Math.abs(i.time-e);a<t&&a<r&&(r=a,n=i.time)}return n}canMoveEvent(e,t,n,r,i){let a=r+i,o=this.config.endTime+this.config.endPaddingTime;if(r<this.config.startTime||a>o||n<0||n>=this.state.tracks.length)return!1;let s=this.state.tracks[n];for(let i=0;i<s.events.length;i++){if(n===e&&i===t)continue;let o=s.events[i];if(!(a<=o.startTime||r>=o.endTime))return!1}return!!this.pluginManager.validateEvent(`validate:event:move`,{fromTrackIndex:e,fromEventIndex:t,toTrackIndex:n,newStartTime:r,duration:i})}showSplitLine(e,t,n){(!this.state.hoveredSplitLine||this.state.hoveredSplitLine.trackIndex!==e||this.state.hoveredSplitLine.eventIndex!==t||Math.abs(this.state.hoveredSplitLine.splitTime-n)>.001)&&(this.state.hoveredSplitLine={trackIndex:e,eventIndex:t,splitTime:n},this.notifyChange(`interaction:splitLine`))}hideSplitLine(){this.state.hoveredSplitLine&&(this.state.hoveredSplitLine=null,this.notifyChange(`interaction:splitLine`))}splitEvent(e,t,n){if(e<0||e>=this.state.tracks.length)return!1;let r=this.state.tracks[e];if(t<0||t>=r.events.length)return!1;let i=r.events[t];if(n<=i.startTime+this.config.minEventDuration||n>=i.endTime-this.config.minEventDuration)return this.setStatus(this.t(`statusInvalidSplitPosition`)),!1;let a={...i,id:i.id,duration:s(n-i.startTime),endTime:n,title:`${i.title} (1)`},o={...i,id:r.events.length,startTime:n,duration:s(i.endTime-n),endTime:s(i.endTime),title:`${i.title} (2)`};return r.events[t]=a,r.events.push(o),this.clearGuideLineCache(),this.eventIndexManager.invalidateTrack(e),this.notifyChange(`events:split`),this.setStatus(this.t(`statusEventSplit`,{title:i.title})),this.callbacks.onEventUpdate&&this.callbacks.onEventUpdate({type:`split`,trackIndex:e,eventIndex:t,event:d(i),firstEvent:d(a),secondEvent:d(o)}),!0}draw(){this.renderManager.draw()}setReadOnly(e){this.config.readOnly=e,e&&(this.state.selectedEvent=null,this.state.draggingEvent=null,this.state.resizingEvent=null,this.state.draggingTimeIndicator=!1,this.state.contextMenuVisible=!1,this.state.contextMenuEvent=null,this.state.hoveredResizeHandle=null,this.state.hoveredSplitLine=null,this.state.guideLines=[]),this.notifyChange(`config:readOnly`),this.setStatus(this.t(e?`statusReadOnlyModeEnabled`:`statusReadOnlyModeDisabled`))}highlightEvent(e,t){if(e<0||e>=this.state.tracks.length)return this.logger.error(this.t(`errorInvalidTrackIndexWithValue`,{trackIndex:e})),!1;let n=this.state.tracks[e];if(t<0||t>=n.events.length)return this.logger.error(this.t(`errorInvalidEventIndexWithValue`,{eventIndex:t})),!1;this.state.selectedEvent=null,this.state.selectedTrack=null,this.state.highlightedEvent={trackIndex:e,eventIndex:t};let r=n.events[t];return this.notifyChange(`highlight:change`),this.setStatus(this.t(`statusEventHighlighted`,{title:r.title})),!0}clearHighlight(){(this.state.highlightedEvent||this.state.selectedEvent)&&(this.state.highlightedEvent=null,this.state.selectedEvent=null,this.state.selectedTrack=null,this.notifyChange(`highlight:change`),this.setStatus(this.t(`statusHighlightCleared`)))}getHighlightedEvent(){return this.state.highlightedEvent}isReadOnly(){return this.config.readOnly}destroy(){this.clearGuideLineCache(),this.eventListeners&&=(this.canvas.removeEventListener(`mousedown`,this.eventListeners.mousedown),this.canvas.removeEventListener(`mousemove`,this.eventListeners.mousemove),this.canvas.removeEventListener(`mouseup`,this.eventListeners.mouseup),this.canvas.removeEventListener(`mouseleave`,this.eventListeners.mouseleave),this.canvas.removeEventListener(`contextmenu`,this.eventListeners.contextmenu),this.canvas.removeEventListener(`wheel`,this.eventListeners.wheel),null),this.setStatus(this.t(`statusTimelineDestroyed`))}clearGuideLineCache(){this.guideLineService.clearCache()}getPluginId(e){return`${e.metadata.name}@${e.metadata.version}`}isThemePlugin(e){return e.metadata.type===T.THEME}redrawAfterPluginChange(){this.markDirty([`background`,`tracks`,`timeline`,`guideLines`,`indicator`,`scrollbar`,`interaction`,`overlay`]),this.draw()}};function we(e,t){if(!e.descriptionI18n)return e.description;let n=_(t);return e.descriptionI18n[n]||e.descriptionI18n.zh||e.description}export{O as ContextMenuPlugin,D as DarkThemePlugin,g as EventMediaPlugin,te as EventTooltipPlugin,E as LightThemePlugin,k as PerformanceOverlayPlugin,ee as PluginPriority,T as PluginType,Ce as Timeline,l as createTimelineMessages,e as formatTime,b as getCurrentTime,we as getPluginMetadataDescription};
1
+ import{_ as e,a as t,b as n,c as r,d as i,f as a,g as o,h as s,i as c,l,m as u,n as d,o as f,p,r as m,s as h,t as g,u as _,v,x as y,y as b}from"./EventMediaPlugin-Co_Fr3CX.mjs";import{i as x,n as S,r as C,t as w}from"./Logger-BTKQPGDj.mjs";import{n as T,t as E}from"./types-NnKZYB1U.mjs";import{t as D}from"./LightThemePlugin-BigH_oWz.mjs";import{t as O}from"./DarkThemePlugin-oE6DVEib.mjs";import{t as ee}from"./ContextMenuPlugin-DkjzERie.mjs";import{t as k}from"./PerformanceOverlayPlugin-o5al1GSm.mjs";import{t as A}from"./EventTooltipPlugin-mbadM95i.mjs";var j=class{constructor(e,t){this.H_SCROLLBAR_PADDING=13,this.config=e,this.state=t}getContentWidth(e){if(this.cwZoom===e&&this.cwValue!==void 0)return this.cwValue;let t=this.config.endTime+this.config.endPaddingTime-this.config.startTime,n=this.config.startPaddingTime+t*this.config.secondWidth*e;return this.cwZoom=e,this.cwValue=n,n}invalidateCache(){this.cwZoom=void 0,this.cwValue=void 0}getContentHeight(){return this.config.timelineHeight+this.config.firstTrackTopMargin+this.state.tracks.length*(this.config.trackHeight+this.config.trackMargin)}computeMaxScrollX(e,t){let n=this.getContentWidth(e);return Math.max(0,n-t)}computeMaxScrollY(e){let t=this.getContentHeight();return Math.max(0,t-e)}hasHorizontalScrollbar(e,t){return this.getContentWidth(t)>e}getAvailableHeight(e,t,n){return e-(this.hasHorizontalScrollbar(t,n)?this.H_SCROLLBAR_PADDING:0)}computeMaxScrollYWithPadding(e,t,n){let r=this.getContentHeight(),i=this.getAvailableHeight(e,t,n);return Math.max(0,r-i)}};const M=x(`RenderPipeline`);let N=0;function te(e){return e!==`background`&&e!==`overlay`}var ne=class{constructor(){this.renderers=new Map,this.renderOrder=[`background`,`tracks`,`timeline`,`guideLines`,`indicator`,`interaction`,`scrollbar`,`overlay`],this.stats={layerTimes:{},totalTime:0,renderedLayers:0,skippedLayers:0}}registerRenderer(e,t){this.renderers.set(e,t)}unregisterRenderer(e){this.renderers.delete(e)}setRenderOrder(e){this.renderOrder=e}render(e,t={}){let n=performance.now(),{forceFullRender:r=!1,dirtyLayers:a,skipPerfMeasure:o=!1}=t,s=n-N>=250;s&&(N=n,M.debugStyled(w.pipeline,`▶ Render Start`,`forceFullRender=${r}`,a?`dirtyLayers=[${Array.from(a).join(`, `)}]`:`dirtyLayers=all`)),this.stats.renderedLayers=0,this.stats.skippedLayers=0,this.stats.layerTimes={};for(let t of this.renderOrder){let n=this.renderers.get(t);if(!n)continue;if(!this.shouldRenderLayer(t,n,e,r,a)){this.stats.skippedLayers++;continue}let s=o?0:performance.now();try{let r=te(t)?e.pluginManager?.getCoreLayerHooks(t):void 0;r&&r.length>0?this.executeWithHooks(e,n,r):n.render(e),this.stats.renderedLayers++}catch(n){M.error(`${i(e.config,`errorRenderLayer`,{layer:t})}:`,n)}o||(this.stats.layerTimes[t]=performance.now()-s)}return this.stats.totalTime=performance.now()-n,s&&M.debugStyled(w.pipeline,`◀ Render End`,`rendered=${this.stats.renderedLayers}, skipped=${this.stats.skippedLayers}, time=${this.stats.totalTime.toFixed(2)}ms`),{...this.stats}}executeWithHooks(e,t,n){let r={width:e.width,height:e.height,getContext:e.canvas.getContext.bind(e.canvas)},a=()=>t.render(e);for(let t=n.length-1;t>=0;t--){let o=n[t],s=a;a=()=>{try{o.handler(e.ctx,r,e.config,e.state,s)}catch(t){M.error(`${i(e.config,`errorCoreLayerHook`,{hook:o.name})}:`,t),s()}}}a()}shouldRenderLayer(e,t,n,r,i){return r||!i?!0:i.has(e)}getStats(){return{...this.stats}}clearPrevContext(){}getRegisteredRenderers(){return this.renderers}},re=class{constructor(){this.name=`Timeline`,this.layer=`timeline`}render(e){let{ctx:t,config:n,state:r,width:i}=e;t.fillStyle=n.colors.timelineBackground,t.fillRect(0,0,i,n.timelineHeight),t.strokeStyle=n.colors.timelineGrid,t.lineWidth=1,t.globalAlpha=.4,t.beginPath(),t.moveTo(0,n.timelineHeight-.5),t.lineTo(i,n.timelineHeight-.5),t.stroke(),t.globalAlpha=1;let a=n.startTime+(r.scrollX-n.startPaddingTime)/(n.secondWidth*r.zoomLevel),o=a+i/(n.secondWidth*r.zoomLevel),s=Math.max(n.startTime,Math.floor(a)),c=Math.min(n.endTime+n.endPaddingTime,Math.ceil(o));this.isCustomScaleMode(n)?this.renderCustomScale(t,n,r,s,c,i):this.renderAutoScale(t,n,r,s,c,i)}isCustomScaleMode(e){return e.scale!=null&&e.scale>0}renderCustomScale(e,t,n,r,i,a){let o=t.scale,s=Math.max(1,Math.floor(t.scaleSplitCount)),c=o/s;this.renderCustomMainTicks(e,t,n,o,r,i,a),s>1&&this.renderCustomSubTicks(e,t,n,o,c,r,i,a)}renderCustomMainTicks(e,t,n,r,i,a,o){let s=t.timelineHeight,c=Math.floor(i/r)*r,l=-80;e.strokeStyle=t.colors.timelineGrid,e.lineWidth=1.5,e.fillStyle=t.colors.timelineText,e.font=`12px Arial`,e.textBaseline=`top`;for(let i=c;i<=a;i+=r){let a=this.timeToX(i,t,n);if(a>=-50&&a<=o+50){let n=i>t.endTime;if(a-l>=80){e.strokeStyle=n?`rgba(150, 155, 165, 0.3)`:t.colors.timelineGrid,e.beginPath(),e.moveTo(a,s),e.lineTo(a,s-14),e.stroke(),e.fillStyle=n?`rgba(150, 155, 165, 0.4)`:t.colors.timelineText,e.textAlign=`center`;let o=t.getScaleRender?t.getScaleRender(i):this.formatTime(i,this.autoDetectFormat(r));e.fillText(o,a,5),l=a}}}e.textBaseline=`alphabetic`}renderCustomSubTicks(e,t,n,r,i,a,o,s){let c=t.timelineHeight,l=Math.floor(a/i)*i;e.lineWidth=1,e.strokeStyle=t.colors.timelineSubGrid;for(let a=l;a<=o;a+=i){let i=a/r;if(Math.abs(i-Math.round(i))<1e-9)continue;let o=this.timeToX(a,t,n);o>=0&&o<=s&&(e.globalAlpha=a>t.endTime?.3:.75,e.beginPath(),e.moveTo(o,c),e.lineTo(o,c-6),e.stroke(),e.globalAlpha=1)}}renderAutoScale(e,t,n,r,i,a){let o=[{threshold:10,main:10,sub:2,format:`HMS`},{threshold:8,main:30,sub:10,format:`HMS`},{threshold:5,main:60,sub:15,format:`HMS`},{threshold:3,main:300,sub:60,format:`HM`},{threshold:2,main:600,sub:120,format:`HM`},{threshold:1,main:1800,sub:600,format:`HM`},{threshold:.5,main:3600,sub:900,format:`H`},{threshold:0,main:7200,sub:1800,format:`H`}],s=o.find(e=>n.zoomLevel>=e.threshold)||o[o.length-1];this.renderAutoMainTicks(e,t,n,s,r,i,a),this.renderAutoSubTicks(e,t,n,s,r,i,a),n.zoomLevel>=10&&this.renderAutoMicroTicks(e,t,n,s,r,i,a)}renderAutoMainTicks(e,t,n,r,i,a,o){let s=t.timelineHeight,c=r.main,l=Math.floor(i/c)*c,u=-80;e.strokeStyle=t.colors.timelineGrid,e.lineWidth=1.5,e.fillStyle=t.colors.timelineText,e.font=`12px Arial`,e.textBaseline=`top`;for(let i=l;i<=a;i+=c){let a=this.timeToX(i,t,n);if(a>=-50&&a<=o+50){let n=i>t.endTime;if(a-u>=80){e.strokeStyle=n?`rgba(150, 155, 165, 0.3)`:t.colors.timelineGrid,e.beginPath(),e.moveTo(a,s),e.lineTo(a,s-14),e.stroke(),e.fillStyle=n?`rgba(150, 155, 165, 0.4)`:t.colors.timelineText,e.textAlign=`center`;let o=t.getScaleRender?t.getScaleRender(i):this.formatTime(i,r.format);e.fillText(o,a,5),u=a}}}e.textBaseline=`alphabetic`}renderAutoSubTicks(e,t,n,r,i,a,o){let s=t.timelineHeight,c=r.sub,l=r.main,u=Math.floor(i/c)*c;e.lineWidth=1,e.strokeStyle=t.colors.timelineSubGrid;for(let r=u;r<=a;r+=c){if(r%l===0)continue;let i=this.timeToX(r,t,n);i>=0&&i<=o&&(e.globalAlpha=r>t.endTime?.3:.75,e.beginPath(),e.moveTo(i,s),e.lineTo(i,s-6),e.stroke(),e.globalAlpha=1)}}renderAutoMicroTicks(e,t,n,r,i,a,o){let s=t.timelineHeight,c=r.sub/2,l=Math.floor(i/c)*c;e.lineWidth=1,e.strokeStyle=t.colors.timelineSubGrid,e.globalAlpha=.3;for(let i=l;i<=a;i+=c){if(i%r.sub===0)continue;let a=this.timeToX(i,t,n);a>=0&&a<=o&&(e.beginPath(),e.moveTo(a,s),e.lineTo(a,s-3),e.stroke())}e.globalAlpha=1}timeToX(e,t,n){let r=e-t.startTime;return t.startPaddingTime+r*t.secondWidth*n.zoomLevel-n.scrollX}autoDetectFormat(e){return e<60?`HMS`:e<3600?`HM`:`H`}formatTime(e,t){let n=Math.floor(e/3600),r=Math.floor(e%3600/60),i=Math.floor(e%60);switch(t){case`HMS`:return`${n.toString().padStart(2,`0`)}:${r.toString().padStart(2,`0`)}:${i.toString().padStart(2,`0`)}`;case`HM`:return`${n.toString().padStart(2,`0`)}:${r.toString().padStart(2,`0`)}`;case`H`:return`${n.toString().padStart(2,`0`)}:00`;default:return`${n.toString().padStart(2,`0`)}:${r.toString().padStart(2,`0`)}`}}shouldRender(e,t){if(!t)return!0;let{config:n,state:r}=e,{config:i,state:a}=t;return r.zoomLevel!==a.zoomLevel||r.scrollX!==a.scrollX||n.startTime!==i.startTime||n.endTime!==i.endTime||n.timelineHeight!==i.timelineHeight||n.scale!==i.scale||n.scaleSplitCount!==i.scaleSplitCount||n.getScaleRender!==i.getScaleRender}};const ie=x(`EventsRenderer`),P=new Map;var ae=class{renderEvents(e,t,n,r,i,a,o,s){let c=s??a.width,l=n.tracks[r],u=Math.max(5,t.trackHeight*.0625),d=t.trackHeight-u*2,f=t.eventTextStyle,m=f.titleFontSize===`auto`?Math.max(10,Math.min(14,t.trackHeight*.175)):f.titleFontSize,h=f.timeFontSize===`auto`?Math.max(8,Math.min(12,t.trackHeight*.15)):f.timeFontSize,g=performance.now();g-(P.get(r)??0)>=500&&(P.set(r,g),ie.debugStyled(w.eventRender,`Track ${r}: ${l.events.length} events`));for(let s=0;s<l.events.length;s++){let g=l.events[s];if(n.draggingEvent&&n.draggingEvent.isDragging&&n.draggingEvent.trackIndex===r&&n.draggingEvent.eventIndex===s)continue;let _=t.startPaddingTime+(g.startTime-t.startTime)*t.secondWidth*n.zoomLevel-n.scrollX,v=g.duration*t.secondWidth*n.zoomLevel;if(_+v<0||_>c)continue;let y=n.selectedEvent&&n.selectedEvent.trackIndex===r&&n.selectedEvent.eventIndex===s,b=n.highlightedEvent&&n.highlightedEvent.trackIndex===r&&n.highlightedEvent.eventIndex===s,x=n.timeIndicatorPosition,S=t.enableTimeIndicator&&!n.isManualSelection&&x>g.startTime&&x<g.endTime,C=y||b||S;e.save();let w=t.eventBlockStyle.borderRadius;e.fillStyle=g.color,w>0?(p(e,_,i+u,v,d,w),e.fill()):e.fillRect(_,i+u,v,d),e.restore(),o&&o.emitEvent(`render:event:media`,e,a,t,n,r,s,_,i,v,u,d),C&&(e.save(),e.strokeStyle=t.colors.eventBorderSelected,e.lineWidth=2,t.eventBlockStyle.enableSelectionGlow&&(e.shadowColor=t.colors.eventBorderSelected,e.shadowBlur=t.eventBlockStyle.selectionGlowBlur),w>0?p(e,_,i+u,v,d,w,!0):e.strokeRect(_,i+u,v,d),e.shadowBlur=0,e.restore()),this.drawEventText(e,t,g,_,i,v,u,m,h,f),t.enableEventResize&&this.drawResizeHandles(e,t,n,r,s,_,i,v,d,u),t.showEventDurationLabel&&C&&this.drawEventDurationLabel(e,t,g,_,i,v,u),t.enableEventSplit&&n.hoveredSplitLine&&!n.draggingEvent&&!n.resizingEvent&&!n.draggingTimeIndicator&&this.drawSplitLine(e,t,n,r,s,i,u,d)}}truncateText(e,t,n){if(n<=0)return``;if(e.measureText(t).width<=n)return t;if(e.measureText(`...`).width>=n)return`...`;let r=0,i=t.length,a=``;for(;r<i;){let o=Math.floor((r+i+1)/2),s=t.substring(0,o)+`...`;e.measureText(s).width<=n?(a=s,r=o):i=o-1}return a||`...`}drawEventText(e,t,n,r,i,a,o,s,c,l){let u=l.titleColor||t.colors.eventText,d=l.timeColor||t.colors.eventText,f={left:r+10,right:r+a-10,center:r+a/2}[l.textAlign]??r+a/2,p={top:i+o+s,middle:i+t.trackHeight/2,bottom:i+t.trackHeight-o}[l.verticalAlign]??i+o;e.textAlign=l.textAlign;let m=l.showTitle&&t.trackHeight>=l.minHeightForTitle,h=l.showTime&&t.trackHeight>=l.minHeightForTime,g=v(n.startTime,n.endTime),_=a-20;if(m){e.fillStyle=u,e.font=`${l.titleFontWeight} ${s}px ${l.titleFontFamily}`;let t=h?p-s/2+l.titleOffsetY:p+l.titleOffsetY,r=this.truncateText(e,n.title,_);e.fillText(r,f,t)}if(h){e.fillStyle=d,e.font=`${l.timeFontWeight} ${c}px ${l.timeFontFamily}`;let t=m?p+c+l.timeOffsetY:p+l.timeOffsetY,n=this.truncateText(e,g,_);e.fillText(n,f,t)}}drawResizeHandles(e,t,n,r,i,a,o,s,c,l){let u=n.hoveredResizeHandle&&n.hoveredResizeHandle.trackIndex===r&&n.hoveredResizeHandle.eventIndex===i,d=n.resizingEvent&&n.resizingEvent.trackIndex===r&&n.resizingEvent.eventIndex===i;if(n.selectedEvent&&n.selectedEvent.trackIndex===r&&n.selectedEvent.eventIndex===i||u||d){let r=t.resizeHandleWidth,i=`rgba(255, 255, 255, 0.8)`,f=`rgba(255, 255, 255, 1)`,p=u&&n.hoveredResizeHandle.edge===`left`,m=d&&n.resizingEvent.edge===`left`;e.fillStyle=p||m?f:i,e.fillRect(a-r/2,o+l,r,c);let h=u&&n.hoveredResizeHandle.edge===`right`,g=d&&n.resizingEvent.edge===`right`;e.fillStyle=h||g?f:i,e.fillRect(a+s-r/2,o+l,r,c)}}drawSplitLine(t,n,r,i,a,o,s,c){let l=r.hoveredSplitLine;if(l.trackIndex===i&&l.eventIndex===a){let i=(l.splitTime+n.startPaddingTime-n.startTime)*n.secondWidth*r.zoomLevel-r.scrollX;t.save(),t.strokeStyle=`rgba(255, 255, 0, 0.8)`,t.lineWidth=2,t.setLineDash([5,5]),t.beginPath(),t.moveTo(i,o+s),t.lineTo(i,o+s+c),t.stroke(),t.setLineDash([]),t.fillStyle=`rgba(255, 255, 0, 1)`,t.beginPath(),t.arc(i,o+s,4,0,Math.PI*2),t.fill(),t.beginPath(),t.arc(i,o+s+c,4,0,Math.PI*2),t.fill();let a=e(l.splitTime);t.font=`bold 11px Arial`,t.fillStyle=`rgba(255, 255, 0, 1)`,t.textAlign=`center`,t.fillText(`Split: ${a}`,i,o+s-5),t.restore()}}drawEventDurationLabel(e,t,n,r,i,a,s){e.save();let c=Math.round(n.duration*1e3)/1e3,l;l=t.formatEventDuration?t.formatEventDuration(c):o(c,t.eventDurationPrefix),e.font=`bold 11px Arial`,e.fillStyle=t.colors.eventDurationLabel,e.textAlign=`center`;let u=r+a/2,d=i+s-8;e.fillText(l,u,d),e.restore()}},oe=class{constructor(){this.name=`Tracks`,this.layer=`tracks`,this.eventsRenderer=new ae}render(e){let{ctx:t,canvas:n,config:r,state:i,pluginManager:a,width:o,height:s}=e,c=r.startPaddingTime-i.scrollX,l=this.eventsRenderer;for(let e=0;e<i.tracks.length;e++){let u=r.timelineHeight+r.firstTrackTopMargin+e*(r.trackHeight+r.trackMargin)-i.scrollY;if(u+r.trackHeight<r.timelineHeight||u>s)continue;let d;d=e===i.selectedTrack||i.highlightedEvent&&i.highlightedEvent.trackIndex===e||i.selectedEvent&&i.selectedEvent.trackIndex===e?r.colors.trackBackgroundSelected:r.colors.trackBackgroundOdd&&r.colors.trackBackgroundEven?e%2==0?r.colors.trackBackgroundOdd:r.colors.trackBackgroundEven:r.colors.trackBackground,t.fillStyle=d;let f=o-c;f>0&&t.fillRect(c,u,f,r.trackHeight),l.renderEvents(t,r,i,e,u,n,a,o)}}shouldRender(e,t){if(!t)return!0;let{config:n,state:r}=e,{config:i,state:a}=t;return r.tracks!==a.tracks||r.scrollY!==a.scrollY||r.scrollX!==a.scrollX||r.zoomLevel!==a.zoomLevel||r.selectedEvent!==a.selectedEvent||r.highlightedEvent!==a.highlightedEvent||n.trackHeight!==i.trackHeight||n.trackMargin!==i.trackMargin}},se=class{constructor(){this.name=`Scrollbar`,this.layer=`scrollbar`}render(e){let{ctx:t,config:n,state:r,width:i,height:a}=e;this.drawVerticalScrollbar(t,n,r,i,a),this.drawHorizontalScrollbar(t,n,r,i,a)}drawVerticalScrollbar(e,t,n,r,i){let a=t.startPaddingTime+(t.endTime+t.endPaddingTime-t.startTime)*t.secondWidth*n.zoomLevel>r?13:0,o=t.timelineHeight+t.firstTrackTopMargin+n.tracks.length*(t.trackHeight+t.trackMargin);if(o>i-a){let s=r-8-5,c=t.timelineHeight,l=i-t.timelineHeight-a-5;e.fillStyle=t.colors.scrollbarTrack,p(e,s,c,8,l,4);let u=(i-a-5)/o,d=Math.max(30,l*u),f=o-i+a+5,m=n.scrollY/f,h=c+(l-d)*m;e.fillStyle=n.draggingScrollbar?t.colors.scrollbarHandleHover:t.colors.scrollbarHandle,p(e,s,h,8,d,4),e.fillStyle=t.colors.scrollbarHandleHighlight,p(e,s,h,8,d/2,4),n.draggingScrollbar&&(e.strokeStyle=t.colors.scrollbarBorder,e.lineWidth=1,p(e,s,h,8,d,4,!0))}}drawHorizontalScrollbar(e,t,n,r,i){let a=t.startPaddingTime+(t.endTime+t.endPaddingTime-t.startTime)*t.secondWidth*n.zoomLevel;if(a<=r)return;let o=t.timelineHeight+t.firstTrackTopMargin+n.tracks.length*(t.trackHeight+t.trackMargin)>i?13:0,s=i-8-5,c=r-o;e.fillStyle=t.colors.scrollbarTrack,p(e,0,s,c,8,4);let l=r/a,u=Math.max(30,c*l),d=a-r,f=n.scrollX/d,m=0+(c-u)*f;e.fillStyle=n.draggingHorizontalScrollbar?t.colors.scrollbarHandleHover:t.colors.scrollbarHandle,p(e,m,s,u,8,4),e.fillStyle=t.colors.scrollbarHandleHighlight,p(e,m,s,u/2,8,4),n.draggingHorizontalScrollbar&&(e.strokeStyle=t.colors.scrollbarBorder,e.lineWidth=1,p(e,m,s,u,8,4,!0))}shouldRender(e,t){if(!t)return!0;let{state:n}=e,{state:r}=t;return n.scrollY!==r.scrollY||n.scrollX!==r.scrollX||n.draggingScrollbar!==r.draggingScrollbar||n.draggingHorizontalScrollbar!==r.draggingHorizontalScrollbar}},F=class{constructor(){this.name=`Indicator`,this.layer=`indicator`}render(e){let{ctx:t,config:n,state:r,width:i,height:a}=e;if(!n.enableTimeIndicator)return;let o=n.startPaddingTime+(r.timeIndicatorPosition-n.startTime)*n.secondWidth*r.zoomLevel-r.scrollX;if(o<-10||o>i+10)return;t.strokeStyle=n.colors.timeIndicator,t.lineWidth=n.timeIndicatorWidth,t.beginPath(),t.moveTo(o,n.timelineHeight),t.lineTo(o,a),t.stroke();let s=n.timeIndicatorHeadSize,c=n.timeIndicatorTriangleHeight,l=n.timelineHeight-s-c;t.fillStyle=n.colors.timeIndicator,t.fillRect(o-s/2,l,s,s),t.beginPath(),t.moveTo(o-s/2,l+s),t.lineTo(o+s/2,l+s),t.lineTo(o,l+s+c),t.closePath(),t.fill()}shouldRender(e,t){if(!t)return!0;let{config:n,state:r}=e,{config:i,state:a}=t;return n.enableTimeIndicator?r.timeIndicatorPosition!==a.timeIndicatorPosition||r.draggingTimeIndicator!==a.draggingTimeIndicator||r.scrollX!==a.scrollX||r.zoomLevel!==a.zoomLevel||n.timelineHeight!==i.timelineHeight:!1}},I=class{constructor(){this.name=`GuideLines`,this.layer=`guideLines`}render(t){let{ctx:n,config:r,state:i,width:a,height:o}=t;if(n.save(),i.guideLines.length>0){n.strokeStyle=r.colors.guideLine,n.lineWidth=2,n.setLineDash([5,5]);for(let t of i.guideLines){let s=r.startPaddingTime+(t.time-r.startTime)*r.secondWidth*i.zoomLevel-i.scrollX;s<-10||s>a+10||(n.beginPath(),n.moveTo(s,r.timelineHeight),n.lineTo(s,o),n.stroke(),n.setLineDash([]),n.fillStyle=r.colors.guideLineLabel,n.font=`bold 11px Arial`,n.textAlign=`center`,n.fillText(e(t.time),s,r.timelineHeight-5),n.setLineDash([5,5]))}}if(i.dragTimeReference){let t=r.startPaddingTime+(i.dragTimeReference.time-r.startTime)*r.secondWidth*i.zoomLevel-i.scrollX;if(t>=-10&&t<=a+10){let a=i.dragTimeReference.y-i.scrollY;n.strokeStyle=r.colors.dragTimeReferenceLine,n.lineWidth=2,n.setLineDash([8,4]),n.beginPath(),n.moveTo(t,r.timelineHeight),n.lineTo(t,a),n.stroke(),n.setLineDash([]),n.fillStyle=r.colors.dragTimeReferenceLabel,n.font=`bold 12px Arial`,n.textAlign=`center`;let o=e(i.dragTimeReference.time),s=n.measureText(o).width;n.fillStyle=r.colors.dragTimeReferenceLabelBackground,n.fillRect(t-s/2-4,r.timelineHeight-14-4-5,s+8,22),n.fillStyle=r.colors.dragTimeReferenceLabel,n.fillText(o,t,r.timelineHeight-5)}}n.restore()}shouldRender(e,t){if(!t)return!0;let{state:n}=e,{state:r}=t;return n.guideLines!==r.guideLines||n.dragTimeReference!==r.dragTimeReference||n.scrollX!==r.scrollX||n.scrollY!==r.scrollY||n.zoomLevel!==r.zoomLevel}},L=class{constructor(){this.name=`Interaction`,this.layer=`interaction`}render(e){let{ctx:t,config:n,state:r}=e;!r.draggingEvent||!r.draggingEvent.isDragging||(this.renderDragPreview(t,n,r),this.renderDraggingEvent(t,n,r))}renderDragPreview(e,t,n){if(!n.draggingEvent||!n.tracks[n.draggingEvent.trackIndex])return;let r=n.tracks[n.draggingEvent.trackIndex].events[n.draggingEvent.eventIndex];if(!r)return;let i=n.draggingEvent.currentMouseY||0,a=n.draggingEvent.canMove!==!1,o=Math.floor((i-t.timelineHeight-t.firstTrackTopMargin)/(t.trackHeight+t.trackMargin)),s=Math.max(0,Math.min(n.tracks.length-1,o)),c=t.timelineHeight+t.firstTrackTopMargin+s*(t.trackHeight+t.trackMargin),l=(n.draggingEvent.currentMouseX||0)-n.dragOffsetX,u=r.duration*t.secondWidth*n.zoomLevel,d=Math.max(5,t.trackHeight*.0625),f=t.trackHeight-d*2,m=t.eventBlockStyle.borderRadius;e.save(),a?(e.fillStyle=t.colors.dragPreviewValid,e.strokeStyle=t.colors.dragPreviewBorderValid):(e.fillStyle=t.colors.dragPreviewInvalid,e.strokeStyle=t.colors.dragPreviewBorderInvalid),e.lineWidth=2,e.setLineDash([5,5]),e.globalAlpha=.6,m>0?(p(e,l,c-n.scrollY+d,u,f,m),e.fill(),e.stroke()):(e.fillRect(l,c-n.scrollY+d,u,f),e.strokeRect(l,c-n.scrollY+d,u,f)),e.restore()}renderDraggingEvent(e,t,n){if(!n.draggingEvent||!n.tracks[n.draggingEvent.trackIndex].events)return;let r=n.tracks[n.draggingEvent.trackIndex].events[n.draggingEvent.eventIndex];if(!r)return;let i=n.draggingEvent.currentMouseX||0,a=n.draggingEvent.currentMouseY||0,o=i-n.dragOffsetX,s=a-n.dragOffsetY-n.scrollY,c=r.duration*t.secondWidth*n.zoomLevel,l=Math.max(5,t.trackHeight*.0625),u=t.trackHeight-l*2;e.save();let d=t.eventBlockStyle.borderRadius;e.fillStyle=r.color,d>0?(p(e,o,s+l,c,u,d),e.fill()):e.fillRect(o,s+l,c,u),e.strokeStyle=t.colors.eventBorderSelected,e.lineWidth=2,t.eventBlockStyle.enableSelectionGlow&&(e.shadowColor=t.colors.eventBorderSelected,e.shadowBlur=t.eventBlockStyle.selectionGlowBlur),d>0?(p(e,o,s+l,c,u,d),e.stroke()):e.strokeRect(o,s+l,c,u),e.shadowBlur=0,e.restore(),this.renderEventText(e,t,r,o,s,c,l)}renderEventText(t,n,r,i,a,o,s){let c=n.eventTextStyle,l=c.titleColor||n.colors.eventText,u=c.timeColor||n.colors.eventText,d={left:i+10,right:i+o-10,center:i+o/2}[c.textAlign]??i+o/2,f={top:a+s,middle:a+n.trackHeight/2,bottom:a+n.trackHeight-s}[c.verticalAlign]??a+s;t.textAlign=c.textAlign;let p=c.showTitle&&n.trackHeight>=c.minHeightForTitle,m=c.showTime&&n.trackHeight>=c.minHeightForTime,h=c.titleFontSize===`auto`?Math.max(10,Math.min(14,n.trackHeight*.175)):c.titleFontSize,g=c.timeFontSize===`auto`?Math.max(8,Math.min(12,n.trackHeight*.15)):c.timeFontSize,_=`${e(r.startTime)} - ${e(r.endTime)}`;if(p){t.fillStyle=l,t.font=`${c.titleFontWeight} ${h}px ${c.titleFontFamily}`;let e=m?f-(typeof h==`number`?h:14)/2+c.titleOffsetY:f+c.titleOffsetY;t.fillText(r.title,d,e)}if(m){t.fillStyle=u,t.font=`${c.timeFontWeight} ${g}px ${c.timeFontFamily}`;let e=p?f+(typeof g==`number`?g:12)+c.timeOffsetY:f+c.timeOffsetY;t.fillText(_,d,e)}}shouldRender(e,t){if(!t)return!0;let{state:n}=e,{state:r}=t;return!!(n.draggingEvent!==r.draggingEvent||n.draggingEvent&&r.draggingEvent&&(n.draggingEvent.currentMouseX!==r.draggingEvent.currentMouseX||n.draggingEvent.currentMouseY!==r.draggingEvent.currentMouseY))}};function R(e,t,n,r,i,a){return{ctx:e,canvas:t,config:n,state:r,dpr:i,width:t.width/i,height:t.height/i,pluginManager:a}}const z=x(`LayerBuffer`),B={background:`background`,tracks:`main`,timeline:`main`,guideLines:`main`,indicator:`main`,scrollbar:`main`,interaction:`interaction`,overlay:`overlay`},V=[`background`,`main`,`media`,`interaction`,`overlay`];function H(e,t){if(typeof OffscreenCanvas<`u`)try{let n=new OffscreenCanvas(e,t),r=n.getContext(`2d`);if(r)return{canvas:n,ctx:r}}catch(e){z.debug(`Failed to create OffscreenCanvas buffer, fallback to DOM canvas`,e)}let n=document.createElement(`canvas`);return n.width=e,n.height=t,{canvas:n,ctx:n.getContext(`2d`)}}var U=class{constructor(){this.buffers=new Map,this.width=0,this.height=0,this.dpr=1}initialize(e,t,n){this.width=e,this.height=t,this.dpr=n;let r=Math.max(1,Math.floor(e*n)),i=Math.max(1,Math.floor(t*n));for(let e of V){let t=this.buffers.get(e);if(t)t.canvas.width=r,t.canvas.height=i,t.dirty=!0;else{let{canvas:t,ctx:n}=H(r,i);this.buffers.set(e,{canvas:t,ctx:n,dirty:!0})}}z.debugStyled(w.pipeline,`LayerBufferManager initialized: ${r}x${i} (dpr=${n})`)}markDirtyFromLayers(e){for(let t of e){let e=B[t];if(e){let t=this.buffers.get(e);t&&(t.dirty=!0)}}}markDirty(e){let t=this.buffers.get(e);t&&(t.dirty=!0)}markAllDirty(){for(let e of this.buffers.values())e.dirty=!0}getBuffer(e){return this.buffers.get(e)}isDirty(e){return this.buffers.get(e)?.dirty??!0}clearDirty(e){let t=this.buffers.get(e);t&&(t.dirty=!1)}compositeToMain(e,t,n){e.save(),e.setTransform(1,0,0,1,0,0),e.clearRect(0,0,t,n);for(let t of V){let n=this.buffers.get(t);n&&e.drawImage(n.canvas,0,0)}e.restore()}isInitialized(){return this.buffers.size>0}getSize(){return{width:this.width,height:this.height,dpr:this.dpr}}dispose(){this.buffers.clear(),this.width=0,this.height=0}};const W=x(`DirtyCheck`);var G=class{constructor(e,t,n,r,i){this.cachedLogicalWidth=0,this.cachedLogicalHeight=0,this.cacheValid=!1,this.dirtyLayers=new Set([`background`,`tracks`,`timeline`,`guideLines`,`indicator`,`scrollbar`,`overlay`,`interaction`]),this.lastLayerTimes={},this.isFirstRender=!0,this.canvas=e,this.ctx=t,this.config=n,this.state=r,this.pluginManager=i,this.dpr=window.devicePixelRatio||1,this.logicalCanvas={width:0,height:0,getContext:this.canvas.getContext.bind(this.canvas)},this.viewport=new j(this.config,this.state),this.layerBufferManager=new U,this.renderPipeline=new ne,this.renderPipeline.registerRenderer(`timeline`,new re),this.renderPipeline.registerRenderer(`tracks`,new oe),this.renderPipeline.registerRenderer(`guideLines`,new I),this.renderPipeline.registerRenderer(`indicator`,new F),this.renderPipeline.registerRenderer(`scrollbar`,new se),this.renderPipeline.registerRenderer(`interaction`,new L)}setCanvasSize(e,t){let n=Math.floor(e*this.dpr),r=Math.floor(t*this.dpr);if(Math.abs(this.canvas.width-n)<1&&Math.abs(this.canvas.height-r)<1)return;this.canvas.width=n,this.canvas.height=r,this.canvas.style.width=`${e}px`,this.canvas.style.height=`${t}px`,this.invalidateCache();let i=this.getContentHeight(),a=Math.max(0,i-this.getCachedLogicalHeight());this.state.scrollY=Math.max(0,Math.min(a,this.state.scrollY)),this.state.zoomLevel<this.config.minAutoFitZoom&&(this.state.zoomLevel=this.config.minAutoFitZoom,this.state.scrollX=0),this.markAllDirty(),this.draw()}getCanvasLogicalWidth(){return this.canvas.width/this.dpr}getCanvasLogicalHeight(){return this.canvas.height/this.dpr}getCachedLogicalWidth(){return this.cacheValid||=(this.cachedLogicalWidth=this.canvas.width/this.dpr,this.cachedLogicalHeight=this.canvas.height/this.dpr,!0),this.cachedLogicalWidth}getCachedLogicalHeight(){return this.cacheValid||=(this.cachedLogicalWidth=this.canvas.width/this.dpr,this.cachedLogicalHeight=this.canvas.height/this.dpr,!0),this.cachedLogicalHeight}invalidateCache(){this.cacheValid=!1}draw(){if(this.dirtyLayers.size===0&&!this.isFirstRender)return;this.pluginManager.measureStart(`draw`);let e=this.canvas.width/this.dpr,t=this.canvas.height/this.dpr;this.logicalCanvas.width=e,this.logicalCanvas.height=t;let n=this.logicalCanvas,r=this.layerBufferManager.getSize();if((!this.layerBufferManager.isInitialized()||r.width!==e||r.height!==t||r.dpr!==this.dpr)&&this.layerBufferManager.initialize(e,t,this.dpr),this.isFirstRender?this.layerBufferManager.markAllDirty():this.layerBufferManager.markDirtyFromLayers(this.dirtyLayers),this.layerBufferManager.isDirty(`background`)){let e=this.layerBufferManager.getBuffer(`background`),t=performance.now();e.ctx.clearRect(0,0,e.canvas.width,e.canvas.height),e.ctx.save(),e.ctx.scale(this.dpr,this.dpr),this.pluginManager.renderBackground(e.ctx,n,this.config,this.state),e.ctx.restore(),this.layerBufferManager.clearDirty(`background`),this.lastLayerTimes.background=performance.now()-t}if(this.layerBufferManager.isDirty(`main`)){let e=this.layerBufferManager.getBuffer(`main`);e.ctx.clearRect(0,0,e.canvas.width,e.canvas.height),e.ctx.save(),e.ctx.scale(this.dpr,this.dpr);let t=R(e.ctx,this.canvas,this.config,this.state,this.dpr,this.pluginManager);this.renderPipeline.render(t,{forceFullRender:!1,dirtyLayers:new Set([`tracks`,`timeline`,`guideLines`,`indicator`,`scrollbar`])}),e.ctx.restore(),this.layerBufferManager.clearDirty(`main`);let n=this.renderPipeline.getStats();this.lastLayerTimes={...this.lastLayerTimes,...n.layerTimes}}if(this.layerBufferManager.isDirty(`media`)&&this.layerBufferManager.clearDirty(`media`),this.layerBufferManager.isDirty(`interaction`)){let e=this.layerBufferManager.getBuffer(`interaction`);e.ctx.clearRect(0,0,e.canvas.width,e.canvas.height),e.ctx.save(),e.ctx.scale(this.dpr,this.dpr);let t=R(e.ctx,this.canvas,this.config,this.state,this.dpr,this.pluginManager);this.renderPipeline.render(t,{forceFullRender:!1,dirtyLayers:new Set([`interaction`])}),e.ctx.restore(),this.layerBufferManager.clearDirty(`interaction`)}if(this.layerBufferManager.isDirty(`overlay`)){let e=this.layerBufferManager.getBuffer(`overlay`),t=performance.now();e.ctx.clearRect(0,0,e.canvas.width,e.canvas.height),e.ctx.save(),e.ctx.scale(this.dpr,this.dpr),this.pluginManager.renderOverlay(e.ctx,n,this.config,this.state),e.ctx.restore(),this.layerBufferManager.clearDirty(`overlay`),this.lastLayerTimes.overlay=performance.now()-t}this.layerBufferManager.compositeToMain(this.ctx,this.canvas.width,this.canvas.height),this.isFirstRender&&=!1,this.pluginManager.measureEnd(`draw`),this.dirtyLayers.clear()}getContentWidth(e){return this.viewport.getContentWidth(e)}getContentHeight(){return this.viewport.getContentHeight()}computeMaxScrollX(e){return this.viewport.computeMaxScrollX(e,this.getCachedLogicalWidth())}computeMaxScrollY(){return this.viewport.computeMaxScrollYWithPadding(this.getCachedLogicalHeight(),this.getCachedLogicalWidth(),this.state.zoomLevel)}hasHorizontalScrollbar(){return this.viewport.hasHorizontalScrollbar(this.getCachedLogicalWidth(),this.state.zoomLevel)}getAvailableHeight(){return this.viewport.getAvailableHeight(this.getCachedLogicalHeight(),this.getCachedLogicalWidth(),this.state.zoomLevel)}invalidateLayoutCache(){this.viewport.invalidateCache()}markDirty(e){W.debugStyled(w.dataUpdate,`✓ Marking layers dirty: [${e.join(`, `)}]`);for(let t of e)this.dirtyLayers.add(t)}markAllDirty(){W.debugStyled(w.dataUpdate,`✓ Marking ALL layers dirty`),this.dirtyLayers=new Set([`background`,`tracks`,`timeline`,`guideLines`,`indicator`,`scrollbar`,`overlay`,`interaction`]),this.layerBufferManager.markAllDirty()}getLastLayerTimes(){return{...this.lastLayerTimes}}},K=class{constructor(e){this.logger=e}throw(e){throw this.logger.error(e),Error(e)}debug(e,t){this.logger.error(e,t)}debugIf(e,t,n){e&&this.debug(t,n)}fail(e,t,n){return this.debugIf(e,t,n),!1}error(e){this.logger.error(e)}warn(e){this.logger.warn(e)}},ce=class{constructor(e,t=new K(x(`PluginManager`))){this.baseContext=e,this.errorHandler=t,this.pluginResources=new Map,this.pluginMetadata=new Map,this.plugins=new Map,this.eventHandlers=new Map,this.renderLayers=new Map,this.renderLayerOwners=new Map,this.renderLayerOrder=new Map,this.coreLayerHooks=new Map,this.coreLayerHookOwners=new Map,this.coreLayerHookOrder=new Map,this.pluginData=new Map,this.registrationOrder=0}async loadPlugin(e){let{name:t,version:n}=e.metadata,r=`${t}@${n}`;if(this.plugins.has(r))return!1;if(!this.areDependenciesLoaded(e.metadata.dependencies))return this.errorHandler.fail(this.baseContext.config.debug,i(this.baseContext.config,`errorPluginDependenciesMissing`,{pluginId:r}),Error(`Missing dependencies: ${e.metadata.dependencies?.join(`, `)}`));this.pluginMetadata.set(r,e.metadata);let a=this.createPluginContext(r),o=!1,s=!1;try{return e.init&&(o=!0,await e.init(a)),e.activate&&(s=!0,await e.activate(a)),this.plugins.set(r,{plugin:e,context:a,active:!0}),!0}catch(t){return await this.rollbackFailedLoad(r,e,a,o,s),this.cleanupPluginResources(r),this.errorHandler.fail(this.baseContext.config.debug,i(this.baseContext.config,`errorPluginLoadFailed`,{pluginId:r}),t)}}async unloadPlugin(e){let t=this.plugins.get(e);if(!t)return!1;let n=await this.runLifecycleStep(e,`deactivate`,t.plugin.deactivate,t.context);await this.runLifecycleStep(e,`destroy`,t.plugin.destroy,t.context)||(n=!1);try{return n}finally{this.cleanupPluginResources(e),this.plugins.delete(e)}}async rollbackFailedLoad(e,t,n,r,i){i&&await this.runLifecycleStep(e,`rollback deactivate`,t.deactivate,n),(r||i)&&await this.runLifecycleStep(e,`rollback destroy`,t.destroy,n)}async runLifecycleStep(e,t,n,r){if(!n)return!0;try{return await n(r),!0}catch(n){return this.errorHandler.fail(this.baseContext.config.debug,i(this.baseContext.config,`errorPluginLifecycleFailed`,{step:t,pluginId:e}),n)}}createPluginContext(e){let t=new Map;this.pluginData.set(e,t),this.pluginResources.set(e,this.createPluginResources());let n={registerRenderLayer:t=>this.registerRenderLayer(e,t),unregisterRenderLayer:t=>this.unregisterRenderLayer(e,t),registerCoreLayerHook:t=>this.registerCoreLayerHook(e,t),unregisterCoreLayerHook:t=>this.unregisterCoreLayerHook(e,t),registerEventHandler:(t,n)=>this.registerEventHandler(e,t,n),unregisterEventHandler:(t,n)=>this.unregisterEventHandler(e,t,n),showNotification:(t,n=`info`)=>{let r=x(`plugin:${e}`);switch(n){case`error`:r.error(t);break;case`warning`:r.warn(t);break;default:r.info(t)}},getData:e=>t.get(e),setData:(e,n)=>t.set(e,n),setPerformanceProvider:t=>{this.performanceProvider=t,this.performanceProviderOwner=e},getPerformanceStats:()=>this.performanceProvider?this.performanceProvider.getAllStats():new Map,getFPS:()=>this.performanceProvider?this.performanceProvider.getFPS():0};return{...this.baseContext,api:n}}registerEventHandler(e,t,n){let r=this.eventHandlers.get(t)||[];r.push({pluginId:e,handler:n,priority:this.getPluginPriority(e),order:this.nextRegistrationOrder()}),r.sort((e,t)=>t.priority===e.priority?e.order-t.order:t.priority-e.priority),this.eventHandlers.set(t,r);let i=this.getPluginResources(e),a=i.eventHandlers.get(t)??new Set;a.add(n),i.eventHandlers.set(t,a)}unregisterEventHandler(e,t,n){let r=this.eventHandlers.get(t);if(!r)return;let i=r.filter(t=>!(t.pluginId===e&&t.handler===n));i.length===0?this.eventHandlers.delete(t):this.eventHandlers.set(t,i);let a=this.pluginResources.get(e),o=a?.eventHandlers.get(t);o&&(o.delete(n),o.size===0&&a?.eventHandlers.delete(t))}registerRenderLayer(e,t){this.reassignRenderLayerOwner(t.name,e),this.renderLayers.set(t.name,t),this.renderLayerOwners.set(t.name,e),this.renderLayerOrder.set(t.name,this.nextRegistrationOrder()),this.getPluginResources(e).renderLayers.add(t.name)}unregisterRenderLayer(e,t){this.renderLayerOwners.get(t)===e&&(this.renderLayers.delete(t),this.renderLayerOwners.delete(t),this.renderLayerOrder.delete(t),this.pluginResources.get(e)?.renderLayers.delete(t))}registerCoreLayerHook(e,t){this.reassignCoreLayerHookOwner(t.name,e),this.coreLayerHooks.set(t.name,t),this.coreLayerHookOwners.set(t.name,e),this.coreLayerHookOrder.set(t.name,this.nextRegistrationOrder()),this.getPluginResources(e).coreLayerHooks.add(t.name)}unregisterCoreLayerHook(e,t){this.coreLayerHookOwners.get(t)===e&&(this.coreLayerHooks.delete(t),this.coreLayerHookOwners.delete(t),this.coreLayerHookOrder.delete(t),this.pluginResources.get(e)?.coreLayerHooks.delete(t))}getCoreLayerHooks(e){return Array.from(this.coreLayerHooks.entries()).filter(([,t])=>t.target===e).sort(([e],[t])=>this.compareOwnedResources(e,t)).map(([,e])=>e)}hasCoreLayerHooks(e){for(let t of this.coreLayerHooks.values())if(t.target===e)return!0;return!1}cleanupPluginResources(e){let t=this.pluginResources.get(e);if(t){for(let[n,r]of t.eventHandlers){let t=this.eventHandlers.get(n);if(!t)continue;let i=t.filter(t=>!(t.pluginId===e&&r.has(t.handler)));i.length===0?this.eventHandlers.delete(n):this.eventHandlers.set(n,i)}for(let n of t.renderLayers)this.renderLayerOwners.get(n)===e&&(this.renderLayers.delete(n),this.renderLayerOwners.delete(n),this.renderLayerOrder.delete(n));for(let n of t.coreLayerHooks)this.coreLayerHookOwners.get(n)===e&&(this.coreLayerHooks.delete(n),this.coreLayerHookOwners.delete(n),this.coreLayerHookOrder.delete(n))}this.performanceProviderOwner===e&&(this.performanceProvider=void 0,this.performanceProviderOwner=void 0),this.pluginData.delete(e),this.pluginMetadata.delete(e),this.pluginResources.delete(e)}emitEvent(e,...t){let n=this.eventHandlers.get(e);if(!(!n||n.length===0))for(let r of n)try{r.handler(...t)}catch(t){this.errorHandler.debugIf(this.baseContext.config.debug,i(this.baseContext.config,`errorPluginEventFailed`,{event:e}),t)}}validateEvent(e,...t){let n=this.eventHandlers.get(e);if(!n||n.length===0)return!0;for(let r of n)try{if(r.handler(...t)===!1)return!1}catch(t){return this.errorHandler.debugIf(this.baseContext.config.debug,i(this.baseContext.config,`errorPluginValidationFailed`,{event:e}),t),!1}return!0}renderBackground(e,t,n,r){for(let i of this.layersByPosition(`background`))i.render(e,t,n,r)}renderOverlay(e,t,n,r){for(let i of this.layersByPosition(`overlay`))i.render(e,t,n,r)}layersByPosition(e){return Array.from(this.renderLayers.entries()).filter(([,t])=>t.position===e).sort(([e],[t])=>this.compareOwnedResources(e,t)).map(([,e])=>e)}getLoadedPlugins(){return Array.from(this.plugins.values()).map(e=>e.plugin)}isPluginLoaded(e){for(let[t]of this.plugins)if(t.startsWith(`${e}@`))return!0;return!1}measureStart(e){this.performanceProvider&&this.performanceProvider.startMeasurement(e)}measureEnd(e){this.performanceProvider&&this.performanceProvider.endMeasurement(e)}createPluginResources(){return{eventHandlers:new Map,renderLayers:new Set,coreLayerHooks:new Set}}getPluginResources(e){let t=this.pluginResources.get(e);return t||(t=this.createPluginResources(),this.pluginResources.set(e,t),t)}reassignRenderLayerOwner(e,t){let n=this.renderLayerOwners.get(e);!n||n===t||this.pluginResources.get(n)?.renderLayers.delete(e)}reassignCoreLayerHookOwner(e,t){let n=this.coreLayerHookOwners.get(e);!n||n===t||this.pluginResources.get(n)?.coreLayerHooks.delete(e)}areDependenciesLoaded(e){return!e||e.length===0?!0:e.every(e=>this.plugins.has(e)?!0:this.isPluginLoaded(e))}getPluginPriority(e){return this.pluginMetadata.get(e)?.priority??0}nextRegistrationOrder(){let e=this.registrationOrder;return this.registrationOrder+=1,e}compareOwnedResources(e,t){let n=this.renderLayerOwners.get(e)??this.coreLayerHookOwners.get(e),r=this.renderLayerOwners.get(t)??this.coreLayerHookOwners.get(t),i=n?this.getPluginPriority(n):0,a=r?this.getPluginPriority(r):0;return a===i?(this.renderLayerOrder.get(e)??this.coreLayerHookOrder.get(e)??0)-(this.renderLayerOrder.get(t)??this.coreLayerHookOrder.get(t)??0):a-i}},le=class{constructor(e){this.state={tracks:[],selectedTrack:null,selectedEvent:null,highlightedEvent:null,draggingEvent:null,dragOffsetX:0,dragOffsetY:0,resizingEvent:null,draggingTimeIndicator:!1,timeIndicatorDragOffsetX:0,draggingScrollbar:!1,scrollbarDragOffset:0,draggingHorizontalScrollbar:!1,horizontalScrollbarDragOffset:0,zoomLevel:1,scrollX:0,scrollY:0,snapEnabled:!0,timeIndicatorSnapEnabled:!0,contextMenuEvent:null,contextMenuVisible:!1,contextMenuX:0,contextMenuY:0,hoveredContextMenuItem:-1,timeIndicatorPosition:e.startTime,timeIndicatorHighlightedEvents:[],isManualSelection:!1,guideLines:[],dragTimeReference:null,hoveredResizeHandle:null,lastClickTime:0,lastClickEvent:null,hoveredSplitLine:null,statusText:i(e,`statusReady`),contextMenuBounds:null,lastDrawTime:0}}setStatus(e,t){this.state.statusText=e,t&&t(e)}},ue=class{constructor(e){this.sortedIndices=new Map,this.dirtyTracks=new Set,this.batching=!1,this.state=e}invalidateTrack(e){this.dirtyTracks.add(e)}invalidateAll(){this.sortedIndices.clear(),this.dirtyTracks.clear()}beginBatch(){this.batching=!0}endBatch(){if(this.batching){for(let e of Array.from(this.dirtyTracks)){let t=this.state.tracks[e],n=t.events.map((e,t)=>t);n.sort((e,n)=>t.events[e].startTime-t.events[n].startTime),this.sortedIndices.set(e,n)}this.dirtyTracks.clear(),this.batching=!1}}ensureSorted(e){if(this.batching&&this.sortedIndices.has(e)&&!this.dirtyTracks.has(e))return this.sortedIndices.get(e);if(this.dirtyTracks.has(e)||!this.sortedIndices.has(e)){let t=this.state.tracks[e],n=t.events.map((e,t)=>t);n.sort((e,n)=>t.events[e].startTime-t.events[n].startTime),this.sortedIndices.set(e,n),this.dirtyTracks.delete(e)}return this.sortedIndices.get(e)}getCandidatesByTime(e,t,n=0){let r=this.ensureSorted(e),i=this.state.tracks[e],a=0,o=r.length-1,s=-1,c=t+n;for(;a<=o;){let e=a+o>>1,t=r[e];i.events[t].startTime<=c?(s=e,a=e+1):o=e-1}if(s===-1)return[];let l=[];for(let e=s;e>=0;e--){let a=r[e],o=i.events[a];o.startTime>t+n||o.endTime<t-n||l.push(a)}for(let e=s+1;e<r.length;e++){let a=r[e];if(i.events[a].startTime>t+n)break;l.push(a)}return l}};const q=x(`ChangeScheduler`);var de=class{constructor(e,t,n){this.renderManager=null,this.eventIndexManager=null,this.drawFn=null,this.handlers=new Map,this.batchContext=null,this.isBatching=!1,this.highlightChanged=!1,this.state=e,this.config=t,this.callbacks=n,this.initializeHandlers()}setRenderManager(e){this.renderManager=e}setEventIndexManager(e){this.eventIndexManager=e}setDrawFunction(e){this.drawFn=e}initializeHandlers(){this.handlers.set(`events:add`,{layers:[`tracks`,`timeline`,`scrollbar`,`indicator`],derive:()=>this.refreshHighlightList(),needsDraw:!0}),this.handlers.set(`events:update`,{layers:[`tracks`,`timeline`,`scrollbar`,`indicator`],derive:()=>this.refreshHighlightList(),needsDraw:!0}),this.handlers.set(`events:delete`,{layers:[`tracks`,`timeline`,`scrollbar`,`indicator`],derive:()=>this.refreshHighlightList(),needsDraw:!0}),this.handlers.set(`events:move`,{layers:[`tracks`,`timeline`,`scrollbar`,`guideLines`,`indicator`,`interaction`],derive:()=>this.refreshHighlightList(),needsDraw:!0}),this.handlers.set(`events:split`,{layers:[`tracks`,`timeline`,`scrollbar`,`indicator`],derive:()=>this.refreshHighlightList(),needsDraw:!0}),this.handlers.set(`tracks:add`,{layers:[`tracks`,`timeline`,`scrollbar`],derive:()=>this.refreshHighlightList(),needsDraw:!0}),this.handlers.set(`tracks:remove`,{layers:[`tracks`,`timeline`,`scrollbar`],derive:()=>this.refreshHighlightList(),needsDraw:!0}),this.handlers.set(`timeIndicator:move`,{layers:[`indicator`,`tracks`,`timeline`,`interaction`],derive:()=>this.computeHighlightList(),notify:()=>this.emitTimeIndicatorHighlight(),needsDraw:!0}),this.handlers.set(`timeIndicator:drag`,{layers:[`indicator`,`tracks`,`interaction`],derive:()=>this.computeHighlightList(),needsDraw:!0}),this.handlers.set(`scroll:x`,{layers:[`tracks`,`timeline`,`guideLines`,`indicator`,`scrollbar`,`interaction`],needsDraw:!0}),this.handlers.set(`scroll:y`,{layers:[`tracks`,`timeline`,`guideLines`,`indicator`,`scrollbar`,`interaction`,`overlay`],needsDraw:!0}),this.handlers.set(`zoom:change`,{layers:[`background`,`tracks`,`timeline`,`guideLines`,`indicator`,`scrollbar`,`interaction`,`overlay`],needsDraw:!0}),this.handlers.set(`selection:change`,{layers:[`tracks`,`interaction`,`indicator`],needsDraw:!0}),this.handlers.set(`highlight:change`,{layers:[`tracks`,`indicator`],needsDraw:!0}),this.handlers.set(`canvas:resize`,{layers:[`background`,`tracks`,`timeline`,`guideLines`,`indicator`,`scrollbar`,`interaction`,`overlay`],needsDraw:!0}),this.handlers.set(`data:load`,{layers:[`tracks`,`timeline`,`scrollbar`,`guideLines`],derive:()=>this.refreshHighlightList(),needsDraw:!0}),this.handlers.set(`theme:change`,{layers:[`background`,`tracks`,`timeline`,`indicator`,`scrollbar`,`overlay`],needsDraw:!0}),this.handlers.set(`interaction:hover`,{layers:[`tracks`,`interaction`,`overlay`],needsDraw:!0}),this.handlers.set(`interaction:contextMenu`,{layers:[`overlay`,`interaction`],needsDraw:!0}),this.handlers.set(`interaction:splitLine`,{layers:[`tracks`],needsDraw:!0}),this.handlers.set(`config:debug`,{layers:[`overlay`],needsDraw:!0}),this.handlers.set(`config:timeIndicator`,{layers:[`indicator`,`tracks`,`interaction`],derive:()=>this.refreshHighlightList(),needsDraw:!0}),this.handlers.set(`config:endTime`,{layers:[`background`,`tracks`,`timeline`,`guideLines`,`indicator`,`scrollbar`,`interaction`,`overlay`],needsDraw:!0}),this.handlers.set(`config:readOnly`,{layers:[`tracks`,`interaction`,`overlay`],needsDraw:!0})}notify(e){let t=this.handlers.get(e);if(!t){q.warn(i(this.config,`warningUnknownChangeType`,{change:e}));return}if(this.isBatching&&this.batchContext){this.batchContext.changes.add(e);for(let e of t.layers)this.batchContext.dirtyLayers.add(e);t.derive&&this.batchContext.pendingDerives.push(t.derive),t.notify&&this.batchContext.pendingNotifications.push(t.notify)}else this.processChange(t)}notifyMultiple(e){this.beginBatch();for(let t of e)this.notify(t);this.endBatch()}beginBatch(){if(this.isBatching){q.warn(i(this.config,`warningAlreadyInBatchMode`));return}this.isBatching=!0,this.batchContext={changes:new Set,dirtyLayers:new Set,pendingNotifications:[],pendingDerives:[]}}endBatch(){if(!this.isBatching||!this.batchContext){q.warn(i(this.config,`warningNotInBatchMode`));return}let e=this.batchContext;if(this.isBatching=!1,this.batchContext=null,e.changes.size===0)return;let t=[...new Set(e.pendingDerives)];for(let e of t)e();this.renderManager&&e.dirtyLayers.size>0&&this.renderManager.markDirty(Array.from(e.dirtyLayers)),this.drawFn&&this.drawFn();let n=[...new Set(e.pendingNotifications)];for(let e of n)e()}processChange(e){e.derive&&e.derive(),this.renderManager&&e.layers.length>0&&this.renderManager.markDirty(e.layers),e.needsDraw&&this.drawFn&&this.drawFn(),e.notify&&e.notify()}refreshHighlightList(){this.state.timeIndicatorHighlightedEvents=this.detectHighlightedEvents(this.state.timeIndicatorPosition)}computeHighlightList(){let e=this.state.timeIndicatorPosition,t=this.detectHighlightedEvents(e),n=this.hasHighlightChanged(this.state.timeIndicatorHighlightedEvents,t);this.state.timeIndicatorHighlightedEvents=t,this.highlightChanged=n}hasHighlightChanged(e,t){if(e.length!==t.length)return!0;for(let n=0;n<e.length;n++)if(e[n].trackIndex!==t[n].trackIndex||e[n].eventIndex!==t[n].eventIndex)return!0;return!1}detectHighlightedEvents(e){if(!this.config.enableTimeIndicator)return[];let t=[];if(this.eventIndexManager)for(let n=0;n<this.state.tracks.length;n++){let r=this.eventIndexManager.getCandidatesByTime(n,e,0),i=this.state.tracks[n];for(let a of r){let r=i.events[a];r&&e>r.startTime&&e<r.endTime&&t.push({trackIndex:n,eventIndex:a})}}else for(let n=0;n<this.state.tracks.length;n++){let r=this.state.tracks[n];for(let i=0;i<r.events.length;i++){let a=r.events[i];e>a.startTime&&e<a.endTime&&t.push({trackIndex:n,eventIndex:i})}}return t}emitTimeIndicatorHighlight(){if(this.highlightChanged){if(this.callbacks.onTimeIndicatorHighlight){let e=this.state.timeIndicatorPosition,t=this.state.timeIndicatorHighlightedEvents.filter(({trackIndex:e,eventIndex:t})=>{let n=this.state.tracks[e];return n&&t<n.events.length}).map(({trackIndex:e,eventIndex:t})=>{let n=this.state.tracks[e].events[t];return{trackIndex:e,eventIndex:t,event:d(n)}});this.callbacks.onTimeIndicatorHighlight({position:e,highlightedEvents:t})}this.highlightChanged=!1}}registerHandler(e,t){this.handlers.set(e,t)}getLayersForChange(e){return this.handlers.get(e)?.layers||[]}updateCallbacks(e){this.callbacks=e}};function J(e,t,n){return n||e.colors.eventColors[t%e.colors.eventColors.length]}var fe=class{constructor(e){this.config=e.config,this.state=e.state,this.eventIndexManager=e.eventIndexManager,this.logger=e.logger,this.onMutate=e.onMutate}validateEventTime(e,t){let n=this.config.endTime+this.config.endPaddingTime,r,a;if(t>e&&t<=n)r=e,a=s(t-e);else if(t<=this.config.endTime-this.config.startTime&&e+t<=n)r=e,a=t;else return this.logger.error(i(this.config,`errorInvalidTimeRange`,{startTime:e,endTime:t})),null;return r<this.config.startTime?(this.logger.error(i(this.config,`errorStartTimeBeforeMin`,{startTime:r,minAllowed:this.config.startTime})),null):{startSec:r,duration:a}}addEvent(e,t,n,r,i=``,a,o=!1){if(!this.isValidTrackIndex(e))return null;let c=this.validateEventTime(t,n);if(!c)return null;let{startSec:l,duration:u}=c,d=this.state.tracks[e],f=s(u),p={id:d.events.length,startTime:l,endTime:s(l+f),duration:f,title:r,description:i,color:J(this.config,d.events.length),...o?{readonly:o}:{},...a?{customData:a}:{}};return d.events.push(p),this.invalidateTrack(e),p}updateEvent(e,t,n){let r=this.getEvent(e,t);if(!r)return null;let i=d(r);return Object.assign(r,n),this.invalidateTrack(e),{event:r,oldEvent:i}}updateEventData(e,t,n){let r=this.getEvent(e,t);if(!r)return null;let i=d(r);return n.title!==void 0&&(r.title=n.title),n.startTime!==void 0&&(r.startTime=n.startTime,r.endTime=s(r.startTime+r.duration)),n.duration!==void 0&&(r.duration=s(n.duration),r.endTime=s(r.startTime+r.duration)),n.description!==void 0&&(r.description=n.description),this.invalidateTrack(e),{event:r,oldEvent:i}}deleteEvent(e,t){if(!this.isValidTrackIndex(e))return null;let n=this.state.tracks[e];if(!this.isValidEventIndex(n,t))return null;let r=d(n.events[t]);return n.events.splice(t,1),this.invalidateTrack(e),r}loadData(e){if(!e||typeof e!=`object`)return this.logger.error(i(this.config,`errorInvalidDataFormat`)),!1;this.state.tracks=[],this.state.selectedTrack=null,this.state.selectedEvent=null;let t=e.tracks||[];for(let e=0;e<t.length;e++){let n=t[e],r={id:this.state.tracks.length,events:[]},i=n.events||[];for(let e=0;e<i.length;e++){let t=i[e];if(!t.title)continue;let n=this.resolveLoadEventTiming(t);if(!n)continue;let a={id:r.events.length,startTime:n.startTime,endTime:n.endTime,duration:n.duration,title:t.title,description:t.description||``,color:J(this.config,r.events.length,t.color),...t.readonly?{readonly:t.readonly}:{},...t.customData?{customData:t.customData}:{},...t.media?{media:t.media}:{}};r.events.push(a)}this.state.tracks.push(r)}return this.eventIndexManager.invalidateAll(),this.onMutate?.(),!0}getEvent(e,t){if(!this.isValidTrackIndex(e))return this.logger.error(i(this.config,`errorInvalidTrackIndex`)),null;let n=this.state.tracks[e];return this.isValidEventIndex(n,t)?n.events[t]:(this.logger.error(i(this.config,`errorInvalidEventIndex`)),null)}resolveLoadEventTiming(e){let t,n;if(e.endTime!==void 0)t=e.startTime||0,n=s(e.endTime-t);else if(e.duration!==void 0)t=e.startTime||0,n=e.duration;else return null;let r=s(n);return{startTime:t,duration:r,endTime:s(t+r)}}invalidateTrack(e){this.eventIndexManager.invalidateTrack(e),this.onMutate?.()}isValidTrackIndex(e){return e>=0&&e<this.state.tracks.length}isValidEventIndex(e,t){return t>=0&&t<e.events.length}};function pe(e,t,n,r,i){return`${e}-${t}-${n}-${r.toFixed(3)}-${i.toFixed(3)}`}var me=class{constructor(e,t,n=500){this.config=e,this.state=t,this.cacheTtl=n,this.guideLinesCache=new Map,this.guideLinesCacheTimestamp=0}calculateGuideLines(e,t,n,r,i){let a=pe(e,t,n,r,i),o=Date.now();if(o-this.guideLinesCacheTimestamp<this.cacheTtl){let e=this.guideLinesCache.get(a);if(e)return e}else this.clearCache(),this.guideLinesCacheTimestamp=o;let s=[],c=this.config.guideLineSnapThreshold,l=r+i;for(let n=0;n<this.state.tracks.length;n++){let i=this.state.tracks[n];if(!(!i||i.events.length===0))for(let a=0;a<i.events.length;a++){if(n===e&&a===t)continue;let o=i.events[a];o.endTime<r-c||o.startTime>l+c||(this.addGuideLineIfMatched(s,o.startTime,r,`start`,n,c),this.addGuideLineIfMatched(s,o.endTime,l,`end`,n,c),this.addGuideLineIfMatched(s,o.endTime,r,`end`,n,c),this.addGuideLineIfMatched(s,o.startTime,l,`start`,n,c))}}return this.guideLinesCache.set(a,s),s}clearCache(){this.guideLinesCache.clear()}addGuideLineIfMatched(e,t,n,r,i,a){if(Math.abs(t-n)>=a)return;let o=e.find(e=>Math.abs(e.time-t)<1e-4&&e.type===r);if(!o){e.push({time:t,type:r,trackIndices:[i]});return}o.trackIndices.includes(i)||o.trackIndices.push(i)}},he=class{constructor(e,t,n){this.config=e,this.state=t,this.eventIndexManager=n}getInteractionTarget(e,t){let n={trackIndex:null,eventIndex:null,resizeEdge:null},r=this.resolveTrackIndex(t);if(r===null||(n.trackIndex=r,!this.isWithinEventVerticalBounds(r,t)))return n;let{eventIndex:i,resizeEdge:a}=this.resolveCandidateHit(r,e,this.getResizeMargin());return n.eventIndex=i,n.resizeEdge=a,n}getEventAtPosition(e,t){let n=this.resolveTrackIndex(t);if(n===null||!this.isWithinEventVerticalBounds(n,t))return null;let{eventIndex:r}=this.resolveCandidateHit(n,e,0);return r===null?null:{trackIndex:n,eventIndex:r}}getResizeHandle(e,t){let n=this.resolveTrackIndex(t);if(n===null||!this.isWithinEventVerticalBounds(n,t))return null;let{eventIndex:r,resizeEdge:i}=this.resolveCandidateHit(n,e,this.getResizeMargin());return r===null||i===null?null:{trackIndex:n,eventIndex:r,edge:i}}resolveTrackIndex(e){let t=e+this.state.scrollY;if(t<this.config.timelineHeight)return null;let n=Math.floor((t-this.config.timelineHeight-this.config.firstTrackTopMargin)/(this.config.trackHeight+this.config.trackMargin));return n<0||n>=this.state.tracks.length?null:n}isWithinEventVerticalBounds(e,t){let{trackY:n,eventVerticalPadding:r}=this.getTrackHitContext(e);return!(t<n+r||t>n+this.config.trackHeight-r)}getTrackHitContext(e){return{trackIndex:e,trackY:this.config.timelineHeight+this.config.firstTrackTopMargin+e*(this.config.trackHeight+this.config.trackMargin)-this.state.scrollY,eventVerticalPadding:Math.max(5,this.config.trackHeight*.0625)}}resolveCandidateHit(e,t,n){let r=this.getMouseTime(t),i=this.eventIndexManager.getCandidatesByTime(e,r,n);if(i.length===0)return{eventIndex:null,resizeEdge:null};let a=null,o=null,s=null;for(let n of i){let r=this.state.tracks[e].events[n],{eventX:i,eventWidth:c}=this.getEventGeometry(r),l=this.config.resizeHandleWidth;t>=i-l/2&&t<=i+l/2?(a===null||n>a)&&(a=n,o=`left`):t>=i+c-l/2&&t<=i+c+l/2&&(a===null||n>a)&&(a=n,o=`right`),t>=i&&t<=i+c&&(s===null||n>s)&&(s=n)}return a===null?{eventIndex:s,resizeEdge:null}:{eventIndex:a,resizeEdge:o}}getMouseTime(e){return(e+this.state.scrollX-this.config.startPaddingTime)/(this.config.secondWidth*this.state.zoomLevel)+this.config.startTime}getResizeMargin(){return this.config.resizeHandleWidth/(this.config.secondWidth*this.state.zoomLevel)}getEventGeometry(e){return{eventX:this.config.startPaddingTime+(e.startTime-this.config.startTime)*this.config.secondWidth*this.state.zoomLevel-this.state.scrollX,eventWidth:e.duration*this.config.secondWidth*this.state.zoomLevel}}},ge=class{constructor(e){this.state=e}addTrack(){let e={id:this.state.tracks.length,events:[]};return this.state.tracks.push(e),e}removeTrack(){if(this.state.tracks.length<=1)return null;let e=this.state.tracks.pop();return this.syncSelectedTrack(),e}removeEmptyLastTrack(){return this.state.tracks.length<=1||this.state.tracks[this.state.tracks.length-1].events.length!==0?null:this.removeTrack()}syncSelectedTrack(){let{selectedTrack:e,tracks:t}=this.state;e===null||e<t.length||(this.state.selectedTrack=t.length>0?t.length-1:null)}};const _e=[`background`,`tracks`,`timeline`,`guideLines`,`indicator`,`scrollbar`,`interaction`,`overlay`];var ve=class{constructor(e){this.lastEdgeScrollTime=0,this.config=e.config,this.state=e.state,this.renderManager=e.renderManager}setPosition(e,t=!1){let n=this.resolvePosition(e,t);return n===this.state.timeIndicatorPosition?{changed:!1,position:n}:(this.state.timeIndicatorPosition=n,this.scrollIntoViewport(n),{changed:!0,position:n})}setPositionDuringDrag(e){let t=this.clampPosition(e);this.state.timeIndicatorPosition=t,this.scrollIntoViewportThrottled(t)}resolvePosition(e,t){let r=e;if(t&&this.state.snapEnabled){let e=n(this.state.zoomLevel,this.config.snapInterval,this.config.snapToSeconds,this.config.secondPrecisionZoomThreshold,this.config.scale,this.config.scaleSplitCount);r=y(r,e)}return this.clampPosition(r)}clampPosition(e){return Math.max(this.config.startTime,Math.min(this.config.endTime,e))}scrollIntoViewportThrottled(e){let t=performance.now();if(t-this.lastEdgeScrollTime<this.getEdgeScrollThrottle())return;let n=this.getTimeIndicatorX(e,this.state.scrollX),r=this.renderManager.getCanvasLogicalWidth(),i=this.getEdgeScrollTriggerMargin();if(n>=i&&n<=r-i)return;this.lastEdgeScrollTime=t;let a=this.getEdgeScrollViewportMargin(),o=this.getTimeIndicatorX(e,0),s=this.renderManager.computeMaxScrollX(this.state.zoomLevel);n<i?this.state.scrollX=Math.max(0,Math.min(s,o-a)):this.state.scrollX=Math.max(0,Math.min(s,o-(r-a))),this.markDirty()}scrollIntoViewport(e){let t=this.getTimeIndicatorX(e,this.state.scrollX),n=this.renderManager.getCanvasLogicalWidth(),r=this.getEdgeScrollViewportMargin(),i=!1;if(t<r){let t=this.getTimeIndicatorX(e,0)-r,n=this.renderManager.computeMaxScrollX(this.state.zoomLevel);this.state.scrollX=Math.max(0,Math.min(n,t)),i=!0}else if(t>n-r){let t=this.getTimeIndicatorX(e,0)-(n-r),a=this.renderManager.computeMaxScrollX(this.state.zoomLevel);this.state.scrollX=Math.max(0,Math.min(a,t)),i=!0}i&&this.markDirty()}getTimeIndicatorX(e,t){return u(e,this.config.startTime,this.config.startPaddingTime,this.config.secondWidth,this.state.zoomLevel,t)}getEdgeScrollThrottle(){return this.resolveEdgeScrollValue(this.config.edgeScrollThrottle,80)}getEdgeScrollTriggerMargin(){return this.resolveEdgeScrollValue(this.config.edgeScrollTriggerMargin,30)}getEdgeScrollViewportMargin(){return this.resolveEdgeScrollValue(this.config.edgeScrollViewportMargin,50)}resolveEdgeScrollValue(e,t){return!Number.isFinite(e)||e<0?t:e}markDirty(){this.renderManager.markDirty([..._e])}};const ye=[`background`,`tracks`,`timeline`,`guideLines`,`indicator`,`scrollbar`,`interaction`,`overlay`];var be=class{constructor(e){this.config=e.config,this.state=e.state,this.renderManager=e.renderManager}autoFitToCanvas(){let e=this.renderManager.getCanvasLogicalWidth(),t=Math.max(this.config.minAutoFitZoom,this.state.zoomLevel,1),n=Math.max(this.config.maxAutoFitZoom,t);if(this.renderManager.getContentWidth(t)>=e)return this.state.zoomLevel=t,{type:`unchanged`};for(;t<=n&&this.renderManager.getContentWidth(t)<e;)t+=.05;if(t<=n&&this.renderManager.getContentWidth(t)>=e)return this.state.zoomLevel=parseFloat(t.toFixed(3)),{type:`fit`,percentage:Math.round(this.state.zoomLevel*100)};if(this.state.zoomLevel=n,this.config.endPaddingTime===0){let t=this.renderManager.getContentWidth(n);if(t<e){let r=(e-t)/(this.config.secondWidth*n);return this.config.endPaddingTime=Math.ceil(r),this.renderManager.invalidateLayoutCache(),{type:`cappedWithPadding`,percentage:Math.round(n*100),seconds:this.config.endPaddingTime}}}return this.markDirty(),{type:`cappedContentShort`,percentage:Math.round(n*100)}}zoomByFactor(e){return this.applyZoomLevel(this.state.zoomLevel*e)}setZoomLevel(e){return this.applyZoomLevel(e)}setEndTime(e){let t=this.state.tracks.some(t=>t.events.some(t=>t.endTime>e)),n=this.config.endTime;this.config.endTime=e,this.renderManager.invalidateLayoutCache(),this.state.timeIndicatorPosition>e&&(this.state.timeIndicatorPosition=e);let r=this.renderManager.computeMaxScrollX(this.state.zoomLevel);return this.state.scrollX=Math.max(0,Math.min(r,this.state.scrollX)),{oldEndTime:n,endTime:e,hasOverflowEvents:t}}applyZoomLevel(e){let t=this.state.zoomLevel,n=this.state.scrollX,r=this.renderManager.getCachedLogicalWidth()/2,i=(r+n)/(this.config.secondWidth*t);this.state.zoomLevel=this.clampZoomLevel(e);let a=i*this.config.secondWidth*this.state.zoomLevel;this.state.scrollX=a-r;let o=this.renderManager.computeMaxScrollX(this.state.zoomLevel);return this.state.scrollX=Math.max(0,Math.min(o,this.state.scrollX)),{changed:t!==this.state.zoomLevel,zoomLevel:this.state.zoomLevel,percentage:Math.round(this.state.zoomLevel*100)}}clampZoomLevel(e){return Math.max(1,Math.min(1e3,e))}markDirty(){this.renderManager.markDirty([...ye])}},xe=class{constructor(e){this.eventListeners=null,this.canvas=e.canvas,this.config=e.config,this.state=e.state,this.renderManager=e.renderManager,this.onCanvasResize=e.onCanvasResize}setupEventListeners(e){this.eventListeners&&this.destroy(),this.eventListeners=e,this.canvas.addEventListener(`mousedown`,e.mousedown),this.canvas.addEventListener(`mousemove`,e.mousemove),this.canvas.addEventListener(`mouseup`,e.mouseup),this.canvas.addEventListener(`mouseleave`,e.mouseleave),this.canvas.addEventListener(`contextmenu`,e.contextmenu),this.canvas.addEventListener(`wheel`,e.wheel,{passive:!1}),this.syncInitialCanvasSize()}setCanvasSize(e,t){this.renderManager.setCanvasSize(e,t)}getCanvasLogicalHeight(){return this.renderManager.getCanvasLogicalHeight()}getCachedLogicalHeight(){return this.renderManager.getCachedLogicalHeight()}adjustCanvasSize(){let e=this.renderManager.computeMaxScrollY();this.state.scrollY=Math.max(0,Math.min(e,this.state.scrollY)),this.onCanvasResize()}destroy(){this.eventListeners&&=(this.canvas.removeEventListener(`mousedown`,this.eventListeners.mousedown),this.canvas.removeEventListener(`mousemove`,this.eventListeners.mousemove),this.canvas.removeEventListener(`mouseup`,this.eventListeners.mouseup),this.canvas.removeEventListener(`mouseleave`,this.eventListeners.mouseleave),this.canvas.removeEventListener(`contextmenu`,this.eventListeners.contextmenu),this.canvas.removeEventListener(`wheel`,this.eventListeners.wheel),null)}syncInitialCanvasSize(){let e=this.canvas.parentElement;if(!e){this.setCanvasSize(this.renderManager.getCanvasLogicalWidth(),this.config.canvasHeight||500);return}let t=e.getBoundingClientRect();this.setCanvasSize(t.width,t.height||this.config.canvasHeight||500)}},Y=class{constructor(e){this.timeline=e}createContext(e){let t=this.timeline.getCanvas().getBoundingClientRect(),n=this.timeline.state;return{canvasX:e.clientX-t.left,canvasY:e.clientY-t.top,logicalX:e.clientX-t.left+n.scrollX,logicalY:e.clientY-t.top+n.scrollY,originalEvent:e,canvasWidth:t.width,canvasHeight:t.height}}handleMouseDown(e){return null}handleMouseMove(e){return null}handleMouseUp(e){return null}handleContextMenu(e){return null}};const X=x(`DraggingState`);var Se=class extends Y{constructor(e){super(e),this.name=`Dragging`,this.MOVE_THRESHOLD=5,this.isSnappedToGuideLine=!1,this.snappedTime=null}onEnter(){this.timeline.beginIndexBatch()}onExit(){let e=this.timeline.state;e.guideLines=[],e.dragTimeReference=null,this.timeline.endIndexBatch(),this.timeline.autoRemoveEmptyLastTrack()}handleMouseMove(e){let{logicalX:t,logicalY:r}=e,i=this.timeline.config,a=this.timeline.state,o=this.timeline.getCanvas();if(!a.draggingEvent)return this.createIdleState();if(Math.sqrt((t-a.draggingEvent.startX)**2+(r-a.draggingEvent.startY)**2)>this.MOVE_THRESHOLD&&(a.draggingEvent.isDragging=!0),!a.draggingEvent.isDragging)return o.style.cursor=`move`,null;let{trackIndex:c,eventIndex:l}=a.draggingEvent;if(c<0||c>=a.tracks.length||l<0||l>=a.tracks[c].events.length)return X.warn(this.timeline.t(`warningInvalidDraggingState`),{value:a.draggingEvent}),a.draggingEvent=null,this.createIdleState();let d=a.tracks[c].events[l];this.timeline.setStatus(this.timeline.t(`statusDragging`,{title:d.title}));let f=(t-a.draggingEvent.startX)/(i.secondWidth*a.zoomLevel),p=a.draggingEvent.originalStartTime+f,m=Math.floor((r-i.timelineHeight-i.firstTrackTopMargin)/(i.trackHeight+i.trackMargin));if(i.autoAddTrack&&m>=a.tracks.length){let e={id:a.tracks.length,events:[]};a.tracks.push(e),this.timeline.setStatus(this.timeline.t(`statusAutoTrackAdded`,{count:a.tracks.length})),this.timeline.callbacks.onTrackAdd&&this.timeline.callbacks.onTrackAdd(e)}m=Math.max(0,Math.min(a.tracks.length-1,m)),a.guideLines=this.timeline.calculateGuideLines(c,l,m,p,d.duration);let h=this.timeline.snapToGuideLines(p,d.duration);if(h!==null)if(this.isSnappedToGuideLine&&this.snappedTime!==null){let e=this.timeline.config.guideLineSnapThreshold*1.5;Math.abs(p-this.snappedTime)<e?p=this.snappedTime:(this.isSnappedToGuideLine=!1,this.snappedTime=null,p=h,this.isSnappedToGuideLine=!0,this.snappedTime=h)}else p=h,this.isSnappedToGuideLine=!0,this.snappedTime=h;else if(this.isSnappedToGuideLine=!1,this.snappedTime=null,a.snapEnabled)if(i.enableTimeIndicator&&a.timeIndicatorSnapEnabled){let e=u(a.timeIndicatorPosition,i.startTime,i.startPaddingTime,i.secondWidth,a.zoomLevel,a.scrollX),t=i.startPaddingTime+(p-i.startTime)*i.secondWidth*a.zoomLevel-a.scrollX;if(Math.abs(t-e)<i.timeIndicatorSnapThreshold)p=a.timeIndicatorPosition;else{let e=n(a.zoomLevel,i.snapInterval,i.snapToSeconds,i.secondPrecisionZoomThreshold,i.scale,i.scaleSplitCount);p=y(p,e)}}else{let e=n(a.zoomLevel,i.snapInterval,i.snapToSeconds,i.secondPrecisionZoomThreshold,i.scale,i.scaleSplitCount);p=y(p,e)}p=Math.max(i.startTime,Math.min(i.endTime-d.duration,p));let g=i.timelineHeight+i.firstTrackTopMargin+m*(i.trackHeight+i.trackMargin)+i.trackHeight/2;a.dragTimeReference={time:p,y:g};let _=this.timeline.canMoveEvent(c,l,m,p,d.duration);if(_&&(d.startTime=p,d.endTime=s(p+d.duration),this.timeline.invalidateIndexTrack(c),m!==c)){let e=a.tracks[c].events.splice(l,1)[0];a.tracks[m].events.push(e),a.draggingEvent.trackIndex=m,a.draggingEvent.eventIndex=a.tracks[m].events.length-1,a.selectedTrack=m,a.selectedEvent&&a.selectedEvent.trackIndex===c&&(a.selectedEvent.eventIndex===l?a.selectedEvent={trackIndex:m,eventIndex:a.tracks[m].events.length-1}:a.selectedEvent.eventIndex>l&&(a.selectedEvent={...a.selectedEvent,eventIndex:a.selectedEvent.eventIndex-1})),this.timeline.invalidateIndexTrack(m),this.timeline.invalidateIndexTrack(c)}return a.draggingEvent&&(a.draggingEvent.currentMouseX=t,a.draggingEvent.currentMouseY=r,a.draggingEvent.canMove=_),this.timeline.notifyChange(`events:move`),null}handleMouseUp(e){let t=this.timeline.state;if(!t.draggingEvent)return this.createIdleState();let{trackIndex:n,eventIndex:r,originalTrackIndex:i,originalEventIndex:a}=t.draggingEvent;if(n<0||n>=t.tracks.length)return X.warn(this.timeline.t(`warningDraggingEventMissing`),{trackIndex:n,eventIndex:r}),t.draggingEvent=null,this.createIdleState();let o=t.tracks[n]?.events[r];if(!o)return X.warn(this.timeline.t(`warningDraggingEventMissing`),{trackIndex:n,eventIndex:r}),t.draggingEvent=null,this.createIdleState();let s=t.selectedEvent&&t.selectedEvent.trackIndex===i&&t.selectedEvent.eventIndex===a;return t.draggingEvent.isDragging?(this.timeline.setStatus(this.timeline.t(`statusEventPlaced`,{title:o.title,start:this.timeline.formatTime(o.startTime),end:this.timeline.formatTime(o.endTime)})),s&&(t.selectedEvent={trackIndex:n,eventIndex:r}),this.timeline.callbacks.onEventMove&&this.timeline.callbacks.onEventMove({trackIndex:n,eventIndex:r,event:d(o),fromTrackIndex:i})):(t.selectedEvent={trackIndex:n,eventIndex:r},this.timeline.setStatus(this.timeline.t(`statusEventSelected`,{title:o.title})),this.timeline.callbacks.onEventClick&&this.timeline.callbacks.onEventClick({trackIndex:n,eventIndex:r,event:d(o),trackName:this.timeline.t(`labelTrackName`,{index:n+1}),formattedTimeRange:`${this.timeline.formatTime(o.startTime)} - ${this.timeline.formatTime(o.endTime)}`})),t.draggingEvent=null,this.timeline.notifyChange(`events:move`),this.createIdleState()}createIdleState(){return new Q(this.timeline)}},Z=class extends Y{constructor(e){super(e),this.name=`Resizing`}onEnter(){this.timeline.beginIndexBatch()}onExit(){let e=this.timeline.state;e.guideLines=[],this.timeline.endIndexBatch()}handleMouseMove(e){let{logicalX:t}=e,r=this.timeline.config,i=this.timeline.state;if(!i.resizingEvent)return this.createIdleState();let{trackIndex:a,eventIndex:o,edge:c,originalStartTime:l,originalDuration:u}=i.resizingEvent;if(a<0||a>=i.tracks.length||o<0||o>=i.tracks[a].events.length)return i.resizingEvent=null,this.createIdleState();let d=i.tracks[a].events[o],f=(t-i.resizingEvent.startX)/(r.secondWidth*i.zoomLevel);if(c===`left`){let e=l+f,t=s(l+u),c=t-e;i.guideLines=this.timeline.calculateGuideLines(a,o,a,e,c>0?c:u);let p=this.timeline.snapEdgeToGuideLines(e);if(p!==null)e=p;else if(i.snapEnabled){let t=n(i.zoomLevel,r.snapInterval,r.snapToSeconds,r.secondPrecisionZoomThreshold,r.scale,r.scaleSplitCount);e=y(e,t)}e=s(Math.max(r.startTime,e)),e=s(Math.min(e,t-r.minEventDuration));let m=s(t-e),h=!0;for(let n=0;n<i.tracks[a].events.length;n++){if(n===o)continue;let r=i.tracks[a].events[n],s=r.startTime,c=s+r.duration;if(e<c&&t>s){h=!1;break}}if(h){if(!this.timeline.canMoveEvent(a,o,a,e,m))return this.timeline.notifyChange(`events:update`),null;d.startTime=e,d.duration=s(m),d.endTime=t,this.timeline.invalidateIndexTrack(a)}}else{let e=u+f,t=l+e;i.guideLines=this.timeline.calculateGuideLines(a,o,a,l,e>0?e:u);let c=this.timeline.snapEdgeToGuideLines(t);if(c!==null)e=s(c-l);else if(i.snapEnabled){let a=n(i.zoomLevel,r.snapInterval,r.snapToSeconds,r.secondPrecisionZoomThreshold,r.scale,r.scaleSplitCount);e=s(y(t,a)-l)}else e=s(e);t=l+e,e=s(Math.max(r.minEventDuration,e)),e=s(Math.min(e,r.endTime-l)),t=l+e;let p=!0;for(let e=0;e<i.tracks[a].events.length;e++){if(e===o)continue;let n=i.tracks[a].events[e],r=n.startTime;if(l<r+n.duration&&t>r){p=!1;break}}if(p){if(!this.timeline.canMoveEvent(a,o,a,l,e))return this.timeline.notifyChange(`events:update`),null;d.duration=s(e),d.endTime=s(l+e),this.timeline.invalidateIndexTrack(a)}}return this.timeline.notifyChange(`events:update`),this.timeline.setStatus(this.timeline.t(`statusEventResizing`,{start:this.timeline.formatTime(d.startTime),end:this.timeline.formatTime(d.endTime)})),null}handleMouseUp(e){let t=this.timeline.state;if(!t.resizingEvent)return this.createIdleState();let{trackIndex:n,eventIndex:r}=t.resizingEvent;if(n<0||n>=t.tracks.length||r<0||r>=t.tracks[n].events.length)return t.resizingEvent=null,this.createIdleState();let i=t.tracks[n].events[r];return t.resizingEvent=null,this.timeline.getCanvas().style.cursor=`default`,this.timeline.setStatus(this.timeline.t(`statusEventResized`,{title:i.title})),this.timeline.callbacks.onEventUpdate&&this.timeline.callbacks.onEventUpdate({type:`resize`,trackIndex:n,eventIndex:r,event:d(i)}),this.timeline.notifyChange(`events:update`),this.createIdleState()}createIdleState(){return new Q(this.timeline)}},Ce=class extends Y{constructor(e){super(e),this.name=`Scrolling`}handleMouseMove(e){let{canvasX:t,canvasY:n,canvasWidth:r,canvasHeight:i}=e,a=this.timeline.config,o=this.timeline.state;if(o.draggingScrollbar){let e=a.timelineHeight+a.firstTrackTopMargin+o.tracks.length*(a.trackHeight+a.trackMargin),t=i-(a.startPaddingTime+(a.endTime+a.endPaddingTime-a.startTime)*a.secondWidth*o.zoomLevel>r?13:0),s=t-a.timelineHeight-5,c=t/e,l=Math.max(30,s*c),u=Math.max(0,e-t),d=(n-a.timelineHeight-o.scrollbarDragOffset)/(s-l);return o.scrollY=Math.max(0,Math.min(u,d*u)),this.timeline.notifyChange(`scroll:y`),null}if(o.draggingHorizontalScrollbar){let e=a.startPaddingTime+(a.endTime+a.endPaddingTime-a.startTime)*a.secondWidth*o.zoomLevel,n=r,i=r/e,s=Math.max(30,n*i),c=Math.max(0,e-r),l=(t-o.horizontalScrollbarDragOffset)/(n-s);return o.scrollX=Math.max(0,Math.min(c,l*c)),this.timeline.notifyChange(`scroll:x`),null}return null}handleMouseUp(e){let t=this.timeline.state;return t.draggingScrollbar&&(t.draggingScrollbar=!1,this.timeline.setStatus(this.timeline.t(`statusReady`))),t.draggingHorizontalScrollbar&&(t.draggingHorizontalScrollbar=!1,this.timeline.setStatus(this.timeline.t(`statusReady`))),this.createIdleState()}createIdleState(){return new Q(this.timeline)}},we=class extends Y{constructor(e){super(e),this.name=`TimeIndicatorDrag`}handleMouseMove(e){let{canvasX:t}=e,r=this.timeline.config,i=this.timeline.state,a=this.timeline.getCanvas();if(!i.draggingTimeIndicator)return this.createIdleState();a.style.cursor=r.readOnly?`not-allowed`:`ew-resize`;let o=(t-i.timeIndicatorDragOffsetX+i.scrollX-r.startPaddingTime)/(r.secondWidth*i.zoomLevel)+r.startTime;if(i.snapEnabled){let e=n(i.zoomLevel,r.snapInterval,r.snapToSeconds,r.secondPrecisionZoomThreshold,r.scale,r.scaleSplitCount);o=y(o,e)}return o=Math.max(r.startTime,Math.min(r.endTime,o)),this.timeline.setTimeIndicatorDuringDrag(o),null}handleMouseUp(e){let t=this.timeline.state;return t.draggingTimeIndicator&&(t.draggingTimeIndicator=!1,this.timeline.setTimeIndicator(t.timeIndicatorPosition,!1)),this.createIdleState()}createIdleState(){return new Q(this.timeline)}},Te=class{constructor(e){this.delegate=e}handleMouseMove(e){let t=this.delegate.getTimeline(),{config:n,state:r}=t,{canvasX:i,canvasY:a,logicalX:o,logicalY:s}=e,c=t.getCanvas();if(this.handleContextMenuHover(i,a))return null;let l=t.getInteractionTarget(i,a);if(s>=n.timelineHeight&&!n.readOnly&&this.handleContentHover(l,o,c)||this.handleTimeIndicatorHover(i,a))return null;if(l.eventIndex!==null&&l.trackIndex!==null&&!l.resizeEdge){let e=r.tracks[l.trackIndex].events[l.eventIndex];return c.style.cursor=`pointer`,t.setStatus(t.t(`statusHoverEventTimeRange`,{title:e.title,start:t.formatTime(e.startTime),end:t.formatTime(e.endTime)})),null}return c.style.cursor=`default`,null}handleContextMenuHover(e,t){let n=this.delegate.getTimeline(),{config:r,state:i}=n,a=n.getCanvas();if(!i.contextMenuVisible||!i.contextMenuBounds)return!1;let o=i.contextMenuBounds;if(!(e>=o.x&&e<=o.x+o.width&&t>=o.y&&t<=o.y+o.height))return i.hoveredContextMenuItem!==-1&&(i.hoveredContextMenuItem=-1,n.notifyChange(`interaction:contextMenu`)),!1;let s=Math.floor((t-o.y-o.padding)/o.itemHeight);return s>=0&&s<r.contextMenuItems.length?(i.hoveredContextMenuItem!==s&&(i.hoveredContextMenuItem=s,n.notifyChange(`interaction:contextMenu`)),a.style.cursor=`pointer`,!0):(i.hoveredContextMenuItem!==-1&&(i.hoveredContextMenuItem=-1,n.notifyChange(`interaction:contextMenu`)),!0)}handleContentHover(e,t,r){let i=this.delegate.getTimeline(),{config:a,state:o}=i;if(a.enableEventResize&&e.resizeEdge)return o.tracks[e.trackIndex].events[e.eventIndex].readonly?(o.hoveredResizeHandle=null,r.style.cursor=`not-allowed`,i.hideSplitLine(),i.notifyChange(`interaction:hover`),!0):(o.hoveredResizeHandle={trackIndex:e.trackIndex,eventIndex:e.eventIndex,edge:e.resizeEdge},r.style.cursor=`ew-resize`,i.hideSplitLine(),i.notifyChange(`interaction:hover`),!0);if(o.hoveredResizeHandle=null,!a.enableEventSplit||e.eventIndex===null||e.trackIndex===null||e.resizeEdge)return i.hideSplitLine(),!1;let s=e.trackIndex,c=e.eventIndex,l=o.tracks[s].events[c];if(l.readonly)return i.hideSplitLine(),r.style.cursor=`not-allowed`,i.notifyChange(`interaction:hover`),!0;let u=(t-a.startPaddingTime)/(a.secondWidth*o.zoomLevel)+a.startTime;if(o.snapEnabled){let e=n(o.zoomLevel,a.snapInterval,a.snapToSeconds,a.secondPrecisionZoomThreshold,a.scale,a.scaleSplitCount);u=y(u,e)}let d=u-l.startTime,f=l.duration-d;return u>l.startTime&&u<l.startTime+l.duration&&d>=a.minEventDuration&&f>=a.minEventDuration?(i.showSplitLine(s,c,u),r.style.cursor=`pointer`,i.notifyChange(`interaction:splitLine`),!0):(i.hideSplitLine(),!1)}handleTimeIndicatorHover(e,t){let n=this.delegate.getTimeline(),{config:r,state:i}=n,a=n.getCanvas();if(!r.enableTimeIndicator||t>r.timelineHeight)return!1;let o=u(i.timeIndicatorPosition,r.startTime,r.startPaddingTime,r.secondWidth,i.zoomLevel,i.scrollX),s=r.timeIndicatorHeadSize;return e>=o-s/2&&e<=o+s/2&&t>=0&&t<=r.timeIndicatorHeadSize?(a.style.cursor=r.readOnly?`not-allowed`:`ew-resize`,!0):!1}},Ee=class{constructor(e){this.delegate=e}handleMouseDown(e){let t=this.delegate.getTimeline(),{config:n,state:r}=t,{canvasX:i,canvasY:a,logicalX:o,logicalY:s,canvasWidth:c,canvasHeight:l}=e,u=t.getCanvas(),d=n.readOnly;if(e.originalEvent.button===2)return null;let f=this.handleContextMenuClick(e);if(f.handled)return f.nextState;let p=this.handleScrollbarMouseDown(i,a,c,l);if(p)return p;let m=this.handleTimeIndicatorMouseDown(i,a);if(m)return m;if(s<n.timelineHeight)return null;let h=t.getInteractionTarget(i,a);if(n.enableEventResize&&!d&&h.resizeEdge){let e=r.tracks[h.trackIndex].events[h.eventIndex];return e.readonly?(u.style.cursor=`not-allowed`,null):(r.resizingEvent={trackIndex:h.trackIndex,eventIndex:h.eventIndex,edge:h.resizeEdge,startX:o,originalStartTime:e.startTime,originalDuration:e.duration},this.delegate.createResizingState())}return h.eventIndex!==null&&h.trackIndex!==null?this.handleEventMouseDown(h.trackIndex,h.eventIndex,o,s):(r.selectedEvent=null,r.highlightedEvent=null,r.selectedTrack=null,r.isManualSelection=!1,t.callbacks.onEventHighlight&&t.callbacks.onEventHighlight({trackIndex:null,eventIndex:null,event:null}),t.notifyChange(`selection:change`),null)}handleContextMenuClick(e){let t=this.delegate.getTimeline(),{config:n,state:r}=t,{canvasX:i,canvasY:a}=e;if(!r.contextMenuVisible||!r.contextMenuBounds)return{handled:!1,nextState:null};let o=r.contextMenuBounds;if(!(i>=o.x&&i<=o.x+o.width&&a>=o.y&&a<=o.y+o.height))return r.contextMenuVisible=!1,r.contextMenuEvent=null,t.notifyChange(`interaction:contextMenu`),{handled:!1,nextState:null};let s=Math.floor((a-o.y-o.padding)/o.itemHeight);if(s>=0&&s<n.contextMenuItems.length&&r.contextMenuEvent){let e=n.contextMenuItems[s],{trackIndex:i,eventIndex:a}=r.contextMenuEvent,o=r.tracks[i].events[a];if(o.readonly&&(e.type===`delete`||e.type===`edit`))return t.setStatus(t.t(`statusReadOnlyEditDeleteBlocked`)),r.contextMenuVisible=!1,r.contextMenuEvent=null,t.notifyChange(`interaction:contextMenu`),{handled:!0,nextState:null};t.callbacks.onContextMenu&&t.callbacks.onContextMenu({menuType:e.type,trackIndex:i,eventIndex:a,event:d(o)}),r.contextMenuVisible=!1,r.contextMenuEvent=null,t.notifyChange(`interaction:contextMenu`)}return{handled:!0,nextState:null}}handleScrollbarMouseDown(e,t,n,r){let i=this.delegate.getTimeline(),{config:a,state:o}=i,s=a.timelineHeight+a.firstTrackTopMargin+o.tracks.length*(a.trackHeight+a.trackMargin),c=i.getAvailableHeight();if(s>c){let r=n-8-5,i=a.timelineHeight,l=c-a.timelineHeight-5;if(e>=r&&e<=r+8&&t>=i&&t<=i+l){o.draggingScrollbar=!0;let e=c/s,n=Math.max(30,l*e),r=s-c,a=o.scrollY/r;return o.scrollbarDragOffset=t-(i+(l-n)*a),this.delegate.createScrollingState()}}let l=i.getContentWidthForZoom(o.zoomLevel);if(l<=n)return null;let u=r-8-5,d=n;if(t>=u&&t<=u+8&&e>=0&&e<=d){o.draggingHorizontalScrollbar=!0;let t=n/l,r=Math.max(30,d*t),i=l-n,a=o.scrollX/i;return o.horizontalScrollbarDragOffset=e-(d-r)*a,this.delegate.createScrollingState()}return null}handleTimeIndicatorMouseDown(e,t){let{config:n,state:r}=this.delegate.getTimeline();if(!n.enableTimeIndicator||n.readOnly)return null;let i=u(r.timeIndicatorPosition,n.startTime,n.startPaddingTime,n.secondWidth,r.zoomLevel,r.scrollX),a=n.timeIndicatorHeadSize,o=n.timeIndicatorTriangleHeight,s=n.timelineHeight-a-o;return e>=i-a/2&&e<=i+a/2&&t>=s&&t<=n.timelineHeight?(r.draggingTimeIndicator=!0,r.timeIndicatorDragOffsetX=e-i,this.delegate.createTimeIndicatorDragState()):null}handleEventMouseDown(e,t,n,r){let i=this.delegate.getTimeline(),{config:a,state:o}=i,s=i.getCanvas(),c=o.tracks[e].events[t],l=Date.now();if(o.lastClickEvent&&o.lastClickEvent.trackIndex===e&&o.lastClickEvent.eventIndex===t&&l-o.lastClickTime<300&&a.enableEventSplit){if(c.readonly)return i.setStatus(i.t(`statusReadOnlySplitBlocked`)),o.lastClickTime=0,o.lastClickEvent=null,null;let r=(n-a.startPaddingTime)/(a.secondWidth*o.zoomLevel)+a.startTime;return i.splitEvent(e,t,r),o.lastClickTime=0,o.lastClickEvent=null,i.hideSplitLine(),null}if(o.lastClickEvent={trackIndex:e,eventIndex:t},o.lastClickTime=l,o.selectedEvent={trackIndex:e,eventIndex:t},o.isManualSelection=!0,o.highlightedEvent=null,o.selectedTrack=null,c.readonly||a.readOnly)return s.style.cursor=`not-allowed`,i.setStatus(i.t(`statusEventSelected`,{title:c.title})),i.callbacks.onEventHighlight&&i.callbacks.onEventHighlight({trackIndex:e,eventIndex:t,event:d(c)}),i.callbacks.onEventClick&&i.callbacks.onEventClick({trackIndex:e,eventIndex:t,event:d(c),trackName:i.t(`labelTrackName`,{index:e+1}),formattedTimeRange:v(c.startTime,c.endTime)}),i.notifyChange(`selection:change`),null;let u=a.startPaddingTime+(c.startTime-a.startTime)*a.secondWidth*o.zoomLevel-o.scrollX,f=a.timelineHeight+a.firstTrackTopMargin+e*(a.trackHeight+a.trackMargin);return o.draggingEvent={trackIndex:e,eventIndex:t,eventX:u,eventY:f,originalTrackIndex:e,originalEventIndex:t,originalStartTime:c.startTime,startX:n,startY:r,isDragging:!1},o.dragOffsetX=n-u,o.dragOffsetY=r-f,i.callbacks.onEventHighlight&&i.callbacks.onEventHighlight({trackIndex:e,eventIndex:t,event:d(c)}),i.notifyChange(`selection:change`),this.delegate.createDraggingState()}},Q=class extends Y{constructor(e){super(e),this.name=`Idle`,this.hoverController=new Te(this),this.mouseDownRouter=new Ee(this)}getTimeline(){return this.timeline}handleMouseDown(e){return this.mouseDownRouter.handleMouseDown(e)}handleMouseMove(e){return this.hoverController.handleMouseMove(e)}handleContextMenu(e){e.originalEvent.preventDefault();let{canvasX:t,canvasY:n}=e,r=this.timeline.config,i=this.timeline.state;if(!r.enableContextMenu||r.readOnly||!this.timeline.isPluginLoaded(`context-menu`))return null;let a=this.timeline.getEventAtPosition(t,n);if(a){let{trackIndex:e,eventIndex:r}=a;i.contextMenuEvent={trackIndex:e,eventIndex:r},i.contextMenuVisible=!0,i.contextMenuX=t,i.contextMenuY=n,i.hoveredContextMenuItem=-1,this.timeline.notifyChange(`interaction:contextMenu`)}else i.contextMenuVisible=!1,i.contextMenuEvent=null,this.timeline.notifyChange(`interaction:contextMenu`);return null}createDraggingState(){return new Se(this.timeline)}createResizingState(){return new Z(this.timeline)}createScrollingState(){return new Ce(this.timeline)}createTimeIndicatorDragState(){return new we(this.timeline)}};const $=x(`StateMachine`);var De=class{constructor(e){this.timeline=e,this.rafId=null,this.pendingMouseMove=null,this.currentState=new Q(e)}getCurrentStateName(){return this.currentState.name}transitionTo(e){if(!e||e===this.currentState)return;let t=this.currentState;t.onExit&&($.debugStyled(w.stateExit,`◁ Exit: ${t.name}`),t.onExit(e)),this.currentState=e,e.onEnter&&($.debugStyled(w.stateEnter,`▷ Enter: ${e.name}`),e.onEnter(t)),$.debugStyled(w.stateTransition,`⟳ Transition: ${t.name} → ${e.name}`)}createContext(e){let t=this.timeline.getCanvas().getBoundingClientRect(),n=this.timeline.state;return{canvasX:e.clientX-t.left,canvasY:e.clientY-t.top,logicalX:e.clientX-t.left+n.scrollX,logicalY:e.clientY-t.top+n.scrollY,originalEvent:e,canvasWidth:t.width,canvasHeight:t.height}}handleMouseDown(e){let t=this.createContext(e),n=this.currentState.handleMouseDown(t);this.transitionTo(n)}handleMouseMove(e){if(this.rafId!==null){this.pendingMouseMove=e;return}this.pendingMouseMove=e,this.rafId=requestAnimationFrame(()=>{this.pendingMouseMove&&=(this.handleMouseMoveImpl(this.pendingMouseMove),null),this.rafId=null})}handleMouseMoveImpl(e){let t=this.createContext(e),n=this.currentState.handleMouseMove(t);this.transitionTo(n)}handleMouseUp(e){this.rafId!==null&&(cancelAnimationFrame(this.rafId),this.rafId=null,this.pendingMouseMove=null);let t=e||new MouseEvent(`mouseup`),n=this.createContext(t),r=this.currentState.handleMouseUp(n);this.transitionTo(r)}handleContextMenu(e){let t=this.createContext(e),n=this.currentState.handleContextMenu(t);this.transitionTo(n)}destroy(){this.rafId!==null&&(cancelAnimationFrame(this.rafId),this.rafId=null),this.pendingMouseMove=null}},Oe=class{constructor(e){this.timeline=e}handleWheel(e){if(e.preventDefault(),e.ctrlKey||e.metaKey){let t=e.deltaY>0?.9:1.1;this.timeline.zoom(t)}else this.timeline.state.scrollY+=e.deltaY,this.timeline.adjustCanvasSize(),this.timeline.notifyChange(`scroll:y`)}},ke=class{constructor(e){this.canvasController=e.canvasController,this.mouseHandler=e.mouseHandler??new De(e.timeline),this.wheelHandler=e.wheelHandler??new Oe(e.timeline)}bind(){this.canvasController.setupEventListeners(this.createEventListeners())}destroy(){this.canvasController.destroy(),this.mouseHandler.destroy()}createEventListeners(){return{mousedown:e=>this.mouseHandler.handleMouseDown(e),mousemove:e=>this.mouseHandler.handleMouseMove(e),mouseup:e=>this.mouseHandler.handleMouseUp(e),mouseleave:()=>this.mouseHandler.handleMouseUp(),contextmenu:e=>this.mouseHandler.handleContextMenu(e),wheel:e=>this.wheelHandler.handleWheel(e)}}},Ae=class{constructor(e){this.currentThemePluginId=null,this.pluginManager=e.pluginManager,this.builtinThemes=e.builtinThemes,this.onThemeChanged=e.onThemeChanged,this.onPluginVisualChange=e.onPluginVisualChange}loadInitialTheme(e){let t=this.getPluginId(e);this.pluginManager.loadPlugin(e).then(e=>{e&&(this.currentThemePluginId=t,this.onThemeChanged())})}async usePlugin(e){return this.isThemePlugin(e)?this.switchThemePlugin(e):await this.pluginManager.loadPlugin(e)?(this.onPluginVisualChange(),!0):!1}getLoadedPlugins(){return this.pluginManager.getLoadedPlugins()}isPluginLoaded(e){return this.pluginManager.isPluginLoaded(e)}async removePlugin(e){return await this.pluginManager.unloadPlugin(e)?this.currentThemePluginId===e?(this.currentThemePluginId=null,this.onThemeChanged(),!0):(this.onPluginVisualChange(),!0):!1}async setTheme(e){return this.switchThemePlugin(this.builtinThemes[e])}async switchThemePlugin(e){let t=this.getPluginId(e);if(this.currentThemePluginId===t)return!0;if(this.currentThemePluginId){if(!await this.pluginManager.unloadPlugin(this.currentThemePluginId))return!1;this.currentThemePluginId=null}return await this.pluginManager.loadPlugin(e)?(this.currentThemePluginId=t,this.onThemeChanged(),!0):!1}getPluginId(e){return`${e.metadata.name}@${e.metadata.version}`}isThemePlugin(e){return e.metadata.type===`theme`}},je=class{constructor(e,n={}){let i=_(n.locale),o=l(i,n.messages);this.logger=new S({enabled:!0,level:n.debug?`debug`:`info`,prefix:`Timeline`,useGlobalConfig:!1}),C({enabled:!0,level:n.debug?`debug`:`info`}),this.errorHandler=new K(this.logger);let s=document.getElementById(e);(!s||!(s instanceof HTMLCanvasElement))&&this.errorHandler.throw(a(o,`errorCanvasNotFound`,{canvasId:e})),this.canvas=s;let u=this.canvas.getContext(`2d`);u||this.errorHandler.throw(a(o,`errorCanvasContextUnavailable`)),this.ctx=u,n.startPaddingTime===void 0&&(n.startPaddingTime=10),this.config={...c,...n,locale:i,messages:o,colors:{...m,...n.colors},eventTextStyle:{...h,...n.eventTextStyle},eventBlockStyle:{...f,...n.eventBlockStyle},eventDurationPrefix:n.eventDurationPrefix??o.labelDurationPrefix,contextMenuItems:n.contextMenuItems||r(o),contextMenuStyle:{...t,...n.contextMenuStyle}},this.logger.setLevel(this.config.debug?`debug`:`info`),this.callbacks={onEventAdd:n.onEventAdd||null,onEventUpdate:n.onEventUpdate||null,onEventDelete:n.onEventDelete||null,onEventMove:n.onEventMove||null,onEventClick:n.onEventClick||null,onEventEdit:n.onEventEdit||null,onContextMenu:n.onContextMenu||null,onTrackAdd:n.onTrackAdd||null,onTrackRemove:n.onTrackRemove||null,onTimeIndicatorMove:n.onTimeIndicatorMove||null,onZoom:n.onZoom||null,onStatusChange:n.onStatusChange||null,onEventHighlight:n.onEventHighlight||null,onTimeIndicatorHighlight:n.onTimeIndicatorHighlight||null},this.stateManager=new le(this.config),this.state=this.stateManager.state,this.trackManager=new ge(this.state),this.eventIndexManager=new ue(this.state),this.eventMutationService=new fe({config:this.config,state:this.state,eventIndexManager:this.eventIndexManager,logger:this.logger,onMutate:()=>this.clearGuideLineCache()}),this.guideLineService=new me(this.config,this.state),this.hitTestService=new he(this.config,this.state,this.eventIndexManager),this.pluginManager=new ce({timeline:this,config:this.config,state:this.state}),this.renderManager=new G(this.canvas,this.ctx,this.config,this.state,this.pluginManager),this.pluginController=new Ae({pluginManager:this.pluginManager,builtinThemes:{light:D,dark:O},onThemeChanged:()=>this.notifyChange(`theme:change`),onPluginVisualChange:()=>this.redrawAfterPluginChange()}),this.canvasController=new xe({canvas:this.canvas,config:this.config,state:this.state,renderManager:this.renderManager,onCanvasResize:()=>this.notifyChange(`canvas:resize`)}),this.interactionManager=new ke({timeline:this,canvasController:this.canvasController}),n.theme&&this.pluginController.loadInitialTheme(n.theme),this.timeIndicatorController=new ve({config:this.config,state:this.state,renderManager:this.renderManager}),this.viewportController=new be({config:this.config,state:this.state,renderManager:this.renderManager}),this.changeScheduler=new de(this.state,this.config,this.callbacks),this.changeScheduler.setRenderManager(this.renderManager),this.changeScheduler.setEventIndexManager(this.eventIndexManager),this.changeScheduler.setDrawFunction(()=>this.draw()),this.init(),this.interactionManager.bind()}getCanvas(){return this.canvas}async usePlugin(e){return this.pluginController.usePlugin(e)}getLoadedPlugins(){return this.pluginController.getLoadedPlugins()}isPluginLoaded(e){return this.pluginController.isPluginLoaded(e)}async removePlugin(e){return this.pluginController.removePlugin(e)}async setTheme(e){return this.pluginController.setTheme(e)}init(){this.config.autoFitOnInit&&this.autoFitViewport(),this.notifyChange(`data:load`)}getContentWidthForZoom(e){return this.renderManager.getContentWidth(e)}hasHorizontalScrollbar(){return this.renderManager.hasHorizontalScrollbar()}getAvailableHeight(){return this.renderManager.getAvailableHeight()}notifyChange(e){this.changeScheduler.notify(e)}beginChangeBatch(){this.changeScheduler.beginBatch()}endChangeBatch(){this.changeScheduler.endBatch()}setDebug(e){this.config.debug!==e&&(this.config.debug=e,this.logger.setLevel(e?`debug`:`info`),C({level:e?`debug`:`info`}),this.notifyChange(`config:debug`))}setEnableTimeIndicator(e){this.config.enableTimeIndicator!==e&&(this.config.enableTimeIndicator=e,e||(this.state.draggingTimeIndicator=!1,this.state.timeIndicatorHighlightedEvents=[]),this.notifyChange(`config:timeIndicator`))}markDirty(e){this.renderManager.markDirty(e)}getLastLayerTimes(){return this.renderManager.getLastLayerTimes()}beginIndexBatch(){this.eventIndexManager.beginBatch()}endIndexBatch(){this.eventIndexManager.endBatch()}invalidateIndexTrack(e){this.eventIndexManager.invalidateTrack(e)}invalidateIndexAll(){this.eventIndexManager.invalidateAll()}autoFitViewport(){this.adjustCanvasSize();let e=this.viewportController.autoFitToCanvas();switch(e.type){case`fit`:this.setStatus(this.t(`statusAutoFit`,{percentage:e.percentage}));break;case`cappedWithPadding`:this.setStatus(this.t(`statusAutoFitCappedWithPadding`,{percentage:e.percentage,seconds:e.seconds}));break;case`cappedContentShort`:this.setStatus(this.t(`statusAutoFitCappedContentShort`,{percentage:e.percentage}));break;default:break}}setCanvasSize(e,t){this.canvasController.setCanvasSize(e,t)}getCanvasLogicalHeight(){return this.canvasController.getCanvasLogicalHeight()}getCachedLogicalHeight(){return this.canvasController.getCachedLogicalHeight()}adjustCanvasSize(){this.canvasController.adjustCanvasSize()}addTrack(){let e=this.trackManager.addTrack();this.clearGuideLineCache(),this.adjustCanvasSize(),this.setStatus(this.t(`statusTrackAdded`,{count:this.state.tracks.length})),this.callbacks.onTrackAdd&&this.callbacks.onTrackAdd(e)}removeTrack(){let e=this.trackManager.removeTrack();if(!e){this.setStatus(this.t(`statusAtLeastOneTrackRequired`));return}this.clearGuideLineCache(),this.adjustCanvasSize(),this.setStatus(this.t(`statusTrackRemoved`,{count:this.state.tracks.length})),this.callbacks.onTrackRemove&&this.callbacks.onTrackRemove(e)}autoRemoveEmptyLastTrack(){if(!this.config.autoRemoveEmptyLastTrack)return;let e=this.trackManager.removeEmptyLastTrack();for(;e;)this.clearGuideLineCache(),this.setStatus(this.t(`statusEmptyTrackRemoved`,{count:this.state.tracks.length})),this.callbacks.onTrackRemove&&this.callbacks.onTrackRemove(e),this.adjustCanvasSize(),e=this.trackManager.removeEmptyLastTrack()}addEvent(e,t,n,r,i=``,a,o=!1){let s=this.eventMutationService.addEvent(e,t,n,r,i,a,o);s&&(this.notifyChange(`events:add`),this.callbacks.onEventAdd&&this.callbacks.onEventAdd({trackIndex:e,event:d(s)}))}updateEvent(e,t,n){let r=this.eventMutationService.updateEvent(e,t,n);return r?(this.notifyChange(`events:update`),this.setStatus(this.t(`statusEventUpdated`,{title:r.event.title})),this.callbacks.onEventUpdate&&this.callbacks.onEventUpdate({trackIndex:e,eventIndex:t,event:d(r.event),oldEvent:r.oldEvent}),!0):!1}updateEventData(e,t,n){let r=this.eventMutationService.updateEventData(e,t,n);return r?(this.notifyChange(`events:update`),this.setStatus(this.t(`statusEventUpdated`,{title:r.event.title})),this.callbacks.onEventUpdate&&this.callbacks.onEventUpdate({trackIndex:e,eventIndex:t,event:d(r.event),oldEvent:r.oldEvent}),!0):!1}deleteEvent(e,t){let n=this.eventMutationService.deleteEvent(e,t);return n?(this.autoRemoveEmptyLastTrack(),this.notifyChange(`events:delete`),this.setStatus(this.t(`statusEventDeleted`,{title:n.title})),this.callbacks.onEventDelete&&this.callbacks.onEventDelete({trackIndex:e,eventIndex:t,event:n}),!0):!1}loadData(e){return this.eventMutationService.loadData(e)?(this.state.tracks.length===0&&this.addTrack(),e.timeIndicatorPosition!==void 0&&this.setTimeIndicator(e.timeIndicatorPosition),this.notifyChange(`data:load`),this.setStatus(this.t(`statusDataLoaded`,{count:this.state.tracks.length})),!0):!1}setTimeIndicator(t,n=!1){if(typeof t!=`number`||isNaN(t))return this.logger.error(this.t(`errorTimeIndicatorInvalid`)),!1;let r=this.timeIndicatorController.setPosition(t,n);if(!r.changed)return!0;this.notifyChange(`timeIndicator:move`);let i=e(r.position);return this.setStatus(this.t(`statusTimeIndicatorMoved`,{time:i})),this.callbacks.onTimeIndicatorMove&&this.callbacks.onTimeIndicatorMove({position:r.position,time:i}),!0}setTimeIndicatorDuringDrag(e){this.timeIndicatorController.setPositionDuringDrag(e),this.notifyChange(`timeIndicator:drag`)}zoom(e){let t=this.viewportController.zoomByFactor(e);this.notifyChange(`zoom:change`),this.setStatus(this.t(`statusZoomChanged`,{percentage:t.percentage})),this.callbacks.onZoom&&t.changed&&this.callbacks.onZoom({zoomLevel:t.zoomLevel,percentage:t.percentage})}setZoomLevel(e){if(typeof e!=`number`||isNaN(e))return this.logger.error(this.t(`errorZoomLevelInvalid`)),!1;if(e<1||e>1e3)return this.logger.error(this.t(`errorZoomLevelOutOfRange`)),!1;let t=this.viewportController.setZoomLevel(e);return this.notifyChange(`zoom:change`),this.setStatus(this.t(`statusZoomChanged`,{percentage:t.percentage})),this.callbacks.onZoom&&t.changed&&this.callbacks.onZoom({zoomLevel:t.zoomLevel,percentage:t.percentage}),!0}getZoomLevel(){return this.state.zoomLevel}setEndTime(t){if(typeof t!=`number`||isNaN(t))return this.logger.error(this.t(`errorEndTimeInvalid`)),!1;if(t<=this.config.startTime)return this.logger.error(this.t(`errorEndTimeNotAfterStart`)),!1;let n=this.viewportController.setEndTime(t);return n.hasOverflowEvents&&this.logger.warn(this.t(`warningEventsExceedEndTime`)),this.clearGuideLineCache(),this.notifyChange(`config:endTime`),this.setStatus(this.t(`statusEndTimeUpdated`,{from:e(n.oldEndTime),to:e(n.endTime)})),!0}getEndTime(){return this.config.endTime}formatTime(t){return e(t)}t(e,t={}){return a(this.config.messages,e,t)}setStatus(e){this.stateManager.setStatus(e,this.callbacks.onStatusChange||void 0)}getStatus(){return this.state.statusText}getInteractionTarget(e,t){return this.hitTestService.getInteractionTarget(e,t)}getEventAtPosition(e,t){return this.hitTestService.getEventAtPosition(e,t)}getResizeHandle(e,t){return this.hitTestService.getResizeHandle(e,t)}calculateGuideLines(e,t,n,r,i){return this.guideLineService.calculateGuideLines(e,t,n,r,i)}snapToGuideLines(e,t){if(this.state.guideLines.length===0)return null;let n=this.config.guideLineSnapThreshold,r=e+t,i=null,a=2**53-1;for(let o of this.state.guideLines)if(o.type===`start`){let t=Math.abs(o.time-e);t<n&&t<a&&(a=t,i=o.time)}else if(o.type===`end`){let e=Math.abs(o.time-r);e<n&&e<a&&(a=e,i=o.time-t)}return i}snapEdgeToGuideLines(e){if(this.state.guideLines.length===0)return null;let t=this.config.guideLineSnapThreshold,n=null,r=2**53-1;for(let i of this.state.guideLines){let a=Math.abs(i.time-e);a<t&&a<r&&(r=a,n=i.time)}return n}canMoveEvent(e,t,n,r,i){let a=r+i,o=this.config.endTime+this.config.endPaddingTime;if(r<this.config.startTime||a>o||n<0||n>=this.state.tracks.length)return!1;let s=this.state.tracks[n];for(let i=0;i<s.events.length;i++){if(n===e&&i===t)continue;let o=s.events[i];if(!(a<=o.startTime||r>=o.endTime))return!1}return!!this.pluginManager.validateEvent(`validate:event:move`,{fromTrackIndex:e,fromEventIndex:t,toTrackIndex:n,newStartTime:r,duration:i})}showSplitLine(e,t,n){(!this.state.hoveredSplitLine||this.state.hoveredSplitLine.trackIndex!==e||this.state.hoveredSplitLine.eventIndex!==t||Math.abs(this.state.hoveredSplitLine.splitTime-n)>.001)&&(this.state.hoveredSplitLine={trackIndex:e,eventIndex:t,splitTime:n},this.notifyChange(`interaction:splitLine`))}hideSplitLine(){this.state.hoveredSplitLine&&(this.state.hoveredSplitLine=null,this.notifyChange(`interaction:splitLine`))}splitEvent(e,t,n){if(e<0||e>=this.state.tracks.length)return!1;let r=this.state.tracks[e];if(t<0||t>=r.events.length)return!1;let i=r.events[t];if(n<=i.startTime+this.config.minEventDuration||n>=i.endTime-this.config.minEventDuration)return this.setStatus(this.t(`statusInvalidSplitPosition`)),!1;let a={...i,id:i.id,duration:s(n-i.startTime),endTime:n,title:`${i.title} (1)`},o={...i,id:r.events.length,startTime:n,duration:s(i.endTime-n),endTime:s(i.endTime),title:`${i.title} (2)`};return r.events[t]=a,r.events.push(o),this.clearGuideLineCache(),this.eventIndexManager.invalidateTrack(e),this.notifyChange(`events:split`),this.setStatus(this.t(`statusEventSplit`,{title:i.title})),this.callbacks.onEventUpdate&&this.callbacks.onEventUpdate({type:`split`,trackIndex:e,eventIndex:t,event:d(i),firstEvent:d(a),secondEvent:d(o)}),!0}draw(){this.renderManager.draw()}setReadOnly(e){this.config.readOnly=e,e&&(this.state.selectedEvent=null,this.state.draggingEvent=null,this.state.resizingEvent=null,this.state.draggingTimeIndicator=!1,this.state.contextMenuVisible=!1,this.state.contextMenuEvent=null,this.state.hoveredResizeHandle=null,this.state.hoveredSplitLine=null,this.state.guideLines=[]),this.notifyChange(`config:readOnly`),this.setStatus(this.t(e?`statusReadOnlyModeEnabled`:`statusReadOnlyModeDisabled`))}highlightEvent(e,t){if(e<0||e>=this.state.tracks.length)return this.logger.error(this.t(`errorInvalidTrackIndexWithValue`,{trackIndex:e})),!1;let n=this.state.tracks[e];if(t<0||t>=n.events.length)return this.logger.error(this.t(`errorInvalidEventIndexWithValue`,{eventIndex:t})),!1;this.state.selectedEvent=null,this.state.selectedTrack=null,this.state.highlightedEvent={trackIndex:e,eventIndex:t};let r=n.events[t];return this.notifyChange(`highlight:change`),this.setStatus(this.t(`statusEventHighlighted`,{title:r.title})),!0}clearHighlight(){(this.state.highlightedEvent||this.state.selectedEvent)&&(this.state.highlightedEvent=null,this.state.selectedEvent=null,this.state.selectedTrack=null,this.notifyChange(`highlight:change`),this.setStatus(this.t(`statusHighlightCleared`)))}getHighlightedEvent(){return this.state.highlightedEvent}isReadOnly(){return this.config.readOnly}destroy(){this.clearGuideLineCache(),this.interactionManager.destroy(),this.setStatus(this.t(`statusTimelineDestroyed`))}clearGuideLineCache(){this.guideLineService.clearCache()}redrawAfterPluginChange(){this.markDirty([`background`,`tracks`,`timeline`,`guideLines`,`indicator`,`scrollbar`,`interaction`,`overlay`]),this.draw()}};function Me(e,t){if(!e.descriptionI18n)return e.description;let n=_(t);return e.descriptionI18n[n]||e.descriptionI18n.zh||e.description}export{ee as ContextMenuPlugin,O as DarkThemePlugin,g as EventMediaPlugin,A as EventTooltipPlugin,D as LightThemePlugin,k as PerformanceOverlayPlugin,E as PluginPriority,T as PluginType,je as Timeline,r as createDefaultContextMenuItems,l as createTimelineMessages,o as formatDuration,e as formatTime,v as formatTimeRange,b as getCurrentTime,Me as getPluginMetadataDescription,_ as normalizeTimelineLocale,i as translateTimelineConfig,a as translateTimelineMessage};
@@ -526,10 +526,17 @@ declare global {
526
526
  //#region src/utils/time.d.ts
527
527
  declare function formatTime(seconds: number, showSeconds?: boolean): string;
528
528
  declare function getCurrentTime(): number;
529
+ declare function formatTimeRange(startTime: number, endTime: number): string;
530
+ declare function formatDuration(duration: number, label?: string): string;
529
531
  //#endregion
530
532
  //#region src/utils/i18n.d.ts
531
533
  type TimelineMessageKey = keyof TimelineI18nMessages;
534
+ type ResolvedTimelineLocale = Exclude<TimelineLocale, "zh">;
535
+ declare function normalizeTimelineLocale(locale?: string): ResolvedTimelineLocale;
532
536
  declare function createTimelineMessages(locale?: string, overrides?: Partial<TimelineI18nMessages>): TimelineI18nMessages;
537
+ declare function translateTimelineMessage(messages: TimelineI18nMessages, key: TimelineMessageKey, params?: TimelineMessageParams): string;
538
+ declare function translateTimelineConfig(config: Pick<TimelineConfig, "locale" | "messages">, key: TimelineMessageKey, params?: TimelineMessageParams): string;
539
+ declare function createDefaultContextMenuItems(localeOrMessages?: string | TimelineI18nMessages, overrides?: Partial<TimelineI18nMessages>): ContextMenuItem[];
533
540
  //#endregion
534
541
  //#region src/utils/performanceMonitor.d.ts
535
542
  interface PerformanceStats {
@@ -553,20 +560,22 @@ declare class Timeline {
553
560
  config: TimelineConfig;
554
561
  callbacks: TimelineCallbacks;
555
562
  state: TimelineState;
556
- private mouseHandler;
557
- private wheelHandler;
558
563
  private renderManager;
559
- private eventListeners;
564
+ private canvasController;
565
+ private interactionManager;
560
566
  private pluginManager;
567
+ private pluginController;
561
568
  private logger;
562
569
  private errorHandler;
563
570
  private stateManager;
564
571
  private eventIndexManager;
565
572
  private eventMutationService;
573
+ private trackManager;
574
+ private timeIndicatorController;
575
+ private viewportController;
566
576
  private guideLineService;
567
577
  private hitTestService;
568
578
  private changeScheduler;
569
- private currentThemePluginId;
570
579
  constructor(canvasId: string, options?: TimelineOptions);
571
580
  getCanvas(): HTMLCanvasElement;
572
581
  usePlugin(plugin: TimelinePlugin): Promise<boolean>;
@@ -574,7 +583,6 @@ declare class Timeline {
574
583
  isPluginLoaded(pluginName: string): boolean;
575
584
  removePlugin(pluginId: string): Promise<boolean>;
576
585
  setTheme(theme: "light" | "dark"): Promise<boolean>;
577
- private switchTheme;
578
586
  private init;
579
587
  getContentWidthForZoom(zoomLevel: number): number;
580
588
  hasHorizontalScrollbar(): boolean;
@@ -599,9 +607,7 @@ declare class Timeline {
599
607
  endIndexBatch(): void;
600
608
  invalidateIndexTrack(trackIndex: number): void;
601
609
  invalidateIndexAll(): void;
602
- private autoFitZoomToCanvas;
603
- private setupEventListeners;
604
- private setInitialCanvasSize;
610
+ private autoFitViewport;
605
611
  setCanvasSize(width: number, height: number): void;
606
612
  getCanvasLogicalHeight(): number;
607
613
  getCachedLogicalHeight(): number;
@@ -629,9 +635,6 @@ declare class Timeline {
629
635
  * - 使用节流的边界滚动而非每帧滚动
630
636
  */
631
637
  setTimeIndicatorDuringDrag(seconds: number): void;
632
- private _lastEdgeScrollTime;
633
- private scrollToTimeIndicatorThrottled;
634
- private scrollToTimeIndicator;
635
638
  zoom(factor: number): void;
636
639
  setZoomLevel(zoomLevel: number): boolean;
637
640
  getZoomLevel(): number;
@@ -657,10 +660,6 @@ declare class Timeline {
657
660
  eventIndex: number;
658
661
  edge: "left" | "right";
659
662
  } | null;
660
- private getEdgeScrollThrottle;
661
- private getEdgeScrollTriggerMargin;
662
- private getEdgeScrollViewportMargin;
663
- private resolveEdgeScrollValue;
664
663
  calculateGuideLines(fromTrackIndex: number, eventIndex: number, toTrackIndex: number, newStartTime: number, duration: number): Array<{
665
664
  time: number;
666
665
  type: "start" | "end";
@@ -688,8 +687,6 @@ declare class Timeline {
688
687
  isReadOnly(): boolean;
689
688
  destroy(): void;
690
689
  private clearGuideLineCache;
691
- private getPluginId;
692
- private isThemePlugin;
693
690
  private redrawAfterPluginChange;
694
691
  }
695
692
  //#endregion
@@ -804,4 +801,4 @@ interface PerformanceProvider {
804
801
  getFPS: () => number;
805
802
  }
806
803
  //#endregion
807
- export { TimelineCallbacks as A, ZoomData as B, EventEditData as C, InteractionTarget as D, EventUpdateData as E, TimelineLocale as F, TimelineMessageParams as I, TimelineOptions as L, TimelineConfig as M, TimelineEvent as N, LoadDataFormat as O, TimelineI18nMessages as P, TimelineState as R, EventDeleteData as S, EventTextStyle as T, ContextMenuData as _, PluginLocalizedText as a, EventAddData as b, PluginType as c, TimelinePlugin as d, Timeline as f, getCurrentTime as g, formatTime as h, PluginContext as i, TimelineColors as j, TimeIndicatorMoveData as k, RenderLayer as l, createTimelineMessages as m, CoreRenderTarget as n, PluginMetadata as o, ChangeType as p, PluginAPI as r, PluginPriority as s, CoreLayerHook as t, RenderLayerPosition as u, ContextMenuItem as v, EventMoveData as w, EventClickData as x, ContextMenuStyle as y, Track as z };
804
+ export { EventMoveData as A, TimelineI18nMessages as B, ContextMenuData as C, EventClickData as D, EventAddData as E, TimeIndicatorMoveData as F, Track as G, TimelineMessageParams as H, TimelineCallbacks as I, ZoomData as K, TimelineColors as L, EventUpdateData as M, InteractionTarget as N, EventDeleteData as O, LoadDataFormat as P, TimelineConfig as R, getCurrentTime as S, ContextMenuStyle as T, TimelineOptions as U, TimelineLocale as V, TimelineState as W, translateTimelineConfig as _, PluginLocalizedText as a, formatTime as b, PluginType as c, TimelinePlugin as d, Timeline as f, normalizeTimelineLocale as g, createTimelineMessages as h, PluginContext as i, EventTextStyle as j, EventEditData as k, RenderLayer as l, createDefaultContextMenuItems as m, CoreRenderTarget as n, PluginMetadata as o, ChangeType as p, PluginAPI as r, PluginPriority as s, CoreLayerHook as t, RenderLayerPosition as u, translateTimelineMessage as v, ContextMenuItem as w, formatTimeRange as x, formatDuration as y, TimelineEvent as z };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "timeline-canvas",
3
- "version": "1.4.0",
3
+ "version": "1.4.1",
4
4
  "description": "A powerful timeline component built with Canvas and TypeScript",
5
5
  "main": "dist/index.mjs",
6
6
  "module": "dist/index.mjs",
@@ -50,4 +50,4 @@
50
50
  "import": "./dist/builtin-plugin/*.mjs"
51
51
  }
52
52
  }
53
- }
53
+ }
@@ -1 +0,0 @@
1
- import{i as e}from"./Logger-CfVK3yFL.mjs";import{n as t}from"./types-Dc2ct_CM.mjs";const n=e(`ContextMenuPlugin`);function r(e,t){return e(t)}function i(e={}){return{metadata:{name:`context-menu`,version:`1.0.0`,description:`Context menu as plugin, supports HTML takeover`,descriptionI18n:{"zh-CN":`插件化右键菜单,支持 HTML 接管渲染`},type:t.EXTENSION},activate(t){let i=t.config&&t.config.contextMenuHtml||void 0,a=e.htmlTemplate||(typeof i==`string`?i:void 0),o=!!a;o&&(!a||a.trim()===``)&&(n.warn(t.timeline.t(`warningEmptyHtmlTemplateFallback`)),o=!1),t.api.registerRenderLayer({name:`context-menu-overlay`,position:`overlay`,render(e,n,i,s){if(!i.enableContextMenu||!s.contextMenuVisible||!s.contextMenuEvent){let e=r(t.api.getData,`contextMenuContainer`)||null;e&&(e.style.display=`none`),s.contextMenuBounds=null;return}let{padding:c,itemHeight:l,borderRadius:u,borderWidth:d,minWidth:f,fontSize:p,fontFamily:m,fontWeight:h}=i.contextMenuStyle;e.save(),e.font=`${h} ${p}px ${m}`;let g=f,_=`${h}-${p}-${m}`,v=r(t.api.getData,`contextMenuTextWidthCache`)||{},y=v[_]||{};for(let t of i.contextMenuItems){let n=y[t.name],r=n===void 0?e.measureText(t.name).width:n;n===void 0&&(y[t.name]=r),g=Math.max(g,r+c*2)}v[_]=y,t.api.setData(`contextMenuTextWidthCache`,v);let b=g,x=i.contextMenuItems.length*l+c*2,S=t.timeline.getCanvas().getBoundingClientRect(),C=s.contextMenuX,w=s.contextMenuY;if(C+b>S.width&&(C=S.width-b-5),w+x>S.height&&(w=S.height-x-5),s.contextMenuBounds={x:C,y:w,width:b,height:x,itemHeight:l,padding:c},o){let n=r(t.api.getData,`contextMenuContainer`)||null;if(!n){n=document.createElement(`div`),n.style.position=`absolute`,n.style.zIndex=`1000`,n.style.boxShadow=`0 2px 10px rgba(0,0,0,0.3)`,n.style.border=`${d}px solid ${i.colors.contextMenuBorder}`,n.style.borderRadius=`${u}px`,n.style.font=`${h} ${p}px ${m}`,n.style.background=i.colors.contextMenuBackground,n.style.color=i.colors.contextMenuText;let e=t.timeline.getCanvas().parentElement||document.body;e.style.position=e.style.position||`relative`,e.appendChild(n),t.api.setData(`contextMenuContainer`,n)}if(n.style.display=`block`,n.style.left=`${C}px`,n.style.top=`${w}px`,n.style.width=`${b}px`,n.style.height=`${x}px`,a)n.innerHTML=a;else{let e=``;for(let t=0;t<i.contextMenuItems.length;t++){let n=i.contextMenuItems[t],r=s.hoveredContextMenuItem===t,a=r?i.colors.contextMenuHoverBackground:`transparent`,o=r?i.colors.contextMenuHoverText:i.colors.contextMenuText;e+=`<div style="height:${l}px; padding:${c}px; background:${a}; color:${o}; display:flex; align-items:center;">${n.name}</div>`}n.innerHTML=e}e.restore();return}e.shadowColor=`rgba(0, 0, 0, 0.3)`,e.shadowBlur=10,e.shadowOffsetX=0,e.shadowOffsetY=2,e.fillStyle=i.colors.contextMenuBackground,e.beginPath(),e.roundRect?e.roundRect(C,w,b,x,u):(e.moveTo(C+u,w),e.lineTo(C+b-u,w),e.quadraticCurveTo(C+b,w,C+b,w+u),e.lineTo(C+b,w+x-u),e.quadraticCurveTo(C+b,w+x,C+b-u,w+x),e.lineTo(C+u,w+x),e.quadraticCurveTo(C,w+x,C,w+x-u),e.lineTo(C,w+u),e.quadraticCurveTo(C,w,C+u,w)),e.fill(),e.shadowColor=`transparent`,e.strokeStyle=i.colors.contextMenuBorder,e.lineWidth=d,e.stroke(),e.font=`${h} ${p}px ${m}`;for(let t=0;t<i.contextMenuItems.length;t++){let n=i.contextMenuItems[t],r=w+c+t*l;s.hoveredContextMenuItem===t&&(e.fillStyle=i.colors.contextMenuHoverBackground,e.beginPath(),t===0?e.roundRect?e.roundRect(C+d,r,b-d*2,l,[u-d,u-d,0,0]):e.fillRect(C+d,r,b-d*2,l):t===i.contextMenuItems.length-1&&e.roundRect?e.roundRect(C+d,r,b-d*2,l,[0,0,u-d,u-d]):e.fillRect(C+d,r,b-d*2,l),e.fill()),e.fillStyle=s.hoveredContextMenuItem===t?i.colors.contextMenuHoverText:i.colors.contextMenuText,e.textAlign=`left`,e.textBaseline=`middle`,e.fillText(n.name,C+c,r+l/2)}e.restore()}})},deactivate(e){e.api.unregisterRenderLayer(`context-menu-overlay`);let t=r(e.api.getData,`contextMenuContainer`)||null;t&&t.parentElement&&t.parentElement.removeChild(t)},destroy(e){let t=r(e.api.getData,`contextMenuContainer`)||null;t&&t.parentElement&&t.parentElement.removeChild(t)}}}export{i as t};
@@ -1 +0,0 @@
1
- import{n as e}from"./types-Dc2ct_CM.mjs";const t={canvasBackground:`#1E1E2E`,timelineBackground:`#2D2D3D`,trackBackground:`#2A2A3A`,trackBackgroundSelected:`#3A3A4A`,timelineText:`#CCCCDD`,timelineGrid:`#5A5A7A`,timelineSubGrid:`#3A3A4A`,trackText:`#CCCCDD`,eventColors:[`#FF6B6B`,`#4ECDC4`,`#45B7D1`,`#96CEB4`,`#FECA57`,`#FF9FF3`],eventText:`#FFFFFF`,eventBorder:`#FFFFFF`,eventBorderSelected:`#FFD700`,eventOverlay:`rgba(255, 255, 255, 0.1)`,dragPreviewValid:`rgba(100, 255, 100, 0.5)`,dragPreviewInvalid:`rgba(255, 100, 100, 0.5)`,dragPreviewBorderValid:`#00FF00`,dragPreviewBorderInvalid:`#FF0000`,timeIndicator:`#FF6B6B`,guideLine:`#00D9FF`,guideLineLabel:`#00D9FF`,dragTimeReferenceLine:`#FFD700`,dragTimeReferenceLabel:`#FFD700`,dragTimeReferenceLabelBackground:`rgba(0, 0, 0, 0)`,scrollbarTrack:`rgba(255, 255, 255, 0.6)`,scrollbarHandle:`rgba(150, 150, 150, 0.8)`,scrollbarHandleHover:`rgba(0, 0, 0, 0.85)`,scrollbarHandleHighlight:`rgba(255, 255, 255, 0.3)`,scrollbarBorder:`rgba(255, 255, 255, 0.9)`,contextMenuBackground:`#2D2D3D`,contextMenuBorder:`#5A5A7A`,contextMenuText:`#CCCCDD`,contextMenuHoverBackground:`#3A3A4A`,contextMenuHoverText:`#FFFFFF`,eventDurationLabel:`#FFD700`},n={metadata:{name:`theme-dark`,version:`1.0.0`,description:`Dark theme for timeline`,descriptionI18n:{"zh-CN":`时间轴暗色主题`},type:e.THEME},activate(e){e.config.colors={...e.config.colors,...t},e.api.registerRenderLayer({name:`theme-dark-background`,position:`background`,render(e,t,n){e.fillStyle=n.colors.canvasBackground,e.fillRect(0,0,t.width,t.height)}})},deactivate(e){e.api.unregisterRenderLayer(`theme-dark-background`)}};export{n as t};