@kteneyck/cesium-timeline-react 0.2.0 → 0.3.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.
@@ -1,4 +1,4 @@
1
- (function(et,o){typeof exports=="object"&&typeof module<"u"?o(exports,require("react"),require("cesium"),require("@kteneyck/cesium-timeline-core")):typeof define=="function"&&define.amd?define(["exports","react","cesium","@kteneyck/cesium-timeline-core"],o):(et=typeof globalThis<"u"?globalThis:et||self,o(et.CesiumTimelineReact={},et.React,et.Cesium,et.CesiumTimelineCore))})(this,(function(et,o,Jt,y){"use strict";function Nt(x){const M=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(x){for(const S in x)if(S!=="default"){const i=Object.getOwnPropertyDescriptor(x,S);Object.defineProperty(M,S,i.get?i:{enumerable:!0,get:()=>x[S]})}}return M.default=x,Object.freeze(M)}const j=Nt(Jt);var Et={exports:{}},xt={};/**
1
+ (function(Q,s){typeof exports=="object"&&typeof module<"u"?s(exports,require("react"),require("cesium"),require("@kteneyck/cesium-timeline-core")):typeof define=="function"&&define.amd?define(["exports","react","cesium","@kteneyck/cesium-timeline-core"],s):(Q=typeof globalThis<"u"?globalThis:Q||self,s(Q.CesiumTimelineReact={},Q.React,Q.Cesium,Q.CesiumTimelineCore))})(this,(function(Q,s,Jt,y){"use strict";function Nt(x){const _=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(x){for(const k in x)if(k!=="default"){const i=Object.getOwnPropertyDescriptor(x,k);Object.defineProperty(_,k,i.get?i:{enumerable:!0,get:()=>x[k]})}}return _.default=x,Object.freeze(_)}const j=Nt(Jt);var vt={exports:{}},mt={};/**
2
2
  * @license React
3
3
  * react-jsx-runtime.production.js
4
4
  *
@@ -6,7 +6,7 @@
6
6
  *
7
7
  * This source code is licensed under the MIT license found in the
8
8
  * LICENSE file in the root directory of this source tree.
9
- */var jt;function Xt(){if(jt)return xt;jt=1;var x=Symbol.for("react.transitional.element"),M=Symbol.for("react.fragment");function S(i,R,P){var V=null;if(P!==void 0&&(V=""+P),R.key!==void 0&&(V=""+R.key),"key"in R){P={};for(var N in R)N!=="key"&&(P[N]=R[N])}else P=R;return R=P.ref,{$$typeof:x,type:i,key:V,ref:R!==void 0?R:null,props:P}}return xt.Fragment=M,xt.jsx=S,xt.jsxs=S,xt}var vt={};/**
9
+ */var jt;function Xt(){if(jt)return mt;jt=1;var x=Symbol.for("react.transitional.element"),_=Symbol.for("react.fragment");function k(i,b,T){var P=null;if(T!==void 0&&(P=""+T),b.key!==void 0&&(P=""+b.key),"key"in b){T={};for(var J in b)J!=="key"&&(T[J]=b[J])}else T=b;return b=T.ref,{$$typeof:x,type:i,key:P,ref:b!==void 0?b:null,props:T}}return mt.Fragment=_,mt.jsx=k,mt.jsxs=k,mt}var gt={};/**
10
10
  * @license React
11
11
  * react-jsx-runtime.development.js
12
12
  *
@@ -14,9 +14,9 @@
14
14
  *
15
15
  * This source code is licensed under the MIT license found in the
16
16
  * LICENSE file in the root directory of this source tree.
17
- */var At;function Yt(){return At||(At=1,process.env.NODE_ENV!=="production"&&(function(){function x(e){if(e==null)return null;if(typeof e=="function")return e.$$typeof===z?null:e.displayName||e.name||null;if(typeof e=="string")return e;switch(e){case k:return"Fragment";case Z:return"Profiler";case C:return"StrictMode";case D:return"Suspense";case T:return"SuspenseList";case G:return"Activity"}if(typeof e=="object")switch(typeof e.tag=="number"&&console.error("Received an unexpected object in getComponentNameFromType(). This is likely a bug in React. Please file an issue."),e.$$typeof){case v:return"Portal";case p:return e.displayName||"Context";case E:return(e._context.displayName||"Context")+".Consumer";case b:var f=e.render;return e=e.displayName,e||(e=f.displayName||f.name||"",e=e!==""?"ForwardRef("+e+")":"ForwardRef"),e;case lt:return f=e.displayName||null,f!==null?f:x(e.type)||"Memo";case Y:f=e._payload,e=e._init;try{return x(e(f))}catch{}}return null}function M(e){return""+e}function S(e){try{M(e);var f=!1}catch{f=!0}if(f){f=console;var w=f.error,L=typeof Symbol=="function"&&Symbol.toStringTag&&e[Symbol.toStringTag]||e.constructor.name||"Object";return w.call(f,"The provided key is an unsupported type %s. This value must be coerced to a string before using it here.",L),M(e)}}function i(e){if(e===k)return"<>";if(typeof e=="object"&&e!==null&&e.$$typeof===Y)return"<...>";try{var f=x(e);return f?"<"+f+">":"<...>"}catch{return"<...>"}}function R(){var e=I.A;return e===null?null:e.getOwner()}function P(){return Error("react-stack-top-frame")}function V(e){if(a.call(e,"key")){var f=Object.getOwnPropertyDescriptor(e,"key").get;if(f&&f.isReactWarning)return!1}return e.key!==void 0}function N(e,f){function w(){ot||(ot=!0,console.error("%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://react.dev/link/special-props)",f))}w.isReactWarning=!0,Object.defineProperty(e,"key",{get:w,configurable:!0})}function H(){var e=x(this.type);return B[e]||(B[e]=!0,console.error("Accessing element.ref was removed in React 19. ref is now a regular prop. It will be removed from the JSX Element type in a future release.")),e=this.props.ref,e!==void 0?e:null}function A(e,f,w,L,nt,ft){var O=w.ref;return e={$$typeof:K,type:e,key:f,props:w,_owner:L},(O!==void 0?O:null)!==null?Object.defineProperty(e,"ref",{enumerable:!1,get:H}):Object.defineProperty(e,"ref",{enumerable:!1,value:null}),e._store={},Object.defineProperty(e._store,"validated",{configurable:!1,enumerable:!1,writable:!0,value:0}),Object.defineProperty(e,"_debugInfo",{configurable:!1,enumerable:!1,writable:!0,value:null}),Object.defineProperty(e,"_debugStack",{configurable:!1,enumerable:!1,writable:!0,value:nt}),Object.defineProperty(e,"_debugTask",{configurable:!1,enumerable:!1,writable:!0,value:ft}),Object.freeze&&(Object.freeze(e.props),Object.freeze(e)),e}function U(e,f,w,L,nt,ft){var O=f.children;if(O!==void 0)if(L)if(X(O)){for(L=0;L<O.length;L++)rt(O[L]);Object.freeze&&Object.freeze(O)}else console.error("React.jsx: Static children should always be an array. You are likely explicitly calling React.jsxs or React.jsxDEV. Use the Babel transform instead.");else rt(O);if(a.call(f,"key")){O=x(e);var ut=Object.keys(f).filter(function(l){return l!=="key"});L=0<ut.length?"{key: someKey, "+ut.join(": ..., ")+": ...}":"{key: someKey}",it[O+L]||(ut=0<ut.length?"{"+ut.join(": ..., ")+": ...}":"{}",console.error(`A props object containing a "key" prop is being spread into JSX:
17
+ */var At;function Yt(){return At||(At=1,process.env.NODE_ENV!=="production"&&(function(){function x(e){if(e==null)return null;if(typeof e=="function")return e.$$typeof===U?null:e.displayName||e.name||null;if(typeof e=="string")return e;switch(e){case N:return"Fragment";case H:return"Profiler";case h:return"StrictMode";case D:return"Suspense";case M:return"SuspenseList";case tt:return"Activity"}if(typeof e=="object")switch(typeof e.tag=="number"&&console.error("Received an unexpected object in getComponentNameFromType(). This is likely a bug in React. Please file an issue."),e.$$typeof){case $:return"Portal";case d:return e.displayName||"Context";case E:return(e._context.displayName||"Context")+".Consumer";case v:var f=e.render;return e=e.displayName,e||(e=f.displayName||f.name||"",e=e!==""?"ForwardRef("+e+")":"ForwardRef"),e;case ct:return f=e.displayName||null,f!==null?f:x(e.type)||"Memo";case Y:f=e._payload,e=e._init;try{return x(e(f))}catch{}}return null}function _(e){return""+e}function k(e){try{_(e);var f=!1}catch{f=!0}if(f){f=console;var w=f.error,I=typeof Symbol=="function"&&Symbol.toStringTag&&e[Symbol.toStringTag]||e.constructor.name||"Object";return w.call(f,"The provided key is an unsupported type %s. This value must be coerced to a string before using it here.",I),_(e)}}function i(e){if(e===N)return"<>";if(typeof e=="object"&&e!==null&&e.$$typeof===Y)return"<...>";try{var f=x(e);return f?"<"+f+">":"<...>"}catch{return"<...>"}}function b(){var e=G.A;return e===null?null:e.getOwner()}function T(){return Error("react-stack-top-frame")}function P(e){if(R.call(e,"key")){var f=Object.getOwnPropertyDescriptor(e,"key").get;if(f&&f.isReactWarning)return!1}return e.key!==void 0}function J(e,f){function w(){O||(O=!0,console.error("%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://react.dev/link/special-props)",f))}w.isReactWarning=!0,Object.defineProperty(e,"key",{get:w,configurable:!0})}function z(){var e=x(this.type);return S[e]||(S[e]=!0,console.error("Accessing element.ref was removed in React 19. ref is now a regular prop. It will be removed from the JSX Element type in a future release.")),e=this.props.ref,e!==void 0?e:null}function A(e,f,w,I,V,lt){var C=w.ref;return e={$$typeof:q,type:e,key:f,props:w,_owner:I},(C!==void 0?C:null)!==null?Object.defineProperty(e,"ref",{enumerable:!1,get:z}):Object.defineProperty(e,"ref",{enumerable:!1,value:null}),e._store={},Object.defineProperty(e._store,"validated",{configurable:!1,enumerable:!1,writable:!0,value:0}),Object.defineProperty(e,"_debugInfo",{configurable:!1,enumerable:!1,writable:!0,value:null}),Object.defineProperty(e,"_debugStack",{configurable:!1,enumerable:!1,writable:!0,value:V}),Object.defineProperty(e,"_debugTask",{configurable:!1,enumerable:!1,writable:!0,value:lt}),Object.freeze&&(Object.freeze(e.props),Object.freeze(e)),e}function W(e,f,w,I,V,lt){var C=f.children;if(C!==void 0)if(I)if(L(C)){for(I=0;I<C.length;I++)et(C[I]);Object.freeze&&Object.freeze(C)}else console.error("React.jsx: Static children should always be an array. You are likely explicitly calling React.jsxs or React.jsxDEV. Use the Babel transform instead.");else et(C);if(R.call(f,"key")){C=x(e);var ut=Object.keys(f).filter(function(g){return g!=="key"});I=0<ut.length?"{key: someKey, "+ut.join(": ..., ")+": ...}":"{key: someKey}",at[C+I]||(ut=0<ut.length?"{"+ut.join(": ..., ")+": ...}":"{}",console.error(`A props object containing a "key" prop is being spread into JSX:
18
18
  let props = %s;
19
19
  <%s {...props} />
20
20
  React keys must be passed directly to JSX without using spread:
21
21
  let props = %s;
22
- <%s key={someKey} {...props} />`,L,O,ut,O),it[O+L]=!0)}if(O=null,w!==void 0&&(S(w),O=""+w),V(f)&&(S(f.key),O=""+f.key),"key"in f){w={};for(var Q in f)Q!=="key"&&(w[Q]=f[Q])}else w=f;return O&&N(w,typeof e=="function"?e.displayName||e.name||"Unknown":e),A(e,O,w,R(),nt,ft)}function rt(e){$(e)?e._store&&(e._store.validated=1):typeof e=="object"&&e!==null&&e.$$typeof===Y&&(e._payload.status==="fulfilled"?$(e._payload.value)&&e._payload.value._store&&(e._payload.value._store.validated=1):e._store&&(e._store.validated=1))}function $(e){return typeof e=="object"&&e!==null&&e.$$typeof===K}var tt=o,K=Symbol.for("react.transitional.element"),v=Symbol.for("react.portal"),k=Symbol.for("react.fragment"),C=Symbol.for("react.strict_mode"),Z=Symbol.for("react.profiler"),E=Symbol.for("react.consumer"),p=Symbol.for("react.context"),b=Symbol.for("react.forward_ref"),D=Symbol.for("react.suspense"),T=Symbol.for("react.suspense_list"),lt=Symbol.for("react.memo"),Y=Symbol.for("react.lazy"),G=Symbol.for("react.activity"),z=Symbol.for("react.client.reference"),I=tt.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,a=Object.prototype.hasOwnProperty,X=Array.isArray,W=console.createTask?console.createTask:function(){return null};tt={react_stack_bottom_frame:function(e){return e()}};var ot,B={},F=tt.react_stack_bottom_frame.bind(tt,P)(),ct=W(i(P)),it={};vt.Fragment=k,vt.jsx=function(e,f,w){var L=1e4>I.recentlyCreatedOwnerStacks++;return U(e,f,w,!1,L?Error("react-stack-top-frame"):F,L?W(i(e)):ct)},vt.jsxs=function(e,f,w){var L=1e4>I.recentlyCreatedOwnerStacks++;return U(e,f,w,!0,L?Error("react-stack-top-frame"):F,L?W(i(e)):ct)}})()),vt}var Ct;function zt(){return Ct||(Ct=1,process.env.NODE_ENV==="production"?Et.exports=Xt():Et.exports=Yt()),Et.exports}var u=zt();const Wt=520,Bt=()=>u.jsxs("svg",{width:"14",height:"16",viewBox:"0 0 14 16",fill:"currentColor","aria-hidden":"true",children:[u.jsx("rect",{x:"1",y:"0",width:"4",height:"16",rx:"1"}),u.jsx("rect",{x:"9",y:"0",width:"4",height:"16",rx:"1"})]}),St=()=>u.jsx("svg",{width:"14",height:"14",viewBox:"0 0 14 14",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":"true",children:u.jsx("polyline",{points:"3,5 7,9 11,5"})}),kt=()=>u.jsx("svg",{width:"14",height:"14",viewBox:"0 0 14 14",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":"true",children:u.jsx("polyline",{points:"3,9 7,5 11,9"})}),Lt=({currentTime:x,isPlaying:M,multiplier:S,dateTimeFormat:i,isLive:R,hasStartTime:P,hasEndTime:V,onPlayPause:N,onJumpToStart:H,onRewind:A,onFastForward:U,onJumpToEnd:rt,onJumpToLive:$,onResetSpeed:tt,onDateTimeClick:K,theme:v,swimLanesVisible:k,onToggleSwimLanes:C})=>{const Z=S<0,E=S>1,p=S===1,b=Math.abs(S),D=o.useRef(null),[T,lt]=o.useState(!1);o.useEffect(()=>{const a=D.current;if(!a)return;const X=new ResizeObserver(([W])=>{lt(W.contentRect.width<Wt)});return X.observe(a),()=>X.disconnect()},[]);const Y={background:"none",border:"1px solid transparent",cursor:"pointer",fontSize:"16px",padding:"0",display:"flex",alignItems:"center",justifyContent:"center",minWidth:"32px",width:"32px",height:"32px",borderRadius:"4px",transition:"background-color 0.15s, color 0.15s",fontFamily:"system-ui, -apple-system, sans-serif",flexShrink:0,lineHeight:1},G=a=>({...Y,color:a?v.buttonActiveColor:v.buttonColor,borderColor:a?`${v.buttonActiveColor}33`:"transparent"}),z=(a,X)=>{a.currentTarget.style.backgroundColor=X?`${v.buttonActiveColor}22`:v.buttonHoverColor+"44"},I=a=>{a.currentTarget.style.backgroundColor="transparent"};return u.jsxs("div",{ref:D,style:{display:T?"flex":"grid",gridTemplateColumns:T?void 0:"1fr auto 1fr",alignItems:"center",padding:"6px 16px",backgroundColor:v.controlBarBackground,borderBottom:`1px solid ${v.controlBarBorder}`,fontFamily:"system-ui, -apple-system, sans-serif"},children:[u.jsxs("div",{style:{display:"flex",alignItems:"center",gap:"8px",flexShrink:0},children:[u.jsx("div",{onClick:K,title:K?"Click to jump to a date/time":void 0,style:{color:v.labelColor,fontFamily:"monospace",lineHeight:1.15,cursor:K?"pointer":"default",borderRadius:"4px",padding:"2px 4px",transition:"background 0.15s"},onMouseEnter:a=>{K&&(a.currentTarget.style.background=v.buttonHoverColor+"44")},onMouseLeave:a=>a.currentTarget.style.background="transparent",children:(()=>{const{timeFormat:a,dateFormat:X}=y.splitForDisplay(i);return u.jsxs(u.Fragment,{children:[a&&u.jsx("div",{style:{fontSize:"2em",fontWeight:"bold",letterSpacing:"0.02em"},children:y.formatDateTime(x,a)}),X&&u.jsx("div",{style:{fontSize:"1.15em",letterSpacing:"0.03em",color:v.buttonActiveColor},children:y.formatDateTime(x,X)})]})})()}),u.jsxs("div",{style:{display:"flex",flexDirection:"column",gap:"2px",justifyContent:"center"},children:[u.jsx("button",{onClick:$,style:{...Y,fontSize:"11px",fontWeight:"bold",letterSpacing:"0.05em",width:"52px",minWidth:"52px",height:"20px",borderRadius:"3px",color:R?v.controlBarBackground:v.buttonActiveColor,backgroundColor:R?v.buttonActiveColor:"transparent",borderColor:v.buttonActiveColor,opacity:R?1:.55},onMouseEnter:a=>{a.currentTarget.style.opacity="1"},onMouseLeave:a=>{a.currentTarget.style.opacity=R?"1":"0.55"},title:R?"Currently live":"Jump to live (now)",children:R?"● LIVE":"LIVE"}),u.jsx("div",{style:{height:"20px",display:"flex",alignItems:"center"},children:!p&&u.jsx("button",{onClick:()=>tt(),style:{...Y,fontSize:"11px",color:v.buttonActiveColor,borderColor:`${v.buttonActiveColor}44`,width:"52px",minWidth:"52px",height:"20px"},onMouseEnter:a=>z(a,!0),onMouseLeave:I,title:"Reset to 1× speed",children:Z?`◀ ${b}×`:`${b}× ▶`})})]})]}),u.jsxs("div",{style:{display:"flex",alignItems:"center",gap:"2px",...T?{flex:1,justifyContent:"center"}:{}},children:[P&&u.jsx("button",{onClick:H,style:G(!1),onMouseEnter:a=>z(a,!1),onMouseLeave:I,title:"Jump to start",children:"⏮"}),u.jsx("button",{onClick:A,style:{...G(Z),width:"64px",minWidth:"64px",gap:"3px"},onMouseEnter:a=>z(a,Z),onMouseLeave:I,title:Z?`Reverse ${b}× — click to speed up, press play to stop`:"Rewind",children:Z?u.jsxs(u.Fragment,{children:[u.jsxs("span",{style:{fontSize:"11px",fontWeight:"bold"},children:[b,"×"]}),"◀◀"]}):"◀◀"}),u.jsx("button",{onClick:()=>N(!M),style:{...Y,color:v.buttonActiveColor,fontSize:"18px",width:"40px",minWidth:"40px",height:"40px",borderColor:`${v.buttonActiveColor}55`,borderRadius:"50%",paddingLeft:M?"0":"2px"},onMouseEnter:a=>z(a,!0),onMouseLeave:I,title:M?"Pause":Z?"Play (reset to 1×)":"Play",children:M?u.jsx(Bt,{}):"▶"}),u.jsx("button",{onClick:U,style:{...G(E),width:"64px",minWidth:"64px",gap:"3px"},onMouseEnter:a=>z(a,E),onMouseLeave:I,title:E?`${b}× speed — click to increase, click again at max to reset`:"Fast forward",children:E?u.jsxs(u.Fragment,{children:["▶▶",u.jsxs("span",{style:{fontSize:"11px",fontWeight:"bold"},children:[b,"×"]})]}):"▶▶"}),V&&u.jsx("button",{onClick:rt,style:G(!1),onMouseEnter:a=>z(a,!1),onMouseLeave:I,title:"Jump to end",children:"⏭"})]}),!T&&u.jsx("div",{style:{display:"flex",justifyContent:"flex-end",alignItems:"center"},children:C!=null&&k!=null&&u.jsx("button",{onClick:C,style:{...Y,color:v.buttonActiveColor,borderColor:`${v.buttonActiveColor}33`},onMouseEnter:a=>z(a,k),onMouseLeave:I,title:k?"Collapse swim lanes":"Expand swim lanes",children:k?u.jsx(St,{}):u.jsx(kt,{})})}),T&&C!=null&&k!=null&&u.jsx("button",{onClick:C,style:{...Y,color:v.buttonActiveColor,borderColor:`${v.buttonActiveColor}33`,marginLeft:"4px"},onMouseEnter:a=>z(a,k),onMouseLeave:I,title:k?"Collapse swim lanes":"Expand swim lanes",children:k?u.jsx(St,{}):u.jsx(kt,{})})]})},yt=o.forwardRef((x,M)=>{const{currentTime:S,defaultStartMs:i,defaultEndMs:R,theme:P,maxTicks:V,onTimeChange:N,onDragStart:H,onDragEnd:A,swimLanes:U,showSwimLanes:rt,onSwimLaneItemClick:$,onSwimLaneItemHover:tt,onSwimLaneItemDoubleClick:K,onSwimLaneItemContextMenu:v,onSwimLaneReorder:k}=x,C=o.useRef(null),Z=o.useRef(P),E=o.useRef(V),p=o.useRef(i),b=o.useRef(R),D=o.useRef(j.JulianDate.toDate(S).getTime());o.useEffect(()=>{Z.current=P},[P]),o.useEffect(()=>{E.current=V},[V]);const T=o.useRef(U??[]),lt=o.useRef(rt??(U!=null&&U.length>0)),Y=o.useRef(0),G=o.useRef(null),z=o.useRef(null),I=o.useRef($),a=o.useRef(tt),X=o.useRef(K),W=o.useRef(v),ot=o.useRef(k);o.useEffect(()=>{I.current=$},[$]),o.useEffect(()=>{a.current=tt},[tt]),o.useEffect(()=>{X.current=K},[K]),o.useEffect(()=>{W.current=v},[v]),o.useEffect(()=>{ot.current=k},[k]),o.useEffect(()=>{T.current=U??[],l()},[U]),o.useEffect(()=>{lt.current=rt??(U!=null&&U.length>0),l()},[rt,U]);const B=o.useRef(null),F=o.useRef(null),ct=o.useRef(!1),it=o.useRef(0),e=o.useRef("none"),f=o.useRef(0),w=o.useRef(0),L=o.useRef(0),nt=o.useRef("none"),ft=o.useRef(0),O=o.useRef(0),ut=(t,n)=>Math.hypot(n.clientX-t.clientX,n.clientY-t.clientY),Q=o.useCallback(()=>({startMs:p.current,endMs:b.current,currentMs:D.current,theme:Z.current,maxTicks:E.current,swimLanes:T.current,showSwimLanes:lt.current,scrollTop:Y.current,reorderState:z.current}),[]);o.useImperativeHandle(M,()=>({zoomTo(t,n,r){const c=Math.max(y.MIN_SPAN_MS,Math.min(y.MAX_SPAN_MS,n-t)),s=(t+n)/2;p.current=s-c/2,b.current=s+c/2,r!==void 0&&(D.current=r),l()},getVisibleRange(){return{startMs:p.current,endMs:b.current}},startFollow(t){if(it.current=t,F.current!==null)return;ct.current=!0;let n=performance.now();const r=()=>{const c=performance.now(),s=c-n;n=c;const h=s*it.current;p.current+=h,b.current+=h,D.current+=h,l(),F.current=requestAnimationFrame(r)};F.current=requestAnimationFrame(r)},stopFollow(){ct.current=!1,F.current!==null&&(cancelAnimationFrame(F.current),F.current=null)},correctFollow(t){if(!ct.current)return;const n=t-D.current;D.current=t,p.current+=n,b.current+=n},appendSwimLane(t){T.current=[...T.current,t],l()},updateSwimLane(t,n){T.current=T.current.map(r=>r.id===t?{...r,...n,id:r.id}:r),l()},removeSwimLane(t){T.current=T.current.filter(n=>n.id!==t),l()},reorderSwimLanes(t){const n=new Map(T.current.map(c=>[c.id,c])),r=[];for(const c of t){const s=n.get(c);s&&r.push(s)}T.current=r,l()}}));const l=o.useCallback(()=>{const t=C.current;if(!t)return;const n=t.getContext("2d");if(!n)return;const r=t.getBoundingClientRect(),c=r.width,s=r.height;if(c===0||s===0)return;const h=window.devicePixelRatio||1,m=Math.round(c*h),g=Math.round(s*h);(t.width!==m||t.height!==g)&&(t.width=m,t.height=g),n.save(),n.scale(h,h);const J=y.drawTimeline(n,c,s,Q());J!==Y.current&&(Y.current=J),n.restore()},[Q]);o.useLayoutEffect(()=>{l();const t=C.current;if(!t)return;const n=new ResizeObserver(()=>l());return n.observe(t),()=>n.disconnect()},[l]),o.useEffect(()=>{if(ct.current)return;const t=j.JulianDate.toDate(S).getTime();D.current!==t&&(D.current=t,l())},[S,l]);const ht=o.useCallback(t=>{if(B.current!==null)return;const n=()=>{const r=C.current,c=b.current-p.current,s=t*c*.01;if(p.current+=s,b.current+=s,r){const h=r.getBoundingClientRect(),m=Math.max(0,Math.min(h.width,w.current-h.left)),g=p.current+m/h.width*(b.current-p.current);D.current=g,N(j.JulianDate.fromDate(new Date(g)))}l(),B.current=requestAnimationFrame(n)};B.current=requestAnimationFrame(n)},[l,N]),at=o.useCallback(()=>{B.current!==null&&(cancelAnimationFrame(B.current),B.current=null)},[]),st=o.useCallback((t,n,r,c)=>y.hitTestSwimLane(t,n,r,c,Q()),[Q]),gt=o.useCallback((t,n,r)=>y.hitTestLaneLabel(t,n,r,Q()),[Q]),pt=o.useCallback((t,n)=>y.isInSwimLaneRegion(t,n,Q()),[Q]),Tt=o.useCallback(t=>{t.preventDefault();const n=t.currentTarget.getBoundingClientRect(),r=t.clientX-n.left,c=t.clientY-n.top;if(t.button===0&&ot.current){const s=gt(r,c,n.height);if(s){const m=T.current.findIndex(g=>g.id===s.id);z.current={dragging:!0,dragLaneId:s.id,dragStartY:t.clientY,currentY:t.clientY,insertIndex:m},t.currentTarget.style.cursor="grabbing";return}}if(t.button===0&&pt(c,n.height)){const s=(D.current-p.current)/(b.current-p.current)*n.width;if(!(Math.abs(r-s)<=10)&&st(r,c,n.width,n.height)){L.current=performance.now();return}}if(t.button===0){e.current="scrub",w.current=t.clientX,t.currentTarget.style.cursor="grabbing",H==null||H();const s=p.current+r/n.width*(b.current-p.current);D.current=s,l(),N(j.JulianDate.fromDate(new Date(s)))}else if(t.button===1)e.current="slide",f.current=t.clientX;else if(t.button===2){if(W.current&&pt(c,n.height))return;e.current="zoom",f.current=t.clientX}},[l,N,H,gt,pt,st]);o.useEffect(()=>{const t=r=>{const c=z.current;if(c&&c.dragging){c.currentY=r.clientY;const g=C.current;if(g){const J=g.getBoundingClientRect(),q=r.clientY-J.top;let Rt=-Y.current;const _t=T.current;let Pt=_t.length;for(let wt=0;wt<_t.length;wt++){const Ft=_t[wt].height??y.DEFAULT_LANE_HEIGHT,Gt=Rt+Ft/2;if(q<Gt){Pt=wt;break}Rt+=Ft+y.LANE_GAP}c.insertIndex=Pt}l();return}if(e.current==="none")return;const s=C.current;if(!s)return;const h=s.getBoundingClientRect(),m=h.width;if(e.current==="scrub"){w.current=r.clientX;const g=r.clientX-h.left,J=m*.08;g<J?ht(-1):g>m-J?ht(1):at();const q=Math.max(0,Math.min(m,g)),dt=p.current+q/m*(b.current-p.current);D.current=dt,l(),N(j.JulianDate.fromDate(new Date(dt)))}else if(e.current==="slide"){const g=f.current-r.clientX;if(f.current=r.clientX,g!==0){const J=g/m*(b.current-p.current);p.current+=J,b.current+=J,l()}}else if(e.current==="zoom"){const g=f.current-r.clientX;f.current=r.clientX,g!==0&&mt(Math.pow(1.01,g))}},n=()=>{var c;const r=z.current;if(r&&r.dragging){const s=Math.abs(r.currentY-r.dragStartY),h=T.current,m=h.findIndex(g=>g.id===r.dragLaneId);if(s>5&&m>=0&&r.insertIndex!==m&&r.insertIndex!==m+1){const g=[...h],[J]=g.splice(m,1),q=r.insertIndex>m?r.insertIndex-1:r.insertIndex;g.splice(q,0,J),T.current=g,(c=ot.current)==null||c.call(ot,g.map(dt=>dt.id))}z.current=null,C.current&&(C.current.style.cursor="default"),l();return}at(),e.current="none",C.current&&(C.current.style.cursor="default"),A==null||A()};return document.addEventListener("mousemove",t),document.addEventListener("mouseup",n),()=>{document.removeEventListener("mousemove",t),document.removeEventListener("mouseup",n)}},[l,N,A,ht,at]);const mt=o.useCallback(t=>{const n=y.zoomRange(p.current,b.current,t);p.current=n.startMs,b.current=n.endMs,l()},[l]),bt=o.useCallback(t=>{t.preventDefault();const n=C.current;if(!n)return;const r=n.getBoundingClientRect(),c=t.clientY-r.top,s=lt.current,h=T.current;if(s&&h.length>0){const m=Math.max(0,r.height-y.TICK_AREA_HEIGHT);if(c>=0&&c<m){let g=0;for(const q of h)g+=(q.height??y.DEFAULT_LANE_HEIGHT)+y.LANE_GAP;const J=Math.max(0,g-m);if(J>0){Y.current=Math.max(0,Math.min(J,Y.current+t.deltaY*y.SWIM_LANE_SCROLL_SPEED)),l();return}}}mt(Math.pow(1.05,t.deltaY>0?-1:1))},[mt,l]);o.useEffect(()=>{const t=C.current;if(t)return t.addEventListener("wheel",bt,{passive:!1}),()=>t.removeEventListener("wheel",bt)},[bt]),o.useEffect(()=>{const t=C.current;if(!t)return;const n=s=>{s.preventDefault();const h=t.getBoundingClientRect();if(s.touches.length===1){const m=s.touches[0].clientX-h.left,g=Math.max(0,Math.min(h.width,m)),J=p.current+g/h.width*(b.current-p.current);nt.current="scrub",ft.current=s.touches[0].clientX,w.current=s.touches[0].clientX,D.current=J,l(),H==null||H(),N(j.JulianDate.fromDate(new Date(J)))}else s.touches.length>=2&&(nt.current="pinch",O.current=ut(s.touches[0],s.touches[1]))},r=s=>{s.preventDefault();const h=t.getBoundingClientRect();if(nt.current==="scrub"&&s.touches.length>=1){const m=s.touches[0].clientX-h.left,g=h.width*.08;if(w.current=s.touches[0].clientX,m<g)ht(-1);else if(m>h.width-g)ht(1);else{at();const J=Math.max(0,Math.min(h.width,m)),q=p.current+J/h.width*(b.current-p.current);D.current=q,l(),N(j.JulianDate.fromDate(new Date(q)))}}else if(nt.current==="slide"&&s.touches.length>=1){const m=ft.current-s.touches[0].clientX;if(ft.current=s.touches[0].clientX,m!==0){const g=m/h.width*(b.current-p.current);p.current+=g,b.current+=g,l()}}else if(nt.current==="pinch"&&s.touches.length>=2){const m=ut(s.touches[0],s.touches[1]);m>0&&O.current>0&&mt(O.current/m),O.current=m}},c=s=>{at(),nt.current==="scrub"&&(A==null||A()),s.touches.length===0?nt.current="none":s.touches.length===1&&(nt.current="slide",ft.current=s.touches[0].clientX)};return t.addEventListener("touchstart",n,{passive:!1}),t.addEventListener("touchmove",r,{passive:!1}),t.addEventListener("touchend",c,{passive:!1}),()=>{t.removeEventListener("touchstart",n),t.removeEventListener("touchmove",r),t.removeEventListener("touchend",c)}},[l,H,A,N,mt,ht,at]);const Mt=o.useCallback(t=>{var m,g,J;if(e.current!=="none")return;const n=t.currentTarget.getBoundingClientRect(),r=t.clientX-n.left,c=t.clientY-n.top,s=(D.current-p.current)/(b.current-p.current)*n.width,h=Math.abs(r-s)<=10;if(pt(c,n.height)){const q=st(r,c,n.width,n.height),dt=G.current;if(q)t.currentTarget.style.cursor=h?"grab":"pointer",(!dt||dt.item.id!==q.item.id||dt.lane.id!==q.lane.id)&&(G.current=q,(m=a.current)==null||m.call(a,{laneId:q.lane.id,item:q.item,originalEvent:t.nativeEvent}),l());else if(dt&&(G.current=null,(g=a.current)==null||g.call(a,null),l()),h)t.currentTarget.style.cursor="grab";else{const Rt=gt(r,c,n.height);t.currentTarget.style.cursor=Rt&&ot.current?"grab":"default"}return}G.current&&(G.current=null,(J=a.current)==null||J.call(a,null),l()),t.currentTarget.style.cursor=h?"grab":"default"},[l,st,pt,gt]),Dt=o.useCallback(t=>{var m;if(performance.now()-L.current>300)return;const r=t.currentTarget.getBoundingClientRect(),c=t.clientX-r.left,s=t.clientY-r.top,h=st(c,s,r.width,r.height);h&&((m=I.current)==null||m.call(I,{laneId:h.lane.id,item:h.item,originalEvent:t.nativeEvent}))},[st]),d=o.useCallback(t=>{var h;const n=t.currentTarget.getBoundingClientRect(),r=t.clientX-n.left,c=t.clientY-n.top,s=st(r,c,n.width,n.height);s&&((h=X.current)==null||h.call(X,{laneId:s.lane.id,item:s.item,originalEvent:t.nativeEvent}))},[st]),_=o.useCallback(t=>{const n=t.currentTarget.getBoundingClientRect(),r=t.clientX-n.left,c=t.clientY-n.top,s=st(r,c,n.width,n.height);s&&W.current?(t.preventDefault(),W.current({laneId:s.lane.id,item:s.item,originalEvent:t.nativeEvent})):t.preventDefault()},[st]);return o.useEffect(()=>()=>{B.current!==null&&cancelAnimationFrame(B.current),F.current!==null&&cancelAnimationFrame(F.current)},[]),u.jsx("canvas",{ref:C,style:{width:"100%",flex:1,minHeight:0,display:"block",cursor:"default"},onMouseDown:Tt,onMouseMove:Mt,onClick:Dt,onDoubleClick:d,onMouseLeave:()=>{var t;G.current&&(G.current=null,(t=a.current)==null||t.call(a,null),l()),e.current==="none"&&C.current&&(C.current.style.cursor="default")},onContextMenu:_})});yt.displayName="TimelineCanvas";const Ot=[2,4,8,16,32,100,1],It=[1,2,4,8,16,32,100],Ht=({startTime:x,endTime:M,currentTime:S,clock:i,onTimeChange:R,onPlayPause:P,onMultiplierChange:V,height:N,showControls:H=!0,enableDrag:A=!0,dateTimeFormat:U,onDateTimeClick:rt,jumpToTime:$,maxTicks:tt,ffSpeeds:K=Ot,rwSpeeds:v=It,theme:k,className:C,swimLanes:Z,showSwimLanes:E,onShowSwimLanesChange:p,swimLaneTransition:b="animated",onSwimLaneItemClick:D,onSwimLaneItemHover:T,onSwimLaneItemDoubleClick:lt,onSwimLaneItemContextMenu:Y,onSwimLaneReorder:G})=>{const z=()=>Date.now(),I=x?j.JulianDate.toDate(y.toJulianDate(x)).getTime():z()-432e5,a=M?j.JulianDate.toDate(y.toJulianDate(M)).getTime():z()+12*3600*1e3,[X,W]=o.useState(()=>y.toJulianDate(S??x??j.JulianDate.fromDate(new Date))),[ot,B]=o.useState((i==null?void 0:i.shouldAnimate)??!1),[F,ct]=o.useState((i==null?void 0:i.multiplier)??1),[it,e]=o.useState(E??!0);o.useEffect(()=>{E!=null&&e(E)},[E]);const f=()=>{const d=!it;e(d),p==null||p(d)},w=Z!=null&&Z.length>0,L=o.useRef(null),[nt,ft]=o.useState(0);o.useEffect(()=>{const d=L.current;if(!d)return;const _=new ResizeObserver(([t])=>ft(t.borderBoxSize[0].blockSize));return _.observe(d),()=>_.disconnect()},[H]);const ut=w&&!it?`${nt+y.TICK_AREA_HEIGHT}px`:N!=null?`${N}px`:"100%",Q=o.useRef(!1),l=o.useRef(null),ht={...y.defaultTheme,...k};o.useEffect(()=>{if(!i)return;const d=()=>{if(!Q.current){const _=j.JulianDate.clone(i.currentTime);if(W(_),B(i.shouldAnimate),ct(i.multiplier),l.current){const{startMs:t,endMs:n}=l.current.getVisibleRange(),r=n-t,c=j.JulianDate.toDate(_).getTime(),s=c-t;s<=r*.1?l.current.zoomTo(c-r*.1,c+r*.9,c):s>=r*.9&&l.current.zoomTo(c-r*.9,c+r*.1,c)}}};return i.onTick.addEventListener(d),()=>{i.onTick.removeEventListener(d)}},[i]),o.useEffect(()=>{if(i)return;const d=setInterval(()=>{if(Q.current)return;const _=j.JulianDate.fromDate(new Date);if(W(_),l.current){const{startMs:t,endMs:n}=l.current.getVisibleRange(),r=n-t,c=j.JulianDate.toDate(_).getTime(),s=c-t;s<=r*.1?l.current.zoomTo(c-r*.1,c+r*.9,c):s>=r*.9&&l.current.zoomTo(c-r*.9,c+r*.1,c)}},1e3);return()=>clearInterval(d)},[i]),o.useEffect(()=>{if(!$)return;const d=y.toJulianDate($);if(st(d),l.current){const{startMs:_,endMs:t}=l.current.getVisibleRange(),n=t-_,r=j.JulianDate.toDate(d).getTime();l.current.zoomTo(r-n/2,r+n/2)}},[$]);const at=(d,_=!0)=>{i&&(i.multiplier=d,_&&(i.shouldAnimate=!0)),ct(d),_&&B(!0),V==null||V(d)},st=d=>{W(d),i&&(i.currentTime=j.JulianDate.clone(d)),R==null||R(d)},gt=d=>{d&&F<0&&at(1,!1),i&&(i.shouldAnimate=d),B(d),P==null||P(d)},pt=()=>{const d=K.length>0?K:Ot,_=F>1?F:1,t=d.indexOf(_),n=d[t<0||t===d.length-1?0:t+1];at(n)},Tt=()=>{const d=v.length>0?v:It,_=F<0?Math.abs(F):0,t=d.indexOf(_),n=-d[t<0||t===d.length-1?0:t+1];at(n)},mt=()=>{var _;const d=y.toJulianDate(x??j.JulianDate.fromDate(new Date(I)));i&&(i.currentTime=j.JulianDate.clone(d)),W(d),(_=l.current)==null||_.zoomTo(I,a)},bt=()=>{var _;const d=y.toJulianDate(M??j.JulianDate.fromDate(new Date(a)));i&&(i.currentTime=j.JulianDate.clone(d)),W(d),(_=l.current)==null||_.zoomTo(I,a)},Mt=()=>{var t;const d=j.JulianDate.fromDate(new Date);i&&(i.currentTime=j.JulianDate.clone(d)),W(d),at(1);const _=Date.now();(t=l.current)==null||t.zoomTo(_-12*3600*1e3,_+12*3600*1e3)},Dt=Math.abs(j.JulianDate.toDate(X).getTime()-Date.now())<1e4;return u.jsxs("div",{className:C,style:{width:"100%",height:ut,overflow:"hidden",display:"flex",flexDirection:"column",fontFamily:"system-ui, -apple-system, sans-serif",transition:b==="animated"?"height 0.2s ease":void 0},children:[H&&u.jsx("div",{ref:L,children:u.jsx(Lt,{currentTime:X,isPlaying:ot,multiplier:F,isLive:Dt,hasStartTime:x!=null,hasEndTime:M!=null,onPlayPause:gt,onJumpToStart:mt,onRewind:Tt,onFastForward:pt,onJumpToEnd:bt,onJumpToLive:Mt,onResetSpeed:()=>at(1),onDateTimeClick:rt,dateTimeFormat:U,theme:ht,swimLanesVisible:w?it:void 0,onToggleSwimLanes:w?f:void 0})}),A!==!1&&u.jsx(yt,{ref:l,currentTime:X,defaultStartMs:I,defaultEndMs:a,theme:ht,maxTicks:tt,onTimeChange:st,onDragStart:()=>{Q.current=!0},onDragEnd:()=>{Q.current=!1},swimLanes:Z,showSwimLanes:it,onSwimLaneItemClick:D,onSwimLaneItemHover:T,onSwimLaneItemDoubleClick:lt,onSwimLaneItemContextMenu:Y,onSwimLaneReorder:G})]})},Ut=({startTime:x,endTime:M,currentTime:S,width:i,height:R,tickInterval:P,showLabels:V,snapToTicks:N,enableDrag:H,theme:A,onTimeChange:U,onVisibleRangeChange:rt,onDragStart:$,onDragEnd:tt})=>{const K=o.useMemo(()=>y.generateTicks(x,M,P,i),[x,M,P,i]),v=o.useMemo(()=>y.timeToPosition(S,x,M,i),[S,x,M,i]),k=o.useRef(null),C=E=>{if(!H)return;const p=E.currentTarget.getBoundingClientRect(),b=E.clientX-p.left,D=Math.max(0,Math.min(i,b));if(!(Math.abs(D-v)<=10)){let B=D;N&&(B=y.snapToTick(D,K,10));const F=new Date(x).getTime(),ct=new Date(M).getTime();U(j.JulianDate.fromDate(new Date(F+B/i*(ct-F))));return}$==null||$();const lt=E.clientX,Y=new Date(S).getTime(),G=new Date(x).getTime(),I=(new Date(M).getTime()-G)/i;let a=0,X=!1;const W=B=>{a=B.clientX-lt,X=!0,k.current||(k.current=requestAnimationFrame(()=>{if(X){const F=Y+a*I;U(j.JulianDate.fromDate(new Date(F))),X=!1}k.current=null}))},ot=()=>{document.removeEventListener("mousemove",W),document.removeEventListener("mouseup",ot),k.current!==null&&(cancelAnimationFrame(k.current),k.current=null),tt==null||tt()};document.addEventListener("mousemove",W),document.addEventListener("mouseup",ot)},Z=E=>{E.preventDefault();const p=E.shiftKey?E.deltaY:E.deltaX!==0?E.deltaX:E.deltaY;if(Math.abs(p)<1)return;const b=new Date(x).getTime(),D=new Date(M).getTime(),T=p/i*(D-b)*.5;rt==null||rt(j.JulianDate.fromDate(new Date(b+T)),j.JulianDate.fromDate(new Date(D+T)))};return u.jsxs("svg",{width:"100%",height:R,style:{backgroundColor:A.backgroundColor,display:"block",cursor:"default"},onMouseDown:C,onWheel:Z,children:[u.jsx("rect",{width:i,height:R,fill:A.backgroundColor}),K.map((E,p)=>u.jsxs("g",{children:[u.jsx("line",{x1:E.position,y1:R-(E.isMajor?A.majorTickHeight:A.minorTickHeight),x2:E.position,y2:R,stroke:E.isMajor?A.majorTickColor:A.tickColor,strokeWidth:"1"}),V&&E.isMajor&&E.label&&u.jsx("text",{x:E.position,y:R-A.majorTickHeight-5,textAnchor:"middle",fill:A.labelColor,fontSize:A.fontSize,fontFamily:"monospace",children:E.label})]},p)),u.jsx("line",{x1:v,y1:0,x2:v,y2:R,stroke:A.indicatorColor,strokeWidth:A.indicatorLineWidth,pointerEvents:"none"}),H&&u.jsx("rect",{x:Math.max(0,v-10),y:0,width:20,height:R,fill:"transparent",style:{cursor:"ew-resize"},pointerEvents:"visiblePainted"}),u.jsx("circle",{cx:v,cy:5,r:4,fill:A.indicatorColor,pointerEvents:"none"})]})};Object.defineProperty(et,"TICK_AREA_HEIGHT",{enumerable:!0,get:()=>y.TICK_AREA_HEIGHT}),et.Timeline=Ht,et.TimelineCanvas=yt,et.TimelineControls=Lt,et.TimelineSVG=Ut,Object.keys(y).forEach(x=>{x!=="default"&&!Object.prototype.hasOwnProperty.call(et,x)&&Object.defineProperty(et,x,{enumerable:!0,get:()=>y[x]})}),Object.defineProperty(et,Symbol.toStringTag,{value:"Module"})}));
22
+ <%s key={someKey} {...props} />`,I,C,ut,C),at[C+I]=!0)}if(C=null,w!==void 0&&(k(w),C=""+w),P(f)&&(k(f.key),C=""+f.key),"key"in f){w={};for(var ot in f)ot!=="key"&&(w[ot]=f[ot])}else w=f;return C&&J(w,typeof e=="function"?e.displayName||e.name||"Unknown":e),A(e,C,w,b(),V,lt)}function et(e){nt(e)?e._store&&(e._store.validated=1):typeof e=="object"&&e!==null&&e.$$typeof===Y&&(e._payload.status==="fulfilled"?nt(e._payload.value)&&e._payload.value._store&&(e._payload.value._store.validated=1):e._store&&(e._store.validated=1))}function nt(e){return typeof e=="object"&&e!==null&&e.$$typeof===q}var Z=s,q=Symbol.for("react.transitional.element"),$=Symbol.for("react.portal"),N=Symbol.for("react.fragment"),h=Symbol.for("react.strict_mode"),H=Symbol.for("react.profiler"),E=Symbol.for("react.consumer"),d=Symbol.for("react.context"),v=Symbol.for("react.forward_ref"),D=Symbol.for("react.suspense"),M=Symbol.for("react.suspense_list"),ct=Symbol.for("react.memo"),Y=Symbol.for("react.lazy"),tt=Symbol.for("react.activity"),U=Symbol.for("react.client.reference"),G=Z.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,R=Object.prototype.hasOwnProperty,L=Array.isArray,l=console.createTask?console.createTask:function(){return null};Z={react_stack_bottom_frame:function(e){return e()}};var O,S={},B=Z.react_stack_bottom_frame.bind(Z,T)(),rt=l(i(T)),at={};gt.Fragment=N,gt.jsx=function(e,f,w){var I=1e4>G.recentlyCreatedOwnerStacks++;return W(e,f,w,!1,I?Error("react-stack-top-frame"):B,I?l(i(e)):rt)},gt.jsxs=function(e,f,w){var I=1e4>G.recentlyCreatedOwnerStacks++;return W(e,f,w,!0,I?Error("react-stack-top-frame"):B,I?l(i(e)):rt)}})()),gt}var Ct;function zt(){return Ct||(Ct=1,process.env.NODE_ENV==="production"?vt.exports=Xt():vt.exports=Yt()),vt.exports}var u=zt();const Wt=520,Bt=()=>u.jsxs("svg",{width:"14",height:"16",viewBox:"0 0 14 16",fill:"currentColor","aria-hidden":"true",children:[u.jsx("rect",{x:"1",y:"0",width:"4",height:"16",rx:"1"}),u.jsx("rect",{x:"9",y:"0",width:"4",height:"16",rx:"1"})]}),kt=()=>u.jsx("svg",{width:"14",height:"14",viewBox:"0 0 14 14",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":"true",children:u.jsx("polyline",{points:"3,5 7,9 11,5"})}),St=()=>u.jsx("svg",{width:"14",height:"14",viewBox:"0 0 14 14",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":"true",children:u.jsx("polyline",{points:"3,9 7,5 11,9"})}),Lt=({currentTime:x,isPlaying:_,multiplier:k,dateTimeFormat:i,isLive:b,hasStartTime:T,hasEndTime:P,showJumpToStart:J=!0,showJumpToEnd:z=!0,onPlayPause:A,onJumpToStart:W,onRewind:et,onFastForward:nt,onJumpToEnd:Z,onJumpToLive:q,onResetSpeed:$,onDateTimeClick:N,theme:h,swimLanesVisible:H,onToggleSwimLanes:E})=>{const d=k<0,v=k>1,D=k===1,M=Math.abs(k),ct=s.useRef(null),[Y,tt]=s.useState(!1);s.useEffect(()=>{const l=ct.current;if(!l)return;const O=new ResizeObserver(([S])=>{tt(S.contentRect.width<Wt)});return O.observe(l),()=>O.disconnect()},[]);const U={background:"none",border:"1px solid transparent",cursor:"pointer",fontSize:"16px",padding:"0",display:"flex",alignItems:"center",justifyContent:"center",minWidth:"32px",width:"32px",height:"32px",borderRadius:"4px",transition:"background-color 0.15s, color 0.15s",fontFamily:"system-ui, -apple-system, sans-serif",flexShrink:0,lineHeight:1},G=l=>({...U,color:l?h.buttonActiveColor:h.buttonColor,borderColor:l?`${h.buttonActiveColor}33`:"transparent"}),R=(l,O)=>{l.currentTarget.style.backgroundColor=O?`${h.buttonActiveColor}22`:h.buttonHoverColor+"44"},L=l=>{l.currentTarget.style.backgroundColor="transparent"};return u.jsxs("div",{ref:ct,style:{display:Y?"flex":"grid",gridTemplateColumns:Y?void 0:"1fr auto 1fr",alignItems:"center",padding:"6px 16px",backgroundColor:h.controlBarBackground,borderBottom:`1px solid ${h.controlBarBorder}`,fontFamily:"system-ui, -apple-system, sans-serif"},children:[u.jsxs("div",{style:{display:"flex",alignItems:"center",gap:"8px",flexShrink:0},children:[u.jsx("div",{onClick:N,title:N?"Click to jump to a date/time":void 0,style:{color:h.labelColor,fontFamily:"monospace",lineHeight:1.15,cursor:N?"pointer":"default",borderRadius:"4px",padding:"2px 4px",transition:"background 0.15s"},onMouseEnter:l=>{N&&(l.currentTarget.style.background=h.buttonHoverColor+"44")},onMouseLeave:l=>l.currentTarget.style.background="transparent",children:(()=>{const{timeFormat:l,dateFormat:O}=y.splitForDisplay(i);return u.jsxs(u.Fragment,{children:[l&&u.jsx("div",{style:{fontSize:"2em",fontWeight:"bold",letterSpacing:"0.02em"},children:y.formatDateTime(x,l)}),O&&u.jsx("div",{style:{fontSize:"1.15em",letterSpacing:"0.03em",color:h.buttonActiveColor},children:y.formatDateTime(x,O)})]})})()}),u.jsxs("div",{style:{display:"flex",flexDirection:"column",gap:"2px",justifyContent:"center"},children:[u.jsx("button",{onClick:q,style:{...U,fontSize:"11px",fontWeight:"bold",letterSpacing:"0.05em",width:"52px",minWidth:"52px",height:"20px",borderRadius:"3px",color:b?h.controlBarBackground:h.buttonActiveColor,backgroundColor:b?h.buttonActiveColor:"transparent",borderColor:h.buttonActiveColor,opacity:b?1:.55},onMouseEnter:l=>{l.currentTarget.style.opacity="1"},onMouseLeave:l=>{l.currentTarget.style.opacity=b?"1":"0.55"},title:b?"Currently live":"Jump to live (now)",children:b?"● LIVE":"LIVE"}),u.jsx("div",{style:{height:"20px",display:"flex",alignItems:"center"},children:!D&&u.jsx("button",{onClick:()=>$(),style:{...U,fontSize:"11px",color:h.buttonActiveColor,borderColor:`${h.buttonActiveColor}44`,width:"52px",minWidth:"52px",height:"20px"},onMouseEnter:l=>R(l,!0),onMouseLeave:L,title:"Reset to 1× speed",children:d?`◀ ${M}×`:`${M}× ▶`})})]})]}),u.jsxs("div",{style:{display:"flex",alignItems:"center",gap:"2px",...Y?{flex:1,justifyContent:"center"}:{}},children:[J&&u.jsx("button",{onClick:T?W:void 0,disabled:!T,style:{...G(!1),opacity:T?1:.3,cursor:T?"pointer":"default"},onMouseEnter:T?l=>R(l,!1):void 0,onMouseLeave:T?L:void 0,title:T?"Jump to start":"No start time set",children:"⏮"}),u.jsx("button",{onClick:et,style:{...G(d),width:"64px",minWidth:"64px",gap:"3px"},onMouseEnter:l=>R(l,d),onMouseLeave:L,title:d?`Reverse ${M}× — click to speed up, press play to stop`:"Rewind",children:d?u.jsxs(u.Fragment,{children:[u.jsxs("span",{style:{fontSize:"11px",fontWeight:"bold"},children:[M,"×"]}),"◀◀"]}):"◀◀"}),u.jsx("button",{onClick:()=>A(!_),style:{...U,color:h.buttonActiveColor,fontSize:"18px",width:"40px",minWidth:"40px",height:"40px",borderColor:`${h.buttonActiveColor}55`,borderRadius:"50%",paddingLeft:_?"0":"2px"},onMouseEnter:l=>R(l,!0),onMouseLeave:L,title:_?"Pause":d?"Play (reset to 1×)":"Play",children:_?u.jsx(Bt,{}):"▶"}),u.jsx("button",{onClick:nt,style:{...G(v),width:"64px",minWidth:"64px",gap:"3px"},onMouseEnter:l=>R(l,v),onMouseLeave:L,title:v?`${M}× speed — click to increase, click again at max to reset`:"Fast forward",children:v?u.jsxs(u.Fragment,{children:["▶▶",u.jsxs("span",{style:{fontSize:"11px",fontWeight:"bold"},children:[M,"×"]})]}):"▶▶"}),z&&u.jsx("button",{onClick:P?Z:void 0,disabled:!P,style:{...G(!1),opacity:P?1:.3,cursor:P?"pointer":"default"},onMouseEnter:P?l=>R(l,!1):void 0,onMouseLeave:P?L:void 0,title:P?"Jump to end":"No end time set",children:"⏭"})]}),!Y&&u.jsx("div",{style:{display:"flex",justifyContent:"flex-end",alignItems:"center"},children:E!=null&&H!=null&&u.jsx("button",{onClick:E,style:{...U,color:h.buttonActiveColor,borderColor:`${h.buttonActiveColor}33`},onMouseEnter:l=>R(l,H),onMouseLeave:L,title:H?"Collapse swim lanes":"Expand swim lanes",children:H?u.jsx(kt,{}):u.jsx(St,{})})}),Y&&E!=null&&H!=null&&u.jsx("button",{onClick:E,style:{...U,color:h.buttonActiveColor,borderColor:`${h.buttonActiveColor}33`,marginLeft:"4px"},onMouseEnter:l=>R(l,H),onMouseLeave:L,title:H?"Collapse swim lanes":"Expand swim lanes",children:H?u.jsx(kt,{}):u.jsx(St,{})})]})},Rt=s.forwardRef((x,_)=>{const{currentTime:k,defaultStartMs:i,defaultEndMs:b,theme:T,maxTicks:P,onTimeChange:J,onDragStart:z,onDragEnd:A,swimLanes:W,showSwimLanes:et,onSwimLaneItemClick:nt,onSwimLaneItemHover:Z,onSwimLaneItemDoubleClick:q,onSwimLaneItemContextMenu:$,onSwimLaneReorder:N}=x,h=s.useRef(null),H=s.useRef(T),E=s.useRef(P),d=s.useRef(i),v=s.useRef(b),D=s.useRef(j.JulianDate.toDate(k).getTime());s.useEffect(()=>{H.current=T},[T]),s.useEffect(()=>{E.current=P},[P]);const M=s.useRef(W??[]),ct=s.useRef(et??(W!=null&&W.length>0)),Y=s.useRef(0),tt=s.useRef(null),U=s.useRef(null),G=s.useRef(nt),R=s.useRef(Z),L=s.useRef(q),l=s.useRef($),O=s.useRef(N);s.useEffect(()=>{G.current=nt},[nt]),s.useEffect(()=>{R.current=Z},[Z]),s.useEffect(()=>{L.current=q},[q]),s.useEffect(()=>{l.current=$},[$]),s.useEffect(()=>{O.current=N},[N]),s.useEffect(()=>{M.current=W??[],g()},[W]),s.useEffect(()=>{ct.current=et??(W!=null&&W.length>0),g()},[et,W]);const S=s.useRef(null),B=s.useRef(null),rt=s.useRef(!1),at=s.useRef(0),e=s.useRef("none"),f=s.useRef(0),w=s.useRef(0),I=s.useRef(0),V=s.useRef("none"),lt=s.useRef(0),C=s.useRef(0),ut=(t,n)=>Math.hypot(n.clientX-t.clientX,n.clientY-t.clientY),ot=s.useCallback(()=>({startMs:d.current,endMs:v.current,currentMs:D.current,theme:H.current,maxTicks:E.current,swimLanes:M.current,showSwimLanes:ct.current,scrollTop:Y.current,reorderState:U.current}),[]);s.useImperativeHandle(_,()=>({zoomTo(t,n,r){const a=Math.max(y.MIN_SPAN_MS,Math.min(y.MAX_SPAN_MS,n-t)),o=(t+n)/2;d.current=o-a/2,v.current=o+a/2,r!==void 0&&(D.current=r),g()},getVisibleRange(){return{startMs:d.current,endMs:v.current}},startFollow(t){if(at.current=t,B.current!==null)return;rt.current=!0;let n=performance.now();const r=()=>{const a=performance.now(),o=a-n;n=a;const c=o*at.current;d.current+=c,v.current+=c,D.current+=c,g(),B.current=requestAnimationFrame(r)};B.current=requestAnimationFrame(r)},stopFollow(){rt.current=!1,B.current!==null&&(cancelAnimationFrame(B.current),B.current=null)},correctFollow(t){if(!rt.current)return;const n=t-D.current;D.current=t,d.current+=n,v.current+=n},appendSwimLane(t){M.current=[...M.current,t],g()},updateSwimLane(t,n){M.current=M.current.map(r=>r.id===t?{...r,...n,id:r.id}:r),g()},removeSwimLane(t){M.current=M.current.filter(n=>n.id!==t),g()},reorderSwimLanes(t){const n=new Map(M.current.map(a=>[a.id,a])),r=[];for(const a of t){const o=n.get(a);o&&r.push(o)}M.current=r,g()}}));const g=s.useCallback(()=>{const t=h.current;if(!t)return;const n=t.getContext("2d");if(!n)return;const r=t.getBoundingClientRect(),a=r.width,o=r.height;if(a===0||o===0)return;const c=window.devicePixelRatio||1,p=Math.round(a*c),m=Math.round(o*c);(t.width!==p||t.height!==m)&&(t.width=p,t.height=m),n.save(),n.scale(c,c);const F=y.drawTimeline(n,a,o,ot());F!==Y.current&&(Y.current=F),n.restore()},[ot]);s.useLayoutEffect(()=>{g();const t=h.current;if(!t)return;const n=new ResizeObserver(()=>g());return n.observe(t),()=>n.disconnect()},[g]),s.useEffect(()=>{if(rt.current)return;const t=j.JulianDate.toDate(k).getTime();D.current!==t&&(D.current=t,g())},[k,g]);const it=s.useCallback(t=>{if(S.current!==null)return;const n=()=>{const r=h.current,a=v.current-d.current,o=t*a*.01;if(d.current+=o,v.current+=o,r){const c=r.getBoundingClientRect(),p=Math.max(0,Math.min(c.width,w.current-c.left)),m=d.current+p/c.width*(v.current-d.current);D.current=m,J(j.JulianDate.fromDate(new Date(m)))}g(),S.current=requestAnimationFrame(n)};S.current=requestAnimationFrame(n)},[g,J]),X=s.useCallback(()=>{S.current!==null&&(cancelAnimationFrame(S.current),S.current=null)},[]),st=s.useCallback((t,n,r,a)=>y.hitTestSwimLane(t,n,r,a,ot()),[ot]),ft=s.useCallback((t,n,r)=>y.hitTestLaneLabel(t,n,r,ot()),[ot]),pt=s.useCallback((t,n)=>y.isInSwimLaneRegion(t,n,ot()),[ot]),wt=s.useCallback(t=>{t.preventDefault();const n=t.currentTarget.getBoundingClientRect(),r=t.clientX-n.left,a=t.clientY-n.top;if(t.button===0&&O.current){const o=ft(r,a,n.height);if(o){const p=M.current.findIndex(m=>m.id===o.id);U.current={dragging:!0,dragLaneId:o.id,dragStartY:t.clientY,currentY:t.clientY,insertIndex:p},t.currentTarget.style.cursor="grabbing";return}}if(t.button===0&&pt(a,n.height)){const o=(D.current-d.current)/(v.current-d.current)*n.width;if(!(Math.abs(r-o)<=10)&&st(r,a,n.width,n.height)){I.current=performance.now();return}}if(t.button===0){e.current="scrub",w.current=t.clientX,t.currentTarget.style.cursor="grabbing",z==null||z();const o=d.current+r/n.width*(v.current-d.current);D.current=o,g(),J(j.JulianDate.fromDate(new Date(o)))}else if(t.button===1)e.current="slide",f.current=t.clientX;else if(t.button===2){if(l.current&&pt(a,n.height))return;e.current="zoom",f.current=t.clientX}},[g,J,z,ft,pt,st]);s.useEffect(()=>{const t=r=>{const a=U.current;if(a&&a.dragging){a.currentY=r.clientY;const m=h.current;if(m){const F=m.getBoundingClientRect(),K=r.clientY-F.top;let bt=-Y.current;const _t=M.current;let Pt=_t.length;for(let Et=0;Et<_t.length;Et++){const Ft=_t[Et].height??y.DEFAULT_LANE_HEIGHT,Gt=bt+Ft/2;if(K<Gt){Pt=Et;break}bt+=Ft+y.LANE_GAP}a.insertIndex=Pt}g();return}if(e.current==="none")return;const o=h.current;if(!o)return;const c=o.getBoundingClientRect(),p=c.width;if(e.current==="scrub"){w.current=r.clientX;const m=r.clientX-c.left,F=p*.08;m<F?it(-1):m>p-F?it(1):X();const K=Math.max(0,Math.min(p,m)),dt=d.current+K/p*(v.current-d.current);D.current=dt,g(),J(j.JulianDate.fromDate(new Date(dt)))}else if(e.current==="slide"){const m=f.current-r.clientX;if(f.current=r.clientX,m!==0){const F=m/p*(v.current-d.current);d.current+=F,v.current+=F,g()}}else if(e.current==="zoom"){const m=f.current-r.clientX;f.current=r.clientX,m!==0&&ht(Math.pow(1.01,m))}},n=()=>{var a;const r=U.current;if(r&&r.dragging){const o=Math.abs(r.currentY-r.dragStartY),c=M.current,p=c.findIndex(m=>m.id===r.dragLaneId);if(o>5&&p>=0&&r.insertIndex!==p&&r.insertIndex!==p+1){const m=[...c],[F]=m.splice(p,1),K=r.insertIndex>p?r.insertIndex-1:r.insertIndex;m.splice(K,0,F),M.current=m,(a=O.current)==null||a.call(O,m.map(dt=>dt.id))}U.current=null,h.current&&(h.current.style.cursor="default"),g();return}X(),e.current="none",h.current&&(h.current.style.cursor="default"),A==null||A()};return document.addEventListener("mousemove",t),document.addEventListener("mouseup",n),()=>{document.removeEventListener("mousemove",t),document.removeEventListener("mouseup",n)}},[g,J,A,it,X]);const ht=s.useCallback(t=>{const n=y.zoomRange(d.current,v.current,t);d.current=n.startMs,v.current=n.endMs,g()},[g]),xt=s.useCallback(t=>{t.preventDefault();const n=h.current;if(!n)return;const r=n.getBoundingClientRect(),a=t.clientY-r.top,o=ct.current,c=M.current;if(o&&c.length>0){const p=Math.max(0,r.height-y.TICK_AREA_HEIGHT);if(a>=0&&a<p){let m=0;for(const K of c)m+=(K.height??y.DEFAULT_LANE_HEIGHT)+y.LANE_GAP;const F=Math.max(0,m-p);if(F>0){Y.current=Math.max(0,Math.min(F,Y.current+t.deltaY*y.SWIM_LANE_SCROLL_SPEED)),g();return}}}ht(Math.pow(1.05,t.deltaY>0?-1:1))},[ht,g]);s.useEffect(()=>{const t=h.current;if(t)return t.addEventListener("wheel",xt,{passive:!1}),()=>t.removeEventListener("wheel",xt)},[xt]),s.useEffect(()=>{const t=h.current;if(!t)return;const n=o=>{o.preventDefault();const c=t.getBoundingClientRect();if(o.touches.length===1){const p=o.touches[0].clientX-c.left,m=Math.max(0,Math.min(c.width,p)),F=d.current+m/c.width*(v.current-d.current);V.current="scrub",lt.current=o.touches[0].clientX,w.current=o.touches[0].clientX,D.current=F,g(),z==null||z(),J(j.JulianDate.fromDate(new Date(F)))}else o.touches.length>=2&&(V.current="pinch",C.current=ut(o.touches[0],o.touches[1]))},r=o=>{o.preventDefault();const c=t.getBoundingClientRect();if(V.current==="scrub"&&o.touches.length>=1){const p=o.touches[0].clientX-c.left,m=c.width*.08;if(w.current=o.touches[0].clientX,p<m)it(-1);else if(p>c.width-m)it(1);else{X();const F=Math.max(0,Math.min(c.width,p)),K=d.current+F/c.width*(v.current-d.current);D.current=K,g(),J(j.JulianDate.fromDate(new Date(K)))}}else if(V.current==="slide"&&o.touches.length>=1){const p=lt.current-o.touches[0].clientX;if(lt.current=o.touches[0].clientX,p!==0){const m=p/c.width*(v.current-d.current);d.current+=m,v.current+=m,g()}}else if(V.current==="pinch"&&o.touches.length>=2){const p=ut(o.touches[0],o.touches[1]);p>0&&C.current>0&&ht(C.current/p),C.current=p}},a=o=>{X(),V.current==="scrub"&&(A==null||A()),o.touches.length===0?V.current="none":o.touches.length===1&&(V.current="slide",lt.current=o.touches[0].clientX)};return t.addEventListener("touchstart",n,{passive:!1}),t.addEventListener("touchmove",r,{passive:!1}),t.addEventListener("touchend",a,{passive:!1}),()=>{t.removeEventListener("touchstart",n),t.removeEventListener("touchmove",r),t.removeEventListener("touchend",a)}},[g,z,A,J,ht,it,X]);const yt=s.useCallback(t=>{var p,m,F;if(e.current!=="none")return;const n=t.currentTarget.getBoundingClientRect(),r=t.clientX-n.left,a=t.clientY-n.top,o=(D.current-d.current)/(v.current-d.current)*n.width,c=Math.abs(r-o)<=10;if(pt(a,n.height)){const K=st(r,a,n.width,n.height),dt=tt.current;if(K)t.currentTarget.style.cursor=c?"grab":"pointer",(!dt||dt.item.id!==K.item.id||dt.lane.id!==K.lane.id)&&(tt.current=K,(p=R.current)==null||p.call(R,{laneId:K.lane.id,item:K.item,originalEvent:t.nativeEvent}),g());else if(dt&&(tt.current=null,(m=R.current)==null||m.call(R,null),g()),c)t.currentTarget.style.cursor="grab";else{const bt=ft(r,a,n.height);t.currentTarget.style.cursor=bt&&O.current?"grab":"default"}return}tt.current&&(tt.current=null,(F=R.current)==null||F.call(R,null),g()),t.currentTarget.style.cursor=c?"grab":"default"},[g,st,pt,ft]),Mt=s.useCallback(t=>{var p;if(performance.now()-I.current>300)return;const r=t.currentTarget.getBoundingClientRect(),a=t.clientX-r.left,o=t.clientY-r.top,c=st(a,o,r.width,r.height);c&&((p=G.current)==null||p.call(G,{laneId:c.lane.id,item:c.item,originalEvent:t.nativeEvent}))},[st]),Tt=s.useCallback(t=>{var c;const n=t.currentTarget.getBoundingClientRect(),r=t.clientX-n.left,a=t.clientY-n.top,o=st(r,a,n.width,n.height);o&&((c=L.current)==null||c.call(L,{laneId:o.lane.id,item:o.item,originalEvent:t.nativeEvent}))},[st]),Dt=s.useCallback(t=>{const n=t.currentTarget.getBoundingClientRect(),r=t.clientX-n.left,a=t.clientY-n.top,o=st(r,a,n.width,n.height);o&&l.current?(t.preventDefault(),l.current({laneId:o.lane.id,item:o.item,originalEvent:t.nativeEvent})):t.preventDefault()},[st]);return s.useEffect(()=>()=>{S.current!==null&&cancelAnimationFrame(S.current),B.current!==null&&cancelAnimationFrame(B.current)},[]),u.jsx("canvas",{ref:h,style:{width:"100%",flex:1,minHeight:0,display:"block",cursor:"default"},onMouseDown:wt,onMouseMove:yt,onClick:Mt,onDoubleClick:Tt,onMouseLeave:()=>{var t;tt.current&&(tt.current=null,(t=R.current)==null||t.call(R,null),g()),e.current==="none"&&h.current&&(h.current.style.cursor="default")},onContextMenu:Dt})});Rt.displayName="TimelineCanvas";const Ot=[2,4,8,16,32,100,1],It=[1,2,4,8,16,32,100],Ht=({startTime:x,endTime:_,currentTime:k,clock:i,onTimeChange:b,onPlayPause:T,onMultiplierChange:P,height:J,showControls:z=!0,showJumpToStart:A,showJumpToEnd:W,enableDrag:et=!0,dateTimeFormat:nt,onDateTimeClick:Z,jumpToTime:q,maxTicks:$,ffSpeeds:N=Ot,rwSpeeds:h=It,theme:H,className:E,swimLanes:d,showSwimLanes:v,onShowSwimLanesChange:D,swimLaneTransition:M="animated",onSwimLaneItemClick:ct,onSwimLaneItemHover:Y,onSwimLaneItemDoubleClick:tt,onSwimLaneItemContextMenu:U,onSwimLaneReorder:G})=>{const R=()=>Date.now(),L=x?j.JulianDate.toDate(y.toJulianDate(x)).getTime():R()-432e5,l=_?j.JulianDate.toDate(y.toJulianDate(_)).getTime():R()+12*3600*1e3,[O,S]=s.useState(()=>y.toJulianDate(k??x??j.JulianDate.fromDate(new Date))),[B,rt]=s.useState((i==null?void 0:i.shouldAnimate)??!1),[at,e]=s.useState((i==null?void 0:i.multiplier)??1),[f,w]=s.useState(v??!0);s.useEffect(()=>{v!=null&&w(v)},[v]);const I=()=>{const t=!f;w(t),D==null||D(t)},V=d!=null&&d.length>0,lt=s.useRef(null),[C,ut]=s.useState(0);s.useEffect(()=>{const t=lt.current;if(!t)return;const n=new ResizeObserver(([r])=>ut(r.borderBoxSize[0].blockSize));return n.observe(t),()=>n.disconnect()},[z]);const g=V&&!f?`${C+y.TICK_AREA_HEIGHT}px`:J!=null?`${J}px`:"100%",it=s.useRef(!1),X=s.useRef(null),st={...y.defaultTheme,...H};s.useEffect(()=>{if(!i)return;const t=()=>{if(!it.current){const n=j.JulianDate.clone(i.currentTime);if(S(n),rt(i.shouldAnimate),e(i.multiplier),X.current){const{startMs:r,endMs:a}=X.current.getVisibleRange(),o=a-r,c=j.JulianDate.toDate(n).getTime(),p=c-r;p<=o*.1?X.current.zoomTo(c-o*.1,c+o*.9,c):p>=o*.9&&X.current.zoomTo(c-o*.9,c+o*.1,c)}}};return i.onTick.addEventListener(t),()=>{i.onTick.removeEventListener(t)}},[i]),s.useEffect(()=>{if(i)return;const t=setInterval(()=>{if(it.current)return;const n=j.JulianDate.fromDate(new Date);if(S(n),X.current){const{startMs:r,endMs:a}=X.current.getVisibleRange(),o=a-r,c=j.JulianDate.toDate(n).getTime(),p=c-r;p<=o*.1?X.current.zoomTo(c-o*.1,c+o*.9,c):p>=o*.9&&X.current.zoomTo(c-o*.9,c+o*.1,c)}},1e3);return()=>clearInterval(t)},[i]),s.useEffect(()=>{if(!q)return;const t=y.toJulianDate(q);if(pt(t),X.current){const{startMs:n,endMs:r}=X.current.getVisibleRange(),a=r-n,o=j.JulianDate.toDate(t).getTime();X.current.zoomTo(o-a/2,o+a/2)}},[q]);const ft=(t,n=!0)=>{i&&(i.multiplier=t,n&&(i.shouldAnimate=!0)),e(t),n&&rt(!0),P==null||P(t)},pt=t=>{S(t),i&&(i.currentTime=j.JulianDate.clone(t)),b==null||b(t)},wt=t=>{t&&at<0&&ft(1,!1),i&&(i.shouldAnimate=t),rt(t),T==null||T(t)},ht=()=>{const t=N.length>0?N:Ot,n=at>1?at:1,r=t.indexOf(n),a=t[r<0||r===t.length-1?0:r+1];ft(a)},xt=()=>{const t=h.length>0?h:It,n=at<0?Math.abs(at):0,r=t.indexOf(n),a=-t[r<0||r===t.length-1?0:r+1];ft(a)},yt=()=>{var n;const t=y.toJulianDate(x??j.JulianDate.fromDate(new Date(L)));i&&(i.currentTime=j.JulianDate.clone(t)),S(t),(n=X.current)==null||n.zoomTo(L,l)},Mt=()=>{var n;const t=y.toJulianDate(_??j.JulianDate.fromDate(new Date(l)));i&&(i.currentTime=j.JulianDate.clone(t)),S(t),(n=X.current)==null||n.zoomTo(L,l)},Tt=()=>{var r;const t=j.JulianDate.fromDate(new Date);i&&(i.currentTime=j.JulianDate.clone(t)),S(t),ft(1);const n=Date.now();(r=X.current)==null||r.zoomTo(n-12*3600*1e3,n+12*3600*1e3)},Dt=Math.abs(j.JulianDate.toDate(O).getTime()-Date.now())<1e4;return u.jsxs("div",{className:E,style:{width:"100%",height:g,overflow:"hidden",display:"flex",flexDirection:"column",fontFamily:"system-ui, -apple-system, sans-serif",transition:M==="animated"?"height 0.2s ease":void 0},children:[z&&u.jsx("div",{ref:lt,children:u.jsx(Lt,{currentTime:O,isPlaying:B,multiplier:at,isLive:Dt,hasStartTime:x!=null,hasEndTime:_!=null,showJumpToStart:A,showJumpToEnd:W,onPlayPause:wt,onJumpToStart:yt,onRewind:xt,onFastForward:ht,onJumpToEnd:Mt,onJumpToLive:Tt,onResetSpeed:()=>ft(1),onDateTimeClick:Z,dateTimeFormat:nt,theme:st,swimLanesVisible:V?f:void 0,onToggleSwimLanes:V?I:void 0})}),et!==!1&&u.jsx(Rt,{ref:X,currentTime:O,defaultStartMs:L,defaultEndMs:l,theme:st,maxTicks:$,onTimeChange:pt,onDragStart:()=>{it.current=!0},onDragEnd:()=>{it.current=!1},swimLanes:d,showSwimLanes:f,onSwimLaneItemClick:ct,onSwimLaneItemHover:Y,onSwimLaneItemDoubleClick:tt,onSwimLaneItemContextMenu:U,onSwimLaneReorder:G})]})},Ut=({startTime:x,endTime:_,currentTime:k,width:i,height:b,tickInterval:T,showLabels:P,snapToTicks:J,enableDrag:z,theme:A,onTimeChange:W,onVisibleRangeChange:et,onDragStart:nt,onDragEnd:Z})=>{const q=s.useMemo(()=>y.generateTicks(x,_,T,i),[x,_,T,i]),$=s.useMemo(()=>y.timeToPosition(k,x,_,i),[k,x,_,i]),N=s.useRef(null),h=E=>{if(!z)return;const d=E.currentTarget.getBoundingClientRect(),v=E.clientX-d.left,D=Math.max(0,Math.min(i,v));if(!(Math.abs(D-$)<=10)){let S=D;J&&(S=y.snapToTick(D,q,10));const B=new Date(x).getTime(),rt=new Date(_).getTime();W(j.JulianDate.fromDate(new Date(B+S/i*(rt-B))));return}nt==null||nt();const ct=E.clientX,Y=new Date(k).getTime(),tt=new Date(x).getTime(),G=(new Date(_).getTime()-tt)/i;let R=0,L=!1;const l=S=>{R=S.clientX-ct,L=!0,N.current||(N.current=requestAnimationFrame(()=>{if(L){const B=Y+R*G;W(j.JulianDate.fromDate(new Date(B))),L=!1}N.current=null}))},O=()=>{document.removeEventListener("mousemove",l),document.removeEventListener("mouseup",O),N.current!==null&&(cancelAnimationFrame(N.current),N.current=null),Z==null||Z()};document.addEventListener("mousemove",l),document.addEventListener("mouseup",O)},H=E=>{E.preventDefault();const d=E.shiftKey?E.deltaY:E.deltaX!==0?E.deltaX:E.deltaY;if(Math.abs(d)<1)return;const v=new Date(x).getTime(),D=new Date(_).getTime(),M=d/i*(D-v)*.5;et==null||et(j.JulianDate.fromDate(new Date(v+M)),j.JulianDate.fromDate(new Date(D+M)))};return u.jsxs("svg",{width:"100%",height:b,style:{backgroundColor:A.backgroundColor,display:"block",cursor:"default"},onMouseDown:h,onWheel:H,children:[u.jsx("rect",{width:i,height:b,fill:A.backgroundColor}),q.map((E,d)=>u.jsxs("g",{children:[u.jsx("line",{x1:E.position,y1:b-(E.isMajor?A.majorTickHeight:A.minorTickHeight),x2:E.position,y2:b,stroke:E.isMajor?A.majorTickColor:A.tickColor,strokeWidth:"1"}),P&&E.isMajor&&E.label&&u.jsx("text",{x:E.position,y:b-A.majorTickHeight-5,textAnchor:"middle",fill:A.labelColor,fontSize:A.fontSize,fontFamily:"monospace",children:E.label})]},d)),u.jsx("line",{x1:$,y1:0,x2:$,y2:b,stroke:A.indicatorColor,strokeWidth:A.indicatorLineWidth,pointerEvents:"none"}),z&&u.jsx("rect",{x:Math.max(0,$-10),y:0,width:20,height:b,fill:"transparent",style:{cursor:"ew-resize"},pointerEvents:"visiblePainted"}),u.jsx("circle",{cx:$,cy:5,r:4,fill:A.indicatorColor,pointerEvents:"none"})]})};Object.defineProperty(Q,"TICK_AREA_HEIGHT",{enumerable:!0,get:()=>y.TICK_AREA_HEIGHT}),Q.Timeline=Ht,Q.TimelineCanvas=Rt,Q.TimelineControls=Lt,Q.TimelineSVG=Ut,Object.keys(y).forEach(x=>{x!=="default"&&!Object.prototype.hasOwnProperty.call(Q,x)&&Object.defineProperty(Q,x,{enumerable:!0,get:()=>y[x]})}),Object.defineProperty(Q,Symbol.toStringTag,{value:"Module"})}));
package/dist/index.d.ts CHANGED
@@ -23,6 +23,8 @@ export declare interface ControlsProps {
23
23
  isLive: boolean;
24
24
  hasStartTime: boolean;
25
25
  hasEndTime: boolean;
26
+ showJumpToStart?: boolean;
27
+ showJumpToEnd?: boolean;
26
28
  theme: TimelineTheme;
27
29
  swimLanesVisible?: boolean;
28
30
  onToggleSwimLanes?: () => void;
@@ -87,6 +89,8 @@ export declare interface TimelineProps {
87
89
  onMultiplierChange?: (multiplier: number) => void;
88
90
  height?: number;
89
91
  showControls?: boolean;
92
+ showJumpToStart?: boolean;
93
+ showJumpToEnd?: boolean;
90
94
  enableDrag?: boolean;
91
95
  dateTimeFormat?: string;
92
96
  onDateTimeClick?: () => void;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kteneyck/cesium-timeline-react",
3
- "version": "0.2.0",
3
+ "version": "0.3.0",
4
4
  "description": "React timeline component for Cesium with clock integration",
5
5
  "license": "MIT",
6
6
  "author": "kteneyck",
@@ -52,7 +52,7 @@
52
52
  "@types/react-dom": ">=18"
53
53
  },
54
54
  "dependencies": {
55
- "@kteneyck/cesium-timeline-core": "0.2.0"
55
+ "@kteneyck/cesium-timeline-core": "0.3.0"
56
56
  },
57
57
  "devDependencies": {
58
58
  "@types/react": "19.0.1",