@jaeungkim/gantt-chart 0.3.1 → 0.4.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.
Files changed (57) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +60 -101
  3. package/dist/components/GanttBar.d.ts +23 -0
  4. package/dist/components/GanttChartHeader.d.ts +17 -0
  5. package/dist/components/GanttDependencyArrows.d.ts +15 -0
  6. package/dist/components/GanttDragGuides.d.ts +9 -0
  7. package/dist/components/GanttGridSplitter.d.ts +14 -0
  8. package/dist/components/GanttMarkers.d.ts +18 -0
  9. package/dist/components/GanttTaskGrid.d.ts +42 -0
  10. package/dist/components/ScaleSelector.d.ts +11 -0
  11. package/dist/constants/gantt.d.ts +47 -0
  12. package/dist/core/calendar.d.ts +45 -0
  13. package/dist/core/criticalPath.d.ts +67 -0
  14. package/dist/core/dates.d.ts +32 -0
  15. package/dist/core/index.d.ts +16 -0
  16. package/dist/core/scheduling.d.ts +104 -0
  17. package/dist/core/tree.d.ts +42 -0
  18. package/dist/core/types.d.ts +76 -0
  19. package/dist/gantt-chart.css +1 -1
  20. package/dist/hooks/useGanttBarDrag.d.ts +35 -0
  21. package/dist/hooks/useGanttDrawCreate.d.ts +31 -0
  22. package/dist/hooks/useGanttExportApi.d.ts +30 -0
  23. package/dist/hooks/useGanttHistoryApi.d.ts +28 -0
  24. package/dist/hooks/useGanttLinkDrag.d.ts +31 -0
  25. package/dist/hooks/useGanttProgressDrag.d.ts +16 -0
  26. package/dist/hooks/useGanttRowDrag.d.ts +33 -0
  27. package/dist/hooks/useGanttScrollApi.d.ts +63 -0
  28. package/dist/hooks/useGanttSelectors.d.ts +23 -0
  29. package/dist/hooks/useGanttVirtualization.d.ts +32 -0
  30. package/dist/hooks/useResolvedTheme.d.ts +15 -0
  31. package/dist/index.cjs +4 -0
  32. package/dist/index.d.cts +13 -0
  33. package/dist/index.d.ts +13 -51
  34. package/dist/index.js +5819 -0
  35. package/dist/pages/Gantt.d.ts +306 -0
  36. package/dist/stores/context.d.ts +10 -0
  37. package/dist/stores/store.d.ts +118 -0
  38. package/dist/types/gantt.d.ts +283 -0
  39. package/dist/types/task.d.ts +111 -0
  40. package/dist/utils/a11y.d.ts +141 -0
  41. package/dist/utils/arrowPath.d.ts +66 -0
  42. package/dist/utils/dependency.d.ts +42 -0
  43. package/dist/utils/grouping.d.ts +81 -0
  44. package/dist/utils/headerUtils.d.ts +6 -0
  45. package/dist/utils/history.d.ts +56 -0
  46. package/dist/utils/i18n.d.ts +16 -0
  47. package/dist/utils/mutation.d.ts +47 -0
  48. package/dist/utils/pngExport.d.ts +67 -0
  49. package/dist/utils/pointerGesture.d.ts +31 -0
  50. package/dist/utils/rowDrag.d.ts +69 -0
  51. package/dist/utils/timeline.d.ts +161 -0
  52. package/dist/utils/transformData.d.ts +15 -0
  53. package/dist/utils/viewport.d.ts +95 -0
  54. package/package.json +47 -32
  55. package/dist/index.cjs.js +0 -4
  56. package/dist/index.es.js +0 -2394
  57. package/dist/readmeImg.png +0 -0
