timeline-canvas 1.5.0 → 1.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.mjs CHANGED
@@ -1 +1 @@
1
- import{a as e,c as t,d as n,f as r,i,l as a,n as o,o as s,p as c,r as l,s as u,t as d,u as f}from"./EventMediaPlugin-BCuSI5ww.mjs";import{t as p}from"./PerformanceOverlayPlugin-Cph1TMWd.mjs";import{i as m,n as h,r as g,t as _}from"./Logger-BX6_sfV3.mjs";import{n as v,t as y}from"./types-DhRsiQBh.mjs";import{t as b}from"./LightThemePlugin-BD4cbg_E.mjs";import{t as x}from"./DarkThemePlugin-pFFtYjOV.mjs";import{t as S}from"./ContextMenuPlugin-Btbm1QEm.mjs";import{t as C}from"./EventTooltipPlugin-0Dz25qie.mjs";function w(e,t=!0){let n=Math.round(e),r=Math.floor(n/3600),i=Math.floor(n%3600/60),a=n%60;return t?`${r.toString().padStart(2,`0`)}:${i.toString().padStart(2,`0`)}:${a.toString().padStart(2,`0`)}`:`${r.toString().padStart(2,`0`)}:${i.toString().padStart(2,`0`)}`}function T(){let e=new Date;return e.getHours()*3600+e.getMinutes()*60+e.getSeconds()}function E(e,t,n,r,i,a){if(n)return 1;if(i!=null&&i>0){let t=i/Math.max(1,Math.floor(a??10));return e>=r?t:i}return t*60}function D(e,t){return Math.round(e/t)*t}function O(e,t=3){let n=10**t;return Math.round(e*n)/n}function k(e,t){return`${w(e)} - ${w(t)}`}function A(e,t){let n=w(O(e));return t?`${t} ${n}`:n}function ee(e){return typeof structuredClone==`function`?structuredClone(e):j(e)}function j(e){let t=Object.entries(e).map(([e,t])=>[e,M(t)]);return Object.fromEntries(t)}function te(e){return e.map(e=>M(e))}function M(e){return Array.isArray(e)?te(e):N(e)?j(e):e}function ne(e){if(e.media)return{...e.media.images?{images:e.media.images.map(e=>({src:e.src,...e.fit?{fit:e.fit}:{},...e.opacity===void 0?{}:{opacity:e.opacity}}))}:{},...e.media.waveform?{waveform:{data:e.media.waveform.data,...e.media.waveform.color?{color:e.media.waveform.color}:{},...e.media.waveform.backgroundColor?{backgroundColor:e.media.waveform.backgroundColor}:{},...e.media.waveform.opacity===void 0?{}:{opacity:e.media.waveform.opacity}}}:{}}}function N(e){if(typeof e!=`object`||!e)return!1;let t=Object.getPrototypeOf(e);return t===Object.prototype||t===null}function P(e){return{id:e.id,startTime:e.startTime,endTime:e.endTime,duration:e.duration,title:e.title,description:e.description,color:e.color,...e.readonly?{readonly:e.readonly}:{},...e.customData?{customData:ee(e.customData)}:{},...e.media?{media:ne(e)}:{}}}var re=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 F=m(`RenderPipeline`);let I=0;function ie(e){return e!==`background`&&e!==`overlay`}var ae=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:i,skipPerfMeasure:a=!1}=t,o=n-I>=250;o&&(I=n,F.debugStyled(_.pipeline,`▶ Render Start`,`forceFullRender=${r}`,i?`dirtyLayers=[${Array.from(i).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,i)){this.stats.skippedLayers++;continue}let o=a?0:performance.now();try{let r=ie(t)?e.pluginManager?.getCoreLayerHooks(t):void 0;r&&r.length>0?this.executeWithHooks(e,n,r):n.render(e),this.stats.renderedLayers++}catch(n){F.error(`${f(e.config,`errorRenderLayer`,{layer:t})}:`,n)}a||(this.stats.layerTimes[t]=performance.now()-o)}return this.stats.totalTime=performance.now()-n,o&&F.debugStyled(_.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)},i=()=>t.render(e);for(let t=n.length-1;t>=0;t--){let a=n[t],o=i;i=()=>{try{a.handler(e.ctx,r,e.config,e.state,o)}catch(t){F.error(`${f(e.config,`errorCoreLayerHook`,{hook:a.name})}:`,t),o()}}}i()}shouldRenderLayer(e,t,n,r,i){return r||!i?!0:i.has(e)}getStats(){return{...this.stats}}clearPrevContext(){}getRegisteredRenderers(){return this.renderers}},oe=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 se=m(`EventsRenderer`),L=new Map;var ce=class{renderEvents(e,t,n,i,a,o,s,c){let l=c??o.width,u=n.tracks[i],d=Math.max(5,t.trackHeight*.0625),f=t.trackHeight-d*2,p=t.eventTextStyle,m=p.titleFontSize===`auto`?Math.max(10,Math.min(14,t.trackHeight*.175)):p.titleFontSize,h=p.timeFontSize===`auto`?Math.max(8,Math.min(12,t.trackHeight*.15)):p.timeFontSize,g=performance.now();g-(L.get(i)??0)>=500&&(L.set(i,g),se.debugStyled(_.eventRender,`Track ${i}: ${u.events.length} events`));for(let c=0;c<u.events.length;c++){let g=u.events[c];if(n.draggingEvent&&n.draggingEvent.isDragging&&n.draggingEvent.trackIndex===i&&n.draggingEvent.eventIndex===c)continue;let _=t.startPaddingTime+(g.startTime-t.startTime)*t.secondWidth*n.zoomLevel-n.scrollX,v=g.duration*t.secondWidth*n.zoomLevel;if(_+v<0||_>l)continue;let y=n.selectedEvent&&n.selectedEvent.trackIndex===i&&n.selectedEvent.eventIndex===c,b=n.highlightedEvent&&n.highlightedEvent.trackIndex===i&&n.highlightedEvent.eventIndex===c,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?(r(e,_,a+d,v,f,w),e.fill()):e.fillRect(_,a+d,v,f),e.restore(),s&&s.emitEvent(`render:event:media`,e,o,t,n,i,c,_,a,v,d,f),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?r(e,_,a+d,v,f,w,!0):e.strokeRect(_,a+d,v,f),e.shadowBlur=0,e.restore()),this.drawEventText(e,t,g,_,a,v,d,m,h,p),t.enableEventResize&&this.drawResizeHandles(e,t,n,i,c,_,a,v,f,d),t.showEventDurationLabel&&C&&this.drawEventDurationLabel(e,t,g,_,a,v,d),t.enableEventSplit&&n.hoveredSplitLine&&!n.draggingEvent&&!n.resizingEvent&&!n.draggingTimeIndicator&&this.drawSplitLine(e,t,n,i,c,a,d,f)}}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=k(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(e,t,n,r,i,a,o,s){let c=n.hoveredSplitLine;if(c.trackIndex===r&&c.eventIndex===i){let r=(c.splitTime+t.startPaddingTime-t.startTime)*t.secondWidth*n.zoomLevel-n.scrollX;e.save(),e.strokeStyle=`rgba(255, 255, 0, 0.8)`,e.lineWidth=2,e.setLineDash([5,5]),e.beginPath(),e.moveTo(r,a+o),e.lineTo(r,a+o+s),e.stroke(),e.setLineDash([]),e.fillStyle=`rgba(255, 255, 0, 1)`,e.beginPath(),e.arc(r,a+o,4,0,Math.PI*2),e.fill(),e.beginPath(),e.arc(r,a+o+s,4,0,Math.PI*2),e.fill();let i=w(c.splitTime);e.font=`bold 11px Arial`,e.fillStyle=`rgba(255, 255, 0, 1)`,e.textAlign=`center`,e.fillText(`Split: ${i}`,r,a+o-5),e.restore()}}drawEventDurationLabel(e,t,n,r,i,a,o){e.save();let s=Math.round(n.duration*1e3)/1e3,c;c=t.formatEventDuration?t.formatEventDuration(s):A(s,t.eventDurationPrefix),e.font=`bold 11px Arial`,e.fillStyle=t.colors.eventDurationLabel,e.textAlign=`center`;let l=r+a/2,u=i+o-8;e.fillText(c,l,u),e.restore()}},le=class{constructor(){this.name=`Tracks`,this.layer=`tracks`,this.eventsRenderer=new ce}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}},ue=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,i,a){let o=t.startPaddingTime+(t.endTime+t.endPaddingTime-t.startTime)*t.secondWidth*n.zoomLevel>i?13:0,s=t.timelineHeight+t.firstTrackTopMargin+n.tracks.length*(t.trackHeight+t.trackMargin);if(s>a-o){let c=i-8-5,l=t.timelineHeight,u=a-t.timelineHeight-o-5;e.fillStyle=t.colors.scrollbarTrack,r(e,c,l,8,u,4);let d=(a-o-5)/s,f=Math.max(30,u*d),p=s-a+o+5,m=n.scrollY/p,h=l+(u-f)*m;e.fillStyle=n.draggingScrollbar?t.colors.scrollbarHandleHover:t.colors.scrollbarHandle,r(e,c,h,8,f,4),e.fillStyle=t.colors.scrollbarHandleHighlight,r(e,c,h,8,f/2,4),n.draggingScrollbar&&(e.strokeStyle=t.colors.scrollbarBorder,e.lineWidth=1,r(e,c,h,8,f,4,!0))}}drawHorizontalScrollbar(e,t,n,i,a){let o=t.startPaddingTime+(t.endTime+t.endPaddingTime-t.startTime)*t.secondWidth*n.zoomLevel;if(o<=i)return;let s=t.timelineHeight+t.firstTrackTopMargin+n.tracks.length*(t.trackHeight+t.trackMargin)>a?13:0,c=a-8-5,l=i-s;e.fillStyle=t.colors.scrollbarTrack,r(e,0,c,l,8,4);let u=i/o,d=Math.max(30,l*u),f=o-i,p=n.scrollX/f,m=0+(l-d)*p;e.fillStyle=n.draggingHorizontalScrollbar?t.colors.scrollbarHandleHover:t.colors.scrollbarHandle,r(e,m,c,d,8,4),e.fillStyle=t.colors.scrollbarHandleHighlight,r(e,m,c,d/2,8,4),n.draggingHorizontalScrollbar&&(e.strokeStyle=t.colors.scrollbarBorder,e.lineWidth=1,r(e,m,c,d,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}},R=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}},z=class{constructor(){this.name=`GuideLines`,this.layer=`guideLines`}render(e){let{ctx:t,config:n,state:r,width:i,height:a}=e;if(t.save(),r.guideLines.length>0){t.strokeStyle=n.colors.guideLine,t.lineWidth=2,t.setLineDash([5,5]);for(let e of r.guideLines){let o=n.startPaddingTime+(e.time-n.startTime)*n.secondWidth*r.zoomLevel-r.scrollX;o<-10||o>i+10||(t.beginPath(),t.moveTo(o,n.timelineHeight),t.lineTo(o,a),t.stroke(),t.setLineDash([]),t.fillStyle=n.colors.guideLineLabel,t.font=`bold 11px Arial`,t.textAlign=`center`,t.fillText(w(e.time),o,n.timelineHeight-5),t.setLineDash([5,5]))}}if(r.dragTimeReference){let e=n.startPaddingTime+(r.dragTimeReference.time-n.startTime)*n.secondWidth*r.zoomLevel-r.scrollX;if(e>=-10&&e<=i+10){let i=r.dragTimeReference.y-r.scrollY;t.strokeStyle=n.colors.dragTimeReferenceLine,t.lineWidth=2,t.setLineDash([8,4]),t.beginPath(),t.moveTo(e,n.timelineHeight),t.lineTo(e,i),t.stroke(),t.setLineDash([]),t.fillStyle=n.colors.dragTimeReferenceLabel,t.font=`bold 12px Arial`,t.textAlign=`center`;let a=w(r.dragTimeReference.time),o=t.measureText(a).width;t.fillStyle=n.colors.dragTimeReferenceLabelBackground,t.fillRect(e-o/2-4,n.timelineHeight-14-4-5,o+8,22),t.fillStyle=n.colors.dragTimeReferenceLabel,t.fillText(a,e,n.timelineHeight-5)}}t.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}},B=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 i=n.tracks[n.draggingEvent.trackIndex].events[n.draggingEvent.eventIndex];if(!i)return;let a=n.draggingEvent.currentMouseY||0,o=n.draggingEvent.canMove!==!1,s=Math.floor((a-t.timelineHeight-t.firstTrackTopMargin)/(t.trackHeight+t.trackMargin)),c=Math.max(0,Math.min(n.tracks.length-1,s)),l=t.timelineHeight+t.firstTrackTopMargin+c*(t.trackHeight+t.trackMargin),u=(n.draggingEvent.currentMouseX||0)-n.dragOffsetX,d=i.duration*t.secondWidth*n.zoomLevel,f=Math.max(5,t.trackHeight*.0625),p=t.trackHeight-f*2,m=t.eventBlockStyle.borderRadius;e.save(),o?(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?(r(e,u,l-n.scrollY+f,d,p,m),e.fill(),e.stroke()):(e.fillRect(u,l-n.scrollY+f,d,p),e.strokeRect(u,l-n.scrollY+f,d,p)),e.restore()}renderDraggingEvent(e,t,n){if(!n.draggingEvent||!n.tracks[n.draggingEvent.trackIndex].events)return;let i=n.tracks[n.draggingEvent.trackIndex].events[n.draggingEvent.eventIndex];if(!i)return;let a=n.draggingEvent.currentMouseX||0,o=n.draggingEvent.currentMouseY||0,s=a-n.dragOffsetX,c=o-n.dragOffsetY-n.scrollY,l=i.duration*t.secondWidth*n.zoomLevel,u=Math.max(5,t.trackHeight*.0625),d=t.trackHeight-u*2;e.save();let f=t.eventBlockStyle.borderRadius;e.fillStyle=i.color,f>0?(r(e,s,c+u,l,d,f),e.fill()):e.fillRect(s,c+u,l,d),e.strokeStyle=t.colors.eventBorderSelected,e.lineWidth=2,t.eventBlockStyle.enableSelectionGlow&&(e.shadowColor=t.colors.eventBorderSelected,e.shadowBlur=t.eventBlockStyle.selectionGlowBlur),f>0?(r(e,s,c+u,l,d,f),e.stroke()):e.strokeRect(s,c+u,l,d),e.shadowBlur=0,e.restore(),this.renderEventText(e,t,i,s,c,l,u)}renderEventText(e,t,n,r,i,a,o){let s=t.eventTextStyle,c=s.titleColor||t.colors.eventText,l=s.timeColor||t.colors.eventText,u={left:r+10,right:r+a-10,center:r+a/2}[s.textAlign]??r+a/2,d={top:i+o,middle:i+t.trackHeight/2,bottom:i+t.trackHeight-o}[s.verticalAlign]??i+o;e.textAlign=s.textAlign;let f=s.showTitle&&t.trackHeight>=s.minHeightForTitle,p=s.showTime&&t.trackHeight>=s.minHeightForTime,m=s.titleFontSize===`auto`?Math.max(10,Math.min(14,t.trackHeight*.175)):s.titleFontSize,h=s.timeFontSize===`auto`?Math.max(8,Math.min(12,t.trackHeight*.15)):s.timeFontSize,g=`${w(n.startTime)} - ${w(n.endTime)}`;if(f){e.fillStyle=c,e.font=`${s.titleFontWeight} ${m}px ${s.titleFontFamily}`;let t=p?d-(typeof m==`number`?m:14)/2+s.titleOffsetY:d+s.titleOffsetY;e.fillText(n.title,u,t)}if(p){e.fillStyle=l,e.font=`${s.timeFontWeight} ${h}px ${s.timeFontFamily}`;let t=f?d+(typeof h==`number`?h:12)+s.timeOffsetY:d+s.timeOffsetY;e.fillText(g,u,t)}}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 V(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 H=m(`LayerBuffer`),U={background:`background`,tracks:`main`,timeline:`main`,guideLines:`main`,indicator:`main`,scrollbar:`main`,interaction:`interaction`,overlay:`overlay`},W=[`background`,`main`,`media`,`interaction`,`overlay`];function de(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){H.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 fe=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 W){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}=de(r,i);this.buffers.set(e,{canvas:t,ctx:n,dirty:!0})}}H.debugStyled(_.pipeline,`LayerBufferManager initialized: ${r}x${i} (dpr=${n})`)}markDirtyFromLayers(e){for(let t of e){let e=U[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 W){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(){for(let e of this.buffers.values())e.canvas.width=0,e.canvas.height=0;this.buffers.clear(),this.width=0,this.height=0}};const G=m(`DirtyCheck`);var pe=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.disposed=!1,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 re(this.config,this.state),this.layerBufferManager=new fe,this.renderPipeline=new ae,this.renderPipeline.registerRenderer(`timeline`,new oe),this.renderPipeline.registerRenderer(`tracks`,new le),this.renderPipeline.registerRenderer(`guideLines`,new z),this.renderPipeline.registerRenderer(`indicator`,new R),this.renderPipeline.registerRenderer(`scrollbar`,new ue),this.renderPipeline.registerRenderer(`interaction`,new B)}setCanvasSize(e,t){if(this.disposed)return;let n=window.devicePixelRatio||1,r=Math.floor(e*n),i=Math.floor(t*n);if(this.dpr===n&&Math.abs(this.canvas.width-r)<1&&Math.abs(this.canvas.height-i)<1&&this.canvas.style.width===`${e}px`&&this.canvas.style.height===`${t}px`)return;this.dpr=n,this.canvas.width=r,this.canvas.height=i,this.canvas.style.width=`${e}px`,this.canvas.style.height=`${t}px`,this.invalidateCache();let a=this.getContentHeight(),o=Math.max(0,a-this.getCachedLogicalHeight());this.state.scrollY=Math.max(0,Math.min(o,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.disposed||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=V(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=V(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){G.debugStyled(_.dataUpdate,`✓ Marking layers dirty: [${e.join(`, `)}]`);for(let t of e)this.dirtyLayers.add(t)}markAllDirty(){G.debugStyled(_.dataUpdate,`✓ Marking ALL layers dirty`),this.dirtyLayers=new Set([`background`,`tracks`,`timeline`,`guideLines`,`indicator`,`scrollbar`,`overlay`,`interaction`]),this.layerBufferManager.markAllDirty()}getLastLayerTimes(){return{...this.lastLayerTimes}}dispose(){this.disposed=!0,this.layerBufferManager.dispose(),this.dirtyLayers.clear(),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)}},me=class{constructor(e,t=new K(m(`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,this.destroyed=!1,this.pendingLoads=new Map,this.pendingUnloads=new Map}loadPlugin(e){let{name:t,version:n}=e.metadata,r=`${t}@${n}`;if(this.destroyed||this.plugins.has(r)||this.pendingLoads.has(r)||this.pendingUnloads.has(r))return Promise.resolve(!1);let i=Promise.resolve().then(()=>this.performLoad(r,e)).finally(()=>this.pendingLoads.delete(r));return this.pendingLoads.set(r,i),i}async performLoad(e,t){if(this.destroyed)return!1;if(!this.areDependenciesLoaded(t.metadata.dependencies))return this.errorHandler.fail(this.baseContext.config.debug,f(this.baseContext.config,`errorPluginDependenciesMissing`,{pluginId:e}),Error(`Missing dependencies: ${t.metadata.dependencies?.join(`, `)}`));this.pluginMetadata.set(e,t.metadata);let n=this.createPluginContext(e),r=!1,i=!1,a=!1;try{return t.init&&(r=!0,await t.init(n)),this.destroyed||(t.activate&&(i=!0,await t.activate(n)),this.destroyed)?!1:(this.plugins.set(e,{plugin:t,context:n,active:!0}),a=!0,!0)}catch(t){return this.errorHandler.fail(this.baseContext.config.debug,f(this.baseContext.config,`errorPluginLoadFailed`,{pluginId:e}),t)}finally{a||(await this.rollbackFailedLoad(e,t,n,r,i),this.cleanupPluginResources(e))}}unloadPlugin(e){let t=this.pendingUnloads.get(e);if(t)return t;let n=this.plugins.get(e);if(!n)return Promise.resolve(!1);this.plugins.delete(e);let r=Promise.resolve().then(()=>this.performUnload(e,n)).finally(()=>{this.cleanupPluginResources(e),this.pendingUnloads.delete(e)});return this.pendingUnloads.set(e,r),r}async performUnload(e,t){let n=await this.runLifecycleStep(e,`deactivate`,t.plugin.deactivate,t.context);return await this.runLifecycleStep(e,`destroy`,t.plugin.destroy,t.context)||(n=!1),n}destroy(){return this.destroyPromise?this.destroyPromise:(this.destroyed=!0,this.destroyPromise=Promise.resolve().then(()=>this.disposePlugins()),this.destroyPromise)}async disposePlugins(){for(let e of[...this.plugins.keys()].reverse())await this.unloadPlugin(e);await Promise.allSettled([...this.pendingLoads.values(),...this.pendingUnloads.values()])}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,f(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=m(`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.get(e)?.clear(),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,f(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,f(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||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}},he=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:f(e,`statusReady`),contextMenuBounds:null,lastDrawTime:0}}setStatus(e,t){this.state.statusText=e,t&&t(e)}},ge=class{constructor(e){this.trackIndices=new Map,this.dirtyTracks=new Set,this.batching=!1,this.state=e}invalidateTrack(e){this.dirtyTracks.add(e)}invalidateAll(){this.trackIndices.clear(),this.dirtyTracks.clear()}beginBatch(){this.batching=!0}endBatch(){if(this.batching){for(let e of this.dirtyTracks)this.state.tracks[e]?this.ensureIndex(e):this.trackIndices.delete(e);this.dirtyTracks.clear(),this.batching=!1}}ensureIndex(e){let t=this.trackIndices.get(e);if(t&&!this.dirtyTracks.has(e))return t;let n=this.state.tracks[e].events,r=n.map((e,t)=>t);r.sort((e,t)=>n[e].startTime-n[t].startTime);let i=new Float64Array(r.length*4).fill(-1/0),a=(e,t,o)=>{if(t===o)return i[e]=n[r[t]].endTime;let s=t+o>>>1;return i[e]=Math.max(a(e*2,t,s),a(e*2+1,s+1,o))};r.length&&a(1,0,r.length-1);let o={indices:r,maxEnds:i};return this.trackIndices.set(e,o),this.dirtyTracks.delete(e),o}getCandidatesByTime(e,t,n=0){let{indices:r,maxEnds:i}=this.ensureIndex(e),a=this.state.tracks[e],o=0,s=r.length-1,c=-1,l=t+n;for(;o<=s;){let e=o+s>>1,t=r[e];a.events[t].startTime<=l?(c=e,o=e+1):s=e-1}if(c===-1)return[];let u=[],d=(e,a,o)=>{if(a>c||i[e]<t-n)return;if(a===o){u.push(r[a]);return}let s=a+o>>>1;d(e*2+1,s+1,o),d(e*2,a,s)};return d(1,0,r.length-1),u}};const q=m(`ChangeScheduler`);var _e=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(f(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(f(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(f(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:P(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 ve=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,i;if(t>e&&t<=n)r=e,i=O(t-e);else if(t<=this.config.endTime-this.config.startTime&&e+t<=n)r=e,i=t;else return this.logger.error(f(this.config,`errorInvalidTimeRange`,{startTime:e,endTime:t})),null;return r<this.config.startTime?(this.logger.error(f(this.config,`errorStartTimeBeforeMin`,{startTime:r,minAllowed:this.config.startTime})),null):{startSec:r,duration:i}}addEvent(e,t,n,r,i=``,a,o=!1){if(!this.isValidTrackIndex(e))return null;let s=this.validateEventTime(t,n);if(!s)return null;let{startSec:c,duration:l}=s,u=this.state.tracks[e],d=O(l),f={id:u.events.length,startTime:c,endTime:O(c+d),duration:d,title:r,description:i,color:J(this.config,u.events.length),...o?{readonly:o}:{},...a?{customData:a}:{}};return u.events.push(f),this.invalidateTrack(e),f}updateEvent(e,t,n){let r=this.getEvent(e,t);if(!r)return null;let i=P(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=P(r);return n.title!==void 0&&(r.title=n.title),n.startTime!==void 0&&(r.startTime=n.startTime,r.endTime=O(r.startTime+r.duration)),n.duration!==void 0&&(r.duration=O(n.duration),r.endTime=O(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=P(n.events[t]);return n.events.splice(t,1),this.invalidateTrack(e),r}loadData(e){if(!e||typeof e!=`object`)return this.logger.error(f(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(f(this.config,`errorInvalidTrackIndex`)),null;let n=this.state.tracks[e];return this.isValidEventIndex(n,t)?n.events[t]:(this.logger.error(f(this.config,`errorInvalidEventIndex`)),null)}resolveLoadEventTiming(e){let t,n;if(e.endTime!==void 0)t=e.startTime||0,n=O(e.endTime-t);else if(e.duration!==void 0)t=e.startTime||0,n=e.duration;else return null;let r=O(n);return{startTime:t,duration:r,endTime:O(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 ye(e,t,n,r,i){return`${e}-${t}-${n}-${r.toFixed(3)}-${i.toFixed(3)}`}var be=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=ye(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)}},xe=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}}},Se=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 Ce=[`background`,`tracks`,`timeline`,`guideLines`,`indicator`,`scrollbar`,`interaction`,`overlay`];var we=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 n=e;if(t&&this.state.snapEnabled){let e=E(this.state.zoomLevel,this.config.snapInterval,this.config.snapToSeconds,this.config.secondPrecisionZoomThreshold,this.config.scale,this.config.scaleSplitCount);n=D(n,e)}return this.clampPosition(n)}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 c(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([...Ce])}};const Te=[`background`,`tracks`,`timeline`,`guideLines`,`indicator`,`scrollbar`,`interaction`,`overlay`];var Ee=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([...Te])}},De=class{constructor(e){this.eventListeners=null,this.resizeObserver=null,this.activePointerId=null,this.previousTouchAction=null,this.pixelRatio=window.devicePixelRatio||1,this.resolutionQuery=null,this.handlePointerDown=e=>{e.pointerType===`mouse`||this.activePointerId!==null||!e.isPrimary||(e.preventDefault(),this.activePointerId=e.pointerId,this.canvas.setPointerCapture(e.pointerId),this.eventListeners?.pointerdown(e))},this.handlePointerMove=e=>{e.pointerId===this.activePointerId&&(e.preventDefault(),this.eventListeners?.pointermove(e))},this.handlePointerUp=e=>{e.pointerId===this.activePointerId&&(e.preventDefault(),this.eventListeners?.pointerup(e),this.activePointerId=null,this.canvas.releasePointerCapture(e.pointerId))},this.handlePointerCancel=e=>{e.pointerId===this.activePointerId&&(e.preventDefault(),this.activePointerId=null,this.eventListeners?.pointercancel(e),this.canvas.hasPointerCapture(e.pointerId)&&this.canvas.releasePointerCapture(e.pointerId))},this.handleLostPointerCapture=e=>{e.pointerId===this.activePointerId&&(this.activePointerId=null,this.eventListeners?.lostpointercapture(e))},this.handleWindowResize=()=>{this.syncCanvasSize(!0)},this.handleResolutionChange=()=>{this.syncCanvasSize(!0),this.observePixelRatio()},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(`pointerdown`,this.handlePointerDown),this.canvas.addEventListener(`pointermove`,this.handlePointerMove),this.canvas.addEventListener(`pointerup`,this.handlePointerUp),this.canvas.addEventListener(`pointercancel`,this.handlePointerCancel),this.canvas.addEventListener(`lostpointercapture`,this.handleLostPointerCapture),this.canvas.addEventListener(`contextmenu`,e.contextmenu),this.canvas.addEventListener(`wheel`,e.wheel,{passive:!1}),this.previousTouchAction=this.canvas.style.touchAction,this.canvas.style.touchAction=`none`,this.syncCanvasSize(!1),this.observeContainerResize(),this.observePixelRatio(),window.addEventListener(`resize`,this.handleWindowResize)}setCanvasSize(e,t){this.renderManager.setCanvasSize(e,t),this.pixelRatio=window.devicePixelRatio||1}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(){if(this.resizeObserver?.disconnect(),this.resizeObserver=null,this.resolutionQuery?.removeEventListener(`change`,this.handleResolutionChange),this.resolutionQuery=null,window.removeEventListener(`resize`,this.handleWindowResize),!this.eventListeners)return;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(`pointerdown`,this.handlePointerDown),this.canvas.removeEventListener(`pointermove`,this.handlePointerMove),this.canvas.removeEventListener(`pointerup`,this.handlePointerUp),this.canvas.removeEventListener(`pointercancel`,this.handlePointerCancel),this.canvas.removeEventListener(`lostpointercapture`,this.handleLostPointerCapture);let e=this.activePointerId;this.activePointerId=null,e!==null&&this.canvas.hasPointerCapture(e)&&this.canvas.releasePointerCapture(e),this.canvas.removeEventListener(`contextmenu`,this.eventListeners.contextmenu),this.canvas.removeEventListener(`wheel`,this.eventListeners.wheel),this.previousTouchAction!==null&&(this.canvas.style.touchAction=this.previousTouchAction,this.previousTouchAction=null),this.eventListeners=null}observeContainerResize(){let e=this.canvas.parentElement;!e||typeof ResizeObserver>`u`||(this.resizeObserver=new ResizeObserver(()=>{this.syncCanvasSize(!0)}),this.resizeObserver.observe(e))}observePixelRatio(){this.resolutionQuery?.removeEventListener(`change`,this.handleResolutionChange),this.resolutionQuery=window.matchMedia(`(resolution: ${this.pixelRatio}dppx)`),this.resolutionQuery.addEventListener(`change`,this.handleResolutionChange)}syncCanvasSize(e){let t=this.canvas.parentElement;if(!t){let t=this.renderManager.getCanvasLogicalWidth(),n=this.config.canvasHeight||500;this.setCanvasSizeIfChanged(t,n,e);return}let n=t.getBoundingClientRect();this.setCanvasSizeIfChanged(n.width,n.height||this.config.canvasHeight||500,e)}setCanvasSizeIfChanged(e,t,n){(e!==this.renderManager.getCanvasLogicalWidth()||t!==this.renderManager.getCanvasLogicalHeight()||this.pixelRatio!==(window.devicePixelRatio||1))&&(this.setCanvasSize(e,t),n&&this.adjustCanvasSize())}},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}handleCancel(e){return null}handleContextMenu(e){return null}};const X=m(`DraggingState`);var Oe=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:n}=e,r=this.timeline.config,i=this.timeline.state,a=this.timeline.getCanvas();if(!i.draggingEvent)return this.createIdleState();if(Math.sqrt((t-i.draggingEvent.startX)**2+(n-i.draggingEvent.startY)**2)>this.MOVE_THRESHOLD&&(i.draggingEvent.isDragging=!0),!i.draggingEvent.isDragging)return a.style.cursor=`move`,null;let{trackIndex:o,eventIndex:s}=i.draggingEvent;if(o<0||o>=i.tracks.length||s<0||s>=i.tracks[o].events.length)return X.warn(this.timeline.t(`warningInvalidDraggingState`),{value:i.draggingEvent}),i.draggingEvent=null,this.createIdleState();let l=i.tracks[o].events[s];this.timeline.setStatus(this.timeline.t(`statusDragging`,{title:l.title}));let u=(t-i.draggingEvent.startX)/(r.secondWidth*i.zoomLevel),d=i.draggingEvent.originalStartTime+u,f=Math.floor((n-r.timelineHeight-r.firstTrackTopMargin)/(r.trackHeight+r.trackMargin));if(r.autoAddTrack&&f>=i.tracks.length){let e={id:i.tracks.length,events:[]};i.tracks.push(e),this.timeline.setStatus(this.timeline.t(`statusAutoTrackAdded`,{count:i.tracks.length})),this.timeline.callbacks.onTrackAdd&&this.timeline.callbacks.onTrackAdd(e)}f=Math.max(0,Math.min(i.tracks.length-1,f)),i.guideLines=this.timeline.calculateGuideLines(o,s,f,d,l.duration);let p=this.timeline.snapToGuideLines(d,l.duration);if(p!==null){if(this.isSnappedToGuideLine&&this.snappedTime!==null){let e=this.timeline.config.guideLineSnapThreshold*1.5;Math.abs(d-this.snappedTime)<e?d=this.snappedTime:(this.isSnappedToGuideLine=!1,this.snappedTime=null,d=p,this.isSnappedToGuideLine=!0,this.snappedTime=p)}else d=p,this.isSnappedToGuideLine=!0,this.snappedTime=p}else if(this.isSnappedToGuideLine=!1,this.snappedTime=null,i.snapEnabled){if(r.enableTimeIndicator&&i.timeIndicatorSnapEnabled){let e=c(i.timeIndicatorPosition,r.startTime,r.startPaddingTime,r.secondWidth,i.zoomLevel,i.scrollX),t=r.startPaddingTime+(d-r.startTime)*r.secondWidth*i.zoomLevel-i.scrollX;if(Math.abs(t-e)<r.timeIndicatorSnapThreshold)d=i.timeIndicatorPosition;else{let e=E(i.zoomLevel,r.snapInterval,r.snapToSeconds,r.secondPrecisionZoomThreshold,r.scale,r.scaleSplitCount);d=D(d,e)}}else{let e=E(i.zoomLevel,r.snapInterval,r.snapToSeconds,r.secondPrecisionZoomThreshold,r.scale,r.scaleSplitCount);d=D(d,e)}}d=Math.max(r.startTime,Math.min(r.endTime-l.duration,d));let m=r.timelineHeight+r.firstTrackTopMargin+f*(r.trackHeight+r.trackMargin)+r.trackHeight/2;i.dragTimeReference={time:d,y:m};let h=this.timeline.canMoveEvent(o,s,f,d,l.duration);if(h&&(l.startTime=d,l.endTime=O(d+l.duration),this.timeline.invalidateIndexTrack(o),f!==o)){let e=i.tracks[o].events.splice(s,1)[0];i.tracks[f].events.push(e),i.draggingEvent.trackIndex=f,i.draggingEvent.eventIndex=i.tracks[f].events.length-1,i.selectedTrack=f,i.selectedEvent&&i.selectedEvent.trackIndex===o&&(i.selectedEvent.eventIndex===s?i.selectedEvent={trackIndex:f,eventIndex:i.tracks[f].events.length-1}:i.selectedEvent.eventIndex>s&&(i.selectedEvent={...i.selectedEvent,eventIndex:i.selectedEvent.eventIndex-1})),this.timeline.invalidateIndexTrack(f),this.timeline.invalidateIndexTrack(o)}return i.draggingEvent&&(i.draggingEvent.currentMouseX=t,i.draggingEvent.currentMouseY=n,i.draggingEvent.canMove=h),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:P(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:P(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()}handleCancel(e){return this.timeline.state.draggingEvent=null,this.timeline.getCanvas().style.cursor=`default`,this.timeline.notifyChange(`events:move`),this.createIdleState()}createIdleState(){return new Q(this.timeline)}},ke=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,n=this.timeline.config,r=this.timeline.state;if(!r.resizingEvent)return this.createIdleState();let{trackIndex:i,eventIndex:a,edge:o,originalStartTime:s,originalDuration:c}=r.resizingEvent;if(i<0||i>=r.tracks.length||a<0||a>=r.tracks[i].events.length)return r.resizingEvent=null,this.createIdleState();let l=r.tracks[i].events[a],u=(t-r.resizingEvent.startX)/(n.secondWidth*r.zoomLevel);if(o===`left`){let e=s+u,t=O(s+c),o=t-e;r.guideLines=this.timeline.calculateGuideLines(i,a,i,e,o>0?o:c);let d=this.timeline.snapEdgeToGuideLines(e);if(d!==null)e=d;else if(r.snapEnabled){let t=E(r.zoomLevel,n.snapInterval,n.snapToSeconds,n.secondPrecisionZoomThreshold,n.scale,n.scaleSplitCount);e=D(e,t)}e=O(Math.max(n.startTime,e)),e=O(Math.min(e,t-n.minEventDuration));let f=O(t-e),p=!0;for(let n=0;n<r.tracks[i].events.length;n++){if(n===a)continue;let o=r.tracks[i].events[n],s=o.startTime,c=s+o.duration;if(e<c&&t>s){p=!1;break}}if(p){if(!this.timeline.canMoveEvent(i,a,i,e,f))return this.timeline.notifyChange(`events:update`),null;l.startTime=e,l.duration=O(f),l.endTime=t,this.timeline.invalidateIndexTrack(i)}}else{let e=c+u,t=s+e;r.guideLines=this.timeline.calculateGuideLines(i,a,i,s,e>0?e:c);let o=this.timeline.snapEdgeToGuideLines(t);if(o!==null)e=O(o-s);else if(r.snapEnabled){let i=E(r.zoomLevel,n.snapInterval,n.snapToSeconds,n.secondPrecisionZoomThreshold,n.scale,n.scaleSplitCount);e=O(D(t,i)-s)}else e=O(e);t=s+e,e=O(Math.max(n.minEventDuration,e)),e=O(Math.min(e,n.endTime-s)),t=s+e;let d=!0;for(let e=0;e<r.tracks[i].events.length;e++){if(e===a)continue;let n=r.tracks[i].events[e],o=n.startTime;if(s<o+n.duration&&t>o){d=!1;break}}if(d){if(!this.timeline.canMoveEvent(i,a,i,s,e))return this.timeline.notifyChange(`events:update`),null;l.duration=O(e),l.endTime=O(s+e),this.timeline.invalidateIndexTrack(i)}}return this.timeline.notifyChange(`events:update`),this.timeline.setStatus(this.timeline.t(`statusEventResizing`,{start:this.timeline.formatTime(l.startTime),end:this.timeline.formatTime(l.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:P(i)}),this.timeline.notifyChange(`events:update`),this.createIdleState()}handleCancel(e){return this.timeline.state.resizingEvent=null,this.timeline.getCanvas().style.cursor=`default`,this.timeline.notifyChange(`events:update`),this.createIdleState()}createIdleState(){return new Q(this.timeline)}},Ae=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()}handleCancel(e){let t=this.timeline.state;return t.draggingScrollbar=!1,t.draggingHorizontalScrollbar=!1,this.timeline.setStatus(this.timeline.t(`statusReady`)),this.createIdleState()}createIdleState(){return new Q(this.timeline)}},je=class extends Y{constructor(e){super(e),this.name=`TimeIndicatorDrag`}handleMouseMove(e){let{canvasX:t}=e,n=this.timeline.config,r=this.timeline.state,i=this.timeline.getCanvas();if(!r.draggingTimeIndicator)return this.createIdleState();i.style.cursor=n.readOnly?`not-allowed`:`ew-resize`;let a=(t-r.timeIndicatorDragOffsetX+r.scrollX-n.startPaddingTime)/(n.secondWidth*r.zoomLevel)+n.startTime;if(r.snapEnabled){let e=E(r.zoomLevel,n.snapInterval,n.snapToSeconds,n.secondPrecisionZoomThreshold,n.scale,n.scaleSplitCount);a=D(a,e)}return a=Math.max(n.startTime,Math.min(n.endTime,a)),this.timeline.setTimeIndicatorDuringDrag(a),null}handleMouseUp(e){let t=this.timeline.state;return t.draggingTimeIndicator&&(t.draggingTimeIndicator=!1,this.timeline.setTimeIndicator(t.timeIndicatorPosition,!1)),this.createIdleState()}handleCancel(e){return this.timeline.state.draggingTimeIndicator=!1,this.timeline.getCanvas().style.cursor=`default`,this.createIdleState()}createIdleState(){return new Q(this.timeline)}},Me=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,n){let r=this.delegate.getTimeline(),{config:i,state:a}=r;if(i.enableEventResize&&e.resizeEdge)return a.tracks[e.trackIndex].events[e.eventIndex].readonly?(a.hoveredResizeHandle=null,n.style.cursor=`not-allowed`,r.hideSplitLine(),r.notifyChange(`interaction:hover`),!0):(a.hoveredResizeHandle={trackIndex:e.trackIndex,eventIndex:e.eventIndex,edge:e.resizeEdge},n.style.cursor=`ew-resize`,r.hideSplitLine(),r.notifyChange(`interaction:hover`),!0);if(a.hoveredResizeHandle=null,!i.enableEventSplit||e.eventIndex===null||e.trackIndex===null||e.resizeEdge)return r.hideSplitLine(),!1;let o=e.trackIndex,s=e.eventIndex,c=a.tracks[o].events[s];if(c.readonly)return r.hideSplitLine(),n.style.cursor=`not-allowed`,r.notifyChange(`interaction:hover`),!0;let l=(t-i.startPaddingTime)/(i.secondWidth*a.zoomLevel)+i.startTime;if(a.snapEnabled){let e=E(a.zoomLevel,i.snapInterval,i.snapToSeconds,i.secondPrecisionZoomThreshold,i.scale,i.scaleSplitCount);l=D(l,e)}let u=l-c.startTime,d=c.duration-u;return l>c.startTime&&l<c.startTime+c.duration&&u>=i.minEventDuration&&d>=i.minEventDuration?(r.showSplitLine(o,s,l),n.style.cursor=`pointer`,r.notifyChange(`interaction:splitLine`),!0):(r.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=c(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)}},Z=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:P(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=c(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(a.readOnly||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:P(c)}),i.callbacks.onEventClick&&i.callbacks.onEventClick({trackIndex:e,eventIndex:t,event:P(c),trackName:i.t(`labelTrackName`,{index:e+1}),formattedTimeRange:k(c.startTime,c.endTime)}),i.notifyChange(`selection:change`),null;let u=a.startPaddingTime+(c.startTime-a.startTime)*a.secondWidth*o.zoomLevel-o.scrollX,d=a.timelineHeight+a.firstTrackTopMargin+e*(a.trackHeight+a.trackMargin);return o.draggingEvent={trackIndex:e,eventIndex:t,eventX:u,eventY:d,originalTrackIndex:e,originalEventIndex:t,originalStartTime:c.startTime,startX:n,startY:r,isDragging:!1},o.dragOffsetX=n-u,o.dragOffsetY=r-d,i.callbacks.onEventHighlight&&i.callbacks.onEventHighlight({trackIndex:e,eventIndex:t,event:P(c)}),i.notifyChange(`selection:change`),this.delegate.createDraggingState()}},Q=class extends Y{constructor(e){super(e),this.name=`Idle`,this.hoverController=new Me(this),this.mouseDownRouter=new Z(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 Oe(this.timeline)}createResizingState(){return new ke(this.timeline)}createScrollingState(){return new Ae(this.timeline)}createTimeIndicatorDragState(){return new je(this.timeline)}};const $=m(`StateMachine`);var Ne=class{constructor(e){this.timeline=e,this.rafId=null,this.pendingMouseMove=null,this.lastInputEvent=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(_.stateExit,`◁ Exit: ${t.name}`),t.onExit(e)),this.currentState=e,e.onEnter&&($.debugStyled(_.stateEnter,`▷ Enter: ${e.name}`),e.onEnter(t)),$.debugStyled(_.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){this.lastInputEvent=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){this.lastInputEvent=e;let t=this.createContext(e),n=this.currentState.handleMouseMove(t);this.transitionTo(n)}handleMouseUp(e){let t=this.takePendingMouseMove();t&&this.handleMouseMoveImpl(t);let n=e??t??this.lastInputEvent;if(!n)return;this.lastInputEvent=n;let r=this.createContext(n),i=this.currentState.handleMouseUp(r);this.transitionTo(i)}handleCancel(e){this.takePendingMouseMove();let t=e??this.lastInputEvent;if(!t)return;this.lastInputEvent=t;let n=this.createContext(t),r=this.currentState.handleCancel(n);this.transitionTo(r)}handleContextMenu(e){this.lastInputEvent=e;let t=this.createContext(e),n=this.currentState.handleContextMenu(t);this.transitionTo(n)}destroy(){this.handleCancel(),this.lastInputEvent=null}takePendingMouseMove(){this.rafId!==null&&(cancelAnimationFrame(this.rafId),this.rafId=null);let e=this.pendingMouseMove;return this.pendingMouseMove=null,e}},Pe=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`)}},Fe=class{constructor(e){this.canvasController=e.canvasController,this.mouseHandler=e.mouseHandler??new Ne(e.timeline),this.wheelHandler=e.wheelHandler??new Pe(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:e=>this.mouseHandler.handleMouseUp(e),pointerdown:e=>this.mouseHandler.handleMouseDown(e),pointermove:e=>this.mouseHandler.handleMouseMove(e),pointerup:e=>this.mouseHandler.handleMouseUp(e),pointercancel:e=>this.mouseHandler.handleCancel(e),lostpointercapture:e=>this.mouseHandler.handleCancel(e),contextmenu:e=>this.mouseHandler.handleContextMenu(e),wheel:e=>this.wheelHandler.handleWheel(e)}}},Ie=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`}},Le=class{constructor(r,c={}){this.destroyed=!1;let d=a(c.locale),f=t(d,c.messages);this.logger=new h({enabled:!0,level:c.debug?`debug`:`info`,prefix:`Timeline`,useGlobalConfig:!1}),g({enabled:!0,level:c.debug?`debug`:`info`}),this.errorHandler=new K(this.logger);let p=document.getElementById(r);(!p||!(p instanceof HTMLCanvasElement))&&this.errorHandler.throw(n(f,`errorCanvasNotFound`,{canvasId:r})),this.canvas=p;let m=this.canvas.getContext(`2d`);m||this.errorHandler.throw(n(f,`errorCanvasContextUnavailable`)),this.ctx=m,c.startPaddingTime===void 0&&(c.startPaddingTime=10),this.config={...l,...c,locale:d,messages:f,colors:{...o,...c.colors},eventTextStyle:{...s,...c.eventTextStyle},eventBlockStyle:{...e,...c.eventBlockStyle},eventDurationPrefix:c.eventDurationPrefix??f.labelDurationPrefix,contextMenuItems:c.contextMenuItems||u(f),contextMenuStyle:{...i,...c.contextMenuStyle}},this.logger.setLevel(this.config.debug?`debug`:`info`),this.callbacks={onEventAdd:c.onEventAdd||null,onEventUpdate:c.onEventUpdate||null,onEventDelete:c.onEventDelete||null,onEventMove:c.onEventMove||null,onEventClick:c.onEventClick||null,onEventEdit:c.onEventEdit||null,onContextMenu:c.onContextMenu||null,onTrackAdd:c.onTrackAdd||null,onTrackRemove:c.onTrackRemove||null,onTimeIndicatorMove:c.onTimeIndicatorMove||null,onZoom:c.onZoom||null,onStatusChange:c.onStatusChange||null,onEventHighlight:c.onEventHighlight||null,onTimeIndicatorHighlight:c.onTimeIndicatorHighlight||null},this.stateManager=new he(this.config),this.state=this.stateManager.state,this.trackManager=new Se(this.state),this.eventIndexManager=new ge(this.state),this.eventMutationService=new ve({config:this.config,state:this.state,eventIndexManager:this.eventIndexManager,logger:this.logger,onMutate:()=>this.clearGuideLineCache()}),this.guideLineService=new be(this.config,this.state),this.hitTestService=new xe(this.config,this.state,this.eventIndexManager),this.pluginManager=new me({timeline:this,config:this.config,state:this.state}),this.renderManager=new pe(this.canvas,this.ctx,this.config,this.state,this.pluginManager),this.pluginController=new Ie({pluginManager:this.pluginManager,builtinThemes:{light:b,dark:x},onThemeChanged:()=>this.notifyChange(`theme:change`),onPluginVisualChange:()=>this.redrawAfterPluginChange()}),this.canvasController=new De({canvas:this.canvas,config:this.config,state:this.state,renderManager:this.renderManager,onCanvasResize:()=>this.notifyChange(`canvas:resize`)}),this.interactionManager=new Fe({timeline:this,canvasController:this.canvasController}),c.theme&&this.pluginController.loadInitialTheme(c.theme),this.timeIndicatorController=new we({config:this.config,state:this.state,renderManager:this.renderManager}),this.viewportController=new Ee({config:this.config,state:this.state,renderManager:this.renderManager}),this.changeScheduler=new _e(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.destroyed||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`),g({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}))}}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:P(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:P(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:P(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(e,t=!1){if(typeof e!=`number`||isNaN(e))return this.logger.error(this.t(`errorTimeIndicatorInvalid`)),!1;let n=this.timeIndicatorController.setPosition(e,t);if(!n.changed)return!0;this.notifyChange(`timeIndicator:move`);let r=w(n.position);return this.setStatus(this.t(`statusTimeIndicatorMoved`,{time:r})),this.callbacks.onTimeIndicatorMove&&this.callbacks.onTimeIndicatorMove({position:n.position,time:r}),!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(e){if(typeof e!=`number`||isNaN(e))return this.logger.error(this.t(`errorEndTimeInvalid`)),!1;if(e<=this.config.startTime)return this.logger.error(this.t(`errorEndTimeNotAfterStart`)),!1;let t=this.viewportController.setEndTime(e);return t.hasOverflowEvents&&this.logger.warn(this.t(`warningEventsExceedEndTime`)),this.clearGuideLineCache(),this.notifyChange(`config:endTime`),this.setStatus(this.t(`statusEndTimeUpdated`,{from:w(t.oldEndTime),to:w(t.endTime)})),!0}getEndTime(){return this.config.endTime}formatTime(e){return w(e)}t(e,t={}){return n(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:O(n-i.startTime),endTime:n,title:`${i.title} (1)`},o={...i,id:r.events.length,startTime:n,duration:O(i.endTime-n),endTime:O(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:P(i),firstEvent:P(a),secondEvent:P(o)}),!0}draw(){this.destroyed||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(){return this.destroyPromise?this.destroyPromise:(this.destroyed=!0,this.clearGuideLineCache(),this.interactionManager.destroy(),this.renderManager.dispose(),this.destroyPromise=this.pluginManager.destroy(),this.setStatus(this.t(`statusTimelineDestroyed`)),this.destroyPromise)}clearGuideLineCache(){this.guideLineService.clearCache()}redrawAfterPluginChange(){this.markDirty([`background`,`tracks`,`timeline`,`guideLines`,`indicator`,`scrollbar`,`interaction`,`overlay`]),this.draw()}};function Re(e,t){if(!e.descriptionI18n)return e.description;let n=a(t);return e.descriptionI18n[n]||e.descriptionI18n.zh||e.description}export{S as ContextMenuPlugin,x as DarkThemePlugin,d as EventMediaPlugin,C as EventTooltipPlugin,b as LightThemePlugin,p as PerformanceOverlayPlugin,y as PluginPriority,v as PluginType,Le as Timeline,u as createDefaultContextMenuItems,t as createTimelineMessages,A as formatDuration,w as formatTime,k as formatTimeRange,T as getCurrentTime,Re as getPluginMetadataDescription,a as normalizeTimelineLocale,f as translateTimelineConfig,n as translateTimelineMessage};
1
+ import{a as e,c as t,d as n,f as r,i,l as a,n as o,o as s,p as c,r as l,s as u,t as d,u as f}from"./EventMediaPlugin-BCuSI5ww.mjs";import{t as p}from"./PerformanceOverlayPlugin-Cph1TMWd.mjs";import{i as m,n as h,r as g,t as _}from"./Logger-BX6_sfV3.mjs";import{n as v,t as y}from"./types-DhRsiQBh.mjs";import{t as b}from"./LightThemePlugin-BD4cbg_E.mjs";import{t as x}from"./DarkThemePlugin-pFFtYjOV.mjs";import{t as S}from"./ContextMenuPlugin-Btbm1QEm.mjs";import{t as C}from"./EventTooltipPlugin-0Dz25qie.mjs";function w(e,t=!0){let n=Math.round(e),r=Math.floor(n/3600),i=Math.floor(n%3600/60),a=n%60;return t?`${r.toString().padStart(2,`0`)}:${i.toString().padStart(2,`0`)}:${a.toString().padStart(2,`0`)}`:`${r.toString().padStart(2,`0`)}:${i.toString().padStart(2,`0`)}`}function ee(){let e=new Date;return e.getHours()*3600+e.getMinutes()*60+e.getSeconds()}function T(e,t,n,r,i,a){if(n)return 1;if(i!=null&&i>0){let t=i/Math.max(1,Math.floor(a??10));return e>=r?t:i}return t*60}function E(e,t){return Math.round(e/t)*t}function D(e,t=3){let n=10**t;return Math.round(e*n)/n}function O(e,t){return`${w(e)} - ${w(t)}`}function te(e,t){let n=w(D(e));return t?`${t} ${n}`:n}function k(e){return typeof structuredClone==`function`?structuredClone(e):j(e)}function ne(e,t=!1){return e.map(e=>A(e,t))}function A(e,t=!1){return e instanceof Float32Array?t?new Float32Array(e):e:Array.isArray(e)?ne(e,t):ie(e)?j(e,t):e}function j(e,t=!1){let n=Object.entries(e).map(([e,n])=>[e,A(n,t)]);return Object.fromEntries(n)}function re(e){if(!e.media)return;let t={};for(let[n,r]of Object.entries(e.media))if(n===`images`&&Array.isArray(r))t.images=r.map(e=>{let t={};for(let[n,r]of Object.entries(e))t[n]=A(r);return t});else if(n===`waveform`&&typeof r==`object`&&r){let e={};for(let[t,n]of Object.entries(r))e[t]=A(n);t.waveform=e}else t[n]=A(r);return t}function ie(e){if(typeof e!=`object`||!e)return!1;let t=Object.getPrototypeOf(e);return t===Object.prototype||t===null}function M(e){return{id:e.id,startTime:e.startTime,endTime:e.endTime,duration:e.duration,title:e.title,description:e.description,color:e.color,...e.businessId===void 0?{}:{businessId:e.businessId},...e.readonly?{readonly:e.readonly}:{},...e.customData?{customData:k(e.customData)}:{},...e.media?{media:re(e)}:{}}}function ae(e){return A(e,!0)}function N(e){return e instanceof Float32Array?Array.from(e):Array.isArray(e)?e.map(N):ie(e)?Object.fromEntries(Object.entries(e).map(([e,t])=>[e,N(t)])):e}var oe=class{constructor(e,t){this.H_SCROLLBAR_PADDING=13,this.listeners=new Set,this.lastSnapshot=null,this.revision=0,this.pendingNotify=!1,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)}getTrackTop(e){return this.config.timelineHeight+this.config.firstTrackTopMargin+e*(this.config.trackHeight+this.config.trackMargin)-this.state.scrollY}buildSnapshot(e,t,n){return{width:e,height:t,dpr:n,scrollX:this.state.scrollX,scrollY:this.state.scrollY,zoomLevel:this.state.zoomLevel,trackHeight:this.config.trackHeight,trackMargin:this.config.trackMargin,timelineHeight:this.config.timelineHeight,firstTrackTopMargin:this.config.firstTrackTopMargin,contentRect:{x:0,y:this.config.timelineHeight,width:e,height:Math.max(0,t-this.config.timelineHeight)},trackCount:this.state.tracks.length,visibleTrackRange:this.computeVisibleTrackRange(e,t),revision:this.revision}}computeVisibleTrackRange(e,t){let n=t-(this.hasHorizontalScrollbar(e,this.state.zoomLevel)?this.H_SCROLLBAR_PADDING:0),r=null,i=null;for(let e=0;e<this.state.tracks.length;e++){let t=this.getTrackTop(e);t+this.config.trackHeight>this.config.timelineHeight&&t<n&&(r===null&&(r=e),i=e)}return r===null||i===null?null:[r,i]}getTrackRect(e,t,n,r){let i=this.config.startPaddingTime-this.state.scrollX,a=this.getTrackTop(t),o={x:i,y:a,width:Math.max(0,n-i),height:this.config.trackHeight},s=Math.max(a,this.config.timelineHeight),c=Math.min(a+this.config.trackHeight,r-(this.hasHorizontalScrollbar(n,this.state.zoomLevel)?this.H_SCROLLBAR_PADDING:0));return{businessId:e,trackIndex:t,rect:o,visibleRect:c>s?{x:Math.max(o.x,0),y:s,width:Math.max(0,Math.min(o.x+o.width,n)-Math.max(o.x,0)),height:c-s}:null}}subscribeViewport(e,t){this.listeners.add(e);try{e(this.buildSnapshot(t().width,t().height,t().dpr))}catch{}return()=>{this.listeners.delete(e)}}markViewportChange(){this.pendingNotify=!0}flushViewportNotifications(e){if(!this.pendingNotify)return;if(this.pendingNotify=!1,this.listeners.size===0){this.lastSnapshot=null;return}let t=this.buildSnapshot(e.width,e.height,e.dpr);if(!(this.lastSnapshot&&this.snapshotEquals(this.lastSnapshot,t))){this.revision+=1,t.revision=this.revision,this.lastSnapshot=t;for(let e of[...this.listeners])try{e(t)}catch{}}}unsubscribeAll(){this.listeners.clear(),this.pendingNotify=!1,this.lastSnapshot=null}snapshotEquals(e,t){return e.width===t.width&&e.height===t.height&&e.dpr===t.dpr&&e.scrollX===t.scrollX&&e.scrollY===t.scrollY&&e.zoomLevel===t.zoomLevel&&e.trackHeight===t.trackHeight&&e.trackMargin===t.trackMargin&&e.timelineHeight===t.timelineHeight&&e.firstTrackTopMargin===t.firstTrackTopMargin&&e.trackCount===t.trackCount&&e.visibleTrackRange?.[0]===t.visibleTrackRange?.[0]&&e.visibleTrackRange?.[1]===t.visibleTrackRange?.[1]}};const P=m(`RenderPipeline`);let F=0;function se(e){return e!==`background`&&e!==`overlay`}var ce=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:i,skipPerfMeasure:a=!1}=t,o=n-F>=250;o&&(F=n,P.debugStyled(_.pipeline,`▶ Render Start`,`forceFullRender=${r}`,i?`dirtyLayers=[${Array.from(i).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,i)){this.stats.skippedLayers++;continue}let o=a?0:performance.now();try{let r=se(t)?e.pluginManager?.getCoreLayerHooks(t):void 0;r&&r.length>0?this.executeWithHooks(e,n,r):n.render(e),this.stats.renderedLayers++}catch(n){P.error(`${f(e.config,`errorRenderLayer`,{layer:t})}:`,n)}a||(this.stats.layerTimes[t]=performance.now()-o)}return this.stats.totalTime=performance.now()-n,o&&P.debugStyled(_.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)},i=()=>t.render(e);for(let t=n.length-1;t>=0;t--){let a=n[t],o=i;i=()=>{try{a.handler(e.ctx,r,e.config,e.state,o)}catch(t){P.error(`${f(e.config,`errorCoreLayerHook`,{hook:a.name})}:`,t),o()}}}i()}shouldRenderLayer(e,t,n,r,i){return r||!i?!0:i.has(e)}getStats(){return{...this.stats}}clearPrevContext(){}getRegisteredRenderers(){return this.renderers}},le=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 ue=m(`EventContentRenderer`);function de(e){let{ctx:t,canvas:n,config:r,dpr:i,event:a,track:o,trackIndex:s,eventIndex:c,rect:l,phase:u,selected:d,highlighted:f,drawDefaultContent:p,renderEventContent:m}=e,h=fe(e);t.save(),t.beginPath(),t.rect(h.x,h.y,h.width,h.height),t.clip();let g=!1,_=()=>{g||(g=!0,p(t))},v=(()=>{let t=e.event.businessId===void 0?void 0:e.state.editDrafts.get(e.event.businessId);return t?{commitState:t.commitState,operationId:t.operationId}:{commitState:`idle`}})();if(m)try{m({ctx:t,canvas:n,config:r,state:e.state,event:a,track:o,trackIndex:s,eventIndex:c,rect:l,clipRect:h,phase:u,selected:d,highlighted:f,readonly:!!a.readonly||r.readOnly,dpr:i,commitState:v.commitState,...v.operationId?{operationId:v.operationId}:{},drawDefaultContent:_})}catch(e){let t=e instanceof Error?e.message:`unknown error`;ue.error(`[render] custom event content failed (code=event_content_error); falling back to default content (${t})`),_()}else _();t.restore()}function fe(e){let{rect:t,config:n}=e,r=e.dpr>0?e.dpr:1,i=e.canvas.width/r,a=e.canvas.height/r,o=n.timelineHeight,s=i,c=a-pe(e,i),l=Math.max(t.x,0),u=Math.max(t.y,o),d=Math.min(t.x+t.width,0+s),f=Math.min(t.y+t.height,c);return{x:l,y:u,width:Math.max(0,d-l),height:Math.max(0,f-u)}}function pe(e,t){return e.config.startPaddingTime+(e.config.endTime+e.config.endPaddingTime-e.config.startTime)*e.config.secondWidth*e.state.zoomLevel>t?13:0}const me=m(`EventsRenderer`);var he=class{constructor(){this.lastTrackLogTime=new Map}renderEvents(e,t,n,i,a,o,s,c,l=1){let u=c??o.width,d=n.tracks[i],f=Math.max(5,t.trackHeight*.0625),p=t.trackHeight-f*2,m=t.eventTextStyle,h=m.titleFontSize===`auto`?Math.max(10,Math.min(14,t.trackHeight*.175)):m.titleFontSize,g=m.timeFontSize===`auto`?Math.max(8,Math.min(12,t.trackHeight*.15)):m.timeFontSize,v=performance.now();v-(this.lastTrackLogTime.get(i)??0)>=500&&(this.lastTrackLogTime.set(i,v),me.debugStyled(_.eventRender,`Track ${i}: ${d.events.length} events`));let y=n.timeIndicatorPosition;for(let c=0;c<d.events.length;c++){let _=d.events[c],v=_.businessId===void 0?void 0:n.editDrafts.get(_.businessId);if(n.draggingEvent&&n.draggingEvent.isDragging&&n.draggingEvent.trackIndex===i&&n.draggingEvent.eventIndex===c&&!v)continue;let b=t.startPaddingTime+(_.startTime-t.startTime)*t.secondWidth*n.zoomLevel-n.scrollX,x=_.duration*t.secondWidth*n.zoomLevel,S=a;if(v&&(b=t.startPaddingTime+(v.startTime-t.startTime)*t.secondWidth*n.zoomLevel-n.scrollX,x=(v.endTime-v.startTime)*t.secondWidth*n.zoomLevel,S=t.timelineHeight+t.firstTrackTopMargin+v.targetTrackIndex*(t.trackHeight+t.trackMargin)-n.scrollY),b+x<0||b>u)continue;let C=n.selectedEvent&&n.selectedEvent.trackIndex===i&&n.selectedEvent.eventIndex===c,w=n.highlightedEvent&&n.highlightedEvent.trackIndex===i&&n.highlightedEvent.eventIndex===c,ee=t.enableTimeIndicator&&!n.isManualSelection&&y>_.startTime&&y<_.endTime,T=C||w||ee;e.save();let E=t.eventBlockStyle.borderRadius;e.fillStyle=_.color,E>0?(r(e,b,S+f,x,p,E),e.fill()):e.fillRect(b,S+f,x,p),e.restore(),s&&s.emitEvent(`render:event:media`,e,o,t,n,i,c,b,S,x,f,p),T&&(e.save(),e.strokeStyle=t.colors.eventBorderSelected,e.lineWidth=2,t.eventBlockStyle.enableSelectionGlow&&(e.shadowColor=t.colors.eventBorderSelected,e.shadowBlur=t.eventBlockStyle.selectionGlowBlur),E>0?r(e,b,S+f,x,p,E,!0):e.strokeRect(b,S+f,x,p),e.shadowBlur=0,e.restore());let D=n.resizingEvent&&n.resizingEvent.trackIndex===i&&n.resizingEvent.eventIndex===c;this.drawEventContentEntry({ctx:e,canvas:o,config:t,state:n,event:_,track:d,trackIndex:i,eventIndex:c,eventX:b,trackY:S,eventWidth:x,eventVerticalPadding:f,titleFontSize:h,timeFontSize:g,textStyle:m,dpr:l,phase:D?`resize`:`normal`,selected:!!C,highlighted:!!T}),t.enableEventResize&&this.drawResizeHandles(e,t,n,i,c,b,S,x,p,f),t.showEventDurationLabel&&T&&this.drawEventDurationLabel(e,t,_,b,S,x,f),t.enableEventSplit&&n.hoveredSplitLine&&!n.draggingEvent&&!n.resizingEvent&&!n.draggingTimeIndicator&&this.drawSplitLine(e,t,n,i,c,S,f,p)}}drawEventContentEntry(e){let{ctx:t,canvas:n,config:r,state:i,event:a,track:o,trackIndex:s,eventIndex:c,eventX:l,trackY:u,eventWidth:d,eventVerticalPadding:f,titleFontSize:p,timeFontSize:m,textStyle:h,dpr:g,phase:_,selected:v,highlighted:y}=e;de({ctx:t,canvas:n,config:r,state:i,dpr:g,event:a,track:o,trackIndex:s,eventIndex:c,rect:{x:l,y:u,width:d,height:r.trackHeight},phase:_,selected:v,highlighted:y,drawDefaultContent:e=>this.drawEventText(e,r,a,l,u,d,f,p,m,h),renderEventContent:r.renderEventContent})}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=O(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(e,t,n,r,i,a,o,s){let c=n.hoveredSplitLine;if(c.trackIndex===r&&c.eventIndex===i){let r=(c.splitTime+t.startPaddingTime-t.startTime)*t.secondWidth*n.zoomLevel-n.scrollX;e.save(),e.strokeStyle=`rgba(255, 255, 0, 0.8)`,e.lineWidth=2,e.setLineDash([5,5]),e.beginPath(),e.moveTo(r,a+o),e.lineTo(r,a+o+s),e.stroke(),e.setLineDash([]),e.fillStyle=`rgba(255, 255, 0, 1)`,e.beginPath(),e.arc(r,a+o,4,0,Math.PI*2),e.fill(),e.beginPath(),e.arc(r,a+o+s,4,0,Math.PI*2),e.fill();let i=w(c.splitTime);e.font=`bold 11px Arial`,e.fillStyle=`rgba(255, 255, 0, 1)`,e.textAlign=`center`,e.fillText(`Split: ${i}`,r,a+o-5),e.restore()}}drawEventDurationLabel(e,t,n,r,i,a,o){e.save();let s=Math.round(n.duration*1e3)/1e3,c;c=t.formatEventDuration?t.formatEventDuration(s):te(s,t.eventDurationPrefix),e.font=`bold 11px Arial`,e.fillStyle=t.colors.eventDurationLabel,e.textAlign=`center`;let l=r+a/2,u=Math.max(i+o-8,t.timelineHeight+12);e.fillText(c,l,u),e.restore()}},ge=class{constructor(){this.name=`Tracks`,this.layer=`tracks`,this.eventsRenderer=new he}render(e){let{ctx:t,canvas:n,config:r,state:i,pluginManager:a,width:o,height:s,dpr:c}=e,l=r.startPaddingTime-i.scrollX,u=this.eventsRenderer,d=new Set;for(let e of i.editDrafts.values())d.add(e.sourceTrackIndex),d.add(e.targetTrackIndex);for(let e=0;e<i.tracks.length;e++){let f=r.timelineHeight+r.firstTrackTopMargin+e*(r.trackHeight+r.trackMargin)-i.scrollY;if((f+r.trackHeight<r.timelineHeight||f>s)&&!d.has(e))continue;let p;p=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=p;let m=o-l;m>0&&t.fillRect(l,f,m,r.trackHeight),u.renderEvents(t,r,i,e,f,n,a,o,c)}}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}},_e=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,i,a){let o=t.startPaddingTime+(t.endTime+t.endPaddingTime-t.startTime)*t.secondWidth*n.zoomLevel>i?13:0,s=t.timelineHeight+t.firstTrackTopMargin+n.tracks.length*(t.trackHeight+t.trackMargin);if(s>a-o){let c=i-8-5,l=t.timelineHeight,u=a-t.timelineHeight-o-5;e.fillStyle=t.colors.scrollbarTrack,r(e,c,l,8,u,4);let d=(a-o-5)/s,f=Math.max(30,u*d),p=s-a+o+5,m=n.scrollY/p,h=l+(u-f)*m;e.fillStyle=n.draggingScrollbar?t.colors.scrollbarHandleHover:t.colors.scrollbarHandle,r(e,c,h,8,f,4),e.fillStyle=t.colors.scrollbarHandleHighlight,r(e,c,h,8,f/2,4),n.draggingScrollbar&&(e.strokeStyle=t.colors.scrollbarBorder,e.lineWidth=1,r(e,c,h,8,f,4,!0))}}drawHorizontalScrollbar(e,t,n,i,a){let o=t.startPaddingTime+(t.endTime+t.endPaddingTime-t.startTime)*t.secondWidth*n.zoomLevel;if(o<=i)return;let s=t.timelineHeight+t.firstTrackTopMargin+n.tracks.length*(t.trackHeight+t.trackMargin)>a?13:0,c=a-8-5,l=i-s;e.fillStyle=t.colors.scrollbarTrack,r(e,0,c,l,8,4);let u=i/o,d=Math.max(30,l*u),f=o-i,p=n.scrollX/f,m=0+(l-d)*p;e.fillStyle=n.draggingHorizontalScrollbar?t.colors.scrollbarHandleHover:t.colors.scrollbarHandle,r(e,m,c,d,8,4),e.fillStyle=t.colors.scrollbarHandleHighlight,r(e,m,c,d/2,8,4),n.draggingHorizontalScrollbar&&(e.strokeStyle=t.colors.scrollbarBorder,e.lineWidth=1,r(e,m,c,d,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}},ve=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}},ye=class{constructor(){this.name=`GuideLines`,this.layer=`guideLines`}render(e){let{ctx:t,config:n,state:r,width:i,height:a}=e;if(t.save(),r.guideLines.length>0){t.strokeStyle=n.colors.guideLine,t.lineWidth=2,t.setLineDash([5,5]);for(let e of r.guideLines){let o=n.startPaddingTime+(e.time-n.startTime)*n.secondWidth*r.zoomLevel-r.scrollX;o<-10||o>i+10||(t.beginPath(),t.moveTo(o,n.timelineHeight),t.lineTo(o,a),t.stroke(),t.setLineDash([]),t.fillStyle=n.colors.guideLineLabel,t.font=`bold 11px Arial`,t.textAlign=`center`,t.fillText(w(e.time),o,n.timelineHeight-5),t.setLineDash([5,5]))}}if(r.dragTimeReference){let e=n.startPaddingTime+(r.dragTimeReference.time-n.startTime)*n.secondWidth*r.zoomLevel-r.scrollX;if(e>=-10&&e<=i+10){let i=r.dragTimeReference.y-r.scrollY;t.strokeStyle=n.colors.dragTimeReferenceLine,t.lineWidth=2,t.setLineDash([8,4]),t.beginPath(),t.moveTo(e,n.timelineHeight),t.lineTo(e,i),t.stroke(),t.setLineDash([]),t.fillStyle=n.colors.dragTimeReferenceLabel,t.font=`bold 12px Arial`,t.textAlign=`center`;let a=w(r.dragTimeReference.time),o=t.measureText(a).width;t.fillStyle=n.colors.dragTimeReferenceLabelBackground,t.fillRect(e-o/2-4,n.timelineHeight-14-4-5,o+8,22),t.fillStyle=n.colors.dragTimeReferenceLabel,t.fillText(a,e,n.timelineHeight-5)}}t.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}},be=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(e))}renderDragPreview(e,t,n){if(!n.draggingEvent||!n.tracks[n.draggingEvent.trackIndex])return;let i=n.tracks[n.draggingEvent.trackIndex].events[n.draggingEvent.eventIndex];if(!i)return;let a=n.draggingEvent.currentMouseY||0,o=n.draggingEvent.canMove!==!1,s=Math.floor((a-t.timelineHeight-t.firstTrackTopMargin)/(t.trackHeight+t.trackMargin)),c=Math.max(0,Math.min(n.tracks.length-1,s)),l=t.timelineHeight+t.firstTrackTopMargin+c*(t.trackHeight+t.trackMargin),u=(n.draggingEvent.currentMouseX||0)-n.dragOffsetX,d=i.duration*t.secondWidth*n.zoomLevel,f=Math.max(5,t.trackHeight*.0625),p=t.trackHeight-f*2,m=t.eventBlockStyle.borderRadius;e.save(),o?(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?(r(e,u,l-n.scrollY+f,d,p,m),e.fill(),e.stroke()):(e.fillRect(u,l-n.scrollY+f,d,p),e.strokeRect(u,l-n.scrollY+f,d,p)),e.restore()}renderDraggingEvent(e){let{ctx:t,config:n,state:i,canvas:a,dpr:o,pluginManager:s}=e;if(!i.draggingEvent)return;let c=i.tracks[i.draggingEvent.trackIndex];if(!c?.events)return;let l=c.events[i.draggingEvent.eventIndex];if(!l||l.businessId!==void 0&&i.editDrafts.has(l.businessId))return;let u=i.draggingEvent.currentMouseX||0,d=i.draggingEvent.currentMouseY||0,f=u-i.dragOffsetX,p=d-i.dragOffsetY-i.scrollY,m=l.duration*n.secondWidth*i.zoomLevel,h=Math.max(5,n.trackHeight*.0625),g=n.trackHeight-h*2;t.save();let _=n.eventBlockStyle.borderRadius;t.fillStyle=l.color,_>0?(r(t,f,p+h,m,g,_),t.fill()):t.fillRect(f,p+h,m,g),t.strokeStyle=n.colors.eventBorderSelected,t.lineWidth=2,n.eventBlockStyle.enableSelectionGlow&&(t.shadowColor=n.colors.eventBorderSelected,t.shadowBlur=n.eventBlockStyle.selectionGlowBlur),_>0?(r(t,f,p+h,m,g,_),t.stroke()):t.strokeRect(f,p+h,m,g),t.shadowBlur=0,t.restore(),s&&s.emitEvent(`render:event:media`,t,a,n,i,i.draggingEvent.trackIndex,i.draggingEvent.eventIndex,f,p,m,h,g),de({ctx:t,canvas:a,config:n,state:i,dpr:o,event:l,track:c,trackIndex:i.draggingEvent.trackIndex,eventIndex:i.draggingEvent.eventIndex,rect:{x:f,y:p,width:m,height:n.trackHeight},phase:`drag`,selected:!0,highlighted:!0,drawDefaultContent:e=>this.renderEventText(e,n,l,f,p,m,h),renderEventContent:n.renderEventContent})}renderEventText(e,t,n,r,i,a,o){let s=t.eventTextStyle,c=s.titleColor||t.colors.eventText,l=s.timeColor||t.colors.eventText,u={left:r+10,right:r+a-10,center:r+a/2}[s.textAlign]??r+a/2,d={top:i+o,middle:i+t.trackHeight/2,bottom:i+t.trackHeight-o}[s.verticalAlign]??i+o;e.textAlign=s.textAlign;let f=s.showTitle&&t.trackHeight>=s.minHeightForTitle,p=s.showTime&&t.trackHeight>=s.minHeightForTime,m=s.titleFontSize===`auto`?Math.max(10,Math.min(14,t.trackHeight*.175)):s.titleFontSize,h=s.timeFontSize===`auto`?Math.max(8,Math.min(12,t.trackHeight*.15)):s.timeFontSize,g=`${w(n.startTime)} - ${w(n.endTime)}`;if(f){e.fillStyle=c,e.font=`${s.titleFontWeight} ${m}px ${s.titleFontFamily}`;let t=p?d-(typeof m==`number`?m:14)/2+s.titleOffsetY:d+s.titleOffsetY;e.fillText(n.title,u,t)}if(p){e.fillStyle=l,e.font=`${s.timeFontWeight} ${h}px ${s.timeFontFamily}`;let t=f?d+(typeof h==`number`?h:12)+s.timeOffsetY:d+s.timeOffsetY;e.fillText(g,u,t)}}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 I(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 L=m(`LayerBuffer`),xe={background:`background`,tracks:`main`,timeline:`main`,guideLines:`main`,indicator:`main`,scrollbar:`main`,interaction:`interaction`,overlay:`overlay`},R=[`background`,`main`,`media`,`interaction`,`overlay`];function Se(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){L.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 Ce=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 R){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}=Se(r,i);this.buffers.set(e,{canvas:t,ctx:n,dirty:!0})}}L.debugStyled(_.pipeline,`LayerBufferManager initialized: ${r}x${i} (dpr=${n})`)}markDirtyFromLayers(e){for(let t of e){let e=xe[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 R){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(){for(let e of this.buffers.values())e.canvas.width=0,e.canvas.height=0;this.buffers.clear(),this.width=0,this.height=0}};const z=m(`DirtyCheck`);var we=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.disposed=!1,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 oe(this.config,this.state),this.layerBufferManager=new Ce,this.renderPipeline=new ce,this.renderPipeline.registerRenderer(`timeline`,new le),this.renderPipeline.registerRenderer(`tracks`,new ge),this.renderPipeline.registerRenderer(`guideLines`,new ye),this.renderPipeline.registerRenderer(`indicator`,new ve),this.renderPipeline.registerRenderer(`scrollbar`,new _e),this.renderPipeline.registerRenderer(`interaction`,new be)}setCanvasSize(e,t){if(this.disposed)return;let n=window.devicePixelRatio||1,r=Math.floor(e*n),i=Math.floor(t*n);if(this.dpr===n&&Math.abs(this.canvas.width-r)<1&&Math.abs(this.canvas.height-i)<1&&this.canvas.style.width===`${e}px`&&this.canvas.style.height===`${t}px`)return;this.dpr=n,this.canvas.width=r,this.canvas.height=i,this.canvas.style.width=`${e}px`,this.canvas.style.height=`${t}px`,this.invalidateCache();let a=this.getContentHeight(),o=Math.max(0,a-this.getCachedLogicalHeight());this.state.scrollY=Math.max(0,Math.min(o,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}getDevicePixelRatio(){return this.dpr}getViewportManager(){return this.viewport}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.disposed||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=I(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=I(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){z.debugStyled(_.dataUpdate,`✓ Marking layers dirty: [${e.join(`, `)}]`);for(let t of e)this.dirtyLayers.add(t)}markAllDirty(){z.debugStyled(_.dataUpdate,`✓ Marking ALL layers dirty`),this.dirtyLayers=new Set([`background`,`tracks`,`timeline`,`guideLines`,`indicator`,`scrollbar`,`overlay`,`interaction`]),this.layerBufferManager.markAllDirty()}getLastLayerTimes(){return{...this.lastLayerTimes}}dispose(){this.disposed=!0,this.layerBufferManager.dispose(),this.dirtyLayers.clear(),this.lastLayerTimes={}}},B=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)}},Te=class{constructor(e,t=new B(m(`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,this.destroyed=!1,this.pendingLoads=new Map,this.pendingUnloads=new Map}loadPlugin(e){let{name:t,version:n}=e.metadata,r=`${t}@${n}`;if(this.destroyed||this.plugins.has(r)||this.pendingLoads.has(r)||this.pendingUnloads.has(r))return Promise.resolve(!1);let i=Promise.resolve().then(()=>this.performLoad(r,e)).finally(()=>this.pendingLoads.delete(r));return this.pendingLoads.set(r,i),i}async performLoad(e,t){if(this.destroyed)return!1;if(!this.areDependenciesLoaded(t.metadata.dependencies))return this.errorHandler.fail(this.baseContext.config.debug,f(this.baseContext.config,`errorPluginDependenciesMissing`,{pluginId:e}),Error(`Missing dependencies: ${t.metadata.dependencies?.join(`, `)}`));this.pluginMetadata.set(e,t.metadata);let n=this.createPluginContext(e),r=!1,i=!1,a=!1;try{return t.init&&(r=!0,await t.init(n)),this.destroyed||(t.activate&&(i=!0,await t.activate(n)),this.destroyed)?!1:(this.plugins.set(e,{plugin:t,context:n,active:!0}),a=!0,!0)}catch(t){return this.errorHandler.fail(this.baseContext.config.debug,f(this.baseContext.config,`errorPluginLoadFailed`,{pluginId:e}),t)}finally{a||(await this.rollbackFailedLoad(e,t,n,r,i),this.cleanupPluginResources(e))}}unloadPlugin(e){let t=this.pendingUnloads.get(e);if(t)return t;let n=this.plugins.get(e);if(!n)return Promise.resolve(!1);this.plugins.delete(e);let r=Promise.resolve().then(()=>this.performUnload(e,n)).finally(()=>{this.cleanupPluginResources(e),this.pendingUnloads.delete(e)});return this.pendingUnloads.set(e,r),r}async performUnload(e,t){let n=await this.runLifecycleStep(e,`deactivate`,t.plugin.deactivate,t.context);return await this.runLifecycleStep(e,`destroy`,t.plugin.destroy,t.context)||(n=!1),n}destroy(){return this.destroyPromise?this.destroyPromise:(this.destroyed=!0,this.destroyPromise=Promise.resolve().then(()=>this.disposePlugins()),this.destroyPromise)}async disposePlugins(){for(let e of[...this.plugins.keys()].reverse())await this.unloadPlugin(e);await Promise.allSettled([...this.pendingLoads.values(),...this.pendingUnloads.values()])}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,f(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=m(`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.get(e)?.clear(),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,f(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,f(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||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}},Ee=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,editDrafts:new Map,lastClickTime:0,lastClickEvent:null,hoveredSplitLine:null,statusText:f(e,`statusReady`),contextMenuBounds:null,lastDrawTime:0}}setStatus(e,t){this.state.statusText=e,t&&t(e)}},De=class{constructor(e){this.trackIndices=new Map,this.dirtyTracks=new Set,this.batching=!1,this.state=e}invalidateTrack(e){this.dirtyTracks.add(e)}invalidateAll(){this.trackIndices.clear(),this.dirtyTracks.clear()}beginBatch(){this.batching=!0}endBatch(){if(this.batching){for(let e of this.dirtyTracks)this.state.tracks[e]?this.ensureIndex(e):this.trackIndices.delete(e);this.dirtyTracks.clear(),this.batching=!1}}ensureIndex(e){let t=this.trackIndices.get(e);if(t&&!this.dirtyTracks.has(e))return t;let n=this.state.tracks[e].events,r=n.map((e,t)=>t);r.sort((e,t)=>n[e].startTime-n[t].startTime);let i=new Float64Array(r.length*4).fill(-1/0),a=(e,t,o)=>{if(t===o)return i[e]=n[r[t]].endTime;let s=t+o>>>1;return i[e]=Math.max(a(e*2,t,s),a(e*2+1,s+1,o))};r.length&&a(1,0,r.length-1);let o={indices:r,maxEnds:i};return this.trackIndices.set(e,o),this.dirtyTracks.delete(e),o}getCandidatesByTime(e,t,n=0){let{indices:r,maxEnds:i}=this.ensureIndex(e),a=this.state.tracks[e],o=0,s=r.length-1,c=-1,l=t+n;for(;o<=s;){let e=o+s>>1,t=r[e];a.events[t].startTime<=l?(c=e,o=e+1):s=e-1}if(c===-1)return[];let u=[],d=(e,a,o)=>{if(a>c||i[e]<t-n)return;if(a===o){u.push(r[a]);return}let s=a+o>>>1;d(e*2+1,s+1,o),d(e*2,a,s)};return d(1,0,r.length-1),u}};function V(e){return typeof e==`string`?e.length>0:typeof e==`number`&&Number.isFinite(e)}var Oe=class{constructor(e){this.eventLocations=new Map,this.trackIndices=new Map,this.trackEventIds=new Map,this.trackIdsByIndex=new Map,this.dirtyTracks=new Set,this.allDirty=!0,this.state=e}markAllDirty(){this.allDirty=!0,this.dirtyTracks.clear()}markTrackDirty(e){this.allDirty||this.dirtyTracks.add(e)}getEventLocation(e){return this.sync(),this.eventLocations.get(e)??null}hasEvent(e){return this.sync(),this.eventLocations.has(e)}getTrackIndex(e){return this.sync(),this.trackIndices.get(e)??null}sync(){if(this.allDirty){this.rebuildAll();return}if(this.dirtyTracks.size!==0){for(let e of this.dirtyTracks)this.rebuildTrack(e);this.dirtyTracks.clear()}}rebuildAll(){this.eventLocations.clear(),this.trackIndices.clear(),this.trackEventIds.clear(),this.trackIdsByIndex.clear();for(let e=0;e<this.state.tracks.length;e++)this.collectTrack(e);this.allDirty=!1,this.dirtyTracks.clear()}rebuildTrack(e){let t=this.trackEventIds.get(e);if(t)for(let e of t.keys())this.eventLocations.delete(e);let n=this.trackIdsByIndex.get(e);n!==void 0&&this.trackIndices.get(n)===e&&this.trackIndices.delete(n),this.collectTrack(e)}collectTrack(e){let t=this.state.tracks[e];if(!t){this.trackEventIds.delete(e),this.trackIdsByIndex.delete(e);return}let n=new Map;for(let r=0;r<t.events.length;r++){let i=t.events[r].businessId;i!==void 0&&(this.eventLocations.set(i,{trackIndex:e,eventIndex:r}),n.set(i,r))}this.trackEventIds.set(e,n),t.businessId===void 0?this.trackIdsByIndex.set(e,void 0):(this.trackIndices.set(t.businessId,e),this.trackIdsByIndex.set(e,t.businessId))}};const H=2147483647;var ke=class e{static{this.instanceCounter=0}constructor(t,n,r){this.options=null,this.transactions=new Map,this.commitSink=null,this.operationSeq=0,this.instanceSeq=++e.instanceCounter,this.state=t,this.businessIdentityIndex=n,this.notify=r}static validateOptions(e){if(e!==void 0){if(typeof e!=`object`||!e)throw Error(`scheduleEditing must be an object when provided`);if(typeof e.onBeforeCommit!=`function`)throw Error(`scheduleEditing.onBeforeCommit is required when scheduleEditing is configured`);if(e.validate!==void 0&&typeof e.validate!=`function`)throw Error(`scheduleEditing.validate must be a function when provided`);if(e.commitTimeoutMs!==void 0){let t=e.commitTimeoutMs;if(typeof t!=`number`||!Number.isFinite(t)||t<=0||t>H)throw Error(`scheduleEditing.commitTimeoutMs must be a finite positive number <= ${H}`)}}}configure(t){e.validateOptions(t),this.options=t}get active(){return this.options!==null}hasActiveTransaction(e){return this.transactions.has(e)}tryBegin(e){if(!this.active)return{ok:!1,code:`inactive`,reason:`schedule editing is not configured`};let{event:t,trackIndex:n,eventIndex:r,action:i,resizeEdge:a}=e;if(t.businessId===void 0)return{ok:!1,code:`missing_business_id`,reason:`event has no business id`};if(this.transactions.has(t.businessId))return{ok:!1,code:`busy`,reason:`event is locked by an in-flight edit operation`};let o=this.businessIdentityIndex.getEventLocation(t.businessId),s=o?this.state.tracks[o.trackIndex]?.businessId:void 0;if(s===void 0)return{ok:!1,code:`missing_business_id`,reason:`resource has no business id`};let c={resourceBusinessId:s,event:M(t)},l={operationId:`${this.instanceSeq}-${++this.operationSeq}`,eventBusinessId:t.businessId,action:i,...a===void 0?{}:{resizeEdge:a},before:c,beforeTrackIndex:n,beforeEventIndex:r,draft:{resourceBusinessId:s,startTime:t.startTime,endTime:t.endTime},lastCandidateValid:!0,state:`preview`,abort:new AbortController};return this.transactions.set(t.businessId,l),this.syncDraftProjection(l),{ok:!0}}updateDraft(e,t,n){let r=this.transactions.get(e);if(!r||r.state!==`preview`)return;r.draft=t,r.lastCandidateValid=!0;let i=this.state.editDrafts.get(e);i&&(i.targetTrackIndex=n,i.startTime=t.startTime,i.endTime=t.endTime)}getTransaction(e){return this.transactions.get(e)}buildChange(e){let t=this.transactions.get(e);if(!t)return null;let n=this.state.tracks[t.beforeTrackIndex]?.events[t.beforeEventIndex],r={resourceBusinessId:t.draft.resourceBusinessId,event:{...M(n??t.before.event),id:t.before.event.id,startTime:t.draft.startTime,endTime:t.draft.endTime,duration:t.draft.endTime-t.draft.startTime}};return{operationId:t.operationId,eventBusinessId:t.eventBusinessId,action:t.action,...t.resizeEdge===void 0?{}:{resizeEdge:t.resizeEdge},before:t.before,after:r}}markCandidateInvalid(e){let t=this.transactions.get(e);t&&(t.lastCandidateValid=!1)}runBusinessValidate(e){let t=this.options?.validate;if(!t)return{allowed:!0};let n;try{n=t(e)}catch{return{allowed:!1,code:`validation_error`,reason:`business validator threw an exception`}}return n instanceof Promise?{allowed:!1,code:`validation_error`,reason:`business validator must be synchronous`}:!n||typeof n!=`object`?{allowed:!1,code:`validation_error`,reason:`business validator returned an invalid structure`}:n.allowed===!0?{allowed:!0}:n.allowed===!1&&typeof n.code==`string`&&typeof n.reason==`string`?n:{allowed:!1,code:`validation_error`,reason:`business validator returned an invalid structure`}}beginCommit(e,t){let n=this.transactions.get(e);if(!n||n.state!==`preview`)return!1;n.state=`pending`;let r=this.state.editDrafts.get(e);r&&(r.commitState=`pending`),this.notify({state:`pending`,operationId:n.operationId,eventBusinessId:e,action:n.action,before:n.before,after:t.after});let i=this.options?.onBeforeCommit;if(!i)return!1;let a;try{a=Promise.resolve(i.call(this.options,t,{signal:n.abort.signal}))}catch{return this.commitSink?.(null,t),!0}return a.then(e=>{this.commitSink?.(e,t)}).catch(()=>{this.commitSink?.(null,t)}),!0}cancelPreview(e,t,n,r){let i=this.transactions.get(e);!i||i.state!==`preview`||(this.transactions.delete(e),this.state.editDrafts.delete(e),this.notify({state:r,operationId:i.operationId,eventBusinessId:e,action:i.action,before:i.before,reason:t,reasonCode:n}))}cancelAll(e){for(let t of Array.from(this.transactions.values()))t.state===`preview`&&(this.transactions.delete(t.eventBusinessId),this.state.editDrafts.delete(t.eventBusinessId),this.notify({state:`cancelled`,operationId:t.operationId,eventBusinessId:t.eventBusinessId,action:t.action,before:t.before,reason:e}))}handleDatasetReplaced(){let e=[];for(let t of Array.from(this.transactions.values()))t.abort.abort(),e.push(t.operationId),this.transactions.delete(t.eventBusinessId),this.state.editDrafts.delete(t.eventBusinessId),this.notify({state:`invalidated`,operationId:t.operationId,eventBusinessId:t.eventBusinessId,action:t.action,before:t.before,reason:`dataset replaced by authoritative load`});return e}enterReconciliation(e,t,n){let r=this.transactions.get(e);if(!r||r.state!==`pending`)return;r.state=`reconciliation_required`,r.reasonCode=n;let i=this.state.editDrafts.get(e);i&&(i.commitState=`reconciliation_required`),r.abort.abort();let a=M(r.before.event);a.startTime=r.draft.startTime,a.endTime=r.draft.endTime,a.duration=r.draft.endTime-r.draft.startTime,this.notify({state:`reconciliation_required`,operationId:r.operationId,eventBusinessId:e,action:r.action,before:r.before,after:{resourceBusinessId:r.draft.resourceBusinessId,event:a},reason:t,reasonCode:n})}releaseForAccept(e){let t=this.transactions.get(e);t&&(t.abort.abort(),this.transactions.delete(e),this.state.editDrafts.delete(e))}hasTransaction(e){return this.transactions.has(e)}getReservations(e){let t=[];for(let n of this.transactions.values())(e===void 0||n.eventBusinessId!==e)&&(t.push({resourceBusinessId:n.before.resourceBusinessId,startTime:n.before.event.startTime,endTime:n.before.event.endTime}),t.push({resourceBusinessId:n.draft.resourceBusinessId,startTime:n.draft.startTime,endTime:n.draft.endTime}));return t}destroyAll(){for(let e of this.transactions.values())e.abort.abort(),this.state.editDrafts.delete(e.eventBusinessId);this.transactions.clear()}invalidateTransaction(e,t){let n=this.transactions.get(e);n&&(n.abort.abort(),this.transactions.delete(e),this.state.editDrafts.delete(e),n.state===`pending`&&this.notify({state:`invalidated`,operationId:n.operationId,eventBusinessId:e,action:n.action,before:n.before,reason:t}))}rejectPending(e,t,n){let r=this.transactions.get(e);!r||r.state!==`pending`||(r.abort.abort(),this.transactions.delete(e),this.state.editDrafts.delete(e),this.notify({state:`rejected`,operationId:r.operationId,eventBusinessId:e,action:r.action,before:r.before,reason:t,...n===void 0?{}:{reasonCode:n}}))}getEditState(e){let t=this.transactions.get(e);return t?t.state===`preview`?{state:`preview`,operationId:t.operationId,action:t.action,placement:{...t.draft}}:t.state===`reconciliation_required`?{state:`reconciliation_required`,operationId:t.operationId,action:t.action,placement:{...t.draft},reasonCode:t.reasonCode}:{state:`pending`,operationId:t.operationId,action:t.action,placement:{...t.draft}}:{state:`idle`}}syncDraftProjection(e){let t=this.businessIdentityIndex.getEventLocation(e.eventBusinessId);this.state.editDrafts.set(e.eventBusinessId,{operationId:e.operationId,eventBusinessId:e.eventBusinessId,sourceTrackIndex:t?.trackIndex??e.beforeTrackIndex,targetTrackIndex:t?.trackIndex??e.beforeTrackIndex,startTime:e.draft.startTime,endTime:e.draft.endTime,action:e.action,...e.resizeEdge===void 0?{}:{resizeEdge:e.resizeEdge},commitState:`preview`})}},Ae=class e{constructor(e){this.controller=null,this.settled=new Set,this.timers=new Map,this.deps=e}attachController(e){this.controller=e}beginTiming(e){let t=this.deps.getTimeoutMs(),n=setTimeout(()=>{this.timers.delete(e.operationId),this.handleUnknown(e,`timeout`,`commit timed out waiting for the server result`)},t);this.timers.set(e.operationId,n)}handleResult(t,n){if(!this.deps.isAlive()||this.settled.has(t.operationId))return;let r=this.controller?.getTransaction(t.eventBusinessId);if(!(!r||r.operationId!==t.operationId)&&r.state===`pending`){if(n===null){this.handleUnknown(t,`transport_error`,`commit hook threw or rejected without a verdict`);return}if(!e.isValidResult(n)){this.handleUnknown(t,`invalid_response`,`commit hook returned an invalid result structure`);return}if(n.accepted){this.settleAccepted(t,n);return}this.settleRejected(t,n.reason,n.code)}}settleRejected(e,t,n){this.markSettled(e.operationId),this.stopTimer(e.operationId),this.controller?.rejectPending(e.eventBusinessId,t,n),this.deps.notifySettled()}settleAccepted(e,t){let n=this.deps.isAlive(),r=this.deps.getDatasetEpoch(),i={resourceBusinessId:e.after.resourceBusinessId,startTime:e.after.event.startTime,endTime:e.after.event.endTime},a=t.placement??i,o=this.deps.publishAccepted(e.eventBusinessId,e,a);if(!o.ok){this.handleUnknown(e,o.code??`reconciliation_required`,o.reason??`accepted result cannot be applied locally`);return}this.markSettled(e.operationId),this.stopTimer(e.operationId),this.controller?.releaseForAccept(e.eventBusinessId),this.deps.notifySettled();let s={resourceBusinessId:a.resourceBusinessId,event:o.event};this.deps.notify({state:`accepted`,operationId:e.operationId,eventBusinessId:e.eventBusinessId,action:e.action,before:e.before,after:s}),!(!n||!this.deps.isAlive()||this.deps.getDatasetEpoch()!==r)&&this.deps.fireLegacySuccess(e,a,o.event,{fromTrackIndex:o.fromTrackIndex??0,fromEventIndex:o.fromEventIndex??0,toTrackIndex:o.toTrackIndex??0,toEventIndex:o.toEventIndex??0})}handleUnknown(e,t,n){if(this.settled.has(e.operationId))return;let r=this.controller?.getTransaction(e.eventBusinessId);!r||r.operationId!==e.operationId||r.state===`pending`&&(this.markSettled(e.operationId),this.stopTimer(e.operationId),this.controller?.enterReconciliation(e.eventBusinessId,n,t),this.deps.notifySettled())}invalidateOperations(e){for(let t of e){let e=this.timers.get(t);e&&(clearTimeout(e),this.timers.delete(t)),this.settled.add(t)}}destroy(){for(let e of this.timers.values())clearTimeout(e);this.timers.clear(),this.settled.clear(),this.controller=null}markSettled(e){if(this.settled.add(e),this.settled.size>1e3){let e=0;for(let t of this.settled)if(this.settled.delete(t),++e>=500)break}}stopTimer(e){let t=this.timers.get(e);t&&(clearTimeout(t),this.timers.delete(e))}static isValidResult(e){if(typeof e!=`object`||!e||typeof e.accepted!=`boolean`)return!1;if(e.accepted){if(e.placement!==void 0){let t=e.placement;if(typeof t!=`object`||!t||t.resourceBusinessId===void 0||typeof t.startTime!=`number`||typeof t.endTime!=`number`)return!1}return!0}return typeof e.reason==`string`?e.code===void 0||typeof e.code==`string`:!1}};const U=(e,t,n)=>({ok:!1,error:n===void 0?{code:e,message:t}:{code:e,path:n,message:t}}),W=e=>({ok:!0,value:e});var je=class{constructor(e){this.config=e.config,this.state=e.state,this.businessIdentityIndex=e.businessIdentityIndex,this.eventIndexManager=e.eventIndexManager,this.onMutate=e.onMutate}loadScheduleData(e){if(typeof e!=`object`||!e||!Array.isArray(e.tracks))return U(`invalid_input`,`schedule data must be an object with a tracks array`,`tracks`);if(e.tracks.length===0)return U(`invalid_input`,`tracks must contain at least one resource`,`tracks`);if(e.timeIndicatorPosition!==void 0&&(typeof e.timeIndicatorPosition!=`number`||!Number.isFinite(e.timeIndicatorPosition)))return U(`invalid_input`,`timeIndicatorPosition must be a finite number`,`timeIndicatorPosition`);let t=new Set,n=new Set,r=[];for(let i=0;i<e.tracks.length;i++){let a=e.tracks[i],o=`tracks[${i}]`;if(typeof a!=`object`||!a)return U(`invalid_input`,`track must be an object`,o);if(!V(a.businessId))return U(`invalid_input`,`track.businessId must be a non-empty string or a finite number`,`${o}.businessId`);if(n.has(a.businessId))return U(`duplicate_business_id`,`duplicate track business id`,`${o}.businessId`);if(n.add(a.businessId),!Array.isArray(a.events))return U(`invalid_input`,`track.events must be an array`,`${o}.events`);let s=this.validateCustomData(a.customData,`${o}.customData`);if(!s.ok)return s;let c=[];for(let e=0;e<a.events.length;e++){let n=`${o}.events[${e}]`,r=this.validateEventInput(a.events[e],n,t);if(!r.ok)return r;c.push(r.value)}r.push({businessId:a.businessId,...s.value?{customData:s.value}:{},events:c})}let i=r.map((e,t)=>({id:t,businessId:e.businessId,...e.customData?{customData:k(e.customData)}:{},events:e.events.map((e,t)=>this.createRuntimeEvent(e,t))}));return this.state.tracks=i,this.state.selectedTrack=null,this.state.selectedEvent=null,this.state.highlightedEvent=null,this.state.contextMenuEvent=null,this.state.contextMenuVisible=!1,this.state.hoveredResizeHandle=null,this.state.hoveredSplitLine=null,this.state.lastClickEvent=null,this.state.draggingEvent=null,this.state.resizingEvent=null,this.eventIndexManager.invalidateAll(),this.businessIdentityIndex.markAllDirty(),this.onMutate?.(),W(void 0)}exportScheduleData(){let e=[];for(let t=0;t<this.state.tracks.length;t++){let n=this.state.tracks[t];if(n.businessId===void 0)return U(`missing_business_id`,`track at index ${t} has no business id`,`tracks[${t}]`);let r=[];for(let e=0;e<n.events.length;e++){let i=this.exportEvent(n.events[e],t,e);if(!i.ok)return i;r.push(i.value)}let i=this.validateCustomData(n.customData,`tracks[${t}].customData`);if(!i.ok)return i;e.push({businessId:n.businessId,...i.value?{customData:k(i.value)}:{},events:r})}return W({tracks:e,timeIndicatorPosition:this.state.timeIndicatorPosition})}getEventLocation(e){if(!V(e))return null;let t=this.businessIdentityIndex.getEventLocation(e);if(!t)return null;let n=this.state.tracks[t.trackIndex];if(!n||n.businessId===void 0)return null;let r=n.events[t.eventIndex];return r?{trackIndex:t.trackIndex,eventIndex:t.eventIndex,resourceBusinessId:n.businessId,event:M(r)}:null}patchEvent(e,t){if(!V(e))return U(`not_found`,`no event with the given business id`);if(typeof t!=`object`||!t)return U(`invalid_input`,`patch must be an object`);for(let e of[`id`,`businessId`,`duration`])if(e in t)return U(`invalid_input`,`patch must not change ${e}`,String(e));let n=this.businessIdentityIndex.getEventLocation(e);if(!n)return U(`not_found`,`no event with the given business id`);let r=this.state.tracks[n.trackIndex],i=r?.events[n.eventIndex];if(!r||!i)return U(`not_found`,`no event with the given business id`);let a=t.startTime??i.startTime,o=t.endTime??i.endTime;if(typeof a!=`number`||!Number.isFinite(a))return U(`invalid_input`,`startTime must be a finite number`,`startTime`);if(typeof o!=`number`||!Number.isFinite(o))return U(`invalid_input`,`endTime must be a finite number`,`endTime`);if(a<this.config.startTime)return U(`invalid_input`,`startTime is before the timeline start`,`startTime`);if(o<=a)return U(`invalid_input`,`endTime must be greater than startTime`,`endTime`);if(o>this.config.endTime+this.config.endPaddingTime)return U(`invalid_input`,`endTime exceeds the timeline window`,`endTime`);if(t.title!==void 0&&(typeof t.title!=`string`||t.title.length===0))return U(`invalid_input`,`title must be a non-empty string`,`title`);if(t.description!==void 0&&typeof t.description!=`string`)return U(`invalid_input`,`description must be a string`,`description`);if(t.color!==void 0&&typeof t.color!=`string`)return U(`invalid_input`,`color must be a string`,`color`);if(t.readonly!==void 0&&typeof t.readonly!=`boolean`)return U(`invalid_input`,`readonly must be a boolean`,`readonly`);let s=this.validateCustomData(t.customData,`customData`);if(!s.ok)return s;if(t.media!==void 0){let e=this.validateMedia(t.media,`media`);if(!e.ok)return e}let c=M(i),l=D(o-a);return i.startTime=a,i.endTime=D(a+l),i.duration=l,t.title!==void 0&&(i.title=t.title),t.description!==void 0&&(i.description=t.description),t.color!==void 0&&(i.color=t.color),t.readonly!==void 0&&(t.readonly?i.readonly=!0:delete i.readonly),t.customData!==void 0&&(i.customData=k(s.value)),t.media!==void 0&&(i.media=ae(t.media)),this.eventIndexManager.invalidateTrack(n.trackIndex),this.businessIdentityIndex.markTrackDirty(n.trackIndex),this.onMutate?.(),W({trackIndex:n.trackIndex,eventIndex:n.eventIndex,event:i,oldEvent:c})}upsertScheduleEvents(e){if(!Array.isArray(e))return U(`invalid_input`,`items must be an array`,`items`);let t=new Set,n=[];for(let r=0;r<e.length;r++){let i=e[r],a=`items[${r}]`;if(typeof i!=`object`||!i)return U(`invalid_input`,`item must be an object`,a);if(!V(i.resourceBusinessId))return U(`not_found`,`unknown resource business id`,`${a}.resourceBusinessId`);let o=this.businessIdentityIndex.getTrackIndex(i.resourceBusinessId);if(o===null)return U(`not_found`,`unknown resource business id`,`${a}.resourceBusinessId`);let s=this.validateEventInput(i.event,`${a}.event`,t);if(!s.ok)return s;n.push({targetTrackIndex:o,input:s.value})}let r=[],i=n.map(({targetTrackIndex:e,input:t},n)=>({targetTrackIndex:e,input:t,runtimeEvent:this.createRuntimeEvent(t,0),sequence:n}));for(let{targetTrackIndex:e,input:t,runtimeEvent:n}of i){let i=this.state.tracks[e],a=this.businessIdentityIndex.getEventLocation(t.businessId),o,s,c;a?(s=a.trackIndex,o=M(this.state.tracks[a.trackIndex].events[a.eventIndex]),a.trackIndex===e?(n.id=o.id,i.events[a.eventIndex]=n,c=a.eventIndex):(n.id=o.id,this.state.tracks[a.trackIndex].events.splice(a.eventIndex,1),i.events.push(n),c=i.events.length-1),this.eventIndexManager.invalidateTrack(a.trackIndex),this.businessIdentityIndex.markTrackDirty(a.trackIndex),a.trackIndex!==e&&(this.eventIndexManager.invalidateTrack(e),this.businessIdentityIndex.markTrackDirty(e))):(n.id=i.events.length,i.events.push(n),c=i.events.length-1,this.eventIndexManager.invalidateTrack(e),this.businessIdentityIndex.markTrackDirty(e)),t.color===void 0&&(n.color=this.defaultColor(c)),this.onMutate?.();let l;l=a?s===e?`replace`:`move`:`insert`,r.push({kind:l,trackIndex:e,eventIndex:c,...s===void 0?{}:{fromTrackIndex:s},event:n,...o?{oldEvent:o}:{}})}return W(r)}getTrack(e){if(!V(e))return null;let t=this.businessIdentityIndex.getTrackIndex(e);if(t===null)return null;let n=this.state.tracks[t];return n?{trackIndex:t,track:{id:n.id,...n.businessId===void 0?{}:{businessId:n.businessId},...n.customData?{customData:k(n.customData)}:{},events:n.events.map(M)}}:null}updateTrackCustomData(e,t){if(typeof t!=`object`||!t)return U(`invalid_input`,`patch must be an object`);let n=this.businessIdentityIndex.getTrackIndex(e);if(n===null)return U(`not_found`,`no track with the given business id`);let r=this.state.tracks[n];if(!r)return U(`not_found`,`no track with the given business id`);if(t.customData!==void 0){let e=this.validateCustomData(t.customData,`customData`);if(!e.ok)return e;e.value&&(r.customData=k(e.value))}return this.onMutate?.(),W(r)}validateSingleEventInput(e,t){return this.validateEventInput(e,t,null)}validateEventInput(e,t,n){if(typeof e!=`object`||!e)return U(`invalid_input`,`event must be an object`,t);let r=e;if(!V(r.businessId))return U(`invalid_input`,`event.businessId must be a non-empty string or a finite number`,`${t}.businessId`);if(n?.has(r.businessId))return U(`duplicate_business_id`,`duplicate event business id`,`${t}.businessId`);if(n?.add(r.businessId),typeof r.title!=`string`||r.title.length===0)return U(`invalid_input`,`event.title must be a non-empty string`,`${t}.title`);if(typeof r.startTime!=`number`||!Number.isFinite(r.startTime))return U(`invalid_input`,`event.startTime must be a finite number`,`${t}.startTime`);if(typeof r.endTime!=`number`||!Number.isFinite(r.endTime))return U(`invalid_input`,`event.endTime must be a finite number`,`${t}.endTime`);if(r.startTime<this.config.startTime)return U(`invalid_input`,`event.startTime is before the timeline start`,`${t}.startTime`);if(r.endTime<=r.startTime)return U(`invalid_input`,`event.endTime must be greater than startTime`,`${t}.endTime`);let i=this.config.endTime+this.config.endPaddingTime;if(r.endTime>i)return U(`invalid_input`,`event.endTime exceeds the timeline window`,`${t}.endTime`);if(r.description!==void 0&&typeof r.description!=`string`)return U(`invalid_input`,`event.description must be a string`,`${t}.description`);if(r.color!==void 0&&typeof r.color!=`string`)return U(`invalid_input`,`event.color must be a string`,`${t}.color`);if(r.readonly!==void 0&&typeof r.readonly!=`boolean`)return U(`invalid_input`,`event.readonly must be a boolean`,`${t}.readonly`);let a=this.validateCustomData(r.customData,`${t}.customData`);if(!a.ok)return a;if(r.media!==void 0){let e=this.validateMedia(r.media,`${t}.media`);if(!e.ok)return e}return W({businessId:r.businessId,startTime:r.startTime,endTime:r.endTime,title:r.title,...r.description===void 0?{}:{description:r.description},...r.color===void 0?{}:{color:r.color},...r.readonly===void 0?{}:{readonly:r.readonly},...a.value?{customData:a.value}:{},...r.media===void 0?{}:{media:r.media}})}validateCustomData(e,t){if(e===void 0)return W(void 0);if(typeof e!=`object`||!e||Array.isArray(e))return U(`invalid_input`,`customData must be an object`,t);let n=G(e,t,new WeakSet);return n?U(`invalid_input`,`customData is not JSON-serializable (${n.reason})`,n.path):W(e)}validateMedia(e,t){if(typeof e!=`object`||!e)return U(`invalid_input`,`media must be an object`,t);if(e.images!==void 0){if(!Array.isArray(e.images))return U(`invalid_input`,`media.images must be an array`,`${t}.images`);for(let n=0;n<e.images.length;n++){let r=e.images[n];if(!r||typeof r!=`object`||typeof r.src!=`string`)return U(`invalid_input`,`media.images entries need a src string`,`${t}.images[${n}].src`)}}if(e.waveform!==void 0){let n=e.waveform.data;if(!(n instanceof Float32Array)&&!Array.isArray(n))return U(`invalid_input`,`media.waveform.data must be Float32Array or number[]`,`${t}.waveform.data`);for(let e=0;e<n.length;e++)if(!Number.isFinite(n[e]))return U(`invalid_input`,`media.waveform.data must contain finite numbers`,`${t}.waveform.data[${e}]`)}let n=G(e,t,new WeakSet,!0);return n?U(`invalid_input`,`media is not serializable (${n.reason})`,n.path):W(e)}createRuntimeEvent(e,t){let n=D(e.endTime-e.startTime);return{id:t,startTime:e.startTime,endTime:D(e.startTime+n),duration:n,title:e.title,description:e.description??``,color:e.color??this.defaultColor(t),...e.businessId===void 0?{}:{businessId:e.businessId},...e.readonly?{readonly:e.readonly}:{},...e.customData?{customData:k(e.customData)}:{},...e.media?{media:ae(e.media)}:{}}}defaultColor(e){return this.config.colors.eventColors[e%this.config.colors.eventColors.length]}exportEvent(e,t,n){if(e.businessId===void 0)return U(`missing_business_id`,`event at index ${n} has no business id`,`tracks[${t}].events[${n}]`);let r=this.validateCustomData(e.customData,`tracks[${t}].events[${n}].customData`);if(!r.ok)return r;let i;if(e.media){let r=`tracks[${t}].events[${n}]`,a=G(e.media,`${r}.media`,new WeakSet,!0);if(a)return U(`invalid_input`,`media is not serializable (${a.reason})`,a.path);i=N(e.media)}return W({businessId:e.businessId,startTime:e.startTime,endTime:e.endTime,title:e.title,...e.description?{description:e.description}:{},...e.color===this.defaultColor(n)?{}:{color:e.color},...e.readonly?{readonly:e.readonly}:{},...r.value?{customData:k(r.value)}:{},...i?{media:i}:{}})}};function G(e,t,n,r=!1){if(e===null)return null;let i=typeof e;if(i===`string`||i===`boolean`)return null;if(i===`number`)return Number.isFinite(e)?null:{path:t,reason:`non-finite number`};if(i===`function`||i===`symbol`||i===`bigint`||i===`undefined`)return{path:t,reason:`unsupported value type "${i}"`};let a=e;if(r&&a instanceof Float32Array){if(!Number.isFinite(a.length))return{path:t,reason:`invalid typed array`};for(let e=0;e<a.length;e++)if(!Number.isFinite(a[e]))return{path:`${t}[${e}]`,reason:`non-finite number in typed array`};return null}if(n.has(a))return{path:t,reason:`circular reference`};if(n.add(a),Array.isArray(a)){for(let e=0;e<a.length;e++){let i=G(a[e],`${t}[${e}]`,n,r);if(i)return i}return n.delete(a),null}if(Object.getPrototypeOf(a)!==Object.prototype&&Object.getPrototypeOf(a)!==null)return{path:t,reason:`non plain object`};for(let[e,i]of Object.entries(a)){let a=G(i,`${t}.${e}`,n,r);if(a)return a}return n.delete(a),null}const K=m(`ChangeScheduler`);var Me=class{get batching(){return this.isBatching}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:update`,{layers:[`tracks`,`timeline`],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){K.warn(f(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){K.warn(f(this.config,`warningAlreadyInBatchMode`));return}this.isBatching=!0,this.batchContext={changes:new Set,dirtyLayers:new Set,pendingNotifications:[],pendingDerives:[]}}endBatch(){if(!this.isBatching||!this.batchContext){K.warn(f(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:M(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 Ne(e,t,n){return n||e.colors.eventColors[t%e.colors.eventColors.length]}var Pe=class{constructor(e){this.config=e.config,this.state=e.state,this.eventIndexManager=e.eventIndexManager,this.logger=e.logger,this.onMutate=e.onMutate,this.onStructureInvalidated=e.onStructureInvalidated,this.hasBusinessIdConflict=e.hasBusinessIdConflict}validateEventTime(e,t){let n=this.config.endTime+this.config.endPaddingTime,r,i;if(t>e&&t<=n)r=e,i=D(t-e);else if(t<=this.config.endTime-this.config.startTime&&e+t<=n)r=e,i=t;else return this.logger.error(f(this.config,`errorInvalidTimeRange`,{startTime:e,endTime:t})),null;return r<this.config.startTime?(this.logger.error(f(this.config,`errorStartTimeBeforeMin`,{startTime:r,minAllowed:this.config.startTime})),null):{startSec:r,duration:i}}addEvent(e,t,n,r,i=``,a,o=!1){if(!this.isValidTrackIndex(e))return null;let s=this.validateEventTime(t,n);if(!s)return null;let{startSec:c,duration:l}=s,u=this.state.tracks[e],d=D(l),f={id:u.events.length,startTime:c,endTime:D(c+d),duration:d,title:r,description:i,color:Ne(this.config,u.events.length),...o?{readonly:o}:{},...a?{customData:a}:{}};return u.events.push(f),this.invalidateTrack(e),f}updateEvent(e,t,n){let r=this.getEvent(e,t);if(!r)return null;if(n.businessId!==void 0&&n.businessId!==r.businessId&&(!V(n.businessId)||this.hasBusinessIdConflict?.(n.businessId)))return this.logger.error(`[businessId] duplicate or invalid business id rejected (code=duplicate_business_id)`),null;let i=M(r),a=Object.fromEntries(Object.entries(n).filter(([,e])=>e!==void 0));return Object.assign(r,a),this.invalidateTrack(e),{event:r,oldEvent:i}}updateEventData(e,t,n){let r=this.getEvent(e,t);if(!r)return null;let i=M(r);return n.title!==void 0&&(r.title=n.title),n.startTime!==void 0&&(r.startTime=n.startTime,r.endTime=D(r.startTime+r.duration)),n.duration!==void 0&&(r.duration=D(n.duration),r.endTime=D(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=n.events[t],{captures:i,highlightCaptures:a}=this.captureTrackPointers(e,n.events);return n.events.splice(t,1),this.reassignPointersAfterRemoval(n,i,a,r),this.invalidateTrack(e),M(r)}loadData(e){if(!e||typeof e!=`object`)return this.logger.error(f(this.config,`errorInvalidDataFormat`)),!1;this.state.tracks=[],this.state.selectedTrack=null,this.state.selectedEvent=null,this.state.highlightedEvent=null,this.state.contextMenuEvent=null,this.state.contextMenuVisible=!1,this.state.hoveredResizeHandle=null,this.state.hoveredSplitLine=null,this.state.lastClickEvent=null,this.state.draggingEvent=null,this.state.resizingEvent=null;let t=e.tracks||[];for(let e=0;e<t.length;e++){let n=t[e],r={id:this.state.tracks.length,...V(n.businessId)?{businessId:n.businessId}:{},...n.customData?{customData:n.customData}:{},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:Ne(this.config,r.events.length,t.color),...V(t.businessId)?{businessId:t.businessId}:{},...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.onStructureInvalidated?.(`all`),this.onMutate?.(),!0}getEvent(e,t){if(!this.isValidTrackIndex(e))return this.logger.error(f(this.config,`errorInvalidTrackIndex`)),null;let n=this.state.tracks[e];return this.isValidEventIndex(n,t)?n.events[t]:(this.logger.error(f(this.config,`errorInvalidEventIndex`)),null)}resolveLoadEventTiming(e){let t,n;if(e.endTime!==void 0)t=e.startTime||0,n=D(e.endTime-t);else if(e.duration!==void 0)t=e.startTime||0,n=e.duration;else return null;let r=D(n);return{startTime:t,duration:r,endTime:D(t+r)}}invalidateTrack(e){this.eventIndexManager.invalidateTrack(e),this.onStructureInvalidated?.(e),this.onMutate?.()}captureTrackPointers(e,t){let n=this.state,r=[],i=(n,i)=>{!n||n.trackIndex!==e||r.push({event:t[n.eventIndex],apply:e=>{i(e===null?null:{...n,eventIndex:e})}})};return i(n.selectedEvent,e=>n.selectedEvent=e),i(n.highlightedEvent,e=>n.highlightedEvent=e),i(n.contextMenuEvent,e=>n.contextMenuEvent=e),i(n.lastClickEvent,e=>n.lastClickEvent=e),i(n.hoveredResizeHandle,e=>n.hoveredResizeHandle=e),i(n.hoveredSplitLine,e=>n.hoveredSplitLine=e),i(n.draggingEvent,t=>{n.draggingEvent=t,t&&t.originalTrackIndex===e&&t.originalEventIndex>t.eventIndex&&--t.originalEventIndex}),i(n.resizingEvent,e=>n.resizingEvent=e),{captures:r,highlightCaptures:n.timeIndicatorHighlightedEvents.filter(t=>t.trackIndex===e).map(e=>({item:e,event:t[e.eventIndex]}))}}reassignPointersAfterRemoval(e,t,n,r){for(let n of t){if(!n.event||n.event===r){n.apply(null);continue}let t=e.events.indexOf(n.event);n.apply(t===-1?null:t)}n.length!==0&&(this.state.timeIndicatorHighlightedEvents=this.state.timeIndicatorHighlightedEvents.flatMap(t=>{let i=n.find(e=>e.item===t);if(!i)return[t];if(!i.event||i.event===r)return[];let a=e.events.indexOf(i.event);return a===-1?[]:[{...t,eventIndex:a}]}))}isValidTrackIndex(e){return e>=0&&e<this.state.tracks.length}isValidEventIndex(e,t){return t>=0&&t<e.events.length}};function Fe(e,t,n,r,i){return`${e}-${t}-${n}-${r.toFixed(3)}-${i.toFixed(3)}`}var Ie=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=Fe(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)}},Le=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}}},Re=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 ze=[`background`,`tracks`,`timeline`,`guideLines`,`indicator`,`scrollbar`,`interaction`,`overlay`];var Be=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 n=e;if(t&&this.state.snapEnabled){let e=T(this.state.zoomLevel,this.config.snapInterval,this.config.snapToSeconds,this.config.secondPrecisionZoomThreshold,this.config.scale,this.config.scaleSplitCount);n=E(n,e)}return this.clampPosition(n)}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 c(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([...ze])}};const Ve=[`background`,`tracks`,`timeline`,`guideLines`,`indicator`,`scrollbar`,`interaction`,`overlay`];var He=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([...Ve])}},Ue=class{constructor(e){this.eventListeners=null,this.resizeObserver=null,this.activePointerId=null,this.previousTouchAction=null,this.pixelRatio=window.devicePixelRatio||1,this.resolutionQuery=null,this.handlePointerDown=e=>{e.pointerType===`mouse`||this.activePointerId!==null||!e.isPrimary||(e.preventDefault(),this.activePointerId=e.pointerId,this.canvas.setPointerCapture(e.pointerId),this.eventListeners?.pointerdown(e))},this.handlePointerMove=e=>{e.pointerId===this.activePointerId&&(e.preventDefault(),this.eventListeners?.pointermove(e))},this.handlePointerUp=e=>{e.pointerId===this.activePointerId&&(e.preventDefault(),this.eventListeners?.pointerup(e),this.activePointerId=null,this.canvas.releasePointerCapture(e.pointerId))},this.handlePointerCancel=e=>{e.pointerId===this.activePointerId&&(e.preventDefault(),this.activePointerId=null,this.eventListeners?.pointercancel(e),this.canvas.hasPointerCapture(e.pointerId)&&this.canvas.releasePointerCapture(e.pointerId))},this.handleLostPointerCapture=e=>{e.pointerId===this.activePointerId&&(this.activePointerId=null,this.eventListeners?.lostpointercapture(e))},this.handleWindowResize=()=>{this.syncCanvasSize(!0)},this.handleResolutionChange=()=>{this.syncCanvasSize(!0),this.observePixelRatio()},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(`pointerdown`,this.handlePointerDown),this.canvas.addEventListener(`pointermove`,this.handlePointerMove),this.canvas.addEventListener(`pointerup`,this.handlePointerUp),this.canvas.addEventListener(`pointercancel`,this.handlePointerCancel),this.canvas.addEventListener(`lostpointercapture`,this.handleLostPointerCapture),this.canvas.addEventListener(`contextmenu`,e.contextmenu),this.canvas.addEventListener(`wheel`,e.wheel,{passive:!1}),this.previousTouchAction=this.canvas.style.touchAction,this.canvas.style.touchAction=`none`,this.syncCanvasSize(!1),this.observeContainerResize(),this.observePixelRatio(),window.addEventListener(`resize`,this.handleWindowResize)}setCanvasSize(e,t){this.renderManager.setCanvasSize(e,t),this.pixelRatio=window.devicePixelRatio||1}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(){if(this.resizeObserver?.disconnect(),this.resizeObserver=null,this.resolutionQuery?.removeEventListener(`change`,this.handleResolutionChange),this.resolutionQuery=null,window.removeEventListener(`resize`,this.handleWindowResize),!this.eventListeners)return;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(`pointerdown`,this.handlePointerDown),this.canvas.removeEventListener(`pointermove`,this.handlePointerMove),this.canvas.removeEventListener(`pointerup`,this.handlePointerUp),this.canvas.removeEventListener(`pointercancel`,this.handlePointerCancel),this.canvas.removeEventListener(`lostpointercapture`,this.handleLostPointerCapture);let e=this.activePointerId;this.activePointerId=null,e!==null&&this.canvas.hasPointerCapture(e)&&this.canvas.releasePointerCapture(e),this.canvas.removeEventListener(`contextmenu`,this.eventListeners.contextmenu),this.canvas.removeEventListener(`wheel`,this.eventListeners.wheel),this.previousTouchAction!==null&&(this.canvas.style.touchAction=this.previousTouchAction,this.previousTouchAction=null),this.eventListeners=null}observeContainerResize(){let e=this.canvas.parentElement;!e||typeof ResizeObserver>`u`||(this.resizeObserver=new ResizeObserver(()=>{this.syncCanvasSize(!0)}),this.resizeObserver.observe(e))}observePixelRatio(){this.resolutionQuery?.removeEventListener(`change`,this.handleResolutionChange),this.resolutionQuery=window.matchMedia(`(resolution: ${this.pixelRatio}dppx)`),this.resolutionQuery.addEventListener(`change`,this.handleResolutionChange)}syncCanvasSize(e){let t=this.canvas.parentElement;if(!t){let t=this.renderManager.getCanvasLogicalWidth(),n=this.config.canvasHeight||500;this.setCanvasSizeIfChanged(t,n,e);return}let n=t.getBoundingClientRect();this.setCanvasSizeIfChanged(n.width,n.height||this.config.canvasHeight||500,e)}setCanvasSizeIfChanged(e,t,n){(e!==this.renderManager.getCanvasLogicalWidth()||t!==this.renderManager.getCanvasLogicalHeight()||this.pixelRatio!==(window.devicePixelRatio||1))&&(this.setCanvasSize(e,t),n&&this.adjustCanvasSize())}},q=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}handleCancel(e){return null}handleContextMenu(e){return null}};const We=`gesture interrupted: source event changed under the pointer`,Ge=`pointer cancelled during preview`;function J(e,t,n){return t===`draggingEvent`?e.state.draggingEvent=null:e.state.resizingEvent=null,e.notifyChange(n),new Q(e)}function Y(e,t,n,r){return e.editTransactions.cancelPreview(t,We,`cancelled`,`cancelled`),J(e,n,r)}function X(e,t,n,r=We){if(e.editTransactions.active)for(let t of Array.from(e.state.editDrafts.keys()))e.editTransactions.cancelPreview(t,r,`cancelled`,`cancelled`);return J(e,t,n)}const Z=m(`DraggingState`);var Ke=class extends q{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.getCanvas().style.cursor=`default`,this.timeline.endIndexBatch(),this.timeline.autoRemoveEmptyLastTrack()}handleMouseMove(e){let{logicalX:t,logicalY:n}=e,r=this.timeline.config,i=this.timeline.state,a=this.timeline.getCanvas();if(!i.draggingEvent)return this.createIdleState();if(Math.sqrt((t-i.draggingEvent.startX)**2+(n-i.draggingEvent.startY)**2)>this.MOVE_THRESHOLD&&(i.draggingEvent.isDragging=!0),!i.draggingEvent.isDragging)return a.style.cursor=`move`,null;let{trackIndex:o,eventIndex:s}=i.draggingEvent;if(o<0||o>=i.tracks.length||s<0||s>=i.tracks[o].events.length)return this.timeline.editTransactions.active&&i.draggingEvent.originBusinessId!==void 0?Y(this.timeline,i.draggingEvent.originBusinessId,`draggingEvent`,`events:move`):(Z.warn(this.timeline.t(`warningInvalidDraggingState`),{value:i.draggingEvent}),J(this.timeline,`draggingEvent`,`events:move`));let l=i.tracks[o].events[s];if(this.timeline.editTransactions.active&&i.draggingEvent.originBusinessId!==void 0&&l.businessId!==i.draggingEvent.originBusinessId)return Y(this.timeline,i.draggingEvent.originBusinessId,`draggingEvent`,`events:move`);if(this.timeline.editTransactions.active&&l.businessId!==void 0){let e=this.timeline.editTransactions.getTransaction(l.businessId);if(e&&e.state!==`preview`)return this.timeline.setStatus(`busy: event is locked by an in-flight edit operation`),J(this.timeline,`draggingEvent`,`events:move`);if(!e){let e=this.timeline.editTransactions.tryBegin({event:l,trackIndex:o,eventIndex:s,action:`move`});if(!e.ok)return this.timeline.setStatus(`${e.code}: ${e.reason}`),J(this.timeline,`draggingEvent`,`events:move`)}}this.timeline.setStatus(this.timeline.t(`statusDragging`,{title:l.title}));let u=(t-i.draggingEvent.startX)/(r.secondWidth*i.zoomLevel),d=i.draggingEvent.originalStartTime+u,f=Math.floor((n-r.timelineHeight-r.firstTrackTopMargin)/(r.trackHeight+r.trackMargin));if(this.timeline.editTransactions.active&&l.businessId!==void 0){let e=this.timeline.editTransactions.getTransaction(l.businessId);if(!e||e.state!==`preview`)return this.timeline.setStatus(`busy: event is locked by an in-flight edit operation`),J(this.timeline,`draggingEvent`,`events:move`);f>=i.tracks.length&&(f=i.tracks.length-1),f<0&&(f=0);let r=D(d+l.duration),a=this.timeline.validateScheduleEditCandidate({eventBusinessId:l.businessId,fromTrackIndex:o,fromEventIndex:s,toTrackIndex:f,startTime:d,endTime:r});if(a.allowed){let e=i.tracks[f].businessId;e!==void 0&&this.timeline.editTransactions.updateDraft(l.businessId,{resourceBusinessId:e,startTime:d,endTime:r},f)}else this.timeline.editTransactions.markCandidateInvalid(l.businessId),this.timeline.setStatus(`${a.code}: ${a.reason}`);return i.draggingEvent&&(i.draggingEvent.currentMouseX=t,i.draggingEvent.currentMouseY=n,i.draggingEvent.canMove=a.allowed),this.timeline.notifyChange(`events:move`),null}if(r.autoAddTrack&&f>=i.tracks.length){let e={id:i.tracks.length,events:[]};i.tracks.push(e),this.timeline.setStatus(this.timeline.t(`statusAutoTrackAdded`,{count:i.tracks.length})),this.timeline.callbacks.onTrackAdd&&this.timeline.callbacks.onTrackAdd(e),this.timeline.notifyChange(`tracks:add`)}f=Math.max(0,Math.min(i.tracks.length-1,f)),i.guideLines=this.timeline.calculateGuideLines(o,s,f,d,l.duration);let p=this.timeline.snapToGuideLines(d,l.duration);if(p!==null){if(this.isSnappedToGuideLine&&this.snappedTime!==null){let e=this.timeline.config.guideLineSnapThreshold*1.5;Math.abs(d-this.snappedTime)<e?d=this.snappedTime:(this.isSnappedToGuideLine=!1,this.snappedTime=null,d=p,this.isSnappedToGuideLine=!0,this.snappedTime=p)}else d=p,this.isSnappedToGuideLine=!0,this.snappedTime=p}else if(this.isSnappedToGuideLine=!1,this.snappedTime=null,i.snapEnabled){if(r.enableTimeIndicator&&i.timeIndicatorSnapEnabled){let e=c(i.timeIndicatorPosition,r.startTime,r.startPaddingTime,r.secondWidth,i.zoomLevel,i.scrollX),t=r.startPaddingTime+(d-r.startTime)*r.secondWidth*i.zoomLevel-i.scrollX;if(Math.abs(t-e)<r.timeIndicatorSnapThreshold)d=i.timeIndicatorPosition;else{let e=T(i.zoomLevel,r.snapInterval,r.snapToSeconds,r.secondPrecisionZoomThreshold,r.scale,r.scaleSplitCount);d=E(d,e)}}else{let e=T(i.zoomLevel,r.snapInterval,r.snapToSeconds,r.secondPrecisionZoomThreshold,r.scale,r.scaleSplitCount);d=E(d,e)}}d=Math.max(r.startTime,Math.min(r.endTime-l.duration,d));let m=r.timelineHeight+r.firstTrackTopMargin+f*(r.trackHeight+r.trackMargin)+r.trackHeight/2;i.dragTimeReference={time:d,y:m};let h=this.timeline.canMoveEvent(o,s,f,d,l.duration);if(h&&(l.startTime=d,l.endTime=D(d+l.duration),this.timeline.invalidateIndexTrack(o),f!==o)){let e=i.tracks[o].events.splice(s,1)[0];i.tracks[f].events.push(e),i.draggingEvent.trackIndex=f,i.draggingEvent.eventIndex=i.tracks[f].events.length-1,i.selectedTrack=f,i.selectedEvent&&i.selectedEvent.trackIndex===o&&(i.selectedEvent.eventIndex===s?i.selectedEvent={trackIndex:f,eventIndex:i.tracks[f].events.length-1}:i.selectedEvent.eventIndex>s&&(i.selectedEvent={...i.selectedEvent,eventIndex:i.selectedEvent.eventIndex-1})),this.timeline.invalidateIndexTrack(f),this.timeline.invalidateIndexTrack(o),this.timeline.invalidateBusinessIndexTrack(f),this.timeline.invalidateBusinessIndexTrack(o)}return i.draggingEvent&&(i.draggingEvent.currentMouseX=t,i.draggingEvent.currentMouseY=n,i.draggingEvent.canMove=h),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 Z.warn(this.timeline.t(`warningDraggingEventMissing`),{trackIndex:n,eventIndex:r}),X(this.timeline,`draggingEvent`,`events:move`);let o=t.tracks[n]?.events[r];if(!o)return Z.warn(this.timeline.t(`warningDraggingEventMissing`),{trackIndex:n,eventIndex:r}),X(this.timeline,`draggingEvent`,`events:move`);if(this.timeline.editTransactions.active&&t.draggingEvent.originBusinessId!==void 0&&o.businessId!==t.draggingEvent.originBusinessId)return Y(this.timeline,t.draggingEvent.originBusinessId,`draggingEvent`,`events:move`);let s=t.selectedEvent&&t.selectedEvent.trackIndex===i&&t.selectedEvent.eventIndex===a,c=o.businessId===void 0?void 0:this.timeline.editTransactions.getTransaction(o.businessId);if(o.businessId!==void 0&&c?.state===`preview`)return this.timeline.commitScheduleEdit(o.businessId),J(this.timeline,`draggingEvent`,`events:move`);let l=!1;if(o.businessId!==void 0&&this.timeline.editTransactions.active){if(c){if(t.draggingEvent.isDragging)return this.timeline.setStatus(`busy: event is locked by an in-flight edit operation`),J(this.timeline,`draggingEvent`,`events:move`);l=!0,this.timeline.setStatus(`busy: event is locked by an in-flight edit operation`)}else if(t.draggingEvent.isDragging)return this.timeline.setStatus(`cancelled: edit operation invalidated during gesture`),J(this.timeline,`draggingEvent`,`events:move`)}if(t.draggingEvent.isDragging){if(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){let e=t.tracks[i],a=t.tracks[n];this.timeline.callbacks.onEventMove({trackIndex:n,eventIndex:r,event:M(o),fromTrackIndex:i,...t.draggingEvent?.oldEvent?{oldEvent:t.draggingEvent.oldEvent}:{},...e?.businessId===void 0?{}:{fromResourceBusinessId:e.businessId},...a?.businessId===void 0?{}:{toResourceBusinessId:a.businessId}})}}else t.selectedEvent={trackIndex:n,eventIndex:r},l||this.timeline.setStatus(this.timeline.t(`statusEventSelected`,{title:o.title})),this.timeline.callbacks.onEventClick&&this.timeline.callbacks.onEventClick({trackIndex:n,eventIndex:r,event:M(o),trackName:this.timeline.t(`labelTrackName`,{index:n+1}),formattedTimeRange:`${this.timeline.formatTime(o.startTime)} - ${this.timeline.formatTime(o.endTime)}`});return t.draggingEvent=null,this.timeline.notifyChange(`events:move`),this.createIdleState()}handleCancel(e){return X(this.timeline,`draggingEvent`,`events:move`,Ge)}createIdleState(){return new Q(this.timeline)}},qe=class extends q{constructor(e){super(e),this.name=`Resizing`}onEnter(){this.timeline.beginIndexBatch()}onExit(){let e=this.timeline.state;e.guideLines=[],this.timeline.getCanvas().style.cursor=`default`,this.timeline.endIndexBatch()}handleMouseMove(e){let{logicalX:t}=e,n=this.timeline.config,r=this.timeline.state;if(!r.resizingEvent)return this.createIdleState();let{trackIndex:i,eventIndex:a,edge:o,originalStartTime:s,originalDuration:c}=r.resizingEvent;if(i<0||i>=r.tracks.length||a<0||a>=r.tracks[i].events.length)return this.timeline.editTransactions.active&&r.resizingEvent.originBusinessId!==void 0?Y(this.timeline,r.resizingEvent.originBusinessId,`resizingEvent`,`events:update`):J(this.timeline,`resizingEvent`,`events:update`);let l=r.tracks[i].events[a],u=(t-r.resizingEvent.startX)/(n.secondWidth*r.zoomLevel);if(this.timeline.editTransactions.active&&r.resizingEvent.originBusinessId!==void 0&&l.businessId!==r.resizingEvent.originBusinessId)return Y(this.timeline,r.resizingEvent.originBusinessId,`resizingEvent`,`events:update`);if(this.timeline.editTransactions.active&&l.businessId!==void 0){let e=this.timeline.editTransactions.getTransaction(l.businessId);if(e&&e.state!==`preview`)return this.timeline.setStatus(`busy: event is locked by an in-flight edit operation`),J(this.timeline,`resizingEvent`,`events:update`);if(!e){let e=this.timeline.editTransactions.tryBegin({event:l,trackIndex:i,eventIndex:a,action:`resize`,resizeEdge:o});if(!e.ok)return this.timeline.setStatus(`${e.code}: ${e.reason}`),J(this.timeline,`resizingEvent`,`events:update`)}let t=o===`left`,d=D(s+c),f=t?D(Math.max(n.startTime,s+u)):s,p=t?d:D(s+Math.max(n.minEventDuration,c+u)),m=this.timeline.validateScheduleEditCandidate({eventBusinessId:l.businessId,fromTrackIndex:i,fromEventIndex:a,toTrackIndex:i,startTime:f,endTime:p});if(m.allowed){let e=r.tracks[i].businessId;e!==void 0&&this.timeline.editTransactions.updateDraft(l.businessId,{resourceBusinessId:e,startTime:f,endTime:p},i)}else this.timeline.editTransactions.markCandidateInvalid(l.businessId),this.timeline.setStatus(`${m.code}: ${m.reason}`);return this.timeline.notifyChange(`events:update`),null}if(o===`left`){let e=s+u,t=D(s+c),o=t-e;r.guideLines=this.timeline.calculateGuideLines(i,a,i,e,o>0?o:c);let d=this.timeline.snapEdgeToGuideLines(e);if(d!==null)e=d;else if(r.snapEnabled){let t=T(r.zoomLevel,n.snapInterval,n.snapToSeconds,n.secondPrecisionZoomThreshold,n.scale,n.scaleSplitCount);e=E(e,t)}e=D(Math.max(n.startTime,e)),e=D(Math.min(e,t-n.minEventDuration));let f=D(t-e),p=!0;for(let n=0;n<r.tracks[i].events.length;n++){if(n===a)continue;let o=r.tracks[i].events[n],s=o.startTime,c=s+o.duration;if(e<c&&t>s){p=!1;break}}if(p){if(!this.timeline.canMoveEvent(i,a,i,e,f))return this.timeline.notifyChange(`events:update`),null;l.startTime=e,l.duration=D(f),l.endTime=t,this.timeline.invalidateIndexTrack(i)}}else{let e=c+u,t=s+e;r.guideLines=this.timeline.calculateGuideLines(i,a,i,s,e>0?e:c);let o=this.timeline.snapEdgeToGuideLines(t);if(o!==null)e=D(o-s);else if(r.snapEnabled){let i=T(r.zoomLevel,n.snapInterval,n.snapToSeconds,n.secondPrecisionZoomThreshold,n.scale,n.scaleSplitCount);e=D(E(t,i)-s)}else e=D(e);t=s+e,e=D(Math.max(n.minEventDuration,e)),e=D(Math.min(e,n.endTime-s)),t=s+e;let d=!0;for(let e=0;e<r.tracks[i].events.length;e++){if(e===a)continue;let n=r.tracks[i].events[e],o=n.startTime;if(s<o+n.duration&&t>o){d=!1;break}}if(d){if(!this.timeline.canMoveEvent(i,a,i,s,e))return this.timeline.notifyChange(`events:update`),null;l.duration=D(e),l.endTime=D(s+e),this.timeline.invalidateIndexTrack(i)}}return this.timeline.notifyChange(`events:update`),this.timeline.setStatus(this.timeline.t(`statusEventResizing`,{start:this.timeline.formatTime(l.startTime),end:this.timeline.formatTime(l.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 X(this.timeline,`resizingEvent`,`events:update`);let i=t.tracks[n].events[r];if(this.timeline.editTransactions.active&&t.resizingEvent.originBusinessId!==void 0&&i.businessId!==t.resizingEvent.originBusinessId)return Y(this.timeline,t.resizingEvent.originBusinessId,`resizingEvent`,`events:update`);let a=i.businessId===void 0?void 0:this.timeline.editTransactions.getTransaction(i.businessId);if(i.businessId!==void 0&&a?.state===`preview`)return this.timeline.commitScheduleEdit(i.businessId),J(this.timeline,`resizingEvent`,`events:update`);if(i.businessId!==void 0&&a)return this.timeline.setStatus(`busy: event is locked by an in-flight edit operation`),J(this.timeline,`resizingEvent`,`events:update`);if(i.businessId!==void 0&&this.timeline.editTransactions.active&&!a&&e.logicalX!==t.resizingEvent.startX)return this.timeline.setStatus(`cancelled: edit operation invalidated during gesture`),J(this.timeline,`resizingEvent`,`events:update`);let o=t.resizingEvent?.oldEvent;return t.resizingEvent=null,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:M(i),...o?{oldEvent:o}:{}}),this.timeline.notifyChange(`events:update`),this.createIdleState()}handleCancel(e){return X(this.timeline,`resizingEvent`,`events:update`,Ge)}createIdleState(){return new Q(this.timeline)}},Je=class extends q{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()}handleCancel(e){let t=this.timeline.state;return t.draggingScrollbar=!1,t.draggingHorizontalScrollbar=!1,this.timeline.setStatus(this.timeline.t(`statusReady`)),this.createIdleState()}createIdleState(){return new Q(this.timeline)}},Ye=class extends q{constructor(e){super(e),this.name=`TimeIndicatorDrag`}handleMouseMove(e){let{canvasX:t}=e,n=this.timeline.config,r=this.timeline.state,i=this.timeline.getCanvas();if(!r.draggingTimeIndicator)return this.createIdleState();i.style.cursor=n.readOnly?`not-allowed`:`ew-resize`;let a=(t-r.timeIndicatorDragOffsetX+r.scrollX-n.startPaddingTime)/(n.secondWidth*r.zoomLevel)+n.startTime;if(r.snapEnabled){let e=T(r.zoomLevel,n.snapInterval,n.snapToSeconds,n.secondPrecisionZoomThreshold,n.scale,n.scaleSplitCount);a=E(a,e)}return a=Math.max(n.startTime,Math.min(n.endTime,a)),this.timeline.setTimeIndicatorDuringDrag(a),null}handleMouseUp(e){let t=this.timeline.state;return t.draggingTimeIndicator&&(t.draggingTimeIndicator=!1,this.timeline.setTimeIndicator(t.timeIndicatorPosition,!1)),this.createIdleState()}handleCancel(e){return this.timeline.state.draggingTimeIndicator=!1,this.timeline.getCanvas().style.cursor=`default`,this.createIdleState()}createIdleState(){return new Q(this.timeline)}},Xe=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,n){let r=this.delegate.getTimeline(),{config:i,state:a}=r;if(i.enableEventResize&&e.resizeEdge){let t=a.tracks[e.trackIndex].events[e.eventIndex];return t.readonly||r.editTransactions.active&&t.businessId!==void 0&&r.editTransactions.hasTransaction(t.businessId)?(a.hoveredResizeHandle=null,n.style.cursor=`not-allowed`,r.hideSplitLine(),r.notifyChange(`interaction:hover`),!0):(a.hoveredResizeHandle={trackIndex:e.trackIndex,eventIndex:e.eventIndex,edge:e.resizeEdge},n.style.cursor=`ew-resize`,r.hideSplitLine(),r.notifyChange(`interaction:hover`),!0)}if(a.hoveredResizeHandle=null,!i.enableEventSplit||r.editTransactions.active||e.eventIndex===null||e.trackIndex===null||e.resizeEdge)return r.hideSplitLine(),!1;let o=e.trackIndex,s=e.eventIndex,c=a.tracks[o].events[s];if(c.readonly)return r.hideSplitLine(),n.style.cursor=`not-allowed`,r.notifyChange(`interaction:hover`),!0;let l=(t-i.startPaddingTime)/(i.secondWidth*a.zoomLevel)+i.startTime;if(a.snapEnabled){let e=T(a.zoomLevel,i.snapInterval,i.snapToSeconds,i.secondPrecisionZoomThreshold,i.scale,i.scaleSplitCount);l=E(l,e)}let u=l-c.startTime,d=c.duration-u;return l>c.startTime&&l<c.startTime+c.duration&&u>=i.minEventDuration&&d>=i.minEventDuration?(r.showSplitLine(o,s,l),n.style.cursor=`pointer`,r.notifyChange(`interaction:splitLine`),!0):(r.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=c(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)}},Ze=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||t.editTransactions.active&&e.businessId!==void 0&&t.editTransactions.hasTransaction(e.businessId)?(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,oldEvent:M(e),...e.businessId===void 0?{}:{originBusinessId:e.businessId}},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:M(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=c(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&&!i.editTransactions.active){if(a.readOnly||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:M(c)}),i.callbacks.onEventClick&&i.callbacks.onEventClick({trackIndex:e,eventIndex:t,event:M(c),trackName:i.t(`labelTrackName`,{index:e+1}),formattedTimeRange:O(c.startTime,c.endTime)}),i.notifyChange(`selection:change`),null;let u=a.startPaddingTime+(c.startTime-a.startTime)*a.secondWidth*o.zoomLevel-o.scrollX,d=a.timelineHeight+a.firstTrackTopMargin+e*(a.trackHeight+a.trackMargin);return o.draggingEvent={trackIndex:e,eventIndex:t,eventX:u,eventY:d,originalTrackIndex:e,originalEventIndex:t,originalStartTime:c.startTime,startX:n,startY:r,isDragging:!1,oldEvent:M(c),...c.businessId===void 0?{}:{originBusinessId:c.businessId}},o.dragOffsetX=n-u,o.dragOffsetY=r-d,i.callbacks.onEventHighlight&&i.callbacks.onEventHighlight({trackIndex:e,eventIndex:t,event:M(c)}),i.notifyChange(`selection:change`),this.delegate.createDraggingState()}},Q=class extends q{constructor(e){super(e),this.name=`Idle`,this.hoverController=new Xe(this),this.mouseDownRouter=new Ze(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 Ke(this.timeline)}createResizingState(){return new qe(this.timeline)}createScrollingState(){return new Je(this.timeline)}createTimeIndicatorDragState(){return new Ye(this.timeline)}};const $=m(`StateMachine`);var Qe=class{constructor(e){this.timeline=e,this.rafId=null,this.pendingMouseMove=null,this.lastInputEvent=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(_.stateExit,`◁ Exit: ${t.name}`),t.onExit(e)),this.currentState=e,e.onEnter&&($.debugStyled(_.stateEnter,`▷ Enter: ${e.name}`),e.onEnter(t)),$.debugStyled(_.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){this.lastInputEvent=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){this.lastInputEvent=e;let t=this.createContext(e),n=this.currentState.handleMouseMove(t);this.transitionTo(n)}handleMouseUp(e){let t=this.takePendingMouseMove();t&&this.handleMouseMoveImpl(t);let n=e??t??this.lastInputEvent;if(!n)return;this.lastInputEvent=n;let r=this.createContext(n),i=this.currentState.handleMouseUp(r);this.transitionTo(i)}handleCancel(e){this.takePendingMouseMove();let t=e??this.lastInputEvent;if(!t)return;this.lastInputEvent=t;let n=this.createContext(t),r=this.currentState.handleCancel(n);this.transitionTo(r)}handleContextMenu(e){this.lastInputEvent=e;let t=this.createContext(e),n=this.currentState.handleContextMenu(t);this.transitionTo(n)}destroy(){this.handleCancel(),this.lastInputEvent=null}takePendingMouseMove(){this.rafId!==null&&(cancelAnimationFrame(this.rafId),this.rafId=null);let e=this.pendingMouseMove;return this.pendingMouseMove=null,e}},$e=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`)}},et=class{constructor(e){this.canvasController=e.canvasController,this.mouseHandler=e.mouseHandler??new Qe(e.timeline),this.wheelHandler=e.wheelHandler??new $e(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:e=>this.mouseHandler.handleMouseUp(e),pointerdown:e=>this.mouseHandler.handleMouseDown(e),pointermove:e=>this.mouseHandler.handleMouseMove(e),pointerup:e=>this.mouseHandler.handleMouseUp(e),pointercancel:e=>this.mouseHandler.handleCancel(e),lostpointercapture:e=>this.mouseHandler.handleCancel(e),contextmenu:e=>this.mouseHandler.handleContextMenu(e),wheel:e=>this.wheelHandler.handleWheel(e)}}},tt=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`}},nt=class r{constructor(r,c={}){this.onScheduleCommitStateChange=null,this.destroyed=!1,this.datasetEpoch=0,this.viewportBatching=!1;let d=a(c.locale),f=t(d,c.messages);this.logger=new h({enabled:!0,level:c.debug?`debug`:`info`,prefix:`Timeline`,useGlobalConfig:!1}),g({enabled:!0,level:c.debug?`debug`:`info`}),this.errorHandler=new B(this.logger);let p=document.getElementById(r);(!p||!(p instanceof HTMLCanvasElement))&&this.errorHandler.throw(n(f,`errorCanvasNotFound`,{canvasId:r})),this.canvas=p;let m=this.canvas.getContext(`2d`);m||this.errorHandler.throw(n(f,`errorCanvasContextUnavailable`)),this.ctx=m,c.startPaddingTime===void 0&&(c.startPaddingTime=10),this.config={...l,...c,locale:d,messages:f,colors:{...o,...c.colors},eventTextStyle:{...s,...c.eventTextStyle},eventBlockStyle:{...e,...c.eventBlockStyle},eventDurationPrefix:c.eventDurationPrefix??f.labelDurationPrefix,contextMenuItems:c.contextMenuItems||u(f),contextMenuStyle:{...i,...c.contextMenuStyle}},this.logger.setLevel(this.config.debug?`debug`:`info`),this.callbacks={onEventAdd:c.onEventAdd||null,onEventUpdate:c.onEventUpdate||null,onEventDelete:c.onEventDelete||null,onEventMove:c.onEventMove||null,onEventClick:c.onEventClick||null,onEventEdit:c.onEventEdit||null,onContextMenu:c.onContextMenu||null,onTrackAdd:c.onTrackAdd||null,onTrackRemove:c.onTrackRemove||null,onTimeIndicatorMove:c.onTimeIndicatorMove||null,onZoom:c.onZoom||null,onStatusChange:c.onStatusChange||null,onEventHighlight:c.onEventHighlight||null,onTimeIndicatorHighlight:c.onTimeIndicatorHighlight||null},ke.validateOptions(c.scheduleEditing),this.onScheduleCommitStateChange=c.onScheduleCommitStateChange??null,this.stateManager=new Ee(this.config),this.state=this.stateManager.state,this.trackManager=new Re(this.state),this.eventIndexManager=new De(this.state),this.businessIdentityIndex=new Oe(this.state),this.editTransactions=new ke(this.state,this.businessIdentityIndex,e=>this.onScheduleCommitStateChange?.(e)),c.scheduleEditing&&this.editTransactions.configure(c.scheduleEditing),this.commitCoordinator=new Ae({notify:e=>this.onScheduleCommitStateChange?.(e),isAlive:()=>!this.destroyed,getDatasetEpoch:()=>this.datasetEpoch,notifySettled:()=>this.notifyChange(`events:update`),publishAccepted:(e,t,n)=>this.publishAcceptedPlacement(e,t,n),fireLegacySuccess:(e,t,n,r)=>this.fireLegacySuccessCallback(e,t,n,r),getTimeoutMs:()=>c.scheduleEditing?.commitTimeoutMs??3e4}),this.commitCoordinator.attachController(this.editTransactions),this.editTransactions.commitSink=(e,t)=>this.commitCoordinator.handleResult(t,e),this.eventMutationService=new Pe({config:this.config,state:this.state,eventIndexManager:this.eventIndexManager,logger:this.logger,onMutate:()=>this.clearGuideLineCache(),onStructureInvalidated:e=>{e===`all`?this.businessIdentityIndex.markAllDirty():this.businessIdentityIndex.markTrackDirty(e)},hasBusinessIdConflict:e=>this.businessIdentityIndex.hasEvent(e)}),this.scheduleDataService=new je({config:this.config,state:this.state,businessIdentityIndex:this.businessIdentityIndex,eventIndexManager:this.eventIndexManager,onMutate:()=>this.clearGuideLineCache()}),this.guideLineService=new Ie(this.config,this.state),this.hitTestService=new Le(this.config,this.state,this.eventIndexManager),this.pluginManager=new Te({timeline:this,config:this.config,state:this.state}),this.renderManager=new we(this.canvas,this.ctx,this.config,this.state,this.pluginManager),this.pluginController=new tt({pluginManager:this.pluginManager,builtinThemes:{light:b,dark:x},onThemeChanged:()=>this.notifyChange(`theme:change`),onPluginVisualChange:()=>this.redrawAfterPluginChange()}),this.canvasController=new Ue({canvas:this.canvas,config:this.config,state:this.state,renderManager:this.renderManager,onCanvasResize:()=>this.notifyChange(`canvas:resize`)}),this.interactionManager=new et({timeline:this,canvasController:this.canvasController}),c.theme&&this.pluginController.loadInitialTheme(c.theme),this.timeIndicatorController=new Be({config:this.config,state:this.state,renderManager:this.renderManager}),this.viewportController=new He({config:this.config,state:this.state,renderManager:this.renderManager}),this.changeScheduler=new Me(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.destroyed||(this.changeScheduler.notify(e),this.handleViewportRelevantChange(e))}static{this.VIEWPORT_RELEVANT_CHANGES=new Set([`scroll:x`,`scroll:y`,`zoom:change`,`canvas:resize`,`tracks:add`,`tracks:update`,`tracks:remove`,`data:load`,`config:endTime`])}handleViewportRelevantChange(e){let t=this.renderManager.getViewportManager();r.VIEWPORT_RELEVANT_CHANGES.has(e)&&(t.markViewportChange(),this.viewportBatching||t.flushViewportNotifications({width:this.renderManager.getCanvasLogicalWidth(),height:this.renderManager.getCanvasLogicalHeight(),dpr:this.renderManager.getDevicePixelRatio()}))}getViewport(){return this.renderManager.getViewportManager().buildSnapshot(this.renderManager.getCanvasLogicalWidth(),this.renderManager.getCanvasLogicalHeight(),this.renderManager.getDevicePixelRatio())}subscribeViewport(e){return this.renderManager.getViewportManager().subscribeViewport(e,()=>({width:this.renderManager.getCanvasLogicalWidth(),height:this.renderManager.getCanvasLogicalHeight(),dpr:this.renderManager.getDevicePixelRatio()}))}getTrackRectByBusinessId(e){let t=this.businessIdentityIndex.getTrackIndex(e);if(t===null)return null;let n=this.state.tracks[t];return n?this.renderManager.getViewportManager().getTrackRect(n.businessId??e,t,this.renderManager.getCanvasLogicalWidth(),this.renderManager.getCanvasLogicalHeight()):null}timeToX(e){return typeof e!=`number`||!Number.isFinite(e)?null:c(e,this.config.startTime,this.config.startPaddingTime,this.config.secondWidth,this.state.zoomLevel,this.state.scrollX)}xToTime(e){if(typeof e!=`number`||!Number.isFinite(e))return null;let t=this.config.secondWidth*this.state.zoomLevel;return t<=0?null:(e+this.state.scrollX-this.config.startPaddingTime)/t+this.config.startTime}beginChangeBatch(){this.viewportBatching=!0,this.changeScheduler.beginBatch()}endChangeBatch(){this.changeScheduler.endBatch(),this.viewportBatching=!1,this.renderManager.getViewportManager().flushViewportNotifications({width:this.renderManager.getCanvasLogicalWidth(),height:this.renderManager.getCanvasLogicalHeight(),dpr:this.renderManager.getDevicePixelRatio()})}setDebug(e){this.config.debug!==e&&(this.config.debug=e,this.logger.setLevel(e?`debug`:`info`),g({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}))}}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.businessIdentityIndex.markTrackDirty(this.state.tracks.length-1),this.setStatus(this.t(`statusTrackAdded`,{count:this.state.tracks.length})),this.callbacks.onTrackAdd&&this.callbacks.onTrackAdd(e)}removeTrack(){let e=this.state.tracks[this.state.tracks.length-1];if(e?.businessId!==void 0&&this.editTransactions.getReservations().some(t=>t.resourceBusinessId===e.businessId)){this.setStatus(`resource is reserved by an in-flight edit operation`);return}let t=this.state.tracks.length-1,n=this.trackManager.removeTrack();if(!n){this.setStatus(this.t(`statusAtLeastOneTrackRequired`));return}this.clearGuideLineCache(),this.adjustCanvasSize(),this.businessIdentityIndex.markTrackDirty(t),this.setStatus(this.t(`statusTrackRemoved`,{count:this.state.tracks.length})),this.callbacks.onTrackRemove&&this.callbacks.onTrackRemove(n)}autoRemoveEmptyLastTrack(){if(!this.config.autoRemoveEmptyLastTrack)return;let e=this.state.tracks[this.state.tracks.length-1];if(e?.businessId!==void 0&&this.editTransactions.getReservations().some(t=>t.resourceBusinessId===e.businessId))return;let t=this.trackManager.removeEmptyLastTrack();for(;t;)this.clearGuideLineCache(),this.businessIdentityIndex.markTrackDirty(this.state.tracks.length),this.setStatus(this.t(`statusEmptyTrackRemoved`,{count:this.state.tracks.length})),this.callbacks.onTrackRemove&&this.callbacks.onTrackRemove(t),this.adjustCanvasSize(),t=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:M(s)}))}updateEvent(e,t,n){let r=this.state.tracks[e]?.events[t];if(r?.businessId!==void 0&&this.editTransactions.hasTransaction(r.businessId))return!1;let i=this.eventMutationService.updateEvent(e,t,n);return i?(this.notifyChange(`events:update`),this.setStatus(this.t(`statusEventUpdated`,{title:i.event.title})),this.callbacks.onEventUpdate&&this.callbacks.onEventUpdate({trackIndex:e,eventIndex:t,event:M(i.event),oldEvent:i.oldEvent}),!0):!1}updateEventData(e,t,n){let r=this.state.tracks[e]?.events[t];if(r?.businessId!==void 0&&this.editTransactions.hasTransaction(r.businessId))return!1;let i=this.eventMutationService.updateEventData(e,t,n);return i?(this.notifyChange(`events:update`),this.setStatus(this.t(`statusEventUpdated`,{title:i.event.title})),this.callbacks.onEventUpdate&&this.callbacks.onEventUpdate({trackIndex:e,eventIndex:t,event:M(i.event),oldEvent:i.oldEvent}),!0):!1}deleteEvent(e,t){let n=this.state.tracks[e]?.events[t];if(n?.businessId!==void 0&&this.editTransactions.hasTransaction(n.businessId))return!1;let r=this.eventMutationService.deleteEvent(e,t);return r?(this.autoRemoveEmptyLastTrack(),this.notifyChange(`events:delete`),this.setStatus(this.t(`statusEventDeleted`,{title:r.title})),this.callbacks.onEventDelete&&this.callbacks.onEventDelete({trackIndex:e,eventIndex:t,event:r}),!0):!1}loadData(e){return this.eventMutationService.loadData(e)?(this.datasetEpoch+=1,this.commitCoordinator.invalidateOperations(this.editTransactions.handleDatasetReplaced()),this.state.tracks.length===0&&this.addTrack(),e.timeIndicatorPosition!==void 0&&this.setTimeIndicator(e.timeIndicatorPosition),this.adjustCanvasSize(),this.notifyChange(`data:load`),this.setStatus(this.t(`statusDataLoaded`,{count:this.state.tracks.length})),!0):!1}lockedEditError(e){let t=this.editTransactions.getTransaction(e);return t?t.state===`reconciliation_required`?{ok:!1,error:{code:`reconciliation_required`,message:`event awaits authoritative reconciliation; edits are locked`}}:{ok:!1,error:{code:`busy`,message:`event is locked by an in-flight edit operation`}}:null}getScheduleEditState(e){return this.destroyed?null:this.editTransactions.hasActiveTransaction(e)?this.editTransactions.getEditState(e):this.businessIdentityIndex.hasEvent(e)?{state:`idle`}:null}reconcileScheduleEvent(e,t,n){if(this.destroyed)return{ok:!1,error:{code:`destroyed`,message:`timeline instance is destroyed`}};if(!this.businessIdentityIndex.hasEvent(e))return{ok:!1,error:{code:`not_found`,message:`no event with the given business id`}};let r=this.editTransactions.getTransaction(e);if(!r||r.operationId!==n?.operationId)return{ok:!1,error:{code:`stale_operation`,message:`operation no longer matches the current transaction`}};if(t===null){let t=r.before,i=r.action;this.commitCoordinator.invalidateOperations([r.operationId]),this.editTransactions.invalidateTransaction(e,`authoritative deletion`);let a=this.deleteEventByBusinessId(e);return a.ok?(this.notifyChange(`events:delete`),this.onScheduleCommitStateChange?.({state:`reconciled`,operationId:n.operationId,eventBusinessId:e,action:i,before:t,after:null}),{ok:!0,value:void 0}):a}if(typeof t!=`object`)return{ok:!1,error:{code:`invalid_input`,message:`snapshot must be an object or null`,path:`snapshot`}};if(!t.event||typeof t.event!=`object`)return{ok:!1,error:{code:`invalid_input`,message:`snapshot.event must be an object`,path:`snapshot.event`}};if(t.event.businessId!==e)return{ok:!1,error:{code:`invalid_input`,message:`snapshot.event.businessId must match the reconciled id`,path:`snapshot.event.businessId`}};if(this.businessIdentityIndex.getTrackIndex(t.resourceBusinessId)===null)return{ok:!1,error:{code:`not_found`,message:`snapshot resource does not exist`,path:`snapshot.resourceBusinessId`}};let i=this.scheduleDataService.validateSingleEventInput(t.event,`snapshot.event`);if(!i.ok)return{ok:!1,error:i.error};this.commitCoordinator.invalidateOperations([r.operationId]),this.editTransactions.invalidateTransaction(e,`authoritative snapshot applied`);let a=this.upsertScheduleEvents([{resourceBusinessId:t.resourceBusinessId,event:t.event}]);if(!a.ok)return{ok:!1,error:a.error};let o=this.getEventByBusinessId(e);return this.notifyChange(`events:update`),this.onScheduleCommitStateChange?.({state:`reconciled`,operationId:n.operationId,eventBusinessId:e,action:r.action,before:r.before,...o?{after:{resourceBusinessId:t.resourceBusinessId,event:o.event}}:{}}),{ok:!0,value:void 0}}validateScheduleEditCandidate(e,t){let{eventBusinessId:n,fromTrackIndex:r,fromEventIndex:i,toTrackIndex:a,startTime:o,endTime:s}=e;if(this.destroyed)return{allowed:!1,code:`invalid_time`,reason:`timeline instance is destroyed`};let c=this.state.tracks[r]?.events[i];if(!c)return{allowed:!1,code:`invalid_time`,reason:`source event no longer exists`};if(!t?.forPublish&&(c.readonly||this.config.readOnly))return{allowed:!1,code:`readonly`,reason:`event or timeline is read-only`};if(c.businessId===void 0||c.businessId!==n)return{allowed:!1,code:`missing_business_id`,reason:`event business id mismatch`};let l=this.state.tracks[a];if(!l||l.businessId===void 0)return{allowed:!1,code:`invalid_resource`,reason:`target resource does not exist or has no business id`};if(typeof o!=`number`||typeof s!=`number`||!Number.isFinite(o)||!Number.isFinite(s)||s-o<this.config.minEventDuration||o<this.config.startTime||s>this.config.endTime+this.config.endPaddingTime)return{allowed:!1,code:`invalid_time`,reason:`placement violates time constraints`};for(let e=0;e<l.events.length;e++){if(a===r&&e===i)continue;let t=l.events[e];if(o<t.endTime&&s>t.startTime)return{allowed:!1,code:`overlap`,reason:`placement overlaps a confirmed event`}}let u=l.businessId;for(let e of this.editTransactions.getReservations(n))if(e.resourceBusinessId===u&&o<e.endTime&&s>e.startTime)return{allowed:!1,code:`reservation_conflict`,reason:`placement conflicts with an in-flight edit reservation`};return t?.forPublish||this.pluginManager.validateEvent(`validate:event:move`,{fromTrackIndex:r,fromEventIndex:i,toTrackIndex:a,newStartTime:o,duration:s-o})?{allowed:!0}:{allowed:!1,code:`plugin_rejected`,reason:`rejected by event-move plugin validation`}}commitScheduleEdit(e){if(this.destroyed)return!1;let t=this.editTransactions.getTransaction(e);if(!t||t.state!==`preview`)return!1;if(!t.lastCandidateValid)return this.editTransactions.cancelPreview(e,`drop position is invalid`,`invalid_time`,`validation_failed`),!1;let n=this.state.editDrafts.get(e);if(!n)return!1;let r=this.validateScheduleEditCandidate({eventBusinessId:e,fromTrackIndex:t.beforeTrackIndex,fromEventIndex:t.beforeEventIndex,toTrackIndex:n.targetTrackIndex,startTime:n.startTime,endTime:n.endTime});if(!r.allowed)return this.editTransactions.cancelPreview(e,r.reason,r.code,`validation_failed`),this.setStatus(`${r.code}: ${r.reason}`),!1;let i=this.editTransactions.buildChange(e);if(!i)return!1;let a=this.editTransactions.runBusinessValidate(i);if(!a.allowed)return this.editTransactions.cancelPreview(e,a.reason,a.code,`validation_failed`),this.setStatus(`${a.code}: ${a.reason}`),!1;let o=this.editTransactions.beginCommit(e,i);return o&&this.editTransactions.getTransaction(e)?.state===`pending`&&this.commitCoordinator.beginTiming(i),o}publishAcceptedPlacement(e,t,n){let r=this.businessIdentityIndex.getEventLocation(e);if(!r)return{ok:!1,code:`not_found`,reason:`event no longer exists`};let i=this.businessIdentityIndex.getTrackIndex(n.resourceBusinessId);if(i===null)return{ok:!1,code:`invalid_resource`,reason:`corrected resource does not exist`};let a=this.validateScheduleEditCandidate({eventBusinessId:e,fromTrackIndex:r.trackIndex,fromEventIndex:r.eventIndex,toTrackIndex:i,startTime:n.startTime,endTime:n.endTime},{forPublish:!0});if(!a.allowed)return{ok:!1,code:`reconciliation_required`,reason:`${a.code}: ${a.reason}`};let o=this.state.tracks[r.trackIndex].events[r.eventIndex],s=t.before;return o.businessId!==e||o.startTime!==s.event.startTime||o.endTime!==s.event.endTime||this.state.tracks[r.trackIndex].businessId!==s.resourceBusinessId?{ok:!1,code:`reconciliation_required`,reason:`located event no longer matches the edit snapshot; accepted placement withheld`}:(o.startTime=n.startTime,o.endTime=n.endTime,o.duration=D(n.endTime-n.startTime),i===r.trackIndex?(this.eventIndexManager.invalidateTrack(r.trackIndex),this.businessIdentityIndex.markTrackDirty(r.trackIndex),{ok:!0,event:M(o),fromTrackIndex:r.trackIndex,fromEventIndex:r.eventIndex,toTrackIndex:r.trackIndex,toEventIndex:r.eventIndex}):(this.state.tracks[r.trackIndex].events.splice(r.eventIndex,1),this.state.tracks[i].events.push(o),this.eventIndexManager.invalidateTrack(r.trackIndex),this.eventIndexManager.invalidateTrack(i),this.businessIdentityIndex.markTrackDirty(r.trackIndex),this.businessIdentityIndex.markTrackDirty(i),this.state.selectedEvent&&this.state.selectedEvent.trackIndex===r.trackIndex&&this.state.selectedEvent.eventIndex===r.eventIndex&&(this.state.selectedEvent={trackIndex:i,eventIndex:this.state.tracks[i].events.length-1}),{ok:!0,event:M(o),fromTrackIndex:r.trackIndex,fromEventIndex:r.eventIndex,toTrackIndex:i,toEventIndex:this.state.tracks[i].events.length-1}))}fireLegacySuccessCallback(e,t,n,r){if(e.action===`move`){this.callbacks.onEventMove&&this.callbacks.onEventMove({trackIndex:r.toTrackIndex,eventIndex:r.toEventIndex,event:n,fromTrackIndex:r.fromTrackIndex,oldEvent:e.before.event,fromResourceBusinessId:e.before.resourceBusinessId,toResourceBusinessId:t.resourceBusinessId});return}this.callbacks.onEventUpdate&&this.callbacks.onEventUpdate({type:`resize`,trackIndex:r.toTrackIndex,eventIndex:r.toEventIndex,event:n,oldEvent:e.before.event})}loadScheduleData(e){if(this.destroyed)return{ok:!1,error:{code:`destroyed`,message:`timeline instance is destroyed`}};let t=this.scheduleDataService.loadScheduleData(e);return t.ok?(this.datasetEpoch+=1,this.commitCoordinator.invalidateOperations(this.editTransactions.handleDatasetReplaced()),e.timeIndicatorPosition!==void 0&&this.setTimeIndicator(e.timeIndicatorPosition),this.adjustCanvasSize(),this.notifyChange(`data:load`),this.setStatus(this.t(`statusDataLoaded`,{count:this.state.tracks.length})),t):(this.logger.error(`[schedule] loadScheduleData rejected (code=${t.error.code}${t.error.path?`, path=${t.error.path}`:``})`),this.setStatus(this.t(`errorInvalidDataFormat`)),t)}exportScheduleData(){let e=this.scheduleDataService.exportScheduleData();return e.ok||this.logger.error(`[schedule] exportScheduleData rejected (code=${e.error.code}${e.error.path?`, path=${e.error.path}`:``})`),e}getEventByBusinessId(e){return this.scheduleDataService.getEventLocation(e)}getTrackByBusinessId(e){return this.scheduleDataService.getTrack(e)}updateEventByBusinessId(e,t){if(this.destroyed)return{ok:!1,error:{code:`destroyed`,message:`timeline instance is destroyed`}};let n=this.lockedEditError(e);if(n)return n;let r=this.scheduleDataService.patchEvent(e,t);if(!r.ok)return this.logger.error(`[schedule] updateEventByBusinessId rejected (code=${r.error.code}${r.error.path?`, path=${r.error.path}`:``})`),r;let{trackIndex:i,eventIndex:a,event:o,oldEvent:s}=r.value;return this.notifyChange(`events:update`),this.setStatus(this.t(`statusEventUpdated`,{title:o.title})),this.callbacks.onEventUpdate&&this.callbacks.onEventUpdate({trackIndex:i,eventIndex:a,event:M(o),oldEvent:s}),{ok:!0,value:void 0}}upsertScheduleEvents(e){if(!this.destroyed){for(let t of Array.isArray(e)?e:[])if(t&&typeof t==`object`&&t.event&&t.event.businessId!==void 0&&this.editTransactions.hasTransaction(t.event.businessId)){let e=this.lockedEditError(t.event.businessId);if(e)return e}}if(this.destroyed)return{ok:!1,error:{code:`destroyed`,message:`timeline instance is destroyed`}};let t=!this.changeScheduler.batching;t&&this.beginChangeBatch();try{let t=this.scheduleDataService.upsertScheduleEvents(e);if(!t.ok)return this.logger.error(`[schedule] upsertScheduleEvents rejected (code=${t.error.code}${t.error.path?`, path=${t.error.path}`:``})`),t;for(let e of t.value){if(e.event.businessId===void 0)continue;let t=this.businessIdentityIndex.getEventLocation(e.event.businessId);t&&(e.trackIndex=t.trackIndex,e.eventIndex=t.eventIndex)}let n=``;for(let e of t.value)n=e.event.title,e.kind===`insert`?(this.notifyChange(`events:add`),this.callbacks.onEventAdd&&this.callbacks.onEventAdd({trackIndex:e.trackIndex,event:M(e.event)})):(this.notifyChange(`events:update`),this.callbacks.onEventUpdate&&this.callbacks.onEventUpdate({trackIndex:e.trackIndex,eventIndex:e.eventIndex,event:M(e.event),oldEvent:e.oldEvent}));return n&&this.setStatus(this.t(`statusEventUpdated`,{title:n})),{ok:!0,value:void 0}}finally{t&&this.endChangeBatch()}}deleteEventByBusinessId(e){if(this.destroyed)return{ok:!1,error:{code:`destroyed`,message:`timeline instance is destroyed`}};let t=this.lockedEditError(e);if(t)return t;let n=this.businessIdentityIndex.getEventLocation(e);return n?(this.deleteEvent(n.trackIndex,n.eventIndex),{ok:!0,value:void 0}):(this.logger.error(`[schedule] deleteEventByBusinessId rejected (code=not_found)`),{ok:!1,error:{code:`not_found`,message:`no event with the given business id`}})}highlightEventByBusinessId(e){if(this.destroyed)return{ok:!1,error:{code:`destroyed`,message:`timeline instance is destroyed`}};let t=this.businessIdentityIndex.getEventLocation(e);return t?this.highlightEvent(t.trackIndex,t.eventIndex)?{ok:!0,value:void 0}:{ok:!1,error:{code:`not_found`,message:`no event with the given business id`}}:(this.logger.error(`[schedule] highlightEventByBusinessId rejected (code=not_found)`),{ok:!1,error:{code:`not_found`,message:`no event with the given business id`}})}updateTrackByBusinessId(e,t){if(this.destroyed)return{ok:!1,error:{code:`destroyed`,message:`timeline instance is destroyed`}};let n=this.scheduleDataService.updateTrackCustomData(e,t);return n.ok?(this.notifyChange(`tracks:update`),{ok:!0,value:void 0}):(this.logger.error(`[schedule] updateTrackByBusinessId rejected (code=${n.error.code}${n.error.path?`, path=${n.error.path}`:``})`),n)}invalidateBusinessIndexTrack(e){this.businessIdentityIndex.markTrackDirty(e)}setTimeIndicator(e,t=!1){if(typeof e!=`number`||isNaN(e))return this.logger.error(this.t(`errorTimeIndicatorInvalid`)),!1;let n=this.timeIndicatorController.setPosition(e,t);if(!n.changed)return!0;this.notifyChange(`timeIndicator:move`);let r=w(n.position);return this.setStatus(this.t(`statusTimeIndicatorMoved`,{time:r})),this.callbacks.onTimeIndicatorMove&&this.callbacks.onTimeIndicatorMove({position:n.position,time:r}),!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(e){if(typeof e!=`number`||isNaN(e))return this.logger.error(this.t(`errorEndTimeInvalid`)),!1;if(e<=this.config.startTime)return this.logger.error(this.t(`errorEndTimeNotAfterStart`)),!1;let t=this.viewportController.setEndTime(e);return t.hasOverflowEvents&&this.logger.warn(this.t(`warningEventsExceedEndTime`)),this.clearGuideLineCache(),this.notifyChange(`config:endTime`),this.setStatus(this.t(`statusEndTimeUpdated`,{from:w(t.oldEndTime),to:w(t.endTime)})),!0}getEndTime(){return this.config.endTime}formatTime(e){return w(e)}t(e,t={}){return n(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]?.events[t];if(r?.businessId!==void 0&&this.editTransactions.hasTransaction(r.businessId))return!1;let i=this.state.tracks[e];if(t<0||t>=i.events.length)return!1;let a=i.events[t];if(n<=a.startTime+this.config.minEventDuration||n>=a.endTime-this.config.minEventDuration)return this.setStatus(this.t(`statusInvalidSplitPosition`)),!1;let o={...a,id:a.id,duration:D(n-a.startTime),endTime:n,title:`${a.title} (1)`},s={...a,id:i.events.length,businessId:void 0,startTime:n,duration:D(a.endTime-n),endTime:D(a.endTime),title:`${a.title} (2)`};return i.events[t]=o,i.events.push(s),this.clearGuideLineCache(),this.eventIndexManager.invalidateTrack(e),this.businessIdentityIndex.markTrackDirty(e),this.notifyChange(`events:split`),this.setStatus(this.t(`statusEventSplit`,{title:a.title})),this.callbacks.onEventUpdate&&this.callbacks.onEventUpdate({type:`split`,trackIndex:e,eventIndex:t,event:M(a),firstEvent:M(o),secondEvent:M(s)}),!0}draw(){this.destroyed||this.renderManager.draw()}setReadOnly(e){this.config.readOnly=e,e&&(this.editTransactions.active&&this.editTransactions.cancelAll(`read-only mode enabled during preview`),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(){return this.editTransactions.destroyAll(),this.commitCoordinator.destroy(),this.destroyPromise?this.destroyPromise:(this.destroyed=!0,this.clearGuideLineCache(),this.renderManager.getViewportManager().unsubscribeAll(),this.interactionManager.destroy(),this.renderManager.dispose(),this.destroyPromise=this.pluginManager.destroy(),this.setStatus(this.t(`statusTimelineDestroyed`)),this.destroyPromise)}clearGuideLineCache(){this.guideLineService.clearCache()}redrawAfterPluginChange(){this.markDirty([`background`,`tracks`,`timeline`,`guideLines`,`indicator`,`scrollbar`,`interaction`,`overlay`]),this.draw()}};function rt(e,t){if(!e.descriptionI18n)return e.description;let n=a(t);return e.descriptionI18n[n]||e.descriptionI18n.zh||e.description}export{S as ContextMenuPlugin,x as DarkThemePlugin,d as EventMediaPlugin,C as EventTooltipPlugin,b as LightThemePlugin,p as PerformanceOverlayPlugin,y as PluginPriority,v as PluginType,nt as Timeline,u as createDefaultContextMenuItems,t as createTimelineMessages,te as formatDuration,w as formatTime,O as formatTimeRange,ee as getCurrentTime,rt as getPluginMetadataDescription,a as normalizeTimelineLocale,f as translateTimelineConfig,n as translateTimelineMessage};