package/dist/index.cjs ADDED
@@ -0,0 +1,4 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const $=require("react/jsx-runtime"),b=require("react"),Ss=require("react-dom");function bs(t){const n=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(t){for(const r in t)if(r!=="default"){const s=Object.getOwnPropertyDescriptor(t,r);Object.defineProperty(n,r,s.get?s:{enumerable:!0,get:()=>t[r]})}}return n.default=t,Object.freeze(n)}const oe=bs(b);function hr(t){return t&&t.__esModule&&Object.prototype.hasOwnProperty.call(t,"default")?t.default:t}var Me={exports:{}},ys=Me.exports,Yn;function xs(){return Yn||(Yn=1,(function(t,n){(function(r,s){t.exports=s()})(ys,(function(){var r=1e3,s=6e4,o=36e5,e="millisecond",i="second",a="minute",l="hour",u="day",c="week",d="month",f="quarter",h="year",m="date",p="Invalid Date",y=/^(\d{4})[-/]?(\d{1,2})?[-/]?(\d{0,2})[Tt\s]*(\d{1,2})?:?(\d{1,2})?:?(\d{1,2})?[.:]?(\d+)?$/,S=/\[([^\]]+)]|YYYY|YY|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g,v={name:"en",weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),ordinal:function(C){var E=["th","st","nd","rd"],I=C%100;return"["+C+(E[(I-20)%10]||E[I]||E[0])+"]"}},x=function(C,E,I){var N=String(C);return!N||N.length>=E?C:""+Array(E+1-N.length).join(I)+C},D={s:x,z:function(C){var E=-C.utcOffset(),I=Math.abs(E),N=Math.floor(I/60),L=I%60;return(E<=0?"+":"-")+x(N,2,"0")+":"+x(L,2,"0")},m:function C(E,I){if(E.date()<I.date())return-C(I,E);var N=12*(I.year()-E.year())+(I.month()-E.month()),L=E.clone().add(N,d),F=I-L<0,W=E.clone().add(N+(F?-1:1),d);return+(-(N+(I-L)/(F?L-W:W-L))||0)},a:function(C){return C<0?Math.ceil(C)||0:Math.floor(C)},p:function(C){return{M:d,y:h,w:c,d:u,D:m,h:l,m:a,s:i,ms:e,Q:f}[C]||String(C||"").toLowerCase().replace(/s$/,"")},u:function(C){return C===void 0}},T="en",P={};P[T]=v;var k="$isDayjsObject",A=function(C){return C instanceof X||!(!C||!C[k])},w=function C(E,I,N){var L;if(!E)return T;if(typeof E=="string"){var F=E.toLowerCase();P[F]&&(L=F),I&&(P[F]=I,L=F);var W=E.split("-");if(!L&&W.length>1)return C(W[0])}else{var K=E.name;P[K]=E,L=K}return!N&&L&&(T=L),L||!N&&T},g=function(C,E){if(A(C))return C.clone();var I=typeof E=="object"?E:{};return I.date=C,I.args=arguments,new X(I)},j=D;j.l=w,j.i=A,j.w=function(C,E){return g(C,{locale:E.$L,utc:E.$u,x:E.$x,$offset:E.$offset})};var X=(function(){function C(I){this.$L=w(I.locale,null,!0),this.parse(I),this.$x=this.$x||I.x||{},this[k]=!0}var E=C.prototype;return E.parse=function(I){this.$d=(function(N){var L=N.date,F=N.utc;if(L===null)return new Date(NaN);if(j.u(L))return new Date;if(L instanceof Date)return new Date(L);if(typeof L=="string"&&!/Z$/i.test(L)){var W=L.match(y);if(W){var K=W[2]-1||0,tt=(W[7]||"0").substring(0,3);return F?new Date(Date.UTC(W[1],K,W[3]||1,W[4]||0,W[5]||0,W[6]||0,tt)):new Date(W[1],K,W[3]||1,W[4]||0,W[5]||0,W[6]||0,tt)}}return new Date(L)})(I),this.init()},E.init=function(){var I=this.$d;this.$y=I.getFullYear(),this.$M=I.getMonth(),this.$D=I.getDate(),this.$W=I.getDay(),this.$H=I.getHours(),this.$m=I.getMinutes(),this.$s=I.getSeconds(),this.$ms=I.getMilliseconds()},E.$utils=function(){return j},E.isValid=function(){return this.$d.toString()!==p},E.isSame=function(I,N){var L=g(I);return this.startOf(N)<=L&&L<=this.endOf(N)},E.isAfter=function(I,N){return g(I)<this.startOf(N)},E.isBefore=function(I,N){return this.endOf(N)<g(I)},E.$g=function(I,N,L){return j.u(I)?this[N]:this.set(L,I)},E.unix=function(){return Math.floor(this.valueOf()/1e3)},E.valueOf=function(){return this.$d.getTime()},E.startOf=function(I,N){var L=this,F=!!j.u(N)||N,W=j.p(I),K=function(M,G){var U=j.w(L.$u?Date.UTC(L.$y,G,M):new Date(L.$y,G,M),L);return F?U:U.endOf(u)},tt=function(M,G){return j.w(L.toDate()[M].apply(L.toDate("s"),(F?[0,0,0,0]:[23,59,59,999]).slice(G)),L)},et=this.$W,st=this.$M,dt=this.$D,lt="set"+(this.$u?"UTC":"");switch(W){case h:return F?K(1,0):K(31,11);case d:return F?K(1,st):K(0,st+1);case c:var vt=this.$locale().weekStart||0,ot=(et<vt?et+7:et)-vt;return K(F?dt-ot:dt+(6-ot),st);case u:case m:return tt(lt+"Hours",0);case l:return tt(lt+"Minutes",1);case a:return tt(lt+"Seconds",2);case i:return tt(lt+"Milliseconds",3);default:return this.clone()}},E.endOf=function(I){return this.startOf(I,!1)},E.$set=function(I,N){var L,F=j.p(I),W="set"+(this.$u?"UTC":""),K=(L={},L[u]=W+"Date",L[m]=W+"Date",L[d]=W+"Month",L[h]=W+"FullYear",L[l]=W+"Hours",L[a]=W+"Minutes",L[i]=W+"Seconds",L[e]=W+"Milliseconds",L)[F],tt=F===u?this.$D+(N-this.$W):N;if(F===d||F===h){var et=this.clone().set(m,1);et.$d[K](tt),et.init(),this.$d=et.set(m,Math.min(this.$D,et.daysInMonth())).$d}else K&&this.$d[K](tt);return this.init(),this},E.set=function(I,N){return this.clone().$set(I,N)},E.get=function(I){return this[j.p(I)]()},E.add=function(I,N){var L,F=this;I=Number(I);var W=j.p(N),K=function(st){var dt=g(F);return j.w(dt.date(dt.date()+Math.round(st*I)),F)};if(W===d)return this.set(d,this.$M+I);if(W===h)return this.set(h,this.$y+I);if(W===u)return K(1);if(W===c)return K(7);var tt=(L={},L[a]=s,L[l]=o,L[i]=r,L)[W]||1,et=this.$d.getTime()+I*tt;return j.w(et,this)},E.subtract=function(I,N){return this.add(-1*I,N)},E.format=function(I){var N=this,L=this.$locale();if(!this.isValid())return L.invalidDate||p;var F=I||"YYYY-MM-DDTHH:mm:ssZ",W=j.z(this),K=this.$H,tt=this.$m,et=this.$M,st=L.weekdays,dt=L.months,lt=L.meridiem,vt=function(G,U,ct,it){return G&&(G[U]||G(N,F))||ct[U].slice(0,it)},ot=function(G){return j.s(K%12||12,G,"0")},M=lt||function(G,U,ct){var it=G<12?"AM":"PM";return ct?it.toLowerCase():it};return F.replace(S,(function(G,U){return U||(function(ct){switch(ct){case"YY":return String(N.$y).slice(-2);case"YYYY":return j.s(N.$y,4,"0");case"M":return et+1;case"MM":return j.s(et+1,2,"0");case"MMM":return vt(L.monthsShort,et,dt,3);case"MMMM":return vt(dt,et);case"D":return N.$D;case"DD":return j.s(N.$D,2,"0");case"d":return String(N.$W);case"dd":return vt(L.weekdaysMin,N.$W,st,2);case"ddd":return vt(L.weekdaysShort,N.$W,st,3);case"dddd":return st[N.$W];case"H":return String(K);case"HH":return j.s(K,2,"0");case"h":return ot(1);case"hh":return ot(2);case"a":return M(K,tt,!0);case"A":return M(K,tt,!1);case"m":return String(tt);case"mm":return j.s(tt,2,"0");case"s":return String(N.$s);case"ss":return j.s(N.$s,2,"0");case"SSS":return j.s(N.$ms,3,"0");case"Z":return W}return null})(G)||W.replace(":","")}))},E.utcOffset=function(){return 15*-Math.round(this.$d.getTimezoneOffset()/15)},E.diff=function(I,N,L){var F,W=this,K=j.p(N),tt=g(I),et=(tt.utcOffset()-this.utcOffset())*s,st=this-tt,dt=function(){return j.m(W,tt)};switch(K){case h:F=dt()/12;break;case d:F=dt();break;case f:F=dt()/3;break;case c:F=(st-et)/6048e5;break;case u:F=(st-et)/864e5;break;case l:F=st/o;break;case a:F=st/s;break;case i:F=st/r;break;default:F=st}return L?F:j.a(F)},E.daysInMonth=function(){return this.endOf(d).$D},E.$locale=function(){return P[this.$L]},E.locale=function(I,N){if(!I)return this.$L;var L=this.clone(),F=w(I,N,!0);return F&&(L.$L=F),L},E.clone=function(){return j.w(this.$d,this)},E.toDate=function(){return new Date(this.valueOf())},E.toJSON=function(){return this.isValid()?this.toISOString():null},E.toISOString=function(){return this.$d.toISOString()},E.toString=function(){return this.$d.toUTCString()},C})(),q=X.prototype;return g.prototype=q,[["$ms",e],["$s",i],["$m",a],["$H",l],["$W",u],["$M",d],["$y",h],["$D",m]].forEach((function(C){q[C[1]]=function(E){return this.$g(E,C[0],C[1])}})),g.extend=function(C,E){return C.$i||(C(E,X,g),C.$i=!0),g},g.locale=w,g.isDayjs=A,g.unix=function(C){return g(1e3*C)},g.en=P[T],g.Ls=P,g.p={},g}))})(Me)),Me.exports}var ws=xs();const mr=hr(ws);var Ie={exports:{}},$s=Ie.exports,Wn;function Ds(){return Wn||(Wn=1,(function(t,n){(function(r,s){t.exports=s()})($s,(function(){var r="minute",s=/[+-]\d\d(?::?\d\d)?/g,o=/([+-]|\d\d)/g;return function(e,i,a){var l=i.prototype;a.utc=function(p){var y={date:p,utc:!0,args:arguments};return new i(y)},l.utc=function(p){var y=a(this.toDate(),{locale:this.$L,utc:!0});return p?y.add(this.utcOffset(),r):y},l.local=function(){return a(this.toDate(),{locale:this.$L,utc:!1})};var u=l.parse;l.parse=function(p){p.utc&&(this.$u=!0),this.$utils().u(p.$offset)||(this.$offset=p.$offset),u.call(this,p)};var c=l.init;l.init=function(){if(this.$u){var p=this.$d;this.$y=p.getUTCFullYear(),this.$M=p.getUTCMonth(),this.$D=p.getUTCDate(),this.$W=p.getUTCDay(),this.$H=p.getUTCHours(),this.$m=p.getUTCMinutes(),this.$s=p.getUTCSeconds(),this.$ms=p.getUTCMilliseconds()}else c.call(this)};var d=l.utcOffset;l.utcOffset=function(p,y){var S=this.$utils().u;if(S(p))return this.$u?0:S(this.$offset)?d.call(this):this.$offset;if(typeof p=="string"&&(p=(function(T){T===void 0&&(T="");var P=T.match(s);if(!P)return null;var k=(""+P[0]).match(o)||["-",0,0],A=k[0],w=60*+k[1]+ +k[2];return w===0?0:A==="+"?w:-w})(p),p===null))return this;var v=Math.abs(p)<=16?60*p:p;if(v===0)return this.utc(y);var x=this.clone();if(y)return x.$offset=v,x.$u=!1,x;var D=this.$u?this.toDate().getTimezoneOffset():-1*this.utcOffset();return(x=this.local().add(v+D,r)).$offset=v,x.$x.$localOffset=D,x};var f=l.format;l.format=function(p){var y=p||(this.$u?"YYYY-MM-DDTHH:mm:ss[Z]":"");return f.call(this,y)},l.valueOf=function(){var p=this.$utils().u(this.$offset)?0:this.$offset+(this.$x.$localOffset||this.$d.getTimezoneOffset());return this.$d.valueOf()-6e4*p},l.isUTC=function(){return!!this.$u},l.toISOString=function(){return this.toDate().toISOString()},l.toString=function(){return this.toDate().toUTCString()};var h=l.toDate;l.toDate=function(p){return p==="s"&&this.$offset?a(this.format("YYYY-MM-DD HH:mm:ss:SSS")).toDate():h.call(this)};var m=l.diff;l.diff=function(p,y,S){if(p&&this.$u===p.$u)return m.call(this,p,y,S);var v=this.local(),x=a(p).local();return m.call(v,x,y,S)}}}))})(Ie)),Ie.exports}var Ms=Ds();const Is=hr(Ms);mr.extend(Is);const R=mr.utc;function gr(t){return Math.floor(t.month()/3)+1}function Os(t){return t.startOf("month").month(Math.floor(t.month()/3)*3)}function Es(t,n=0){const r=(t.day()-n+7)%7;return t.startOf("day").subtract(r,"day")}const wt=38,Ts=73,pr=120,Un=120,Hn=800,nn=16,Xn="YYYY-MM-DD",ks=[{key:"name",header:"Name",width:220},{key:"startDate",header:"Start",width:110,render:t=>R(t.startDate).format(Xn)},{key:"endDate",header:"End",width:110,render:t=>R(t.endDate).format(Xn)}],Ls=5,As=14,Ps=56,Te=8,vr=44,Sr=Te*3,_s=vr*3,Ns=16,br=Math.round(Ns*Math.SQRT2/2),Rs={hour:"MMM D, YYYY HH:mm [UTC]",day:"MMM D, YYYY HH:mm [UTC]",week:"MMM D, YYYY",month:"MMM D, YYYY",quarter:"MMM YYYY",year:"MMM YYYY"},pt={hour:{labelUnit:"day",tickUnit:"hour",unitPerTick:1,dragStepUnit:"minute",dragStepAmount:15,basePxPerDragStep:30,formatTickLabel:t=>t.format("HH:mm"),formatHeaderLabel:t=>t.format("MMM D, YYYY")},day:{labelUnit:"day",tickUnit:"hour",unitPerTick:1,dragStepUnit:"hour",dragStepAmount:1,basePxPerDragStep:32,formatTickLabel:t=>t.format("HH"),formatHeaderLabel:t=>t.format("MMM D, YYYY")},week:{labelUnit:"month",tickUnit:"day",unitPerTick:1,dragStepUnit:"hour",dragStepAmount:6,basePxPerDragStep:54,formatTickLabel:t=>t.format("D"),formatHeaderLabel:t=>t.format("MMM YYYY")},month:{labelUnit:"month",tickUnit:"day",unitPerTick:1,dragStepUnit:"day",dragStepAmount:1,basePxPerDragStep:32,formatTickLabel:t=>t.format("D"),formatHeaderLabel:t=>t.format("MMM YYYY")},quarter:{labelUnit:"quarter",tickUnit:"month",unitPerTick:1,dragStepUnit:"day",dragStepAmount:3,basePxPerDragStep:24,formatTickLabel:t=>t.format("MMM"),formatHeaderLabel:t=>`Q${gr(t)} ${t.format("YYYY")}`},year:{labelUnit:"year",tickUnit:"month",unitPerTick:1,dragStepUnit:"day",dragStepAmount:7,basePxPerDragStep:28,formatTickLabel:t=>t.format("MMM"),formatHeaderLabel:t=>t.format("YYYY")}},Gn=t=>{let n;const r=new Set,s=(u,c)=>{const d=typeof u=="function"?u(n):u;if(!Object.is(d,n)){const f=n;n=c??(typeof d!="object"||d===null)?d:Object.assign({},n,d),r.forEach(h=>h(n,f))}},o=()=>n,a={setState:s,getState:o,getInitialState:()=>l,subscribe:u=>(r.add(u),()=>r.delete(u))},l=n=t(s,o,a);return a},Cs=(t=>t?Gn(t):Gn),js=t=>t;function zs(t,n=js){const r=b.useSyncExternalStore(t.subscribe,b.useCallback(()=>n(t.getState()),[t,n]),b.useCallback(()=>n(t.getInitialState()),[t,n]));return b.useDebugValue(r),r}const yr=b.createContext(null);function xr(){const t=b.useContext(yr);if(!t)throw new Error("Gantt store is missing. Render this component inside <ReactGanttChart>.");return t}function ht(t){return zs(xr(),t)}function At(){return xr()}function Mt(t){return t.type==="milestone"}function Pe(t){return typeof t!="number"||Number.isNaN(t)?null:Math.min(100,Math.max(0,t))}const wr={};function Et(t,n=wr){const r=(o,e)=>o!==void 0?o:t.readOnly!==void 0?!t.readOnly:e!==void 0?e:!n.readOnly,s=t.isSummary===!0;return{canMove:r(t.allowMove,n.allowMove),canResize:!Mt(t)&&!s&&r(t.allowResize,n.allowResize),canChangeProgress:!s&&r(t.allowProgressChange,n.allowProgressChange),canCreateLink:r(t.allowLinkCreate,n.allowLinkCreate),canDeleteLink:r(t.allowLinkDelete,n.allowLinkDelete),minDate:t.minDate??n.minDate,maxDate:t.maxDate??n.maxDate}}function Fs(t=wr){return t.allowTaskCreate??!t.readOnly}function Ys(t){const n=t==null?void 0:t.trim();return n?{"--gantt-bar-color":n,"--gantt-bar-color-hover":`color-mix(in srgb, ${n} 86%, #000)`,"--gantt-progress-color":`color-mix(in srgb, ${n} 62%, #000)`}:{}}const jt="day",Vn=366,Ws=18263,Us="YYYY-MM-DD",Hs=[1,2,3,4,5];function rn(t){const n=t?o=>!t(o):()=>!0,r=(o,e)=>{if(!e||!t)return o.add(e,jt);const i=e>0?1:-1;let a=Math.abs(e),l=o,u=Math.abs(e)+Vn*Math.abs(e);for(;a>0;)if(l=l.add(i,jt),n(l)&&a--,u--<=0)return o.add(e,jt);return l},s=(o,e)=>{const i=o.startOf(jt),a=e.startOf(jt),l=a.diff(i,jt);if(!t||l===0||Math.abs(l)>Ws)return l;const u=l>0?1:-1;let c=u>0?i:a;const d=u>0?a:i;let f=0;for(;c.valueOf()<d.valueOf();)c=c.add(1,jt),n(c)&&f++;return f===0?0:f*u};return{skipsNonWorkingDays:t!==null,isWorkingDay:n,addDays:r,daysBetween:s,daysUntil(o,e){let i=s(o,e);const a=e.valueOf();for(let l=0;l<2&&r(o,i).valueOf()<a;l++)i++;for(let l=0;l<2&&r(o,i-1).valueOf()>=a;l++)i--;return i},daysUpTo(o,e){let i=s(o,e);const a=e.valueOf();for(let l=0;l<2&&r(o,i).valueOf()>a;l++)i--;for(let l=0;l<2&&r(o,i+1).valueOf()<=a;l++)i++;return i},snapForward(o){if(!t||n(o))return o;let e=o;for(let i=0;i<Vn;i++)if(e=e.add(1,jt),n(e))return e;return o}}}const Jt=rn(null);function $r(t={}){const{isNonWorkingDay:n,holidays:r}=t;if(n)return rn(n);const s=new Set(t.workingWeekdays??Hs),o=new Set(r??[]);return rn(e=>!s.has(e.day())||o.has(e.format(Us)))}function Kt(t){return`${t.predecessorId}>${t.successorId}:${t.type}`}function Zt(t){var c;const n=new Map(t.map(d=>[d.id,d])),r=[],s=new Map,o=new Map,e=(d,f,h)=>{const m=d.get(f);m?m.push(h):d.set(f,[h])};for(const d of t)for(const f of d.dependencies??[]){if(f.targetId===d.id||!n.has(f.targetId))continue;const h={predecessorId:f.targetId,successorId:d.id,type:f.type,lag:f.lag??0};r.push(h),e(s,h.successorId,h),e(o,h.predecessorId,h)}const i=new Map;for(const d of t)i.set(d.id,((c=s.get(d.id))==null?void 0:c.length)??0);const a=t.filter(d=>!i.get(d.id)).map(d=>d.id),l=[];for(let d=0;d<a.length;d++){const f=a[d];l.push(f);for(const h of o.get(f)??[]){const m=(i.get(h.successorId)??0)-1;i.set(h.successorId,m),m===0&&a.push(h.successorId)}}const u=l.length===t.length?null:t.map(d=>d.id).filter(d=>(i.get(d)??0)>0);return{byId:n,links:r,incoming:s,outgoing:o,order:l,cycle:u}}function Dr(t,n,r){if(n===r)return[n];const{outgoing:s}=Zt(t),o=new Map,e=new Set([n]),i=[n];for(let a=0;a<i.length;a++){const l=i[a];for(const u of s.get(l)??[]){const c=u.successorId;if(!e.has(c)){if(e.add(c),o.set(c,l),c===r){const d=[c];let f=l;for(;f;)d.unshift(f),f=o.get(f);return d}i.push(c)}}}return null}function Xs(t,n,r){if(n===r)return{ok:!1,cycle:[n,r]};const s=Dr(t,r,n);return s?{ok:!1,cycle:[...s,r]}:{ok:!0,cycle:null}}function _e(t){return R(t.startDate)}function ae(t){return Mt(t)?R(t.startDate):R(t.endDate)}function Ne(t,n){return t.type==="FS"||t.type==="FF"?ae(n):_e(n)}function Mr(t,n){return t.type==="FS"||t.type==="SS"?_e(n):ae(n)}function Gs(t,n,r,s){const o=s.addDays(Ne(t,n),t.lag);return s.daysUntil(Mr(t,r),o)}function Vs(t,n,r){return n?{...t,startDate:r.addDays(R(t.startDate),n).toISOString(),endDate:r.addDays(R(t.endDate),n).toISOString()}:t}function Ir(t,n={}){const{policy:r="off",calendar:s=Jt,seeds:o,hierarchy:e=!1,onCycle:i}=n;if(r==="off"||t.length===0)return{tasks:t,movedIds:[],cycle:null};const a=Zt(t);a.cycle&&(i==null||i(a.cycle));const l=Ks(a,o),u=new Set(o??[]);if(e)for(const f of t)f.parentId&&u.add(f.parentId);const c=new Map(a.byId),d=new Map;for(const f of a.order){if(l&&!l.has(f)||u.has(f))continue;const h=c.get(f);if(!h||h.manuallyScheduled)continue;const m=a.incoming.get(f);if(!(m!=null&&m.length))continue;let p=-1/0;for(const S of m){const v=c.get(S.predecessorId);v&&(p=Math.max(p,Gs(S,v,h,s)))}if(!Number.isFinite(p)||(r==="shift-on-overlap"&&(p=Math.max(0,p)),p===0))continue;const y=Vs(h,p,s);c.set(f,y),d.set(f,y)}return d.size?{tasks:t.map(f=>d.get(f.id)??f),movedIds:[...d.keys()],cycle:a.cycle}:{tasks:t,movedIds:[],cycle:a.cycle}}function Ks(t,n){if(!n)return null;const r=[...n],s=new Set(r);for(let o=0;o<r.length;o++)for(const e of t.outgoing.get(r[o])??[])s.has(e.successorId)||(s.add(e.successorId),r.push(e.successorId));return s}function Bs(t,n){return t.type==="FS"||t.type==="SS"?n.start:n.finish}function qs(t,n){return t.type==="FS"||t.type==="SS"?n.start:n.finish}function sn(t,n,r){return{start:r.addDays(_e(t),n),finish:r.addDays(ae(t),n),shift:n}}function Or(t,n=Jt,r=Zt(t)){const s=new Map;for(const o of r.order){const e=r.byId.get(o);if(!e)continue;let i=0;for(const a of r.incoming.get(o)??[]){const l=r.byId.get(a.predecessorId),u=s.get(a.predecessorId);if(!l||!u)continue;const c=n.addDays(n.addDays(Ne(a,l),u.shift),a.lag);i=Math.max(i,n.daysUntil(Mr(a,e),c))}s.set(o,sn(e,i,n))}for(const o of t)s.has(o.id)||s.set(o.id,sn(o,0,n));return s}function Er(t,n,r=Jt,s=Zt(t),o){const e=new Map,i=o??[...n.values()].reduce((a,l)=>!a||l.finish.valueOf()>a.valueOf()?l.finish:a,null);if(!i)return e;for(let a=s.order.length-1;a>=0;a--){const l=s.order[a],u=s.byId.get(l);if(!u)continue;let c=1/0;for(const d of s.outgoing.get(l)??[]){const f=e.get(d.successorId);f&&(c=Math.min(c,r.daysUpTo(Ne(d,u),Bs(d,f))-d.lag))}Number.isFinite(c)||(c=r.daysUpTo(ae(u),i)),e.set(l,sn(u,c,r))}return e}function Tr(t,n={}){const r=n.calendar??Jt,s=Zt(t),o=new Map,e=new Set,i=new Set;if(!t.length)return{metrics:o,criticalTaskIds:e,criticalLinkIds:i,cycle:s.cycle,projectFinish:null};const a=Or(t,r,s),l=Er(t,a,r,s),u=new Map;for(const d of s.links){const f=s.byId.get(d.predecessorId),h=a.get(d.predecessorId),m=a.get(d.successorId);!f||!h||!m||u.set(Kt(d),r.daysUpTo(Ne(d,f),qs(d,m))-d.lag-h.shift)}for(const d of s.order){const f=s.byId.get(d),h=a.get(d),m=l.get(d);if(!f||!h||!m)continue;const p=m.shift-h.shift,y=s.outgoing.get(d)??[],S=y.length?Math.max(0,Math.min(...y.map(D=>u.get(Kt(D))??0))):p,v=Pe(f.progress)===100,x=p===0&&!v;x&&e.add(d),o.set(d,{earlyStart:h.start.toISOString(),earlyFinish:h.finish.toISOString(),lateStart:m.start.toISOString(),lateFinish:m.finish.toISOString(),totalSlack:p,freeSlack:S,critical:x,duration:r.daysBetween(_e(f),ae(f))})}for(const d of s.links)e.has(d.predecessorId)&&e.has(d.successorId)&&u.get(Kt(d))===0&&i.add(Kt(d));const c=[...a.values()].reduce((d,f)=>!d||f.finish.valueOf()>d.valueOf()?f.finish:d,null);return{metrics:o,criticalTaskIds:e,criticalLinkIds:i,cycle:s.cycle,projectFinish:(c==null?void 0:c.toISOString())??null}}function zt(t){const n=new Map(t.map(a=>[a.id,a])),r=new Map,s=new Map,o=new Map,e=[],i=a=>{const l=a.parentId;if(!l||l===a.id||!n.has(l))return null;const u=new Set([a.id]);let c=n.get(l);for(;c;){if(u.has(c.id))return null;if(u.add(c.id),!c.parentId)break;c=n.get(c.parentId)}return l};for(const a of t)r.set(a.id,i(a));for(const a of t){const l=r.get(a.id);if(!l){e.push(a.id);continue}const u=s.get(l);u?u.push(a.id):s.set(l,[a.id])}for(const a of t){let l=0,u=r.get(a.id)??null;for(;u;)l++,u=r.get(u)??null;o.set(a.id,l)}return{childIds:s,parentOf:r,depthOf:o,rootIds:e}}function Qt(t,n,r=zt(t)){if(!r.parentOf.has(n))return[];const s=[n];for(let o=0;o<s.length;o++){const e=r.childIds.get(s[o]);e&&s.push(...e)}return s}function Js(t,n,r=zt(t)){const s=n instanceof Set?n:new Set(n);if(!s.size)return t;const o=e=>{let i=r.parentOf.get(e)??null;for(;i;){if(s.has(i))return!0;i=r.parentOf.get(i)??null}return!1};return t.filter(e=>!o(e.id))}function Zs(t){let n=0,r=0,s=0,o=!1;for(const i of t){const a=Pe(i.progress);a!==null&&(o=!0);const l=a??0,u=Math.max(0,R(i.endDate).valueOf()-R(i.startDate).valueOf());n+=l*u,r+=u,s+=l}if(!o)return;const e=r>0?n/r:s/t.length;return Math.round(e)}function kr(t,n=zt(t)){if(!n.childIds.size)return t;const r=new Map(t.map(i=>[i.id,i])),s=[...n.childIds.keys()].filter(i=>r.has(i)).sort((i,a)=>(n.depthOf.get(a)??0)-(n.depthOf.get(i)??0)),o=new Map,e=i=>o.get(i)??r.get(i);for(const i of s){const a=r.get(i);if(!a)continue;const l=(n.childIds.get(i)??[]).map(e).filter(d=>d!==void 0);if(!l.length)continue;let u=1/0,c=-1/0;for(const d of l){const f=R(d.startDate).valueOf(),h=Mt(d)?f:R(d.endDate).valueOf();Number.isNaN(f)||(u=Math.min(u,f)),Number.isNaN(h)||(c=Math.max(c,h))}!Number.isFinite(u)||!Number.isFinite(c)||o.set(i,{...a,startDate:R(u).toISOString(),endDate:R(c).toISOString(),progress:a.progress??Zs(l)})}return o.size?t.map(i=>o.get(i.id)??i):t}const Lr=200;function ke(t,n){return`${t==="progress"?"progress":"dates"}:${n}`}function Ar({type:t,taskId:n,changedIds:r,previous:s,next:o,edge:e}){const i=new Set(r),a=new Map(s.map(c=>[c.id,c])),l=o.filter(c=>i.has(c.id)),u=l.map(c=>a.get(c.id)).filter(c=>c!==void 0);return{type:t,task:o.find(c=>c.id===n)??l[0],changedTasks:l,previousTasks:u,tasks:o,edge:e}}function Qs(){const t=new Map;return{begin(n){const r=(t.get(n)??0)+1;return t.set(n,r),r},async settle(n,r,s,o){let e;try{e=await s(o)===!1}catch{e=!0}return t.get(n)!==r?"stale":e?"rollback":"commit"}}}const to=400,eo=10;function hn(t,n,r=document){if(t.pointerType==="mouse")return n(t.clientX,t.clientY),null;let s=t.clientX,o=t.clientY,e;const i=()=>{e!==void 0&&clearTimeout(e),e=void 0,r.removeEventListener("pointermove",a),r.removeEventListener("pointerup",l),r.removeEventListener("pointercancel",l)};function a(u){const c=u;if(c.pointerId!==t.pointerId)return;if(Math.abs(c.clientX-t.clientX)+Math.abs(c.clientY-t.clientY)>eo){i();return}s=c.clientX,o=c.clientY}function l(u){u.pointerId===t.pointerId&&i()}return r.addEventListener("pointermove",a),r.addEventListener("pointerup",l),r.addEventListener("pointercancel",l),e=setTimeout(()=>{i(),n(s,o)},to),i}function mn(t=document){const n=r=>r.preventDefault();return t.addEventListener("touchmove",n,{passive:!1}),()=>t.removeEventListener("touchmove",n)}const Bt={year:"numeric",month:"short",day:"numeric"},Le={year:"numeric",month:"short"},on={year:"numeric"},an={hour:"2-digit",minute:"2-digit",hourCycle:"h23"},no={hour:an,day:{hour:"2-digit",hourCycle:"h23"},week:{day:"numeric"},month:{day:"numeric"},quarter:{month:"short"},year:{month:"short"}},ro={hour:Bt,day:Bt,week:Le,month:Le,quarter:on,year:on},so={hour:{...Bt,...an,timeZoneName:"short"},day:{...Bt,...an,timeZoneName:"short"},week:Bt,month:Bt,quarter:Le,year:Le},Kn=new Set;function Oe(t,n){const r=new Intl.DateTimeFormat(t,{timeZone:"UTC",...n});return s=>r.format(s.toDate())}function oo(t){const n=Oe(t,on);return r=>{const s=n(r),o=`Q${gr(r)}`;return/\d$/.test(s)?`${o} ${s}`:`${s} ${o}`}}function Pr(t,n){return t==="week"&&(n==null?void 0:n.firstDayOfWeek)!==void 0?"week":pt[t].labelUnit}function le(t,n){var a;const r=(a=n==null?void 0:n.formats)==null?void 0:a[t],s=Pr(t,n)==="week"?"day":t,o=pt[t],e=pt[s],i=n!=null&&n.locale?io(n.locale,t,s):null;return{tick:(r==null?void 0:r.tick)??(i==null?void 0:i.tick)??(l=>{var u;return((u=o.formatTickLabel)==null?void 0:u.call(o,l))??""}),header:(r==null?void 0:r.header)??(i==null?void 0:i.header)??(l=>{var u;return((u=e.formatHeaderLabel)==null?void 0:u.call(e,l))??l.format()}),tooltip:(r==null?void 0:r.tooltip)??(i==null?void 0:i.tooltip)??(l=>l.format(Rs[t]))}}function io(t,n,r){try{return{tick:Oe(t,no[n]),header:r==="quarter"?oo(t):Oe(t,ro[r]),tooltip:Oe(t,so[n])}}catch{return Kn.has(t)||(Kn.add(t),console.warn(`[gantt-chart] Unusable locale "${t}" - falling back to the built-in labels.`)),null}}const qt=Object.keys(pt),ao={minute:6e4,hour:36e5,day:864e5,week:6048e5};function lo(t){const{basePxPerDragStep:n,dragStepUnit:r,dragStepAmount:s}=pt[t];return n/(s*ao[r])}function co(t,n){const r=qt.indexOf(t);if(r===-1)return t;const s=Math.min(qt.length-1,Math.max(0,r+n));return qt[s]}function uo(t,n){for(const r of qt)if(t*lo(r)<=n)return r;return qt[qt.length-1]}const fo=24,ho=120,mo={delta:0,lastEventAt:0,locked:!1};function go(t,n,r){const s=r-t.lastEventAt>=ho;if(!s&&t.locked)return{state:{delta:0,lastEventAt:r,locked:!0},step:0};const o=(s?0:t.delta)+n;return Math.abs(o)<fo?{state:{delta:o,lastEventAt:r,locked:!1},step:0}:{state:{delta:0,lastEventAt:r,locked:!0},step:Math.sign(o)}}const po=48,vo=22;function So(t,n,r,s=po,o=vo){const e=r-n;if(e<=0)return 0;const i=Math.min(s,e/2);return i<=0?0:t<n+i?-o*Math.min(1,(n+i-t)/i):t>r-i?o*Math.min(1,(t-(r-i))/i):0}const ln={before:0,after:0},$e=2e3;function bo({current:t,scrollLeft:n,viewportPx:r,totalPx:s,pxPerTick:o,canExtend:e}){if(o<=0||r<=0)return null;const i=Math.max(1,Math.ceil(r/o)),a=r/2;return(e==null?void 0:e.before)!==!1&&n<=a&&t.before<$e?{...t,before:Math.min($e,t.before+i)}:(e==null?void 0:e.after)!==!1&&s-(n+r)<=a&&t.after<$e?{...t,after:Math.min($e,t.after+i)}:null}function Bn(t){return t.split(".").map(Number)}function gn(t){return[...t].sort((n,r)=>{const s=Bn(n.sequence),o=Bn(r.sequence),e=Math.max(s.length,o.length);for(let i=0;i<e;i++){const a=s[i]||0,l=o[i]||0;if(a!==l)return a-l}return 0})}function yo(t){return t.split(".").length-1}function xo(t,n,r,s){return gn(t).map((e,i)=>{var h;const a=s?s.depthOf.get(e.id)??0:yo(e.sequence),l=(((h=s==null?void 0:s.childIds.get(e.id))==null?void 0:h.length)??0)>0,u=i+1,{barMarginLeftAmount:c,barWidthSize:d}=cn(R(e.startDate),Mt(e)?R(e.startDate):R(e.endDate),n,r),f=e.baselineStart?cn(R(e.baselineStart),Mt(e)||!e.baselineEnd?R(e.baselineStart):R(e.baselineEnd),n,r):null;return{...e,barLeft:c,barWidth:d,baselineLeft:f==null?void 0:f.barMarginLeftAmount,baselineWidth:f==null?void 0:f.barWidthSize,depth:a,isSummary:l,order:u,originalOrder:u}})}function wo(t,n,r){if(!t.length||!n.length)return 0;const s=t[0].startDate,o=n[0].startDate,e=s.valueOf()-o.valueOf();return e===0?0:e>0?Ut(s,n,r)??0:-(Ut(o,t,r)??0)}function $o(t,n,r){const{tickUnit:s}=pt[n];if(s!=="day"&&s!=="hour")return[];const o=[];let e=0,i=!1;for(const a of t){const l=r(a.startDate);l&&(i?o[o.length-1].width+=a.widthPx:o.push({left:e,width:a.widthPx})),i=l,e+=a.widthPx}return o}function Wt(t,n,r){const{dragStepUnit:s,dragStepAmount:o}=pt[r];return t.add(n*o,s)}function Ee(t,n,r){const{dragStepUnit:s,dragStepAmount:o,basePxPerDragStep:e}=pt[r];return n.diff(t,s,!0)/o*e}function pn(t,n,r,s,o){const{min:e,max:i}=s;if(!e&&!i)return{startDate:n,endDate:r};if(t==="bar"){let u=n,c=r;if(i&&c.valueOf()>i.valueOf()){const d=c.valueOf()-i.valueOf();u=u.subtract(d,"millisecond"),c=i}if(e&&u.valueOf()<e.valueOf()){const d=e.valueOf()-u.valueOf();u=e,c=c.add(d,"millisecond")}return{startDate:u,endDate:c}}if(t==="left"){let u=n;e&&u.valueOf()<e.valueOf()&&(u=e),i&&u.valueOf()>i.valueOf()&&(u=i);const c=Wt(r,-1,o);return u.valueOf()>c.valueOf()&&(u=c),{startDate:u,endDate:r}}let a=r;i&&a.valueOf()>i.valueOf()&&(a=i),e&&a.valueOf()<e.valueOf()&&(a=e);const l=Wt(n,1,o);return a.valueOf()<l.valueOf()&&(a=l),{startDate:n,endDate:a}}function _r(t,n,r){const s=Math.min(0,n),o=Math.max(0,n);let e=n;for(const i of t){const{startDate:a}=pn("bar",i.start.add(n,"millisecond"),i.end.add(n,"millisecond"),i.bounds,r),l=Math.min(o,Math.max(s,a.valueOf()-i.start.valueOf()));Math.abs(l)<Math.abs(e)&&(e=l)}return e}function cn(t,n,r,s){if(!r.length)return{barMarginLeftAmount:0,barWidthSize:0};const o=pt[s],{tickUnit:e,unitPerTick:i}=o;let a=0,l=0,u=!1;const c=t.valueOf(),d=n.valueOf();for(const f of r){const h=f.startDate,m=h.add(i,e),p=f.widthPx,y=h.valueOf(),S=m.valueOf();if(S<=c){a+=p;continue}if(y>=d)break;const v=c>y?t:h,x=d<S?n:m,D=S-y,P=(x.valueOf()-v.valueOf())/D;if(!u&&v.valueOf()>y){const k=(v.valueOf()-y)/D;a+=k*p}l+=P*p,u=!0}return{barMarginLeftAmount:a,barWidthSize:Math.max(l,1)}}function Ut(t,n,r){if(!n.length)return null;const{tickUnit:s,unitPerTick:o}=pt[r],e=t.valueOf();if(e<n[0].startDate.valueOf())return null;let i=0;for(const a of n){const l=a.startDate.valueOf(),u=a.startDate.add(o,s).valueOf();if(e<u)return i+(e-l)/(u-l)*a.widthPx;i+=a.widthPx}return null}function Do(t,n,r){if(!n.length||t<0)return null;const{tickUnit:s,unitPerTick:o}=pt[r];let e=0;for(const i of n){if(t<e+i.widthPx){const a=i.startDate.valueOf(),l=i.startDate.add(o,s).valueOf()-a,u=i.widthPx>0?(t-e)/i.widthPx:0;return R(a+u*l)}e+=i.widthPx}return null}function Nr(t,n){if(!t.length)return null;const{tickUnit:r,unitPerTick:s}=pt[n],o=t[t.length-1];return{start:t[0].startDate,end:o.startDate.add(s,r)}}function Mo(t,n,r,s=[]){const o=[];for(const e of t){const i=R(e.date);if(!i.isValid())continue;const a=Ut(i,n,r);if(a===null)continue;const l=i.valueOf(),u=e.warnOnOverrun===!0&&s.some(c=>(!e.taskIds||e.taskIds.includes(c.id))&&R(c.endDate).valueOf()>l);o.push({marker:e,leftPx:a,overrun:u})}return o}function qn(t,n){if(t<=0)return 0;let r=0;for(let s=0;s<n.length;s++)if(r+=n[s].widthPx,t<r)return s;return n.length-1}function Io(t,n,r){const s=Nr(n,r);if(!s)return[];const o=s.start.valueOf(),e=s.end.valueOf(),i=[];for(const a of t){const l=R(a.startDate),u=R(a.endDate);if(!l.isValid()||!u.isValid()||u.valueOf()<=o||l.valueOf()>=e||u.valueOf()<=l.valueOf())continue;const{barMarginLeftAmount:c,barWidthSize:d}=cn(l,u,n,r);i.push({band:a,leftPx:c,widthPx:d})}return i}function Oo(t,n,r,s){if(!r.length)return null;const{tickUnit:o,unitPerTick:e}=pt[s],i=qn(Math.min(t,n),r),a=qn(Math.max(t,n),r);let l=0;for(let c=0;c<i;c++)l+=r[c].widthPx;let u=0;for(let c=i;c<=a;c++)u+=r[c].widthPx;return{startDate:r[i].startDate,endDate:r[a].startDate.add(e,o),leftPx:l,widthPx:u}}function Eo(t){let n=1/0,r=-1/0;for(const s of t){const o=[s.startDate,s.baselineStart],e=[s.endDate,s.baselineEnd];for(const i of o){const a=i?R(i).valueOf():NaN;Number.isNaN(a)||(n=Math.min(n,a))}for(const i of e){const a=i?R(i).valueOf():NaN;Number.isNaN(a)||(r=Math.max(r,a))}}return{minDate:R(n),maxDate:R(r)}}function To(t,n,r,s){const o=pt[r],{tickUnit:e,unitPerTick:i}=o,a=Ls*i;return{paddedMinDate:t.subtract(a+s.before*i,e),paddedMaxDate:n.add(a+s.after*i,e)}}function ko(t,n,r){const s=pt[r],{tickUnit:o,unitPerTick:e,basePxPerDragStep:i,dragStepUnit:a,dragStepAmount:l}=s,u=[];let c=t.startOf(o);const d=n.valueOf(),f=i/l;for(;c.valueOf()<d;){const h=c.add(e,o),p=h.diff(c,a)*f;u.push({startDate:c,widthPx:p}),c=h}return u}function Lo(t,n,r){return n==="quarter"?Os(t):n==="week"?Es(t,r):t.startOf(n)}function Ao(t,n,r){const s=Pr(n,r),{header:o}=le(n,r);if(t.length===0)return[];const e=[];let i=null;for(const a of t){const l=Lo(a.startDate,s,r==null?void 0:r.firstDayOfWeek),u=l.valueOf(),c=o(l);i&&i.startDate.valueOf()===u?i.widthPx+=a.widthPx:(i&&e.push(i),i={label:c,widthPx:a.widthPx,startDate:l})}return i&&e.push(i),e}function Po(t,n,r,s=!1,o=ln){const e=r==null?void 0:r.start,i=r==null?void 0:r.end;if(!t.length&&!(e&&i))return{bottomCells:[],transformedTasks:[]};const a=s?zt(t):void 0,l=a?kr(t,a):t;let u=e,c=i;if(!u||!c){const{minDate:h,maxDate:m}=Eo(l),{paddedMinDate:p,paddedMaxDate:y}=To(h,m,n,o);u=u??p,c=c??y}const d=ko(u,c,n),f=xo(l,d,n,a);return{bottomCells:d,transformedTasks:f}}function _o(t,n){return t.map(r=>{const s=n.get(r.id);return s?{...r,startDate:s.start.toISOString(),endDate:s.end.toISOString()}:r})}function un(t,n,r){return Ir(_o(t,n),{policy:r.policy,calendar:r.calendar,hierarchy:r.hierarchy,seeds:[...n.keys()],onCycle:r.onCycle})}function No(t,n,r,s){const o=un(t,n,s);if(!o.movedIds.length)return{offsets:{},ids:[]};const e=new Map(t.map(l=>[l.id,l])),i=new Map(o.tasks.map(l=>[l.id,l])),a={};for(const l of o.movedIds){const u=e.get(l),c=i.get(l);if(!u||!c)continue;const d=R(c.startDate);a[l]={offsetX:Ee(R(u.startDate),d,r),offsetWidth:0,offsetStartDate:d,offsetEndDate:R(c.endDate)}}return{offsets:a,ids:o.movedIds}}function Jn(t,n){return!t&&!n?null:{min:t?R(t):void 0,max:n?R(n):void 0}}function Ro(t,n={},r,s){const o=At(),e=b.useRef(null),i=b.useRef(null),a=b.useRef(!1),l=b.useRef(null),u=b.useRef(n);u.current=n,b.useEffect(()=>()=>{var D;return(D=l.current)==null?void 0:D.call(l)},[]);const c=ht(D=>D.selectedScale),{basePxPerDragStep:d}=pt[c],{canMove:f,canResize:h,minDate:m,maxDate:p}=Et(t,r),y=D=>{const T=D.currentTarget.getBoundingClientRect(),P=D.pointerType!=="mouse",k=P?vr:Te,A=P?_s:Sr;if(h&&T.width>=A){const w=D.clientX-T.left;if(w<=k)return"left";if(w>=T.width-k)return"right"}return f?"bar":null},S=D=>{var w;if(!D.isPrimary||D.button!==0||e.current)return;(w=l.current)==null||w.call(l),l.current=null;const T=y(D);if(!T)return;const P=D.currentTarget,{pointerId:k,pointerType:A}=D;l.current=hn({pointerType:A,pointerId:k,clientX:D.clientX,clientY:D.clientY},g=>{l.current=null,v(T,k,A,g,P)})},v=(D,T,P,k,A)=>{i.current=D,a.current=!1;const w=A.closest(".gantt-scroll-container"),g=o.getState().rawTasks,j=t.isSummary?Qt(g,t.id):[t.id],X=new Set(j),q=new Map(g.filter(M=>X.has(M.id)).map(M=>[M.id,{start:R(M.startDate),end:R(M.endDate)}]));q.set(t.id,{start:R(t.startDate),end:R(t.endDate)});const C=Jn(m,p),E=[];for(const M of g){if(!X.has(M.id))continue;const G=q.get(M.id);if(!G)continue;const U=Et(M,r),ct=M.id===t.id?C:Jn(U.minDate,U.maxDate);ct&&E.push({start:G.start,end:G.end,bounds:ct})}e.current={mode:D,pointerId:T,initialClientX:k,initialStartDate:R(t.startDate),initialEndDate:R(t.endDate),initialBarWidth:t.barWidth,dragSteps:0,basePxPerDragStep:d,lastClientX:k,autoScrollPx:0,scaleKey:c,taskId:t.id,taskIds:j,initialDates:q,previewIds:[],snapDays:0,gateToken:null,bounds:C,boundedMembers:E,moveDeltaMs:null,clamped:null},o.getState().setCurrentTask(t),A.focus({preventScroll:!0});try{A.setPointerCapture(T)}catch{}const I=P==="mouse"?null:mn(),N=()=>{const M=e.current;if(!M)return;const G=M.lastClientX-M.initialClientX+M.autoScrollPx,U=Math.round(G/M.basePxPerDragStep),ct=Math.floor((M.initialBarWidth-M.basePxPerDragStep)/M.basePxPerDragStep);let it=U;if(M.mode==="left"&&(it=Math.min(U,ct)),M.mode==="right"&&(it=Math.max(U,-ct)),it===M.dragSteps)return;M.dragSteps=it,a.current=!0,M.gateToken===null&&(M.gateToken=o.getState().mutationGate.begin(ke("move",M.taskId)));const $t=it*M.basePxPerDragStep,bt=z=>Wt(z,it,M.scaleKey);let nt,at,St=0,mt=0;switch(M.mode){case"bar":nt=bt(M.initialStartDate),at=bt(M.initialEndDate),St=$t,mt=0;break;case"left":nt=bt(M.initialStartDate),at=M.initialEndDate,St=$t,mt=-$t;break;case"right":nt=M.initialStartDate,at=bt(M.initialEndDate),St=0,mt=$t;break;default:return}let ft=0;if(s!=null&&s.calendar.skipsNonWorkingDays){const z=M.mode==="right"?at:nt,B=s.calendar.snapForward(z);ft=B.diff(z,"day"),M.mode==="left"&&B.valueOf()>=at.valueOf()&&(ft=0)}M.snapDays=ft;const It=ft?Ee(nt,nt.add(ft,"day"),M.scaleKey):0;if(ft&&(M.mode!=="right"&&(nt=nt.add(ft,"day"),St+=It),M.mode!=="left"&&(at=at.add(ft,"day")),M.mode==="left"&&(mt-=It),M.mode==="right"&&(mt+=It)),M.mode==="bar"){if(M.boundedMembers.length){const z=nt.valueOf()-M.initialStartDate.valueOf(),B=_r(M.boundedMembers,z,M.scaleKey);M.moveDeltaMs=B,nt=M.initialStartDate.add(B,"millisecond"),at=M.initialEndDate.add(B,"millisecond")}}else if(M.bounds){const z=pn(M.mode,nt,at,M.bounds,M.scaleKey);M.clamped=z,nt=z.startDate,at=z.endDate}if(M.moveDeltaMs!==null||M.clamped){const z=Ee(M.initialStartDate,nt,M.scaleKey),B=Ee(M.initialEndDate,at,M.scaleKey);St=z,mt=B-z}const Ot=M.moveDeltaMs!==null?z=>z.add(M.moveDeltaMs,"millisecond"):z=>bt(z).add(ft,"day"),Tt=M.moveDeltaMs!==null?St:$t+It,Dt={},V=new Map;for(const z of M.taskIds){const B=M.initialDates.get(z),J=z===M.taskId||!B,Y=J?nt:Ot(B.start),Pt=J?at:Ot(B.end);Dt[z]={offsetX:J?St:Tt,offsetWidth:J?mt:0,offsetStartDate:Y,offsetEndDate:Pt},V.set(z,{start:Y,end:Pt})}if(s&&s.policy!=="off"){const z=No(o.getState().rawTasks,V,M.scaleKey,s),B=M.previewIds.filter(J=>!(J in z.offsets));M.previewIds=z.ids,B.length&&o.getState().clearDragOffsets(B),Object.assign(Dt,z.offsets)}o.getState().setDragOffsets(Dt)};let L=null,F=0;const W=()=>{L!==null&&cancelAnimationFrame(L),L=null,F=0},K=M=>{!w||!M.autoScrollPx||(w.scrollBy({left:-M.autoScrollPx,behavior:"smooth"}),M.autoScrollPx=0)},tt=()=>{L=null;const M=e.current;if(!M||!w||F===0)return;const G=w.scrollLeft;w.scrollLeft=G+F;const U=w.scrollLeft-G;U!==0&&(M.autoScrollPx+=U,N()),L=requestAnimationFrame(tt)},et=M=>{if(u.current.autoScroll===!1||!w)return;const G=w.getBoundingClientRect(),U=w.querySelector(".gantt-grid");F=So(M,G.left+((U==null?void 0:U.offsetWidth)??0),G.right),F===0?W():L===null&&(L=requestAnimationFrame(tt))},st=M=>{const G=e.current;!G||M.pointerId!==G.pointerId||(G.lastClientX=M.clientX,et(M.clientX),N())},dt=()=>{W(),document.removeEventListener("pointermove",st),document.removeEventListener("pointerup",ot),document.removeEventListener("pointercancel",vt),I==null||I()},lt=M=>{K(M),e.current=null,i.current=null,o.getState().setCurrentTask(null),o.getState().clearDragOffsets([...M.taskIds,...M.previewIds])},vt=M=>{const G=e.current;G&&M.pointerId!==G.pointerId||(dt(),G&&lt(G))},ot=M=>{var B,J;const G=e.current;if(G&&M.pointerId!==G.pointerId)return;dt();const U=G;if(!U)return;if(U.dragSteps===0){lt(U);return}const ct=o.getState().rawTasks,it=Y=>U.moveDeltaMs!==null?R(Y).add(U.moveDeltaMs,"millisecond").toISOString():Wt(R(Y),U.dragSteps,U.scaleKey).add(U.snapDays,"day").toISOString(),$t=(B=U.clamped)==null?void 0:B.startDate.toISOString(),bt=(J=U.clamped)==null?void 0:J.endDate.toISOString(),nt=new Set(U.taskIds),at=ct.map(Y=>{if(!nt.has(Y.id))return Y;switch(U.mode){case"bar":return{...Y,startDate:it(Y.startDate),endDate:it(Y.endDate)};case"left":return{...Y,startDate:$t??it(Y.startDate)};case"right":return{...Y,endDate:bt??it(Y.endDate)};default:return Y}}),St=new Map(at.filter(Y=>nt.has(Y.id)).map(Y=>[Y.id,{start:R(Y.startDate),end:R(Y.endDate)}])),mt=s!==void 0&&s.policy!=="off",ft=mt?un(at,St,s):null,It=ft?ft.tasks:at,Ot=Ar({type:U.mode==="bar"?"move":"resize",taskId:U.taskId,changedIds:ft?[...new Set([...U.taskIds,...ft.movedIds])]:U.taskIds,previous:ct,next:It,edge:U.mode==="left"?"start":U.mode==="right"?"end":void 0}),Tt=()=>{var te,ce;const Y=o.getState().rawTasks,Pt=mt?un(Y,St,s).tasks:(()=>{const ue=new Map(Ot.changedTasks.map(_t=>[_t.id,_t]));return Y.map(_t=>ue.get(_t.id)??_t)})();o.getState().commitTasks(Pt),(ce=(te=u.current).onTasksChange)==null||ce.call(te,Pt)},Dt=[...new Set([...U.taskIds,...U.previewIds])],V=()=>{K(U);const Y=o.getState();Y.beginRevert(Dt),Y.clearDragOffsets(Dt),setTimeout(()=>o.getState().endRevert(Dt),Lr)};e.current=null,i.current=null,o.getState().setCurrentTask(null);const z=u.current.onBeforeTaskChange;if(!z||U.gateToken===null){Tt();return}o.getState().mutationGate.settle(ke("move",U.taskId),U.gateToken,z,Ot).then(Y=>{Y==="commit"?Tt():Y==="rollback"&&V()})};document.addEventListener("pointermove",st),document.addEventListener("pointerup",ot),document.addEventListener("pointercancel",vt)},x=()=>a.current?(a.current=!1,!0):!1;return{onPointerDown:S,dragMode:i.current,consumeDragClick:x}}const dn={offsetX:0,offsetWidth:0};function Co(t,n,r,s,o){if(r<0||o<0)return`M ${n} ${r} h ${(s-n)/2}`;const e=7,i=11,a=25,l=20,u=`M ${n} ${r}`,c=s-n,d=o-r,f=Math.abs(c),h=Math.abs(d),m=o<=r,p=o>=r,y=s>=n,S=s<=n,v=f>l,x=Math.abs(c/2),D=Math.abs(d/2);function T(){function w(){return(y||S)&&p&&!v?"downSmallHorizontal":(y||S)&&m&&!v?"upSmallHorizontal":p&&S?"downLeft":p&&y?"downRight":m&&S?"upLeft":m&&y?"upRight":""}let g=u;switch(w()){case"downRight":{g+=` h ${x-e}`,g+=` a ${e} ${e} 0 0 1 ${e} ${e}`,g+=` v ${d-e*2}`,g+=` a ${e} ${e} 0 0 0 ${e} ${e}`,g+=` h ${x-e}`;break}case"upRight":{g+=` h ${x-e}`,g+=` a ${e} ${e} 0 0 0 ${e} -${e}`,g+=` v -${h-e*2}`,g+=` a ${e} ${e} 0 0 1 ${e} -${e}`,g+=` h ${x-e}`;break}case"downLeft":case"downSmallHorizontal":{const X=r+d/2;g+=` h ${i}`,g+=` a ${e} ${e} 0 0 1 ${e} ${e}`,g+=` v ${X-r-e*2}`,g+=` a ${e} ${e} 0 0 1 -${e} ${e}`,g+=` h ${c-2*i}`,g+=` a ${e} ${e} 0 0 0 -${e} ${e}`,g+=` v ${X-r-e*2}`,g+=` a ${e} ${e} 0 0 0 ${e} ${e}`,g+=` h ${i}`;break}case"upLeft":case"upSmallHorizontal":{const X=r+d/2;g+=` h ${i}`,g+=` a ${e} ${e} 0 0 0 ${e} -${e}`,g+=` v -${r-X-e*2}`,g+=` a ${e} ${e} 0 0 0 -${e} -${e}`,g+=` h ${c-2*i}`,g+=` a ${e} ${e} 0 0 1 -${e} -${e}`,g+=` v -${r-X-e*2}`,g+=` a ${e} ${e} 0 0 1 ${e} -${e}`,g+=` h ${i}`;break}default:return g}return g}function P(){let w=u;return p&&S?(w+=` h ${a-i}`,w+=` a ${e} ${e} 0 0 1 ${e} ${e}`,w+=` v ${d-e*2}`,w+=` a ${e} ${e} 0 0 1 -${e} ${e}`,w+=` h ${c-e*2}`):p&&y?(w+=` h ${c+a-i}`,w+=` a ${e} ${e} 0 0 1 ${e} ${e}`,w+=` v ${d-e*2}`,w+=` a ${e} ${e} 0 0 1 -${e} ${e}`,w+=` h -${a-i}`):m&&S?(w+=` h ${a-i}`,w+=` a ${e} ${e} 0 0 0 ${e} -${e}`,w+=` v ${d+e*2}`,w+=` a ${e} ${e} 0 0 0 -${e} -${e}`,w+=` h ${c-a+i}`):m&&y&&(w+=` h ${c+a-i}`,w+=` a ${e} ${e} 0 0 0 ${e} -${e}`,w+=` v ${d+e*2}`,w+=` a ${e} ${e} 0 0 0 -${e} -${e}`,w+=` h -${a-i}`),w}function k(){function w(){return(y||S)&&p&&!v?"downSmallHorizontal":(y||S)&&m&&!v?"upSmallHorizontal":p&&S?"downLeft":p&&y?"downRight":m&&S?"upLeft":m&&y?"upRight":""}let g=u;switch(w()){case"downRight":case"downSmallHorizontal":{g+=` h ${-i}`,g+=` a ${e} ${e} 0 0 0 -${e} ${e}`,g+=` v ${D-e*2}`,g+=` a ${e} ${e} 0 0 0 ${e} ${e}`,g+=` h ${i*2+c}`,g+=` a ${e} ${e} 0 0 1 ${e} ${e}`,g+=` v ${D-e*2}`,g+=` a ${e} ${e} 0 0 1 -${e} ${e}`,g+=` h ${-i}`;break}case"upRight":case"upSmallHorizontal":{g+=` h ${-i}`,g+=` a ${e} ${e} 0 0 1 -${e} -${e}`,g+=` v ${-(D-e*2)}`,g+=` a ${e} ${e} 0 0 1 ${e} -${e}`,g+=` h ${i*2+c}`,g+=` a ${e} ${e} 0 0 0 ${e} -${e}`,g+=` v ${-(D-e*2)}`,g+=` a ${e} ${e} 0 0 0 -${e} -${e}`,g+=` h ${-i}`;break}case"downLeft":{g+=` h ${-x+e}`,g+=` a ${e} ${e} 0 0 0 -${e} ${e}`,g+=` v ${h-e*2}`,g+=` a ${e} ${e} 0 0 1 -${e} ${e}`,g+=` h ${-x+e}`;break}case"upLeft":{g+=` h ${-(x-e)}`,g+=` a ${e} ${e} 0 0 1 -${e} -${e}`,g+=` v ${-(h-e*2)}`,g+=` a ${e} ${e} 0 0 0 -${e} -${e}`,g+=` h ${-x+e}`;break}default:return g}return g}function A(){let w=u;return p&&S?(w+=` h ${c-a}`,w+=` a ${e} ${e} 0 0 0 -${e} ${e}`,w+=` v ${d-e*2}`,w+=` a ${e} ${e} 0 0 0 ${e} ${e}`,w+=` h ${a}`):p&&y?(w+=` h ${-a}`,w+=` a ${e} ${e} 0 0 0 -${e} ${e}`,w+=` v ${d-e*2}`,w+=` a ${e} ${e} 0 0 0 ${e} ${e}`,w+=` h ${c+a}`):m&&S?(w+=` h ${c-a}`,w+=` a ${e} ${e} 0 0 1 -${e} -${e}`,w+=` v ${d+e*2}`,w+=` a ${e} ${e} 0 0 1 ${e} -${e}`,w+=` h ${a}`):m&&y&&(w+=` h ${-a}`,w+=` a ${e} ${e} 0 0 1 -${e} -${e}`,w+=` v ${d+e*2}`,w+=` a ${e} ${e} 0 0 1 ${e} -${e}`,w+=` h ${c+a}`),w}switch(t){case"FS":return T();case"FF":return P();case"SF":return k();case"SS":return A();default:return`${u} L ${s} ${o}`}}function fn(t,n){const r=Mt(t)?br:0,s=t.barLeft+n.offsetX;return{startX:s-r,endX:r?s+r:s+t.barWidth+n.offsetWidth}}function jo(t,n,r=dn){const{startX:s,endX:o}=fn(t,r);return{x:n==="start"?s:o,y:(t.order-1)*wt+wt/2}}function zo(t,n,r,s,o){const e=wt,i=t.order-1,a=n.order-1,l=e/2,u=a*e+l,c=i*e+l,d=fn(n,s),f=fn(t,r),m={FS:[d.endX,f.startX],SS:[d.startX,f.startX],FF:[d.endX,f.endX],SF:[d.startX,f.endX]}[o];if(!m)return null;const[p,y]=m;return{fromX:p,fromY:u,toX:y,toY:c}}function Fo(t){return new Map(t.map(n=>[n.id,n]))}const De=32;function Yo(t,n){const r=Math.min(t.fromY,t.toY)-De;if(Math.max(t.fromY,t.toY)+De<n.topPx||r>n.bottomPx)return!1;const o=Math.min(t.fromX,t.toX)-De,e=Math.max(t.fromX,t.toX)+De;return n.isBarVisible(o,e-o)}function Wo(t,n,r){const s=[];for(const o of t.values()){const e=n[o.id]??dn;for(const i of o.dependencies??[]){const a=t.get(i.targetId);if(!a)continue;const l=zo(o,a,e,n[a.id]??dn,i.type);l&&s.push({...i,sourceId:o.id,...l,critical:r==null?void 0:r.has(Kt({predecessorId:a.id,successorId:o.id,type:i.type,lag:i.lag??0}))})}}return s}function Uo(t,n){const r=s=>s==="end"?"F":"S";return`${r(t)}${r(n)}`}function Ho(t,n,r){var a;if(n===r)return"self";const s=new Map(t.map(l=>[l.id,l])),o=(a=s.get(r))==null?void 0:a.dependencies;if(o!=null&&o.some(l=>l.targetId===n))return"duplicate";const e=new Set([n]),i=[n];for(;i.length;){const l=s.get(i.pop());for(const u of(l==null?void 0:l.dependencies)??[]){if(u.targetId===r)return"cycle";e.has(u.targetId)||(e.add(u.targetId),i.push(u.targetId))}}return null}const Xo={self:"Cannot link a task to itself",duplicate:"These tasks are already linked",cycle:"That would create a circular dependency"};function Go(t,n,r,s){let o=!1;const e=t.map(i=>i.id!==r?i:(o=!0,{...i,dependencies:[...i.dependencies??[],{targetId:n,type:s}]}));return o?e:t}function Vo(t,n,r){let s=!1;const o=t.map(e=>{if(e.id!==r||!e.dependencies)return e;const i=e.dependencies.filter(a=>a.targetId!==n);return i.length===e.dependencies.length?e:(s=!0,{...e,dependencies:i})});return s?o:t}function Ko({task:t,interaction:n,onTasksChange:r,onDependencyCreate:s}){const o=At(),e=b.useRef(null);return{startLink:a=>l=>{if(!l.isPrimary||l.button!==0||e.current!==null)return;l.stopPropagation(),l.preventDefault();const u=l.currentTarget.closest(".gantt-content");if(!u)return;const c=l.pointerId;e.current=c;const d=jo(t,a),f=o.getState();f.setSelectedDependency(null),f.setLinkDraft({fromTaskId:t.id,fromAnchor:a,fromX:d.x,fromY:d.y,toX:d.x,toY:d.y,hoverTaskId:null,hoverAnchor:null,rejection:null});const h=x=>{var g;if(x.pointerId!==c)return;const D=u.getBoundingClientRect(),T=(g=document.elementFromPoint(x.clientX,x.clientY))==null?void 0:g.closest("[data-task-id]"),P=(T==null?void 0:T.dataset.taskId)??null;let k=null,A=null,w=null;if(T&&P){const j=o.getState().rawTasks,X=j.find(C=>C.id===P);if(P===t.id||X!==void 0&&Et(X,n).canCreateLink){k=P;const C=(T.querySelector(".gantt-milestone-diamond")??T).getBoundingClientRect();A=x.clientX<C.left+C.width/2?"start":"end",w=Ho(j,t.id,P)}}o.getState().setLinkDraft({fromTaskId:t.id,fromAnchor:a,fromX:d.x,fromY:d.y,toX:x.clientX-D.left,toY:x.clientY-D.top,hoverTaskId:k,hoverAnchor:A,rejection:w})},m=()=>{document.removeEventListener("pointermove",h),document.removeEventListener("pointerup",v),document.removeEventListener("pointercancel",y),document.removeEventListener("keydown",S)},p=()=>{m(),e.current=null,o.getState().setLinkDraft(null)},y=x=>{x.pointerId===c&&p()},S=x=>{x.key==="Escape"&&p()},v=x=>{if(x.pointerId!==c)return;const D=o.getState().linkDraft;if(p(),!(D!=null&&D.hoverTaskId)||!D.hoverAnchor||D.rejection)return;const T={predecessorId:D.fromTaskId,successorId:D.hoverTaskId,type:Uo(D.fromAnchor,D.hoverAnchor)};if((s==null?void 0:s(T))===!1)return;const P=Go(o.getState().rawTasks,T.predecessorId,T.successorId,T.type);o.getState().commitTasks(P),r==null||r(P)};document.addEventListener("pointermove",h),document.addEventListener("pointerup",v),document.addEventListener("pointercancel",y),document.addEventListener("keydown",S)}}}function Bo(t,n,r={}){const s=At(),[o,e]=b.useState(null),i=b.useRef(null),a=b.useRef(null);b.useEffect(()=>()=>{var h;return(h=a.current)==null?void 0:h.call(a)},[]);const l=h=>{const m=n.current;if(!m)return null;const p=m.getBoundingClientRect();if(p.width===0)return null;const y=(h-p.left)/p.width;return Math.round(Math.min(1,Math.max(0,y))*100)},{onTasksChange:u,onBeforeTaskChange:c}=r,d=h=>{var p;h.stopPropagation(),h.preventDefault(),(p=a.current)==null||p.call(a),a.current=null;const{pointerType:m}=h;a.current=hn({pointerType:m,pointerId:h.pointerId,clientX:h.clientX,clientY:h.clientY},()=>{a.current=null,f(m)})},f=h=>{const m=h==="mouse"?null:mn();let p=null;const y=v=>{const x=l(v.clientX);x!==null&&(p===null&&(p=s.getState().mutationGate.begin(ke("progress",t.id))),i.current=x,e({percent:x,pending:!1}))},S=()=>{document.removeEventListener("pointermove",y),document.removeEventListener("pointerup",S),document.removeEventListener("pointercancel",S),m==null||m();const v=i.current;if(i.current=null,v===null){e(null);return}const x=s.getState().rawTasks,D=x.map(A=>A.id===t.id?{...A,progress:v}:A),T=Ar({type:"progress",taskId:t.id,changedIds:[t.id],previous:x,next:D}),P=()=>{const A=T.changedTasks[0],w=s.getState().rawTasks.map(g=>g.id===(A==null?void 0:A.id)?A:g);s.getState().commitTasks(w),e(null),u==null||u(w)},k=()=>{s.getState().beginRevert([t.id]),e(null),setTimeout(()=>s.getState().endRevert([t.id]),Lr)};if(!c||p===null){P();return}e({percent:v,pending:!0}),s.getState().mutationGate.settle(ke("progress",t.id),p,c,T).then(A=>{A==="commit"?P():A==="rollback"&&k()})};document.addEventListener("pointermove",y),document.addEventListener("pointerup",S),document.addEventListener("pointercancel",S)};return{onProgressPointerDown:d,progress:(o==null?void 0:o.percent)??Pe(t.progress),isDraggingProgress:o!==null&&!o.pending}}const Zn=5,Qe=(t,n)=>Math.min(Math.max(t,0),Math.max(n,0));function qo(t,n,r){var l;const s=r[n.row];if(!s)return null;const o=r.length-1,e=Qe(n.col,s.cells-1),i=t.key==="ArrowRight"?1:-1;if((t.key==="ArrowLeft"||t.key==="ArrowRight")&&(t.altKey||t.shiftKey)){const u=t.altKey?t.shiftKey?"left":"bar":"right";return{kind:"nudge",row:n.row,col:e,mode:u,steps:i}}switch(t.key){case"ArrowDown":return{kind:"focus",focus:{row:Math.min(n.row+1,o),col:e}};case"ArrowUp":return{kind:"focus",focus:{row:Math.max(n.row-1,0),col:e}};case"ArrowRight":return e===0&&s.expandable&&!s.expanded?{kind:"toggle",row:n.row,col:e}:{kind:"focus",focus:{row:n.row,col:Qe(e+1,s.cells-1)}};case"ArrowLeft":return e===0&&s.expandable&&s.expanded?{kind:"toggle",row:n.row,col:e}:{kind:"focus",focus:{row:n.row,col:Qe(e-1,s.cells-1)}};case"Home":return t.ctrlKey||t.metaKey?{kind:"focus",focus:{row:0,col:0}}:{kind:"focus",focus:{row:n.row,col:0}};case"End":{const u=t.ctrlKey||t.metaKey?o:n.row;return{kind:"focus",focus:{row:u,col:Math.max((((l=r[u])==null?void 0:l.cells)??1)-1,0)}}}case"Enter":case" ":return s.expandable?{kind:"toggle",row:n.row,col:e}:{kind:"activate",row:n.row,col:e};case"Delete":case"Backspace":return{kind:"delete",row:n.row,col:e};case"+":case"=":return{kind:"progress",row:n.row,col:e,delta:Zn};case"-":case"_":return{kind:"progress",row:n.row,col:e,delta:-Zn};default:return null}}function Jo(t,n,r){if(!(!t||!t.tasks.length))return t.tasks[Math.max(0,n-r)]??t.tasks[0]}function Rr(t,n,r=null){const s=[t.name];return Mt(t)?s.push("milestone",n(R(t.startDate))):(t.isSummary&&s.push("summary"),s.push(`${n(R(t.startDate))} to ${n(R(t.endDate))}`)),r!==null&&s.push(`${r}% complete`),s.join(", ")}function Cr(t,n,r){var s;return{role:"row","aria-level":t.level,"aria-posinset":t.posinset,"aria-setsize":t.setsize,"aria-rowindex":n+1+r.headerOffset,...r.expandable?{"aria-expanded":r.expanded}:null,...(s=r.ownedIds)!=null&&s.length?{"aria-owns":r.ownedIds.join(" ")}:null}}function Qn(t,n){return!t&&!n?null:{min:t?R(t):void 0,max:n?R(n):void 0}}function Zo(t,n,r,s,o,e){const{canMove:i,canResize:a,minDate:l,maxDate:u}=Et(n,e);if((r==="bar"?!i:!a)||!s)return null;const c=new Set(n.isSummary&&r==="bar"?Qt(t,n.id):[n.id]),d=Qn(l,u),f=R(n.startDate),h=R(n.endDate);let m=r==="right"?f:Wt(f,s,o),p=r==="left"?h:Wt(h,s,o),y=null;if(r==="bar"){const v=[];for(const x of t){if(!c.has(x.id))continue;const D=Et(x,e),T=x.id===n.id?d:Qn(D.minDate,D.maxDate);T&&v.push({start:x.id===n.id?f:R(x.startDate),end:x.id===n.id?h:R(x.endDate),bounds:T})}if(v.length){if(y=_r(v,m.valueOf()-f.valueOf(),o),y===0)return null;m=f.add(y,"millisecond"),p=h.add(y,"millisecond")}}else if(d){const v=pn(r,m,p,d,o);m=v.startDate,p=v.endDate}if(r!=="bar"&&!p.isAfter(m)||r==="left"&&m.valueOf()===f.valueOf()||r==="right"&&p.valueOf()===h.valueOf())return null;const S=v=>y!==null?R(v).add(y,"millisecond").toISOString():Wt(R(v),s,o).toISOString();return t.map(v=>{if(!c.has(v.id))return v;switch(r){case"bar":return{...v,startDate:S(v.startDate),endDate:S(v.endDate)};case"left":return{...v,startDate:m.toISOString()};default:return{...v,endDate:p.toISOString()}}})}function Qo(t,n,r,s){if(!Et(n,s).canChangeProgress)return null;const o=Pe(n.progress);if(o===null)return null;const e=Math.min(100,Math.max(0,o+r));return e===o?null:t.map(i=>i.id===n.id?{...i,progress:e}:i)}function ti(t,n,r){if(!Et(n,r).canMove)return null;const s=new Set(Qt(t,n.id));if(!s.size)return null;const o=t.filter(e=>!s.has(e.id));return o.length===t.length?null:o}const ei={};function ni(t){const n=Math.max(0,Math.round(t/36e5));return n<24?`${n}h`:`${Math.round(n/24)}d`}function ri({currentTask:t,options:n=ei,interaction:r,tabIndex:s=-1,cellCoord:o,scheduling:e,autoScrollOnDrag:i=!0,onDependencyCreate:a}){const{onTasksChange:l,onBeforeTaskChange:u,onTaskClick:c,onTaskDoubleClick:d,renderBar:f,renderTooltip:h,showTooltip:m=!0}=n,p=b.useRef(null),{onPointerDown:y,dragMode:S,consumeDragClick:v}=Ro(t,{onTasksChange:l,onBeforeTaskChange:u,autoScroll:i},r,e),{canMove:x,canResize:D,canChangeProgress:T,canCreateLink:P}=Et(t,r),[k,A]=b.useState(!1),[w,g]=b.useState(!1),{startLink:j}=Ko({task:t,interaction:r,onTasksChange:l,onDependencyCreate:a}),X=ht(V=>{const z=V.linkDraft;return!z||z.hoverTaskId!==t.id?null:z.rejection?"invalid":"valid"}),q=X?` link-target ${X}`:"",C=P&&$.jsx($.Fragment,{children:["start","end"].map(V=>$.jsx("span",{className:`gantt-link-handle ${V}`,onPointerDown:j(V),role:"button",tabIndex:-1,"aria-label":`Link from the ${V} of ${t.name}`},V))}),E=ht(V=>V.dragOffsets[t.id]),I=ht(V=>{var z;return((z=V.currentTask)==null?void 0:z.id)===t.id}),N=ht(V=>V.selectedScale),L=ht(V=>V.localeOptions),F=ht(V=>V.selectedTaskId===t.id),W=ht(V=>V.revertingIds.includes(t.id)),K=(E==null?void 0:E.offsetX)??0,tt=(E==null?void 0:E.offsetWidth)??0,et=t.barLeft+K,st=Math.max(t.barWidth+tt,As),dt=st<Ps,lt=Mt(t),{onProgressPointerDown:vt,progress:ot,isDraggingProgress:M}=Bo(t,p,{onTasksChange:l,onBeforeTaskChange:u}),G=!lt&&ot!==null,U=b.useCallback(V=>{const z=p.current;if(!z)return;const B=z.getBoundingClientRect();if(B.width<Sr){A(!1);return}const J=V.clientX-B.left;A(J<=Te||J>=B.width-Te)},[]),ct=V=>{v()||c==null||c(t,V)},it=V=>{d==null||d(t,V)},$t=x?"grab":"default",bt=I?x||D?"grabbing":$t:k&&D?"ew-resize":$t,{tooltip:nt}=b.useMemo(()=>le(N,L),[N,L]),at=Rr(t,nt,G?ot:null),St=V=>{if(!E)return"";const z=nt(E.offsetStartDate),B=nt(E.offsetEndDate);if(lt)return z;switch(V){case"left":return`Start: ${z}`;case"right":return`End: ${B}`;case"bar":default:return`${z} → ${B}`}},mt=m?M?"progress":I&&E?S==="left"||S==="right"?"resize":"move":w?"hover":null:null,ft=()=>{if(!mt)return null;const V=mt!=="hover",z=V&&E?E.offsetStartDate:R(t.startDate),B=lt?z:V&&E?E.offsetEndDate:R(t.endDate);return h?h({task:t,reason:mt,startDate:z,endDate:B,durationMs:B.valueOf()-z.valueOf(),progress:ot,scale:N}):mt==="progress"?$.jsxs("div",{className:"gantt-bar-tooltip",role:"status","aria-live":"polite",children:[ot,"%"]}):V?$.jsx("div",{className:"gantt-bar-tooltip",role:"status","aria-live":"polite",children:St(S)}):$.jsxs("div",{className:"gantt-bar-tooltip gantt-bar-tooltip-detail",role:"tooltip",children:[$.jsx("span",{className:"gantt-tooltip-name",children:t.name}),$.jsx("span",{className:"gantt-tooltip-meta",children:lt?nt(z):`${nt(z)} → ${nt(B)}`}),!lt&&$.jsxs("span",{className:"gantt-tooltip-meta",children:[ni(B.valueOf()-z.valueOf()),ot!==null?` · ${ot}%`:""]})]})},It=Ys(t.color),Ot=lt?{transform:`translateX(${et-br}px)`,height:wt/2,cursor:bt,...It}:{transform:`translateX(${et}px)`,width:st,height:wt/2,cursor:bt,...It};if(f)return $.jsx($.Fragment,{children:f({task:t,left:et,width:st,height:wt/2,progress:ot,scale:N,isMilestone:lt,isSummary:!!t.isSummary,isDragging:I,isSelected:F,barProps:{style:Ot,onPointerDown:y,onClick:ct,onDoubleClick:it}})});const Tt=[F?"selected":"",W?"reverting":"",t.className??""].filter(Boolean).join(" "),Dt=Tt?` ${Tt}`:"";return lt?$.jsxs("div",{ref:p,id:`task-${t.id}`,"data-task-id":t.id,className:`gantt-milestone${I?" dragging":""}${t.critical?" critical":""}${q}${Dt}`,onPointerDown:y,onClick:ct,onDoubleClick:it,onMouseEnter:()=>g(!0),onMouseLeave:()=>g(!1),style:Ot,role:"gridcell",tabIndex:s,"data-gantt-cell":o,"aria-label":at,children:[$.jsx("div",{className:"gantt-milestone-diamond"}),$.jsx("span",{className:"gantt-milestone-name",children:t.name}),C,ft()]}):$.jsxs("div",{ref:p,id:`task-${t.id}`,"data-task-id":t.id,className:`gantt-task-bar${I?" dragging":""}${dt?" compact":""}${t.isSummary?" summary":""}${D?"":" no-resize"}${t.critical?" critical":""}${q}${Dt}`,onPointerDown:y,onClick:ct,onDoubleClick:it,onMouseMove:U,onMouseEnter:()=>g(!0),onMouseLeave:()=>{A(!1),g(!1)},style:Ot,role:"gridcell",tabIndex:s,"data-gantt-cell":o,"aria-label":at,children:[G&&$.jsxs($.Fragment,{children:[$.jsx("div",{className:"gantt-progress-fill",style:{width:`${ot}%`}}),T&&$.jsx("div",{className:`gantt-progress-handle${M?" dragging":""}`,style:{left:`${ot}%`},onPointerDown:vt,role:"slider",tabIndex:-1,"aria-label":`${t.name} progress`,"aria-valuemin":0,"aria-valuemax":100,"aria-valuenow":ot})]}),$.jsx("span",{className:`gantt-task-name${dt?" outside":""}`,children:t.name}),C,ft()]})}function si(t,n,r){const s=new Array(t);return new Proxy(s,{get(o,e,i){if(typeof e=="string"){const a=e.charCodeAt(0);if(a>=48&&a<=57){const l=+e;if(Number.isInteger(l)&&l>=0&&l<t){let u=o[l];if(!u){const c=n[l*2];u=o[l]={index:l,key:r(l),start:c,size:n[l*2+1],end:c+n[l*2+1],lane:0}}return u}}if(e==="length")return t}return Reflect.get(o,e,i)}})}function Vt(t,n,r){let s=r.initialDeps??[],o,e=!0;function i(){var a;const l=process.env.NODE_ENV!=="production"&&!!r.key&&!!((a=r.debug)!=null&&a.call(r));let u=0;l&&(u=Date.now());const c=t();if(!(c.length!==s.length||c.some((h,m)=>s[m]!==h)))return o;s=c;let f=0;if(l&&(f=Date.now()),o=n(...c),l){const h=Math.round((Date.now()-u)*100)/100,m=Math.round((Date.now()-f)*100)/100,p=m/16,y=(S,v)=>{for(S=String(S);S.length<v;)S=" "+S;return S};console.info(`%c⏱ ${y(m,5)} /${y(h,5)} ms`,`
2
+ font-size: .6rem;
3
+ font-weight: bold;
4
+ color: hsl(${Math.max(0,Math.min(120-120*p,120))}deg 100% 31%);`,r==null?void 0:r.key)}return r!=null&&r.onChange&&!(e&&r.skipInitialOnChange)&&r.onChange(o),e=!1,o}return i.updateDeps=a=>{s=a},i}function tr(t,n){if(t===void 0)throw new Error("Unexpected undefined");return t}const oi=(t,n)=>Math.abs(t-n)<1.01,ii=(t,n,r)=>{let s;return Object.assign(function(...o){t.clearTimeout(s),s=t.setTimeout(()=>n.apply(this,o),r)},{cancel:()=>{t.clearTimeout(s)}})};let re;const tn=()=>{if(re!==void 0)return re;if(typeof navigator>"u")return re=!1;if(/iP(hone|od|ad)/.test(navigator.userAgent))return re=!0;const t=navigator.maxTouchPoints;return re=navigator.platform==="MacIntel"&&t!==void 0&&t>0},er=t=>{const{offsetWidth:n,offsetHeight:r}=t;return{width:n,height:r}},ai=t=>t,vn=t=>{const n=Math.max(t.startIndex-t.overscan,0),s=Math.min(t.endIndex+t.overscan,t.count-1)-n+1,o=new Array(s);for(let e=0;e<s;e++)o[e]=n+e;return o},li=(t,n)=>{const r=t.scrollElement;if(!r)return;const s=t.targetWindow;if(!s)return;const o=i=>{const{width:a,height:l}=i;n({width:Math.round(a),height:Math.round(l)})};if(o(er(r)),!s.ResizeObserver)return()=>{};const e=new s.ResizeObserver(i=>{const a=()=>{const l=i[0];if(l!=null&&l.borderBoxSize){const u=l.borderBoxSize[0];if(u){o({width:u.inlineSize,height:u.blockSize});return}}o(er(r))};t.options.useAnimationFrameWithResizeObserver?requestAnimationFrame(a):a()});return e.observe(r,{box:"border-box"}),()=>{e.unobserve(r)}},Ae={passive:!0},ci=typeof window>"u"?!0:"onscrollend"in window,ui=(t,n,r)=>{const s=t.scrollElement;if(!s)return;const o=t.targetWindow;if(!o)return;const e=t.options.useScrollendEvent&&ci;let i=0;const a=e?null:ii(o,()=>n(i,!1),t.options.isScrollingResetDelay),l=d=>()=>{i=r(s),a==null||a(),n(i,d)},u=l(!0),c=l(!1);return s.addEventListener("scroll",u,Ae),e&&s.addEventListener("scrollend",c,Ae),()=>{s.removeEventListener("scroll",u),e&&s.removeEventListener("scrollend",c),a==null||a.cancel()}},di=(t,n)=>ui(t,n,r=>{const{horizontal:s,isRtl:o}=t.options;return s?r.scrollLeft*(o&&-1||1):r.scrollTop}),fi=(t,n,r)=>{if(r.options.useCachedMeasurements){const s=r.indexFromElement(t),o=r.options.getItemKey(s);return r.itemSizeCache.get(o)??r.options.estimateSize(s)}if(n!=null&&n.borderBoxSize){const s=n.borderBoxSize[0];if(s)return Math.round(s[r.options.horizontal?"inlineSize":"blockSize"])}if(!n){const s=r.indexFromElement(t),o=r.options.getItemKey(s),e=r.itemSizeCache.get(o);if(e!==void 0)return e}return t[r.options.horizontal?"offsetWidth":"offsetHeight"]},hi=(t,{adjustments:n=0,behavior:r},s)=>{var o,e;(e=(o=s.scrollElement)==null?void 0:o.scrollTo)==null||e.call(o,{[s.options.horizontal?"left":"top"]:t+n,behavior:r})},mi=hi;class gi{constructor(n){this.unsubs=[],this.scrollElement=null,this.targetWindow=null,this.isScrolling=!1,this.scrollState=null,this.measurementsCache=[],this._flatMeasurements=null,this.itemSizeCache=new Map,this.itemSizeCacheVersion=0,this.laneAssignments=new Map,this.pendingMin=null,this.prevLanes=void 0,this.lanesChangedFlag=!1,this.lanesSettling=!1,this.pendingScrollAnchor=null,this.scrollRect=null,this.scrollOffset=null,this.scrollDirection=null,this.scrollAdjustments=0,this._iosDeferredAdjustment=0,this._iosTouching=!1,this._iosJustTouchEnded=!1,this._iosTouchEndTimerId=null,this._intendedScrollOffset=null,this.elementsCache=new Map,this.now=()=>{var r,s,o;return((o=(s=(r=this.targetWindow)==null?void 0:r.performance)==null?void 0:s.now)==null?void 0:o.call(s))??Date.now()},this.observer=(()=>{let r=null;const s=()=>r||(!this.targetWindow||!this.targetWindow.ResizeObserver?null:r=new this.targetWindow.ResizeObserver(o=>{o.forEach(e=>{const i=()=>{const a=e.target,l=this.indexFromElement(a);if(!a.isConnected){this.observer.unobserve(a);for(const[u,c]of this.elementsCache)if(c===a){this.elementsCache.delete(u);break}return}this.isIndexInRange(l)&&this.shouldMeasureDuringScroll(l)&&this.resizeItem(l,this.options.measureElement(a,e,this))};this.options.useAnimationFrameWithResizeObserver?requestAnimationFrame(i):i()})}));return{disconnect:()=>{var o;(o=s())==null||o.disconnect(),r=null},observe:o=>{var e;return(e=s())==null?void 0:e.observe(o,{box:"border-box"})},unobserve:o=>{var e;return(e=s())==null?void 0:e.unobserve(o)}}})(),this.range=null,this.setOptions=r=>{var s,o;const e={debug:!1,initialOffset:0,overscan:1,paddingStart:0,paddingEnd:0,scrollPaddingStart:0,scrollPaddingEnd:0,horizontal:!1,getItemKey:ai,rangeExtractor:vn,onChange:()=>{},measureElement:fi,initialRect:{width:0,height:0},scrollMargin:0,gap:0,indexAttribute:"data-index",initialMeasurementsCache:[],lanes:1,anchorTo:"start",followOnAppend:!1,scrollEndThreshold:1,isScrollingResetDelay:150,enabled:!0,isRtl:!1,useScrollendEvent:!1,useAnimationFrameWithResizeObserver:!1,laneAssignmentMode:"estimate",useCachedMeasurements:!1};for(const f in r){const h=r[f];h!==void 0&&(e[f]=h)}const i=this.options;let a=null,l=null,u=!1;if(i!==void 0&&i.enabled&&e.enabled&&e.anchorTo==="end"&&this.scrollElement!==null){const f=i.count,h=e.count,m=this.getMeasurements(),p=f>0?((s=m[0])==null?void 0:s.key)??i.getItemKey(0):null,y=f>0?((o=m[f-1])==null?void 0:o.key)??i.getItemKey(f-1):null;if(h!==f||f>0&&h>0&&(e.getItemKey(0)!==p||e.getItemKey(h-1)!==y)){u=!0;const x=f>0?this.getVirtualItemForOffset(this.getScrollOffset())??m[0]:null;x&&(a=[x.key,this.getScrollOffset()-x.start]);const D=e.followOnAppend===!0?"auto":e.followOnAppend||null;D&&h>f&&this.isAtEnd(i.scrollEndThreshold)&&(f===0||e.getItemKey(h-1)!==y)&&(l=D)}}this.options=e,u&&(this.pendingMin=0,this.itemSizeCacheVersion++);let c=!1,d=0;if(a&&this.scrollOffset!==null){const[f,h]=a,m=this.getMeasurements(),{count:p,getItemKey:y}=this.options;let S=0;for(;S<p&&y(S)!==f;)S++;if(S<p){const v=m[S];if(v){const x=Math.max(0,v.start+h);x!==this.scrollOffset&&(d=x-this.scrollOffset,this.scrollOffset=x,c=!0)}}}(c||l)&&(this.pendingScrollAnchor=[c?a[0]:null,c?a[1]:0,l,d])},this.notify=r=>{var s,o;(o=(s=this.options).onChange)==null||o.call(s,this,r)},this.maybeNotify=Vt(()=>(this.calculateRange(),[this.isScrolling,this.range?this.range.startIndex:null,this.range?this.range.endIndex:null]),r=>{this.notify(r)},{key:process.env.NODE_ENV!=="production"&&"maybeNotify",debug:()=>this.options.debug,initialDeps:[this.isScrolling,this.range?this.range.startIndex:null,this.range?this.range.endIndex:null]}),this.cleanup=()=>{this.unsubs.filter(Boolean).forEach(r=>r()),this.unsubs=[],this.observer.disconnect(),this.rafId!=null&&this.targetWindow&&(this.targetWindow.cancelAnimationFrame(this.rafId),this.rafId=null),this.scrollState=null,this.isScrolling=!1,this.scrollDirection=null,this._iosDeferredAdjustment=0,this._iosTouching=!1,this._iosJustTouchEnded=!1,this.scrollElement=null,this.targetWindow=null},this._didMount=()=>()=>{this.cleanup()},this._willUpdate=()=>{var r;const s=this.options.enabled?this.options.getScrollElement():null;if(this.scrollElement!==s){if(this.cleanup(),!s){this.maybeNotify();return}if(this.scrollElement=s,this.scrollElement&&"ownerDocument"in this.scrollElement?this.targetWindow=this.scrollElement.ownerDocument.defaultView:this.targetWindow=((r=this.scrollElement)==null?void 0:r.window)??null,this.elementsCache.forEach(e=>{this.observer.observe(e)}),this.unsubs.push(this.options.observeElementRect(this,e=>{this.scrollRect=e,this.maybeNotify()})),this.unsubs.push(this.options.observeElementOffset(this,(e,i)=>{if(i&&this._intendedScrollOffset===null&&e===this.scrollOffset)return;this._intendedScrollOffset!==null&&Math.abs(e-this._intendedScrollOffset)<1.5&&(e=this._intendedScrollOffset),this._intendedScrollOffset=null,this.scrollAdjustments=0;const a=this.getScrollOffset();this.scrollDirection=i?a===e?this.scrollDirection:a<e?"forward":"backward":null,this.scrollOffset=e,this.isScrolling=i,this._flushIosDeferredIfReady(),this.scrollState&&this.scheduleScrollReconcile(),this.maybeNotify()})),"addEventListener"in this.scrollElement){const e=this.scrollElement,i=()=>{this._iosTouching=!0,this._iosJustTouchEnded=!1,this._iosTouchEndTimerId!==null&&this.targetWindow!=null&&(this.targetWindow.clearTimeout(this._iosTouchEndTimerId),this._iosTouchEndTimerId=null)},a=()=>{this._iosTouching=!1,!(!tn()||this.targetWindow==null)&&(this._iosJustTouchEnded=!0,this._iosTouchEndTimerId=this.targetWindow.setTimeout(()=>{this._iosJustTouchEnded=!1,this._iosTouchEndTimerId=null,this._flushIosDeferredIfReady()},150))};e.addEventListener("touchstart",i,Ae),e.addEventListener("touchend",a,Ae),this.unsubs.push(()=>{e.removeEventListener("touchstart",i),e.removeEventListener("touchend",a),this._iosTouchEndTimerId!==null&&this.targetWindow!=null&&(this.targetWindow.clearTimeout(this._iosTouchEndTimerId),this._iosTouchEndTimerId=null)})}this._scrollToOffset(this.getScrollOffset(),{adjustments:void 0,behavior:void 0})}const o=this.pendingScrollAnchor;if(this.pendingScrollAnchor=null,o&&this.scrollElement&&this.options.enabled){const[e,i,a,l]=o;e!==null&&!a&&(tn()&&(this.isScrolling||this._iosTouching||this._iosJustTouchEnded)?l!==0&&(this._iosDeferredAdjustment+=l):this._scrollToOffset(this.getScrollOffset(),{adjustments:void 0,behavior:void 0})),a&&this.scrollToEnd({behavior:a})}},this._flushIosDeferredIfReady=()=>{if(this._iosDeferredAdjustment===0||this.isScrolling||this._iosTouching||this._iosJustTouchEnded)return;const r=this.getScrollOffset(),s=this.getMaxScrollOffset();if(r<0||r>s)return;if(this._iosDeferredAdjustment<0&&r>=s-1){this._iosDeferredAdjustment=0;return}const o=this._iosDeferredAdjustment;this._iosDeferredAdjustment=0,this._scrollToOffset(r,{adjustments:this.scrollAdjustments+=o,behavior:void 0})},this.rafId=null,this.getSize=()=>this.options.enabled?(this.scrollRect=this.scrollRect??this.options.initialRect,this.scrollRect[this.options.horizontal?"width":"height"]):(this.scrollRect=null,0),this.getScrollOffset=()=>this.options.enabled?(this.scrollOffset=this.scrollOffset??(typeof this.options.initialOffset=="function"?this.options.initialOffset():this.options.initialOffset),this.scrollOffset):(this.scrollOffset=null,0),this.getMeasurementOptions=Vt(()=>[this.options.count,this.options.paddingStart,this.options.scrollMargin,this.options.getItemKey,this.options.enabled,this.options.lanes,this.options.laneAssignmentMode,this.options.gap],(r,s,o,e,i,a,l,u)=>(this.prevLanes!==void 0&&this.prevLanes!==a&&(this.lanesChangedFlag=!0),this.prevLanes=a,this.pendingMin=null,{count:r,paddingStart:s,scrollMargin:o,getItemKey:e,enabled:i,lanes:a,laneAssignmentMode:l,gap:u}),{key:!1}),this.isIndexInRange=r=>r>=0&&r<this.options.count,this.getMeasurements=Vt(()=>[this.getMeasurementOptions(),this.itemSizeCacheVersion],({count:r,paddingStart:s,scrollMargin:o,getItemKey:e,enabled:i,lanes:a,laneAssignmentMode:l,gap:u},c)=>{const d=this.itemSizeCache;if(!i)return this.measurementsCache=[],this.itemSizeCache.clear(),this.laneAssignments.clear(),[];if(this.laneAssignments.size>r)for(const S of this.laneAssignments.keys())S>=r&&this.laneAssignments.delete(S);this.lanesChangedFlag&&(this.lanesChangedFlag=!1,this.lanesSettling=!0,this.measurementsCache=[],this.itemSizeCache.clear(),this.laneAssignments.clear(),this.pendingMin=null),this.measurementsCache.length===0&&!this.lanesSettling&&(this.measurementsCache=this.options.initialMeasurementsCache,this.measurementsCache.forEach(S=>{this.itemSizeCache.set(S.key,S.size)}));const f=this.lanesSettling?0:this.pendingMin??0;if(this.pendingMin=null,this.lanesSettling&&this.measurementsCache.length===r&&(this.lanesSettling=!1),a===1){const S=r*2;let v=this._flatMeasurements;if(!v||v.length<S){const T=new Float64Array(S);v&&f>0&&T.set(v.subarray(0,f*2)),v=T,this._flatMeasurements=v}let x;if(f===0)x=s+o;else{const T=f-1;x=v[T*2]+v[T*2+1]+u}for(let T=f;T<r;T++){const P=e(T),k=d.get(P),A=typeof k=="number"?k:this.options.estimateSize(T);v[T*2]=x,v[T*2+1]=A,x+=A+u}const D=si(r,v,e);return this.measurementsCache=D,D}const h=this.measurementsCache.slice(0,f),m=new Array(a).fill(void 0),p=new Float64Array(a);let y=0;for(let S=0;S<f;S++){const v=h[S];v&&(m[v.lane]===void 0&&y++,m[v.lane]=S,p[v.lane]=v.end)}for(let S=f;S<r;S++){const v=e(S),x=this.laneAssignments.get(S);let D,T;const P=l==="estimate"||d.has(v);if(x!==void 0&&this.options.lanes>1){D=x;const g=m[D],j=g!==void 0?h[g]:void 0;T=j?j.end+u:s+o}else if(y===a){let g=0,j=p[0],X=m[0];for(let q=1;q<a;q++){const C=p[q];(C<j||C===j&&m[q]<X)&&(g=q,j=C,X=m[q])}D=g,T=j+u,P&&this.laneAssignments.set(S,D)}else D=S%this.options.lanes,T=s+o,P&&this.laneAssignments.set(S,D);const k=d.get(v),A=typeof k=="number"?k:this.options.estimateSize(S),w=T+A;h[S]={index:S,start:T,size:A,end:w,key:v,lane:D},m[D]===void 0&&y++,m[D]=S,p[D]=w}return this.measurementsCache=h,h},{key:process.env.NODE_ENV!=="production"&&"getMeasurements",debug:()=>this.options.debug}),this.calculateRange=Vt(()=>[this.getMeasurements(),this.getSize(),this.getScrollOffset(),this.options.lanes],(r,s,o,e)=>r.length===0||s===0?(this.range=null,null):(this.range=vi(r,s,o,e,e===1&&this._flatMeasurements!=null?this._flatMeasurements:null),this.range),{key:process.env.NODE_ENV!=="production"&&"calculateRange",debug:()=>this.options.debug}),this.getVirtualIndexes=Vt(()=>{let r=null,s=null;const o=this.calculateRange();return o&&(r=o.startIndex,s=o.endIndex),this.maybeNotify.updateDeps([this.isScrolling,r,s]),[this.options.rangeExtractor,this.options.overscan,this.options.count,r,s]},(r,s,o,e,i)=>e===null||i===null?[]:r({startIndex:e,endIndex:i,overscan:s,count:o}),{key:process.env.NODE_ENV!=="production"&&"getVirtualIndexes",debug:()=>this.options.debug}),this.indexFromElement=r=>{const s=this.options.indexAttribute,o=r.getAttribute(s);return o?parseInt(o,10):(console.warn(`Missing attribute name '${s}={index}' on measured element.`),-1)},this.shouldMeasureDuringScroll=r=>{var s;if(!this.scrollState||this.scrollState.behavior!=="smooth")return!0;const o=this.scrollState.index??((s=this.getVirtualItemForOffset(this.scrollState.lastTargetOffset))==null?void 0:s.index);if(o!==void 0&&this.range){const e=Math.max(this.options.overscan,Math.ceil((this.range.endIndex-this.range.startIndex)/2)),i=Math.max(0,o-e),a=Math.min(this.options.count-1,o+e);return r>=i&&r<=a}return!0},this.measureElement=r=>{if(!r){this.elementsCache.forEach((i,a)=>{i.isConnected||(this.observer.unobserve(i),this.elementsCache.delete(a))});return}const s=this.indexFromElement(r);if(!this.isIndexInRange(s))return;const o=this.options.getItemKey(s),e=this.elementsCache.get(o);e!==r&&(e&&this.observer.unobserve(e),this.observer.observe(r),this.elementsCache.set(o,r)),(!this.isScrolling||this.scrollState)&&this.shouldMeasureDuringScroll(s)&&this.resizeItem(s,this.options.measureElement(r,void 0,this))},this.resizeItem=(r,s)=>{var o,e;if(!this.isIndexInRange(r))return;let i,a,l;const u=this._flatMeasurements;if(this.options.lanes===1&&u!==null)l=this.options.getItemKey(r),a=u[r*2],i=u[r*2+1];else{const f=this.measurementsCache[r];if(!f)return;l=f.key,a=f.start,i=f.size}const c=this.itemSizeCache.get(l)??i,d=s-c;if(d!==0){const f=this.options.anchorTo==="end"&&((o=this.scrollState)==null?void 0:o.behavior)!=="smooth"&&this.getVirtualDistanceFromEnd()<=this.options.scrollEndThreshold,h=f?this.getTotalSize():0,m=this.getScrollOffset()+this.scrollAdjustments,y=!this.itemSizeCache.has(l)?a<m:a+c<=m&&this.scrollDirection!=="backward",S=((e=this.scrollState)==null?void 0:e.behavior)!=="smooth"&&(this.shouldAdjustScrollPositionOnItemSizeChange!==void 0?this.shouldAdjustScrollPositionOnItemSizeChange(this.measurementsCache[r]??{index:r,key:l,start:a,size:i,end:a+i,lane:0},d,this):y);(this.pendingMin===null||r<this.pendingMin)&&(this.pendingMin=r),this.itemSizeCache.set(l,s),this.itemSizeCacheVersion++;let v=!1;f?v=this.applyScrollAdjustment(this.getTotalSize()-h):S&&(v=this.applyScrollAdjustment(d)),this.notify(v)}},this.getVirtualItems=Vt(()=>[this.getVirtualIndexes(),this.getMeasurements()],(r,s)=>{const o=[];for(let e=0,i=r.length;e<i;e++){const a=r[e],l=s[a];o.push(l)}return o},{key:process.env.NODE_ENV!=="production"&&"getVirtualItems",debug:()=>this.options.debug}),this.getVirtualItemForOffset=r=>{const s=this.getMeasurements();if(s.length===0)return;const o=this._flatMeasurements,e=this.options.lanes===1&&o!=null,i=jr(0,s.length-1,e?a=>o[a*2]:a=>tr(s[a]).start,r);return tr(s[i])},this.getMaxScrollOffset=()=>{if(!this.scrollElement)return 0;if("scrollHeight"in this.scrollElement)return this.options.horizontal?this.scrollElement.scrollWidth-this.scrollElement.clientWidth:this.scrollElement.scrollHeight-this.scrollElement.clientHeight;{const r=this.scrollElement.document.documentElement;return this.options.horizontal?r.scrollWidth-this.scrollElement.innerWidth:r.scrollHeight-this.scrollElement.innerHeight}},this.getVirtualDistanceFromEnd=()=>Math.max(this.getTotalSize()-this.getSize()-this.getScrollOffset(),0),this.getDistanceFromEnd=()=>Math.max(this.getMaxScrollOffset()-this.getScrollOffset(),0),this.isAtEnd=(r=this.options.scrollEndThreshold)=>this.getDistanceFromEnd()<=r,this.getOffsetForAlignment=(r,s,o=0)=>{if(!this.scrollElement)return 0;const e=this.getSize(),i=this.getScrollOffset();s==="auto"&&(s=r>=i+e?"end":"start"),s==="center"?r+=(o-e)/2:s==="end"&&(r-=e);const a=this.getMaxScrollOffset();return Math.max(Math.min(a,r),0)},this.getOffsetForIndex=(r,s="auto")=>{r=Math.max(0,Math.min(r,this.options.count-1));const o=this.getSize(),e=this.getScrollOffset(),i=this.measurementsCache[r];if(!i)return;if(s==="auto")if(i.end>=e+o-this.options.scrollPaddingEnd)s="end";else if(i.start<=e+this.options.scrollPaddingStart)s="start";else return[e,s];if(s==="end"&&r===this.options.count-1)return[this.getMaxScrollOffset(),s];const a=s==="end"?i.end+this.options.scrollPaddingEnd:i.start-this.options.scrollPaddingStart;return[this.getOffsetForAlignment(a,s,i.size),s]},this.scrollToOffset=(r,{align:s="start",behavior:o="auto"}={})=>{this._iosDeferredAdjustment=0;const e=this.getOffsetForAlignment(r,s),i=this.now();this.scrollState={index:null,align:s,behavior:o,startedAt:i,lastTargetOffset:e,stableFrames:0},this._scrollToOffset(e,{adjustments:void 0,behavior:o}),this.scheduleScrollReconcile()},this.scrollToIndex=(r,{align:s="auto",behavior:o="auto"}={})=>{this._iosDeferredAdjustment=0,r=Math.max(0,Math.min(r,this.options.count-1));const e=this.getOffsetForIndex(r,s);if(!e)return;const[i,a]=e,l=this.now();this.scrollState={index:r,align:a,behavior:o,startedAt:l,lastTargetOffset:i,stableFrames:0},this._scrollToOffset(i,{adjustments:void 0,behavior:o}),this.scheduleScrollReconcile()},this.scrollBy=(r,{behavior:s="auto"}={})=>{const o=this.getScrollOffset()+r,e=this.now();this.scrollState={index:null,align:"start",behavior:s,startedAt:e,lastTargetOffset:o,stableFrames:0},this._scrollToOffset(o,{adjustments:void 0,behavior:s}),this.scheduleScrollReconcile()},this.scrollToEnd=({behavior:r="auto"}={})=>{if(this.options.count>0){this.scrollToIndex(this.options.count-1,{align:"end",behavior:r});return}this.scrollToOffset(Math.max(this.getTotalSize()-this.getSize(),0),{behavior:r})},this.getTotalSize=()=>{var r;const s=this.getMeasurements();let o;if(s.length===0)o=this.options.paddingStart;else if(this.options.lanes===1){const e=s.length-1,i=this._flatMeasurements;i!=null?o=i[e*2]+i[e*2+1]:o=((r=s[e])==null?void 0:r.end)??0}else{const e=Array(this.options.lanes).fill(null);let i=s.length-1;for(;i>=0&&e.some(a=>a===null);){const a=s[i];e[a.lane]===null&&(e[a.lane]=a.end),i--}o=Math.max(...e.filter(a=>a!==null))}return Math.max(o-this.options.scrollMargin+this.options.paddingEnd,0)},this.takeSnapshot=()=>{const r=[];if(this.itemSizeCache.size===0)return r;const s=this.getMeasurements();for(const o of s)o&&this.itemSizeCache.has(o.key)&&r.push({index:o.index,key:o.key,start:o.start,size:o.size,end:o.end,lane:o.lane});return r},this._scrollToOffset=(r,{adjustments:s,behavior:o})=>{this._intendedScrollOffset=r+(s??0),this.options.scrollToFn(r,{behavior:o,adjustments:s},this)},this.measure=()=>{this.pendingMin=null,this.itemSizeCache.clear(),this.laneAssignments.clear(),this.itemSizeCacheVersion++,this.notify(!1)},this.setOptions(n)}applyScrollAdjustment(n,r){return n===0?!1:(process.env.NODE_ENV!=="production"&&this.options.debug&&console.info("correction",n),tn()&&(this.isScrolling||this._iosTouching||this._iosJustTouchEnded)?(this._iosDeferredAdjustment+=n,!1):(this._scrollToOffset(this.getScrollOffset(),{adjustments:this.scrollAdjustments+=n,behavior:r}),this.scrollOffset!==null&&(this.scrollOffset+=this.scrollAdjustments,this.scrollOffset<0&&(this.scrollOffset=0),this.scrollAdjustments=0),!0))}scheduleScrollReconcile(){if(!this.targetWindow){this.scrollState=null;return}this.rafId==null&&(this.rafId=this.targetWindow.requestAnimationFrame(()=>{this.rafId=null,this.reconcileScroll()}))}reconcileScroll(){if(!this.scrollState||!this.scrollElement)return;if(this.now()-this.scrollState.startedAt>5e3){this.scrollState=null;return}const s=this.scrollState.index!=null?this.getOffsetForIndex(this.scrollState.index,this.scrollState.align):void 0,o=s?s[0]:this.scrollState.lastTargetOffset,e=1,i=o!==this.scrollState.lastTargetOffset;if(!i&&oi(o,this.getScrollOffset())){if(this.scrollState.stableFrames++,this.scrollState.stableFrames>=e){this.getScrollOffset()!==o&&this._scrollToOffset(o,{adjustments:void 0,behavior:"auto"}),this.scrollState=null;return}}else if(this.scrollState.stableFrames=0,i){const a=this.getSize()||600,l=Math.abs(o-this.getScrollOffset()),u=this.scrollState.behavior==="smooth"&&l>a;this.scrollState.lastTargetOffset=o,u||(this.scrollState.behavior="auto"),this._scrollToOffset(o,{adjustments:void 0,behavior:u?"smooth":"auto"})}this.scheduleScrollReconcile()}}const jr=(t,n,r,s)=>{for(;t<=n;){const o=(t+n)/2|0,e=r(o);if(e<s)t=o+1;else if(e>s)n=o-1;else return o}return t>0?t-1:0};function pi(t,n,r){let s=0;for(;s<=n;){const o=(s+n)/2|0,e=t[o*2];if(e<r)s=o+1;else if(e>r)n=o-1;else return o}return s>0?s-1:0}function vi(t,n,r,s,o){const e=t.length-1;if(t.length<=s)return{startIndex:0,endIndex:e};if(s===1&&o!==null){const u=pi(o,e,r);let c=u;const d=r+n;for(;c<e&&o[c*2]+o[c*2+1]<d;)c++;return{startIndex:u,endIndex:c}}let a=jr(0,e,u=>t[u].start,r),l=a;if(s===1)for(;l<e&&t[l].end<r+n;)l++;else if(s>1){const u=Array(s).fill(0);for(;l<e&&u.some(d=>d<r+n);){const d=t[l];u[d.lane]=d.end,l++}const c=Array(s).fill(r+n);for(;a>=0&&c.some(d=>d>=r);){const d=t[a];c[d.lane]=d.start,a--}a=Math.max(0,a-a%s),l=Math.min(e,l+(s-1-l%s))}return{startIndex:a,endIndex:l}}const en=typeof document<"u"?oe.useLayoutEffect:oe.useEffect;function Si({useFlushSync:t=!0,directDomUpdates:n=!1,directDomUpdatesMode:r="transform",...s}){const o=oe.useReducer(c=>c+1,0)[1],e=oe.useRef({enabled:n,mode:r,container:null,lastSize:null,lastPositions:new WeakMap,prevRange:null});e.current.enabled=n,e.current.mode=r;const i=c=>{const d=e.current;if(!d.enabled||!d.container)return;const f=c.getTotalSize();if(f!==d.lastSize){d.lastSize=f;const h=c.options.horizontal?"width":"height";d.container.style[h]=`${f}px`}},a=c=>{const d=e.current;if(!d.enabled||!d.container)return;i(c);const f=!!c.options.horizontal,h=d.mode==="transform",m=f?"left":"top",p=c.options.scrollMargin,y=c.getVirtualItems();for(const S of y){const v=S.start-p,x=c.elementsCache.get(S.key);x&&d.lastPositions.get(x)!==v&&(d.lastPositions.set(x,v),h?x.style.transform=f?`translate3d(${v}px, 0, 0)`:`translate3d(0, ${v}px, 0)`:x.style[m]=`${v}px`)}},l={...s,onChange:(c,d)=>{var f;const h=e.current;let m=!0;if(h.enabled){a(c);const p=c.range,y=h.prevRange;m=!y||y.isScrolling!==c.isScrolling||y.startIndex!==(p==null?void 0:p.startIndex)||y.endIndex!==(p==null?void 0:p.endIndex),m&&(h.prevRange=p?{startIndex:p.startIndex,endIndex:p.endIndex,isScrolling:c.isScrolling}:null)}m&&(t&&d?Ss.flushSync(o):o()),(f=s.onChange)==null||f.call(s,c,d)}},[u]=oe.useState(()=>{const c=new gi(l);return Object.assign(c,{containerRef:d=>{const f=e.current;if(f.container=d,f.lastSize=null,d&&f.enabled){const h=c.getTotalSize();f.lastSize=h;const m=c.options.horizontal?"width":"height";d.style[m]=`${h}px`}}})});return u.setOptions(l),en(()=>u._didMount(),[]),en(()=>(i(u),u._willUpdate())),en(()=>{a(u)}),u}function zr(t){return Si({observeElementRect:li,observeElementOffset:di,scrollToFn:mi,...t})}const Fr=t=>Array.from({length:t.count},(n,r)=>r);function Yr({bottomRowCells:t,scrollRef:n}){var u;const r=ht(c=>c.exportMode),s=zr({horizontal:!0,count:t.length,getScrollElement:()=>n.current,estimateSize:c=>{var d;return((d=t[c])==null?void 0:d.widthPx)??32},overscan:5,rangeExtractor:r?Fr:vn}),o=s.getVirtualItems(),e=((u=o[0])==null?void 0:u.start)??0,i=o[o.length-1],a=i?i.start+i.size:0,l=b.useMemo(()=>(c,d)=>c+d>=e&&c<=a,[e,a]);return b.useEffect(()=>{if(!t.length)return;const c=requestAnimationFrame(()=>{s.measure()});return()=>cancelAnimationFrame(c)},[t,s]),{columnVirtualizer:s,isBarVisible:l}}function Wr({rowCount:t,bottomRowCells:n,scrollRef:r}){const s=ht(i=>i.exportMode),o=zr({count:t,getScrollElement:()=>r.current,estimateSize:()=>wt,overscan:5,rangeExtractor:s?Fr:vn}),e=Yr({bottomRowCells:n,scrollRef:r});return{rowVirtualizer:o,...e}}function bi(t){const n=[];for(const r of t){const s=n[n.length-1];s&&s.label===r.label?s.widthPx+=r.widthPx:n.push({...r})}return n}function yi({bottomRowCells:t,selectedScale:n,width:r,scrollRef:s,renderHeaderCell:o}){var d;const e=ht(f=>f.localeOptions),i=b.useMemo(()=>le(n,e),[n,e]),{columnVirtualizer:a}=Yr({bottomRowCells:t,scrollRef:s}),l=a.getVirtualItems(),u=((d=l[0])==null?void 0:d.start)??0,c=b.useMemo(()=>bi(Ao(t,n,e)),[t,n,e]);return $.jsx("header",{className:"gantt-header",style:{width:`${r}px`},children:$.jsxs("div",{className:"gantt-header-content",children:[$.jsx("div",{className:"gantt-top-header",children:$.jsx("div",{className:"gantt-top-groups",children:c.map((f,h)=>{const m={className:"gantt-top-group",style:{width:`${f.widthPx}px`}};return o?$.jsx(b.Fragment,{children:o({row:"top",date:f.startDate,label:f.label,width:f.widthPx,scale:n,cellProps:m})},`${f.label}-${h}`):$.jsx("div",{...m,children:$.jsx("p",{className:"gantt-top-group-label",children:f.label})},`${f.label}-${h}`)})})}),$.jsxs("div",{className:"gantt-bottom-row",children:[$.jsx("div",{style:{width:`${u}px`},"aria-hidden":"true"}),l.map(f=>{const h=t[f.index];if(!h)return null;const m=i.tick(h.startDate),p={className:"gantt-bottom-cell",style:{width:`${f.size}px`}};return o?$.jsx(b.Fragment,{children:o({row:"bottom",date:h.startDate,label:m,width:f.size,scale:n,cellProps:p})},`bottom-${f.index}`):$.jsx("div",{...p,children:m},`bottom-${f.index}`)})]})]})})}const xi=8;function wi(t){const n=t;return n?n.isContentEditable||n.tagName==="INPUT"||n.tagName==="TEXTAREA"||n.tagName==="SELECT":!1}function $i({transformedTasks:t,rowCount:n,criticalLinkIds:r,interaction:s,onTasksChange:o,onDependencyDelete:e}){var w;const i=At(),a=ht(g=>g.dragOffsets),l=ht(g=>g.bottomRowCells),u=ht(g=>g.linkDraft),c=ht(g=>g.selectedDependency),d=b.useRef(null),f=b.useCallback(g=>{d.current=(g==null?void 0:g.closest(".gantt-scroll-container"))??null},[]),{rowVirtualizer:h,isBarVisible:m}=Wr({rowCount:n,bottomRowCells:l,scrollRef:d}),p=b.useMemo(()=>Fo(t),[t]),y=h.getVirtualItems(),S=y[y.length-1],v={topPx:((w=y[0])==null?void 0:w.start)??0,bottomPx:S?S.start+S.size:0,isBarVisible:m},x=Wo(p,a,r).filter(g=>Yo(g,v)),D=g=>(c==null?void 0:c.sourceId)===g.sourceId&&(c==null?void 0:c.targetId)===g.targetId,T=b.useCallback(()=>{var W;const{rawTasks:g,selectedDependency:j,commitTasks:X,setSelectedDependency:q}=i.getState();if(!j)return;const{sourceId:C,targetId:E}=j,I=g.find(K=>K.id===C),N=(W=I==null?void 0:I.dependencies)==null?void 0:W.find(K=>K.targetId===E);if(!I||!N||!Et(I,s).canDeleteLink)return;const L={predecessorId:E,successorId:C,type:N.type};if((e==null?void 0:e(L))===!1)return;q(null);const F=Vo(g,E,C);X(F),o==null||o(F)},[i,s,e,o]);b.useEffect(()=>{if(!c)return;const g=X=>{wi(X.target)||(X.key==="Delete"||X.key==="Backspace"?(X.preventDefault(),T()):X.key==="Escape"&&i.getState().setSelectedDependency(null))},j=()=>{i.getState().setSelectedDependency(null)};return document.addEventListener("keydown",g),document.addEventListener("pointerdown",j),()=>{document.removeEventListener("keydown",g),document.removeEventListener("pointerdown",j)}},[c,T,i]);const k=`gantt-arrowhead-${b.useId().replace(/[^a-zA-Z0-9]/g,"")}`,A=`${k}-critical`;return $.jsxs("svg",{ref:f,className:`gantt-dependency-arrows${u?" linking":""}`,style:{height:`${n*wt}px`},children:[$.jsx("defs",{children:[k,A].map(g=>$.jsx("marker",{id:g,markerWidth:"5",markerHeight:"5",refX:"4.5",refY:"2.5",orient:"auto",children:$.jsx("polygon",{className:`gantt-dependency-arrow-head${g===A?" critical":""}`,points:"0 0, 5 2.5, 0 5"})},g))}),x.map((g,j)=>{const X=Co(g.type,g.fromX,g.fromY,g.toX,g.toY),q=D(g),C=p.get(g.sourceId),E=C!==void 0&&Et(C,s).canDeleteLink;return $.jsxs("g",{children:[E&&$.jsx("path",{className:"gantt-dependency-hit",d:X,fill:"none",onPointerDown:I=>{I.stopPropagation(),i.getState().setSelectedDependency({sourceId:g.sourceId,targetId:g.targetId})}}),$.jsx("path",{className:`gantt-dependency-arrow${q?" selected":""}${g.critical?" critical":""}`,d:X,markerEnd:`url(#${g.critical?A:k})`,fill:"none"}),q&&$.jsxs("g",{className:"gantt-dependency-delete",transform:`translate(${(g.fromX+g.toX)/2} ${(g.fromY+g.toY)/2})`,role:"button","aria-label":`Delete ${g.type} dependency`,onPointerDown:I=>{I.stopPropagation(),T()},children:[$.jsx("circle",{r:xi}),$.jsx("path",{d:"M -3 -3 L 3 3 M 3 -3 L -3 3"})]})]},`arrow-${j}`)}),u&&$.jsxs("g",{className:"gantt-link-preview",children:[$.jsx("path",{className:`gantt-link-preview-line${u.rejection?" invalid":""}`,d:`M ${u.fromX} ${u.fromY} L ${u.toX} ${u.toY}`,fill:"none",markerEnd:u.rejection?void 0:`url(#${k})`}),$.jsx("circle",{className:"gantt-link-preview-origin",cx:u.fromX,cy:u.fromY,r:"3"}),u.rejection&&$.jsx("text",{className:"gantt-link-preview-reason",x:u.toX+12,y:u.toY-8,children:Xo[u.rejection]})]})]})}function Di({width:t}){const n=ht(c=>c.currentTask),r=ht(c=>c.dragOffsets),s=ht(c=>c.selectedScale),o=ht(c=>c.localeOptions),{tooltip:e}=b.useMemo(()=>le(s,o),[s,o]),i=n?r[n.id]:void 0;if(!n||!i)return null;const a=n.barLeft+i.offsetX,l=a+n.barWidth+i.offsetWidth,u=Mt(n)?[{x:a,label:e(i.offsetStartDate)}]:[{x:a,label:e(i.offsetStartDate)},{x:l,label:e(i.offsetEndDate)}];return $.jsx("div",{className:"gantt-drag-guides",style:{width:`${t}px`},"aria-hidden":"true",children:u.map((c,d)=>$.jsx("div",{className:"gantt-drag-guide",style:{left:`${c.x}px`},children:$.jsx("span",{className:"gantt-drag-guide-label",children:c.label})},`guide-${d}`))})}function Mi({width:t,onWidthChange:n}){const r=e=>Math.min(Hn,Math.max(Un,e)),s=e=>{if(!e.isPrimary||e.button!==0)return;const i=e.clientX,a=t;e.currentTarget.setPointerCapture(e.pointerId);const l=c=>{c.pointerId===e.pointerId&&n(r(a+c.clientX-i))},u=c=>{c.pointerId===e.pointerId&&(document.removeEventListener("pointermove",l),document.removeEventListener("pointerup",u),document.removeEventListener("pointercancel",u))};document.addEventListener("pointermove",l),document.addEventListener("pointerup",u),document.addEventListener("pointercancel",u)},o=e=>{e.key!=="ArrowLeft"&&e.key!=="ArrowRight"||(e.preventDefault(),n(r(t+(e.key==="ArrowLeft"?-16:16))))};return $.jsx("div",{className:"gantt-grid-splitter",style:{left:`${t-2}px`},onPointerDown:s,onKeyDown:o,role:"separator","aria-orientation":"vertical","aria-label":"Resize task list","aria-valuenow":t,"aria-valuemin":Un,"aria-valuemax":Hn,tabIndex:0})}const Ur=(t,n)=>t?{[n]:t}:{};function Ii({bands:t}){return t.length?$.jsx("div",{className:"gantt-range-band-layer","aria-hidden":"true",children:t.map(({band:n,leftPx:r,widthPx:s},o)=>$.jsx("div",{className:`gantt-range-band${n.className?` ${n.className}`:""}`,style:{left:`${r}px`,width:`${s}px`,...Ur(n.color,"--gantt-band-color")},children:n.label&&$.jsx("span",{className:"gantt-range-band-label",children:n.label})},n.id??`${String(n.startDate)}-${o}`))}):null}function Oi({markers:t}){return t.length?$.jsx($.Fragment,{children:t.map(({marker:n,leftPx:r,overrun:s},o)=>$.jsx("div",{className:`gantt-marker${n.className?` ${n.className}`:""}`,style:{left:`${r}px`,...Ur(n.color,"--gantt-marker-color")},"data-warning":s?"true":void 0,"aria-hidden":"true",children:n.label&&$.jsx("span",{className:"gantt-marker-label",children:n.label})},n.id??`${String(n.date)}-${o}`))}):null}const nr=.3;function Ei(t,n){const{draggedId:r,offsetY:s,deltaX:o,tree:e,blockedIds:i,rowHeight:a=wt,indentWidth:l=nn}=n;if(!t.length||!t.some(k=>k.id===r))return null;const u=k=>e.depthOf.get(k)??0,c=k=>(k===null?e.rootIds:e.childIds.get(k)??[]).filter(A=>A!==r),d=s/a,f=Math.min(t.length-1,Math.max(0,Math.floor(d))),h=Math.min(1,Math.max(0,d-f));if(h>nr&&h<1-nr){const k=t[f].id;return{mode:"into",rowIndex:f,depth:u(k)+1,parentId:k,index:c(k).length,valid:!i.has(k)}}const m=h<.5?f:f+1,p=m>0?t[m-1]:null,y=m<t.length?t[m]:null,S=p?u(p.id)+1:0,v=Math.min(y?u(y.id):0,S),x=Math.min(S,Math.max(v,u(r)+Math.round(o/l)));let D=null;if(x>0&&p){let k=p.id;for(let A=S-1;k&&A>x-1;A--)k=e.parentOf.get(k)??null;D=k}const T=c(D);let P=0;for(let k=m-1;k>=0;k--){const A=T.indexOf(t[k].id);if(A>=0){P=A+1;break}}return{mode:"line",rowIndex:m,depth:x,parentId:D,index:P,valid:D===null||!i.has(D)}}function Ti(t,n,r,s){const o=gn(t),e=zt(o);if(!e.parentOf.has(n)||r!==null&&(!e.parentOf.has(r)||Qt(o,n,e).includes(r)))return t;const i=[...e.rootIds],a=new Map([...e.childIds].map(([S,v])=>[S,[...v]])),l=S=>{if(S===null)return i;let v=a.get(S);return v||(v=[],a.set(S,v)),v},u=l(e.parentOf.get(n)??null);u.splice(u.indexOf(n),1);const c=l(r);c.splice(Math.min(Math.max(0,s),c.length),0,n);const d=new Map,f=[],h=(S,v)=>{S.forEach((x,D)=>{const T=v?`${v}.${D+1}`:`${D+1}`;d.set(x,T),f.push(x),h(a.get(x)??[],T)})};h(i,"");const m=new Map(o.map(S=>[S.id,S]));let p=!1;const y=f.map(S=>{const v=m.get(S),x=d.get(S),D=S===n?r:v.parentId;return v.sequence===x&&v.parentId===D?v:(p=!0,{...v,sequence:x,parentId:D})});return p?y:t}const rr=3;function ki(t,n){return t===n?!0:!t||!n?!1:t.mode===n.mode&&t.rowIndex===n.rowIndex&&t.depth===n.depth&&t.parentId===n.parentId&&t.index===n.index&&t.valid===n.valid}function Li({rows:t,bodyRef:n,enabled:r,onReorder:s,onTasksChange:o}){const e=At(),[i,a]=b.useState(null),l=b.useRef(null);return{onRowPointerDown:c=>{var D;if(!r||!c.isPrimary||c.button!==0||l.current||c.target.closest("button"))return;const d=c.currentTarget.dataset.rowId;if(!d)return;const f=gn(e.getState().rawTasks),h=zt(f);if(!h.parentOf.has(d))return;const m={pointerId:c.pointerId,draggedId:d,startX:c.clientX,startY:c.clientY,previousParentId:((D=f.find(T=>T.id===d))==null?void 0:D.parentId)??null,tree:h,blockedIds:new Set(Qt(f,d,h)),active:!1,target:null};l.current=m,c.preventDefault();const p=T=>{if(T.pointerId!==m.pointerId)return;const P=T.clientX-m.startX,k=!m.active;if(k){if(Math.abs(P)<rr&&Math.abs(T.clientY-m.startY)<rr)return;m.active=!0}const A=n.current;if(!A)return;const w=Ei(t,{draggedId:m.draggedId,offsetY:T.clientY-A.getBoundingClientRect().top,deltaX:P,tree:m.tree,blockedIds:m.blockedIds});!k&&ki(m.target,w)||(m.target=w,a({draggedId:m.draggedId,target:w}))},y=()=>{document.removeEventListener("pointermove",p),document.removeEventListener("pointerup",x),document.removeEventListener("pointercancel",v)},S=()=>{y(),l.current=null,a(null)},v=T=>{T.pointerId===m.pointerId&&S()},x=T=>{if(T.pointerId!==m.pointerId)return;const P=m.target,k=m.active;if(S(),!k||!P||!P.valid)return;const A=e.getState().rawTasks,w=Ti(A,m.draggedId,P.parentId,P.index);if(w===A)return;const g=w.find(X=>X.id===m.draggedId);!g||(s==null?void 0:s({task:g,parentId:P.parentId,previousParentId:m.previousParentId,index:P.index,sequence:g.sequence,tasks:w}))===!1||(e.getState().commitTasks(w),o==null||o(w))};document.addEventListener("pointermove",p),document.addEventListener("pointerup",x),document.addEventListener("pointercancel",v)},dragState:i}}function Ai(t,n){if(t.render)return t.render(n);const r=n[t.key];return r==null?"":String(r)}function sr(t,n){const r=t.width??pr;return n===0?{flex:`1 1 ${r}px`,minWidth:60}:{flex:`0 0 ${r}px`}}function Pi({rows:t,columns:n,virtualItems:r,totalHeight:s,width:o,hierarchy:e,collapsedIds:i,onToggleCollapse:a,focus:l,allowRowReorder:u,interaction:c,onReorder:d,onTasksChange:f,selectedTaskId:h,onRowClick:m,onRowDoubleClick:p}){const y=b.useRef(null),S=t.every(P=>!P.group&&P.tasks.length===1),{onRowPointerDown:v,dragState:x}=Li({rows:t,bodyRef:y,enabled:u&&S,onReorder:d,onTasksChange:f}),D=(x==null?void 0:x.target)??null,T=["gantt-grid",x?"row-dragging":""].filter(Boolean).join(" ");return $.jsxs("div",{className:T,style:{width:`${o}px`},role:"presentation",children:[$.jsxs("div",{className:"gantt-grid-header",style:{height:`${Ts}px`},role:"row","aria-rowindex":1,children:[n.map((P,k)=>$.jsx("div",{className:"gantt-grid-header-cell",style:sr(P,k),role:"columnheader",children:P.header},P.key)),$.jsx("span",{className:"gantt-sr-only",role:"columnheader",children:"Timeline"})]}),$.jsxs("div",{ref:y,className:"gantt-grid-body",style:{height:`${s}px`},role:"rowgroup",children:[r.map(P=>{const k=t[P.index];if(!k)return null;const A=k.tasks[0],w=!!k.group||e&&!!(A!=null&&A.isSummary),g=i.has(k.id),j=l.row===P.index,X=Cr(k,P.index,{headerOffset:1,expandable:w,expanded:!g,ownedIds:k.tasks.map(I=>`task-${I.id}`)}),q={height:`${P.size}px`,transform:`translateY(${P.start}px)`};if(k.group)return $.jsx("div",{className:"gantt-grid-row group",style:q,...X,children:$.jsxs("div",{className:"gantt-grid-cell",style:{flex:"1 1 100%",minWidth:0},role:"gridcell",tabIndex:j&&l.col===0?0:-1,"data-gantt-cell":`${P.index}:0`,children:[$.jsx("button",{type:"button",className:`gantt-grid-expander${g?"":" open"}`,onClick:()=>a(k.id),tabIndex:-1,"aria-hidden":"true",children:$.jsx("svg",{viewBox:"0 0 12 12","aria-hidden":"true",children:$.jsx("path",{d:"M4 2.5 L8 6 L4 9.5"})})}),$.jsx("span",{className:"gantt-grid-cell-text",children:k.group.label}),$.jsx("span",{className:"gantt-grid-group-count",children:k.group.count})]})},`grid-row-${k.id}`);if(!A)return null;const C=(D==null?void 0:D.mode)==="into"&&D.rowIndex===P.index,E=u&&S&&Et(A,c).canMove;return $.jsx("div",{"data-row-id":k.id,onPointerDown:E?v:void 0,className:["gantt-grid-row",A.isSummary?"summary":"",E?"draggable":"",(x==null?void 0:x.draggedId)===k.id?"dragging":"",C?"drop-into":"",C&&!D.valid?"invalid":"",A.id===h?"selected":"",A.className??""].filter(Boolean).join(" "),style:q,onClick:m&&(I=>m(A,I)),onDoubleClick:p&&(I=>p(A,I)),...X,children:n.map((I,N)=>$.jsxs("div",{className:"gantt-grid-cell",style:sr(I,N),title:N===0?A.name:void 0,role:"gridcell",tabIndex:j&&l.col===N?0:-1,"data-gantt-cell":`${P.index}:${N}`,children:[N===0&&$.jsx("span",{className:"gantt-grid-indent",style:{width:`${k.depth*nn}px`}}),N===0&&(w?$.jsx("button",{type:"button",className:`gantt-grid-expander${g?"":" open"}`,onClick:L=>{L.stopPropagation(),a(k.id)},tabIndex:-1,"aria-hidden":"true",children:$.jsx("svg",{viewBox:"0 0 12 12","aria-hidden":"true",children:$.jsx("path",{d:"M4 2.5 L8 6 L4 9.5"})})}):$.jsx("span",{className:"gantt-grid-expander-spacer"})),$.jsx("span",{className:"gantt-grid-cell-text",children:Ai(I,A)}),N===0&&k.tasks.length>1&&$.jsxs("span",{className:"gantt-grid-group-count",children:["+",k.tasks.length-1]})]},I.key))},`grid-row-${k.id}`)}),(D==null?void 0:D.mode)==="line"&&$.jsx("div",{className:`gantt-grid-drop-line${D.valid?"":" invalid"}`,style:{top:`${D.rowIndex*wt}px`,marginLeft:`${D.depth*nn}px`},"aria-hidden":"true"})]})]})}const se=Object.keys(pt);function _i({selectedScale:t,onScaleChange:n}){const r=b.useRef({}),s=e=>{var u;const a=(se.indexOf(t)+e+se.length)%se.length,l=se[a];n(l),(u=r.current[l])==null||u.focus()},o=e=>{e.key==="ArrowRight"||e.key==="ArrowDown"?(e.preventDefault(),s(1)):(e.key==="ArrowLeft"||e.key==="ArrowUp")&&(e.preventDefault(),s(-1))};return $.jsx("div",{className:"gantt-scale-selector",role:"group","aria-label":"Timeline scale",children:$.jsx("div",{className:"gantt-scale-control",children:se.map(e=>{const i=e===t;return $.jsx("button",{ref:a=>{a?r.current[e]=a:delete r.current[e]},type:"button",className:"gantt-scale-button","data-active":i,onClick:()=>n(e),onKeyDown:o,"aria-pressed":i,tabIndex:i?0:-1,children:e},e)})})})}const or=4;function Ni({enabled:t,rowIds:n,onTaskCreate:r}){const s=At(),[o,e]=b.useState(null),i=b.useRef(null),a=b.useRef(null),l=c=>{var h;if(!t||!c.isPrimary||c.button!==0||i.current!==null||c.target!==c.currentTarget)return;(h=a.current)==null||h.call(a),a.current=null;const d=c.currentTarget,f=c.pointerId;a.current=hn({pointerType:c.pointerType,pointerId:f,clientX:c.clientX,clientY:c.clientY},(m,p)=>{a.current=null,u(d,f,c.pointerType,m,p)})},u=(c,d,f,h,m)=>{const p=c.getBoundingClientRect(),y=h-p.left,S=Math.floor((m-p.top)/wt);i.current=d;const v=f==="mouse"?null:mn(),x=g=>{const{bottomRowCells:j,selectedScale:X}=s.getState(),q=c.getBoundingClientRect();return Oo(y,g-q.left,j,X)},D=g=>{if(g.pointerId!==d)return;const j=c.getBoundingClientRect();if(Math.abs(g.clientX-j.left-y)<or){e(null);return}const X=x(g.clientX);e(X&&{leftPx:X.leftPx,widthPx:X.widthPx,topPx:S*wt})},T=()=>{document.removeEventListener("pointermove",D),document.removeEventListener("pointerup",w),document.removeEventListener("pointercancel",k),document.removeEventListener("keydown",A)},P=()=>{T(),v==null||v(),i.current=null,e(null)},k=g=>{g.pointerId===d&&P()},A=g=>{g.key==="Escape"&&P()},w=g=>{if(g.pointerId!==d)return;const j=c.getBoundingClientRect(),q=Math.abs(g.clientX-j.left-y)>=or?x(g.clientX):null;P(),q&&(r==null||r({startDate:q.startDate.toISOString(),endDate:q.endDate.toISOString(),rowTaskId:n[S]??null}))};document.addEventListener("pointermove",D),document.addEventListener("pointerup",w),document.addEventListener("pointercancel",k),document.addEventListener("keydown",A)};return{onDrawPointerDown:l,ghost:o}}const Ri=16384,Ci=268435456,Hr=["box-sizing","display","position","top","right","bottom","left","width","height","min-width","min-height","max-width","max-height","margin-top","margin-right","margin-bottom","margin-left","padding-top","padding-right","padding-bottom","padding-left","overflow-x","overflow-y","flex-direction","flex-grow","flex-shrink","flex-basis","align-items","justify-content","row-gap","column-gap","border-top-width","border-right-width","border-bottom-width","border-left-width","border-top-style","border-right-style","border-bottom-style","border-left-style","border-top-color","border-right-color","border-bottom-color","border-left-color","border-top-left-radius","border-top-right-radius","border-bottom-right-radius","border-bottom-left-radius","background-color","background-image","box-shadow","opacity","visibility","z-index","transform","transform-origin","color","font-family","font-size","font-style","font-weight","line-height","letter-spacing","text-align","text-transform","text-overflow","white-space","direction"],ji=["fill","fill-opacity","fill-rule","stroke","stroke-width","stroke-opacity","stroke-linecap","stroke-linejoin","stroke-dasharray","opacity","visibility","color","font-family","font-size","font-weight"];function zi(t,n,r,s=Ri,o=Ci){const e=Math.max(t,1),i=Math.max(n,1),a=Number.isFinite(r)&&r>0?r:1;return Math.min(a,s/e,s/i,Math.sqrt(o/(e*i)))}function ir(t,n,r,s){return t.valueOf()<=n[0].startDate.valueOf()?0:Ut(t,n,r)??s}function Fi(t,n,r,s){if(!t||!n.length)return{left:0,width:s};const o=ir(R(t.from),n,r,s),e=ir(R(t.to),n,r,s),i=Math.min(o,e),a=Math.abs(e-o);if(a<1)throw new Error("exportToPng: the requested range does not overlap the chart's timeline.");return{left:i,width:a}}function Yi(t,n,r){const s=`<svg xmlns="http://www.w3.org/2000/svg" width="${n}" height="${r}" viewBox="0 0 ${n} ${r}"><foreignObject x="0" y="0" width="${n}" height="${r}">${t}</foreignObject></svg>`;return`data:image/svg+xml;charset=utf-8,${encodeURIComponent(s)}`}function Xr(t,n,r){const s=window.getComputedStyle(t),o=n.style;for(const l of r){const u=s.getPropertyValue(l);u&&o.setProperty(l,u)}const e=t instanceof SVGElement?ji:Hr,i=t.children,a=n.children;for(let l=0;l<i.length;l++)Xr(i[l],a[l],e)}function Wi(t){return new Promise((n,r)=>{const s=new Image;s.onload=()=>n(s),s.onerror=()=>r(new Error("exportToPng: the browser refused to rasterize the chart. This usually means the chart contains a resource the SVG renderer cannot inline.")),s.src=t})}function Ui(){return new Promise(t=>requestAnimationFrame(()=>t()))}async function Hi(t,{left:n,width:r,background:s,pixelRatio:o}){const e=t.querySelector(".gantt-header-wrapper"),i=t.querySelector(".gantt-content");if(!i)throw new Error("exportToPng: the chart has no content to export (no timeline is rendered).");const a=i.offsetWidth,l=((e==null?void 0:e.offsetHeight)??0)+i.offsetHeight;if(a<1||l<1)throw new Error("exportToPng: the chart has no content to export.");const u=t.cloneNode(!0);Xr(t,u,Hr),u.style.setProperty("width",`${a}px`),u.style.setProperty("height",`${l}px`),u.style.setProperty("overflow","visible"),u.style.setProperty("margin",`0 0 0 ${-n}px`);const c=document.createElement("div");c.setAttribute("style",`box-sizing:border-box;width:${r}px;height:${l}px;overflow:hidden;background:${s};`),c.appendChild(u);const d=Yi(new XMLSerializer().serializeToString(c),r,l),f=await Wi(d),h=zi(r,l,o),m=document.createElement("canvas");m.width=Math.max(1,Math.round(r*h)),m.height=Math.max(1,Math.round(l*h));const p=m.getContext("2d");if(!p)throw new Error("exportToPng: could not get a 2D canvas context.");return p.fillStyle=s,p.fillRect(0,0,m.width,m.height),p.drawImage(f,0,0,m.width,m.height),new Promise((y,S)=>{try{m.toBlob(v=>{v?y(v):S(new Error("exportToPng: the canvas produced no PNG data."))},"image/png")}catch(v){S(new Error(`exportToPng: the canvas is tainted, so it cannot be read back. A cross-origin image or font reached the chart. (${String(v)})`))}})}const Xi=2,Gi=60;async function Vi(t,n){for(let r=0;r<Gi;r++)if(await Ui(),t.querySelectorAll(".gantt-task-row").length>=n)return;throw new Error(`exportToPng: timed out waiting for all ${n} rows to render.`)}function Ki(t){const n=window.getComputedStyle(t).backgroundColor;return!n||n==="transparent"||n==="rgba(0, 0, 0, 0)"?"#ffffff":n}function Bi({scrollRef:t,bottomRowCells:n,selectedScale:r,taskCount:s,totalWidth:o}){const e=At(),i=b.useCallback(async a=>{const l=t.current;if(!l)throw new Error("exportToPng: no Gantt chart is mounted.");const u=l.closest(".gantt-container");if(!u)throw new Error("exportToPng: the chart container is not in the DOM.");if(!n.length||o<1)throw new Error("exportToPng: the chart has no timeline to export (no tasks).");const{left:c,width:d}=Fi(a==null?void 0:a.range,n,r,o),f=(a==null?void 0:a.background)??Ki(u),{scrollLeft:h,scrollTop:m}=l;e.getState().setExportMode(!0);try{return await Vi(l,s),await Hi(l,{left:c,width:d,background:f,pixelRatio:(a==null?void 0:a.pixelRatio)??Xi})}finally{e.getState().setExportMode(!1),l.scrollLeft=h,l.scrollTop=m}},[t,n,r,s,o,e]);return b.useMemo(()=>({exportToPng:i}),[i])}const qi=new Set(["INPUT","TEXTAREA","SELECT"]);function Ji(t){const n=t;return!n||typeof n.tagName!="string"?!1:n.isContentEditable===!0||qi.has(n.tagName)}function Zi(t){const n=At(),r=b.useCallback(()=>{const i=n.getState().undo();i&&(t==null||t(i))},[n,t]),s=b.useCallback(()=>{const i=n.getState().redo();i&&(t==null||t(i))},[n,t]),o=b.useCallback(i=>{if(!(i.ctrlKey||i.metaKey)||i.altKey||Ji(i.target))return;const a=i.key.toLowerCase();if(a==="z"&&!i.shiftKey){i.preventDefault(),r();return}(a==="y"||a==="z"&&i.shiftKey)&&(i.preventDefault(),s())},[r,s]);return{historyApi:b.useMemo(()=>({undo:r,redo:s,get canUndo(){return n.getState().history.past.length>0},get canRedo(){return n.getState().history.future.length>0}}),[r,s,n]),onKeyDown:o}}const ar=t=>Symbol.iterator in t,lr=t=>"entries"in t,cr=(t,n)=>{const r=t instanceof Map?t:new Map(t.entries()),s=n instanceof Map?n:new Map(n.entries());if(r.size!==s.size)return!1;for(const[o,e]of r)if(!s.has(o)||!Object.is(e,s.get(o)))return!1;return!0},Qi=(t,n)=>{const r=t[Symbol.iterator](),s=n[Symbol.iterator]();let o=r.next(),e=s.next();for(;!o.done&&!e.done;){if(!Object.is(o.value,e.value))return!1;o=r.next(),e=s.next()}return!!o.done&&!!e.done};function ta(t,n){return Object.is(t,n)?!0:typeof t!="object"||t===null||typeof n!="object"||n===null||Object.getPrototypeOf(t)!==Object.getPrototypeOf(n)?!1:ar(t)&&ar(n)?lr(t)&&lr(n)?cr(t,n):Qi(t,n):cr({entries:()=>Object.entries(t)},{entries:()=>Object.entries(n)})}function ea(t){const n=b.useRef(void 0);return r=>{const s=t(r);return ta(n.current,s)?n.current:n.current=s}}function na(){return ht(ea(t=>({rawTasks:t.rawTasks,transformedTasks:t.transformedTasks,bottomRowCells:t.bottomRowCells,selectedScale:t.selectedScale,selectedTaskId:t.selectedTaskId,syncTasksFromProps:t.syncTasksFromProps,setHistoryLimit:t.setHistoryLimit,setTransformedTasks:t.setTransformedTasks,setBottomRowCells:t.setBottomRowCells,setSelectedScale:t.setSelectedScale,setLocaleOptions:t.setLocaleOptions,clearAllDragOffsets:t.clearAllDragOffsets,getTotalWidth:t.getTotalWidth})))}function ra({scrollRef:t,bottomRowCells:n,transformedTasks:r,selectedScale:s,rowHeight:o,viewportInsetPx:e=0,zoomTo:i}){const a=b.useCallback((f,h)=>{const m=t.current;if(!m)return;const p=(h==null?void 0:h.align)==="start"?f:f-(m.clientWidth-e)/2;m.scrollTo({left:Math.max(0,p),behavior:(h==null?void 0:h.smooth)===!1?"auto":"smooth"})},[t,e]),l=b.useCallback((f,h)=>{const m=Ut(R(f),n,s);m!==null&&a(m,h)},[n,s,a]),u=b.useCallback(f=>l(R(),f),[l]),c=b.useCallback((f,h)=>{const m=r.findIndex(x=>x.id===f);if(m===-1)return;const p=r[m],y=t.current;if(!y)return;const S=(p.order-1)*o,v=S<y.scrollTop||S+o>y.scrollTop+y.clientHeight;y.scrollTo({top:v?Math.max(0,S-y.clientHeight/2+o/2):y.scrollTop,left:Math.max(0,(h==null?void 0:h.align)==="start"?p.barLeft:p.barLeft+p.barWidth/2-(y.clientWidth-e)/2),behavior:(h==null?void 0:h.smooth)===!1?"auto":"smooth"})},[r,o,t,e]),d=b.useCallback(()=>{const f=t.current;if(!f||!r.length)return;let h=1/0,m=-1/0;for(const p of r)h=Math.min(h,R(p.startDate).valueOf()),m=Math.max(m,R(p.endDate).valueOf());!Number.isFinite(h)||!Number.isFinite(m)||i(uo(m-h,f.clientWidth-e),{date:R(h),viewportX:0})},[r,t,e,i]);return b.useMemo(()=>({scrollToDate:l,scrollToToday:u,scrollToTask:c,zoomToFit:d,getScrollElement:()=>t.current}),[l,u,c,d,t])}const Gr="(prefers-color-scheme: dark)",Vr=()=>typeof window<"u"&&typeof window.matchMedia=="function",sa=t=>{if(!Vr())return()=>{};const n=window.matchMedia(Gr);return n.addEventListener("change",t),()=>n.removeEventListener("change",t)},oa=()=>Vr()?window.matchMedia(Gr).matches?"dark":"light":null,ia=()=>null;function aa(t,n="gantt-container"){const r=b.useSyncExternalStore(sa,oa,ia),s=b.useMemo(()=>t?t==="system"?r:t:null,[t,r]);return{containerClassName:b.useMemo(()=>s?`${n} ${s}`:n,[n,s]),dataTheme:s??void 0}}const ie={past:[],future:[]},Kr=100;function la(t,n){const r={},s={};let o=!1;for(const e of new Set([...Object.keys(t),...Object.keys(n)])){const i=t[e],a=n[e];i!==a&&(r[e]=i,s[e]=a,o=!0)}return o?{before:r,after:s}:null}function ca(t,n){if(t.length!==n.length)return null;const r=new Map(t.map(o=>[o.id,o])),s=[];for(const o of n){const e=r.get(o.id);if(!e)return null;const i=la(e,o);i&&s.push({id:o.id,...i})}return s}function ur(t,n,r){if(!n.length)return t;const s=new Map(n.map(o=>[o.id,o]));return t.map(o=>{const e=s.get(o.id);return e?{...o,...e[r]}:o})}function Br(t,n){return t.length>n?t.slice(t.length-n):t}function ua(t,n,r){return n.length?r<=0?ie:{past:Br([...t.past,n],r),future:[]}:t}function da(t,n){if(n<=0)return ie;const r=Br(t.past,n);return r===t.past?t:{past:r,future:t.future}}function fa(t){const n=t.past[t.past.length-1];return n?{stack:{past:t.past.slice(0,-1),future:[n,...t.future]},entry:n}:null}function ha(t){const[n,...r]=t.future;return n?{stack:{past:[...t.past,n],future:r},entry:n}:null}const Re="gantt-scale";function ma(t=Re){try{const n=sessionStorage.getItem(t);return n&&n in pt?n:null}catch{return null}}function ga(t=Re){return Cs()((n,r)=>({rawTasks:[],transformedTasks:[],bottomRowCells:[],selectedScale:"month",currentTask:null,dragOffsets:{},exportMode:!1,localeOptions:void 0,history:ie,historyLimit:Kr,linkDraft:null,selectedDependency:null,selectedTaskId:null,revertingIds:[],mutationGate:Qs(),setCurrentTask:s=>n({currentTask:s}),setExportMode:s=>n({exportMode:s}),setLinkDraft:s=>n({linkDraft:s}),setSelectedDependency:s=>n(o=>{var e,i;return((e=o.selectedDependency)==null?void 0:e.sourceId)===(s==null?void 0:s.sourceId)&&((i=o.selectedDependency)==null?void 0:i.targetId)===(s==null?void 0:s.targetId)?o:{selectedDependency:s}}),setLocaleOptions:s=>n({localeOptions:s}),setSelectedTaskId:s=>{r().selectedTaskId!==s&&n({selectedTaskId:s})},beginRevert:s=>n(o=>{const e=s.filter(i=>!o.revertingIds.includes(i));return e.length?{revertingIds:[...o.revertingIds,...e]}:o}),endRevert:s=>n(o=>{const e=new Set(s),i=o.revertingIds.filter(a=>!e.has(a));return i.length===o.revertingIds.length?o:{revertingIds:i}}),setSelectedScale:s=>{if(r().selectedScale!==s){n({selectedScale:s});try{sessionStorage.setItem(t,s)}catch{}}},setRawTasks:s=>n({rawTasks:s}),commitTasks:s=>n(o=>{const e=ca(o.rawTasks,s);return{rawTasks:s,history:e?ua(o.history,e,o.historyLimit):ie}}),syncTasksFromProps:s=>n(o=>JSON.stringify(o.rawTasks)===JSON.stringify(s)?o:{rawTasks:s,history:ie}),setHistoryLimit:s=>n(o=>o.historyLimit===s?o:{historyLimit:s,history:da(o.history,s)}),undo:()=>{const s=r(),o=fa(s.history);if(!o)return null;const e=ur(s.rawTasks,o.entry,"before");return n({rawTasks:e,history:o.stack}),e},redo:()=>{const s=r(),o=ha(s.history);if(!o)return null;const e=ur(s.rawTasks,o.entry,"after");return n({rawTasks:e,history:o.stack}),e},setBottomRowCells:s=>n({bottomRowCells:s}),setTransformedTasks:s=>n({transformedTasks:s}),setDragOffsets:s=>n(o=>({dragOffsets:{...o.dragOffsets,...s}})),clearDragOffsets:s=>n(o=>{const e={...o.dragOffsets};let i=!1;for(const a of s)a in e&&(delete e[a],i=!0);return i?{dragOffsets:e}:o}),clearAllDragOffsets:()=>n(s=>{var i;const o=(i=s.currentTask)==null?void 0:i.id,e=Object.keys(s.dragOffsets);return e.length?!o||!s.dragOffsets[o]?{dragOffsets:{}}:e.length===1?s:{dragOffsets:{[o]:s.dragOffsets[o]}}:s}),getCurrentDragOffset:s=>r().dragOffsets[s]||null,getTotalWidth:()=>r().bottomRowCells.reduce((o,e)=>o+e.widthPx,0)}))}const pa="group:",va="Ungrouped";function qr(t){return`${pa}${t}`}function dr(t){return Mt(t)?R(t.startDate).valueOf():R(t.endDate).valueOf()}function Sa(t){if(t.length<2)return t.length?[[...t]]:[];const n=t.map((o,e)=>({task:o,index:e})).sort((o,e)=>{const i=R(o.task.startDate).valueOf()-R(e.task.startDate).valueOf();return i!==0?i:o.index-e.index}),r=[],s=[];for(const{task:o}of n){const e=R(o.startDate).valueOf(),i=s.findIndex(a=>a<=e);i===-1?(r.push([o]),s.push(dr(o))):(r[i].push(o),s[i]=Math.max(s[i],dr(o)))}return r}function fr(t){const n=new Map;for(const o of t){if(!o.lane)continue;const e=n.get(o.lane);e?e.push(o):n.set(o.lane,[o])}if(!n.size)return t.map(o=>[o]);const r=[],s=new Set;for(const o of t){if(!o.lane){r.push([o]);continue}s.has(o.lane)||(s.add(o.lane),r.push(...Sa(n.get(o.lane)??[])))}return r}function ba(t,n){const r=typeof n=="function"?n(t):t[n];return r==null||r===""?"":String(r)}function ya(t,n={}){const{groupBy:r,collapsedIds:s,tree:o,ungroupedLabel:e=va}=n,i=[];if(r===void 0)for(const a of fr(t))i.push({tasks:a,depth:a[0].depth});else{const a=o?new Map(t.map(c=>[c.id,c])):null,l=c=>{if(!o||!a)return c;let d=c.id,f=o.parentOf.get(d)??null;for(;f;)d=f,f=o.parentOf.get(d)??null;return a.get(d)??c},u=new Map;for(const c of t){const d=ba(l(c),r),f=u.get(d);f?f.push(c):u.set(d,[c])}for(const[c,d]of u)if(i.push({tasks:[],depth:0,group:{key:c,label:c===""?e:c,count:d.length}}),!(s!=null&&s.has(qr(c))))for(const f of fr(d))i.push({tasks:f,depth:f[0].depth+1})}return xa(i)}function xa(t){const n=t.map(i=>i.group?qr(i.group.key):i.tasks.map(a=>a.id).join("+")),r=[],s=new Map,o=[];t.forEach((i,a)=>{const l=i.depth===0?"":o[i.depth-1]??"";r.push(l),s.set(l,(s.get(l)??0)+1),o[i.depth]=n[a],o.length=i.depth+1});const e=new Map;return t.map((i,a)=>{const l=r[a],u=(e.get(l)??0)+1;e.set(l,u);const c=a+1;return{id:n[a],tasks:i.tasks.map(d=>d.order===c?d:{...d,order:c}),depth:i.depth,level:i.depth+1,posinset:u,setsize:s.get(l)??1,group:i.group}})}const wa=600,$a="100%",Da="month",Ma=[],Ia=[],Oa=[],Ea=[],Ta=b.forwardRef(function(n,r){const s=n.storageKey??Re,[o]=b.useState(()=>ga(s));return $.jsx(yr.Provider,{value:o,children:$.jsx(ka,{...n,forwardedRef:r})})});function ka({tasks:t=Ma,onTasksChange:n,height:r=wa,width:s=$a,theme:o,defaultScale:e=Da,className:i,showNonWorkingDays:a=!0,holidays:l,isNonWorkingDay:u,storageKey:c=Re,initialScrollTo:d,readOnly:f,allowMove:h,allowResize:m,allowProgressChange:p,minDate:y,maxDate:S,visibleStart:v,visibleEnd:x,locale:D,formats:T,firstDayOfWeek:P,showTaskList:k,columns:A,hierarchy:w=!1,collapsedIds:g,defaultCollapsedIds:j,onCollapsedChange:X,groupBy:q,ungroupedLabel:C,schedulingPolicy:E="off",onSchedulingCycle:I,workingCalendar:N=!1,criticalPath:L=!1,renderBaseline:F,historyLimit:W=Kr,allowLinkCreate:K,allowLinkDelete:tt,allowTaskCreate:et,onDependencyCreate:st,onDependencyDelete:dt,onTaskCreate:lt,onTaskClick:vt,onTaskDoubleClick:ot,onTaskSelect:M,selectable:G,onBeforeTaskChange:U,renderBar:ct,renderTooltip:it,renderHeaderCell:$t,showTooltip:bt,markers:nt=Oa,rangeBands:at=Ea,zoomOnWheel:St=!1,infiniteScroll:mt=!1,onRangeChange:ft,autoScrollOnDrag:It=!0,allowRowReorder:Ot=!1,onReorder:Tt,forwardedRef:Dt}){const V=At(),{rawTasks:z,transformedTasks:B,bottomRowCells:J,selectedScale:Y,syncTasksFromProps:Pt,setHistoryLimit:te,selectedTaskId:ce,setTransformedTasks:ue,setBottomRowCells:_t,setSelectedScale:de,setLocaleOptions:Sn,clearAllDragOffsets:bn,getTotalWidth:Jr}=na(),fe=b.useMemo(()=>D===void 0&&T===void 0&&P===void 0?void 0:{locale:D,formats:T,firstDayOfWeek:P},[D,T,P]);b.useLayoutEffect(()=>{Sn(fe)},[fe,Sn]);const kt=b.useRef(null),Nt=b.useMemo(()=>({readOnly:f,allowMove:h,allowResize:m,allowProgressChange:p,allowLinkCreate:K,allowLinkDelete:tt,allowTaskCreate:et,minDate:y,maxDate:S}),[f,h,m,p,K,tt,et,y,S]),Ce=A??ks,yn=k??A!==void 0,[je,Zr]=b.useState(!1),[ze,Qr]=b.useState(()=>Ce.reduce((O,_)=>O+(_.width??pr),0)),Ht=yn&&!je,Fe=Ht?ze:0,[xn,ts]=b.useState({scale:Y,value:ln}),he=xn.scale===Y?xn.value:ln,Rt=Jr(),Ct=b.useRef(Y),me=b.useRef(J),Ye=b.useRef(Fe),We=b.useRef(he),wn=b.useRef(Rt),$n=b.useRef(ft);b.useLayoutEffect(()=>{Ct.current=Y,me.current=J,Ye.current=Fe,We.current=he,wn.current=Rt,$n.current=ft});const[es,ns]=b.useState(()=>j??Ia),Xt=g??es,Lt=b.useMemo(()=>new Set(Xt),[Xt]),Ue=b.useCallback(O=>{const _=Xt.includes(O)?Xt.filter(H=>H!==O):[...Xt,O];g===void 0&&ns(_),X==null||X(_)},[Xt,g,X]),ge=b.useMemo(()=>{if(u)return u;const O=new Set(l);return _=>{const H=_.day();return H===0||H===6||O.has(_.format("YYYY-MM-DD"))}},[l,u]),pe=b.useMemo(()=>N?$r({isNonWorkingDay:ge}):Jt,[N,ge]),rs=b.useMemo(()=>({policy:E,calendar:pe,hierarchy:w,onCycle:I}),[E,pe,w,I]),Ft=b.useMemo(()=>L?Tr(z,{calendar:pe}):null,[L,z,pe]),He=b.useMemo(()=>{const O=Ft==null?void 0:Ft.metrics;return O!=null&&O.size?B.map(_=>{const H=O.get(_.id);return H?{..._,...H}:_}):B},[B,Ft]),Dn=G??M!==void 0,Xe=b.useCallback(O=>{if(!Dn)return;const _=(O==null?void 0:O.id)??null;V.getState().selectedTaskId!==_&&(V.getState().setSelectedTaskId(_),M==null||M(O))},[Dn,M,V]),Ge=b.useCallback((O,_)=>{vt==null||vt(O,_),Xe(O)},[vt,Xe]),Ve=b.useCallback((O,_)=>{ot==null||ot(O,_)},[ot]),ss=b.useMemo(()=>({onTasksChange:n,onBeforeTaskChange:U,onTaskClick:Ge,onTaskDoubleClick:Ve,renderBar:ct,renderTooltip:it,showTooltip:bt}),[n,U,Ge,Ve,ct,it,bt]),ve=b.useMemo(()=>w?zt(z):void 0,[w,z]),Mn=b.useMemo(()=>!w||!Lt.size?He:Js(He,Lt,ve),[w,Lt,He,ve]),gt=b.useMemo(()=>ya(Mn,{groupBy:q,collapsedIds:Lt,tree:ve,ungroupedLabel:C}),[Mn,q,Lt,ve,C]),In=b.useMemo(()=>gt.flatMap(O=>O.tasks),[gt]),os=b.useMemo(()=>gt.map(O=>{var _;return O.group?null:((_=O.tasks[0])==null?void 0:_.id)??null}),[gt]),On=lt!==void 0&&Fs(Nt),{onDrawPointerDown:is,ghost:Se}=Ni({enabled:On,rowIds:os,onTaskCreate:lt}),{rowVirtualizer:Gt,isBarVisible:as}=Wr({rowCount:gt.length,bottomRowCells:J,scrollRef:kt}),{containerClassName:ls,dataTheme:cs}=aa(o,i?`gantt-container ${i}`:"gantt-container");b.useEffect(()=>{de(ma(c)??e)},[]);const En=b.useRef(null);b.useEffect(()=>{const O=JSON.stringify(t);O!==En.current&&(En.current=O,Pt(t))},[t,Pt]),b.useEffect(()=>{te(W)},[W,te]);const Tn=b.useMemo(()=>v||x?{start:v?R(v):void 0,end:x?R(x):void 0}:void 0,[v,x]),kn=b.useRef([]),be=b.useRef(0);b.useLayoutEffect(()=>{const{bottomCells:O,transformedTasks:_}=Po(z,Y,Tn,w,he),H=kn.current;H.length&&O.length&&(be.current+=wo(H,O,Y)),kn.current=O,_t(O),ue(_),bn()},[z,Y,Tn,w,he,_t,ue,bn]);const Ke=b.useRef(null);b.useLayoutEffect(()=>{const O=kt.current,_=Ke.current;if(_){Ke.current=null,be.current=0;const Z=Ut(_.date,J,Ct.current);if(O&&Z!==null){O.scrollLeft=Math.max(0,Z-_.viewportX);return}}const H=be.current;H&&(be.current=0,O&&(O.scrollLeft+=H))},[J]);const Be=b.useCallback((O,_)=>{if(O===Ct.current){const H=kt.current,Z=Ut(_.date,me.current,O);H&&Z!==null&&(H.scrollLeft=Math.max(0,Z-_.viewportX));return}Ke.current=_,de(O)},[de]),us=O=>{de(O)};b.useEffect(()=>{if(!St)return;const O=kt.current;if(!O)return;const _={...mo},H=Z=>{if(!Z.ctrlKey&&!Z.metaKey)return;Z.preventDefault();const{state:Q,step:rt}=go(_,Z.deltaY,Z.timeStamp);if(Object.assign(_,Q),!rt)return;const ut=co(Ct.current,rt);if(ut===Ct.current)return;const xt=O.getBoundingClientRect(),jn=Ye.current,zn=Math.min(Math.max(Z.clientX-xt.left,jn),O.clientWidth)-jn,Fn=Do(O.scrollLeft+zn,me.current,Ct.current);Fn&&Be(ut,{date:Fn,viewportX:zn})};return O.addEventListener("wheel",H,{passive:!1}),()=>O.removeEventListener("wheel",H)},[St,Be]),b.useEffect(()=>{if(!mt)return;const O=kt.current;if(!O)return;const _=()=>{const H=me.current,Z=wn.current;if(!H.length||Z<=0)return;const Q=bo({current:We.current,scrollLeft:O.scrollLeft,viewportPx:O.clientWidth-Ye.current,totalPx:Z,pxPerTick:Z/H.length,canExtend:{before:!v,after:!x}});Q&&(We.current=Q,ts({scale:Ct.current,value:Q}))};return _(),O.addEventListener("scroll",_,{passive:!0}),()=>O.removeEventListener("scroll",_)},[mt,J,v,x]);const Ln=b.useRef("");b.useEffect(()=>{const O=$n.current;if(!O)return;const _=Nr(J,Ct.current);if(!_)return;const H=`${_.start.valueOf()}:${_.end.valueOf()}`;H!==Ln.current&&(Ln.current=H,O(_))},[J]);const ds=b.useMemo(()=>Mo([{id:"today",date:R(),className:"gantt-today-marker"},...nt],J,Y,B),[nt,J,Y,B]),fs=b.useMemo(()=>Io(at,J,Y),[at,J,Y]),An=b.useMemo(()=>a?$o(J,Y,ge):[],[a,ge,J,Y]),{historyApi:ee,onKeyDown:hs}=Zi(n),ne=ra({scrollRef:kt,bottomRowCells:J,transformedTasks:In,selectedScale:Y,rowHeight:wt,viewportInsetPx:Fe,zoomTo:Be}),Pn=Bi({scrollRef:kt,bottomRowCells:J,selectedScale:Y,taskCount:gt.length,totalWidth:Rt});b.useImperativeHandle(Dt,()=>({...ne,...Pn,undo:ee.undo,redo:ee.redo,get canUndo(){return ee.canUndo},get canRedo(){return ee.canRedo}}),[ne,Pn,ee]);const _n=b.useRef(null),[qe,Nn]=b.useState({row:0,col:0}),[Rn,Je]=b.useState(0),[ms,Yt]=b.useState(""),ye=Ht?Ce.length:0,yt=b.useMemo(()=>({row:Math.min(qe.row,Math.max(gt.length-1,0)),col:qe.col}),[qe,gt.length]),Ze=b.useMemo(()=>gt.map(O=>{var H;const _=!!O.group||w&&!!((H=O.tasks[0])!=null&&H.isSummary);return{cells:O.group?1:Math.max(ye+O.tasks.length,1),firstBarCell:O.group?1:ye,expandable:_,expanded:!Lt.has(O.id)}}),[gt,ye,w,Lt]),{tooltip:xe}=b.useMemo(()=>le(Y,fe),[Y,fe]),we=b.useCallback(O=>{V.getState().commitTasks(O),n==null||n(O)},[V,n]),gs=b.useCallback(O=>{const _=qo(O,yt,Ze);if(!_)return;O.preventDefault();const H=gt[_.kind==="focus"?yt.row:_.row],Z=Ze[yt.row],Q=_.kind==="focus"?void 0:Jo(H,_.col??0,(Z==null?void 0:Z.firstBarCell)??0);switch(_.kind){case"focus":Nn(_.focus),Je(rt=>rt+1);break;case"toggle":H&&Ue(H.id);break;case"activate":Q&&Yt(Rr(Q,xe,null));break;case"delete":{if(!Q)return;const rt=ti(z,Q,Nt);if(!rt){Yt(`${Q.name} cannot be deleted`);break}we(rt),Yt(`${Q.name} deleted`);break}case"nudge":{if(!Q)return;const rt=Zo(z,Q,_.mode,_.steps,Y,Nt);if(!rt){Yt(`${Q.name} cannot be changed`);break}we(rt);const ut=rt.find(xt=>xt.id===Q.id);ut&&Yt(`${Q.name}, ${xe(R(ut.startDate))} to ${xe(R(ut.endDate))}`),Je(xt=>xt+1);break}case"progress":{if(!Q)return;const rt=Qo(z,Q,_.delta,Nt);if(!rt){Yt(`${Q.name} progress cannot be changed`);break}we(rt);const ut=rt.find(xt=>xt.id===Q.id);Yt(`${Q.name}, ${(ut==null?void 0:ut.progress)??0}% complete`),Je(xt=>xt+1);break}}},[yt,Ze,gt,Ue,z,Nt,Y,we,xe]),ps=b.useCallback(O=>{var Q,rt,ut;const _=(ut=(rt=(Q=O.target).closest)==null?void 0:rt.call(Q,"[data-gantt-cell]"))==null?void 0:ut.getAttribute("data-gantt-cell");if(!_)return;const[H,Z]=_.split(":").map(Number);Nn(xt=>xt.row===H&&xt.col===Z?xt:{row:H,col:Z})},[]);b.useEffect(()=>{if(!Rn)return;let O=3,_=0;const H=()=>{var rt,ut;const Z=(rt=_n.current)==null?void 0:rt.querySelector(`[data-gantt-cell="${yt.row}:${yt.col}"]`);if(Z){Z.focus({preventScroll:!0}),Z.scrollIntoView({block:"nearest",inline:"nearest"});return}if(--O<=0)return;Gt.scrollToIndex(yt.row,{align:"auto"});const Q=(ut=gt[yt.row])==null?void 0:ut.tasks[0];Q&&ne.scrollToTask(Q.id,{smooth:!1}),_=requestAnimationFrame(H)};return H(),()=>cancelAnimationFrame(_)},[Rn]);const Cn=b.useRef(!1);b.useEffect(()=>{if(Cn.current||!d||!J.length)return;Cn.current=!0;const O=d==="today"?R():d;ne.scrollToDate(O,{smooth:!1})},[d,J,ne]);const vs={height:typeof r=="number"?`${r}px`:r,width:typeof s=="number"?`${s}px`:s};return $.jsxs("section",{className:ls,"data-theme":cs,style:vs,tabIndex:-1,onKeyDown:hs,children:[$.jsxs("div",{className:"gantt-toolbar",children:[yn&&$.jsx("button",{type:"button",className:"gantt-grid-toggle",onClick:()=>Zr(O=>!O),"aria-expanded":!je,"aria-label":je?"Expand task list":"Collapse task list",children:$.jsxs("svg",{viewBox:"0 0 16 16","aria-hidden":"true",children:[$.jsx("rect",{x:"1.5",y:"2.5",width:"13",height:"11",rx:"1.5"}),$.jsx("path",{d:"M6 2.5 L6 13.5"})]})}),$.jsx(_i,{selectedScale:Y,onScaleChange:us})]}),$.jsx("div",{className:"gantt-sr-only",role:"status","aria-live":"polite",children:ms}),$.jsxs("div",{className:"gantt-main",children:[$.jsx("div",{ref:kt,className:"gantt-scroll-container",children:$.jsxs("div",{ref:_n,className:"gantt-body",role:"treegrid","aria-label":"Gantt chart","aria-rowcount":gt.length+(Ht?1:0),onKeyDown:gs,onFocusCapture:ps,children:[Ht&&$.jsx(Pi,{rows:gt,columns:Ce,virtualItems:Gt.getVirtualItems(),totalHeight:Gt.getTotalSize(),width:ze,hierarchy:w,collapsedIds:Lt,onToggleCollapse:Ue,focus:yt,allowRowReorder:Ot,interaction:Nt,onReorder:Tt,onTasksChange:n,selectedTaskId:ce,onRowClick:Ge,onRowDoubleClick:Ve}),$.jsxs("div",{className:"gantt-timeline",style:{width:`${Rt}px`},role:"presentation",children:[$.jsx(Di,{width:Rt}),$.jsx("div",{className:"gantt-header-wrapper",style:{width:`${Rt}px`},children:$.jsx(yi,{bottomRowCells:J,selectedScale:Y,width:Rt,scrollRef:kt,renderHeaderCell:$t})}),$.jsxs("div",{className:`gantt-content${On?" drawable":""}`,style:{height:`${Gt.getTotalSize()}px`,width:`${Rt}px`},role:"presentation",onPointerDown:is,onClick:O=>{O.target===O.currentTarget&&Xe(null)},children:[An.length>0&&$.jsx("div",{className:"gantt-non-working-layer","aria-hidden":"true",children:An.map(O=>$.jsx("div",{className:"gantt-non-working-range",style:{left:`${O.left}px`,width:`${O.width}px`}},O.left))}),$.jsx(Ii,{bands:fs}),$.jsx("div",{className:"gantt-rows",role:"presentation",children:Gt.getVirtualItems().map(O=>{var rt;const _=gt[O.index];if(!_)return null;const H={height:`${O.size}px`,transform:`translateY(${O.start}px)`},Z=`gantt-task-row${_.group?" group":""}`;if(Ht)return $.jsx("div",{className:Z,style:H,"aria-hidden":"true"},`row-${_.id}`);const Q=!!_.group||w&&!!((rt=_.tasks[0])!=null&&rt.isSummary);return $.jsx("div",{className:Z,style:H,...Cr(_,O.index,{headerOffset:0,expandable:Q,expanded:!Lt.has(_.id),ownedIds:_.tasks.map(ut=>`task-${ut.id}`)}),children:_.group&&$.jsxs("div",{className:"gantt-group-label",role:"gridcell",tabIndex:yt.row===O.index&&yt.col===0?0:-1,"data-gantt-cell":`${O.index}:0`,children:[_.group.label,$.jsx("span",{className:"gantt-grid-group-count",children:_.group.count})]})},`row-${_.id}`)})}),$.jsx(Oi,{markers:ds}),Se&&$.jsx("div",{className:"gantt-draw-ghost",style:{left:`${Se.leftPx}px`,width:`${Se.widthPx}px`,transform:`translateY(${Se.topPx}px)`},"aria-hidden":"true"}),$.jsx($i,{transformedTasks:In,rowCount:gt.length,criticalLinkIds:Ft==null?void 0:Ft.criticalLinkIds,interaction:Nt,onTasksChange:n,onDependencyDelete:dt}),Gt.getVirtualItems().flatMap(O=>{const _=gt[O.index];return _?_.tasks.map((H,Z)=>{const Q=H.barLeft??0,rt=H.barWidth??0;if(!as(Q,rt))return null;const ut=ye+Z;return $.jsxs("div",{style:{position:"absolute",top:0,left:0,height:`${O.size-1}px`,transform:`translateY(${O.start}px)`,display:"flex",alignItems:"center"},children:[H.baselineLeft!==void 0&&((F==null?void 0:F(H))??$.jsx("div",{className:`gantt-baseline${Mt(H)?" milestone":""}`,style:{left:`${H.baselineLeft}px`,width:Mt(H)?void 0:`${H.baselineWidth}px`},"aria-hidden":"true"})),$.jsx(ri,{currentTask:H,options:ss,interaction:Nt,scheduling:rs,autoScrollOnDrag:It,onDependencyCreate:st,tabIndex:yt.row===O.index&&yt.col===ut?0:-1,cellCoord:`${O.index}:${ut}`})]},H.id)}):[]})]})]})]})}),Ht&&$.jsx(Mi,{width:ze,onWidthChange:Qr})]})]})}exports.CALENDAR_DAYS=Jt;exports.ReactGanttChart=Ta;exports.backwardPass=Er;exports.buildTaskGraph=Zt;exports.buildTaskTree=zt;exports.canLink=Xs;exports.collectSubtreeIds=Qt;exports.computeCriticalPath=Tr;exports.createWorkingCalendar=$r;exports.findPath=Dr;exports.forwardPass=Or;exports.linkKey=Kt;exports.rollUpTasks=kr;exports.scheduleTasks=Ir;
@@ -0,0 +1,13 @@
1
+ export { default as ReactGanttChart } from './pages/Gantt';
2
+ export type { GanttProps } from './pages/Gantt';
3
+ export type { GanttHandle, GanttScrollApi, GanttScrollOptions, GanttZoomAnchor, } from './hooks/useGanttScrollApi';
4
+ export type { GanttExportApi } from './hooks/useGanttExportApi';
5
+ export type { GanttHistoryApi } from './hooks/useGanttHistoryApi';
6
+ export type { GanttExportOptions, GanttExportRange, } from './utils/pngExport';
7
+ export type { Task, TaskDependency, DependencyType, TaskType, TaskTransformed, GanttInteractionConfig, } from './types/task';
8
+ export type { GanttDependencyChange } from './hooks/useGanttLinkDrag';
9
+ export type { GanttTaskDraft } from './hooks/useGanttDrawCreate';
10
+ export type { GanttColumn, GanttDateRange, GanttFormatOverrides, GanttGroupBy, GanttMarker, GanttRangeBand, GanttReorderChange, GanttScaleFormat, GanttScaleKey, GanttTheme, GanttChangeType, GanttTaskChange, GanttBeforeChangeHandler, GanttBarRenderProps, GanttBarRenderer, GanttTooltipReason, GanttTooltipRenderProps, GanttTooltipRenderer, GanttHeaderCellRenderProps, GanttHeaderCellRenderer, } from './types/gantt';
11
+ export type { GanttRow, GanttRowGroup } from './utils/grouping';
12
+ export { backwardPass, buildTaskGraph, buildTaskTree, CALENDAR_DAYS, canLink, collectSubtreeIds, computeCriticalPath, createWorkingCalendar, findPath, forwardPass, linkKey, rollUpTasks, scheduleTasks, } from './core';
13
+ export type { CriticalPathResult, ScheduleOptions, ScheduleResult, SchedulingLink, SchedulingPolicy, TaskGraph, TaskScheduleMetrics, TaskTree, WorkingCalendar, WorkingCalendarOptions, } from './core';
package/dist/index.d.ts CHANGED
@@ -1,51 +1,13 @@
1
- import { GanttScaleKey as GanttScaleKey_2 } from 'types/gantt';
2
- import { GanttTheme as GanttTheme_2 } from 'types/gantt';
3
- import { JSX } from 'react/jsx-runtime';
4
- import { Task as Task_2 } from 'types/task';
5
-
6
- export declare type DependencyType = 'FS' | 'SS' | 'FF' | 'SF';
7
-
8
- export declare interface GanttProps {
9
- /** 태스크 데이터 배열 */
10
- tasks?: Task_2[];
11
- /** 태스크 변경 호출되는 콜백 */
12
- onTasksChange?: (updatedTasks: Task_2[]) => void;
13
- /** 차트 높이 (px 또는 CSS 값) */
14
- height?: number | string;
15
- /** 차트 너비 (px 또는 CSS 값) */
16
- width?: number | string;
17
- /** 테마 설정 - 'light', 'dark', 또는 'system' */
18
- theme?: GanttTheme_2;
19
- /** 기본 스케일 설정 */
20
- defaultScale?: GanttScaleKey_2;
21
- /** 추가 CSS 클래스명 */
22
- className?: string;
23
- }
24
-
25
- export declare type GanttScaleKey = 'day' | 'week' | 'month' | 'year';
26
-
27
- /** 테마 타입 - 'light', 'dark', 또는 'system' (시스템 설정 따름) */
28
- export declare type GanttTheme = 'light' | 'dark' | 'system';
29
-
30
- /**
31
- * Gantt 차트 메인 컴포넌트
32
- * 가상화를 사용하여 대량의 태스크를 효율적으로 렌더링
33
- */
34
- export declare function ReactGanttChart({ tasks, onTasksChange, height, width, theme, defaultScale, className, }: GanttProps): JSX.Element;
35
-
36
- export declare interface Task {
37
- id: string;
38
- name: string;
39
- startDate: string;
40
- endDate: string;
41
- parentId: string | null;
42
- sequence: string;
43
- dependencies?: TaskDependency[];
44
- }
45
-
46
- export declare interface TaskDependency {
47
- targetId: string;
48
- type: DependencyType;
49
- }
50
-
51
- export { }
1
+ export { default as ReactGanttChart } from './pages/Gantt';
2
+ export type { GanttProps } from './pages/Gantt';
3
+ export type { GanttHandle, GanttScrollApi, GanttScrollOptions, GanttZoomAnchor, } from './hooks/useGanttScrollApi';
4
+ export type { GanttExportApi } from './hooks/useGanttExportApi';
5
+ export type { GanttHistoryApi } from './hooks/useGanttHistoryApi';
6
+ export type { GanttExportOptions, GanttExportRange, } from './utils/pngExport';
7
+ export type { Task, TaskDependency, DependencyType, TaskType, TaskTransformed, GanttInteractionConfig, } from './types/task';
8
+ export type { GanttDependencyChange } from './hooks/useGanttLinkDrag';
9
+ export type { GanttTaskDraft } from './hooks/useGanttDrawCreate';
10
+ export type { GanttColumn, GanttDateRange, GanttFormatOverrides, GanttGroupBy, GanttMarker, GanttRangeBand, GanttReorderChange, GanttScaleFormat, GanttScaleKey, GanttTheme, GanttChangeType, GanttTaskChange, GanttBeforeChangeHandler, GanttBarRenderProps, GanttBarRenderer, GanttTooltipReason, GanttTooltipRenderProps, GanttTooltipRenderer, GanttHeaderCellRenderProps, GanttHeaderCellRenderer, } from './types/gantt';
11
+ export type { GanttRow, GanttRowGroup } from './utils/grouping';
12
+ export { backwardPass, buildTaskGraph, buildTaskTree, CALENDAR_DAYS, canLink, collectSubtreeIds, computeCriticalPath, createWorkingCalendar, findPath, forwardPass, linkKey, rollUpTasks, scheduleTasks, } from './core';
13
+ export type { CriticalPathResult, ScheduleOptions, ScheduleResult, SchedulingLink, SchedulingPolicy, TaskGraph, TaskScheduleMetrics, TaskTree, WorkingCalendar, WorkingCalendarOptions, } from './core';