@object-ui/plugin-gantt 7.1.0 → 7.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -5,44 +5,44 @@ import { useNavigationOverlay as l, useObjectTranslation as u, useSchemaContext
5
5
  import { GanttConfigSchema as f } from "@objectstack/spec/ui";
6
6
  import { resolveFieldCurrency as p, useLocalization as m } from "@object-ui/i18n";
7
7
  import { RecordDetailDrawer as h, deriveRecordPageHref as g } from "@object-ui/plugin-detail";
8
- import { AlertDialog as _, AlertDialogAction as v, AlertDialogCancel as ee, AlertDialogContent as te, AlertDialogDescription as ne, AlertDialogFooter as re, AlertDialogHeader as ie, AlertDialogTitle as ae, Button as y, cn as b, useResizeObserver as oe } from "@object-ui/components";
9
- import { formatCurrency as se, formatDate as ce, formatDateTime as x, formatNumber as le, formatPercent as S, getSemanticColorName as ue, getSemanticHex as de, humanizeLabel as fe } from "@object-ui/fields";
10
- import { Activity as pe, ChevronDown as me, ChevronLeft as he, ChevronRight as C, Crosshair as ge, Download as _e, FileDown as ve, Lock as w, Maximize2 as T, Minimize2 as ye, PanelLeft as E, PanelLeftClose as be, Redo2 as xe, Save as Se, Undo2 as Ce, Wand2 as we, ZoomIn as Te, ZoomOut as Ee } from "lucide-react";
11
- import { Fragment as De, jsx as D, jsxs as O } from "react/jsx-runtime";
8
+ import { AlertDialog as ee, AlertDialogAction as _, AlertDialogCancel as v, AlertDialogContent as te, AlertDialogDescription as ne, AlertDialogFooter as re, AlertDialogHeader as ie, AlertDialogTitle as ae, Button as y, cn as b, useResizeObserver as oe } from "@object-ui/components";
9
+ import { formatCurrency as se, formatDate as ce, formatDateTime as le, formatNumber as x, formatPercent as ue, getSemanticColorName as S, getSemanticHex as de, humanizeLabel as fe } from "@object-ui/fields";
10
+ import { Activity as pe, ChevronDown as me, ChevronLeft as he, ChevronRight as C, Crosshair as ge, Download as _e, FileDown as ve, Lock as w, Maximize2 as T, Minimize2 as ye, PanelLeft as be, PanelLeftClose as xe, Redo2 as Se, Save as Ce, Undo2 as we, Wand2 as Te, ZoomIn as Ee, ZoomOut as De } from "lucide-react";
11
+ import { Fragment as Oe, jsx as E, jsxs as D } from "react/jsx-runtime";
12
12
  //#region src/scheduling.ts
13
- var Oe = 1e3 * 60 * 60 * 24, k = (e) => e.toISOString().slice(0, 10);
14
- function A(e, t) {
13
+ var O = 1e3 * 60 * 60 * 24, ke = (e) => e.toISOString().slice(0, 10);
14
+ function k(e, t) {
15
15
  if (t.skipWeekends) {
16
16
  let t = e.getUTCDay();
17
17
  if (t === 0 || t === 6) return !1;
18
18
  }
19
- return !(t.holidays && t.holidays.has(k(e)));
19
+ return !(t.holidays && t.holidays.has(ke(e)));
20
20
  }
21
- function j(e) {
21
+ function A(e) {
22
22
  let t = new Date(e);
23
23
  return t.setUTCHours(0, 0, 0, 0), t;
24
24
  }
25
- function M(e, t) {
26
- let n = j(e);
27
- for (; !A(n, t);) n = new Date(n.getTime() + Oe);
25
+ function j(e, t) {
26
+ let n = A(e);
27
+ for (; !k(n, t);) n = new Date(n.getTime() + O);
28
28
  return n.getTime();
29
29
  }
30
- function ke(e, t, n) {
30
+ function M(e, t, n) {
31
31
  if (t <= e) return 0;
32
- let r = 0, i = j(e), a = j(t).getTime();
33
- for (; i.getTime() < a;) A(i, n) && r++, i = new Date(i.getTime() + Oe);
32
+ let r = 0, i = A(e), a = A(t).getTime();
33
+ for (; i.getTime() < a;) k(i, n) && r++, i = new Date(i.getTime() + O);
34
34
  return r;
35
35
  }
36
- function N(e, t, n) {
37
- if (t <= 0) return j(e).getTime();
38
- let r = j(e), i = t;
39
- for (; i > 0;) A(r, n) && i--, r = new Date(r.getTime() + Oe);
36
+ function Ae(e, t, n) {
37
+ if (t <= 0) return A(e).getTime();
38
+ let r = A(e), i = t;
39
+ for (; i > 0;) k(r, n) && i--, r = new Date(r.getTime() + O);
40
40
  return r.getTime();
41
41
  }
42
- function Ae(e, t, n) {
43
- if (t <= 0) return j(e).getTime();
44
- let r = j(e), i = t;
45
- for (; i > 0;) r = /* @__PURE__ */ new Date(r.getTime() - Oe), A(r, n) && i--;
42
+ function N(e, t, n) {
43
+ if (t <= 0) return A(e).getTime();
44
+ let r = A(e), i = t;
45
+ for (; i > 0;) r = /* @__PURE__ */ new Date(r.getTime() - O), k(r, n) && i--;
46
46
  return r.getTime();
47
47
  }
48
48
  var P = (e) => String(e);
@@ -71,7 +71,7 @@ function Ne(e) {
71
71
  for (let n of e) n.parent != null && n.parent !== "" && t.add(P(n.parent));
72
72
  return t;
73
73
  }
74
- function F(e, t) {
74
+ function Pe(e, t) {
75
75
  let n = /* @__PURE__ */ new Map(), r = /* @__PURE__ */ new Map();
76
76
  for (let t of e) n.set(t, 0), r.set(t, []);
77
77
  for (let e of t) r.get(e.pred).push(e.succ), n.set(e.succ, (n.get(e.succ) ?? 0) + 1);
@@ -97,7 +97,7 @@ function F(e, t) {
97
97
  hasCycle: !1
98
98
  };
99
99
  }
100
- function Pe(e, t) {
100
+ function Fe(e, t) {
101
101
  let n = {
102
102
  criticalIds: /* @__PURE__ */ new Set(),
103
103
  criticalEdges: /* @__PURE__ */ new Set()
@@ -105,10 +105,10 @@ function Pe(e, t) {
105
105
  if (!e.length) return n;
106
106
  let r = /* @__PURE__ */ new Map();
107
107
  for (let n of e) {
108
- let e = t ? ke(n.start.getTime(), n.end.getTime(), t) : (n.end.getTime() - n.start.getTime()) / Oe;
108
+ let e = t ? M(n.start.getTime(), n.end.getTime(), t) : (n.end.getTime() - n.start.getTime()) / O;
109
109
  r.set(P(n.id), Number.isFinite(e) && e > 0 ? e : 0);
110
110
  }
111
- let i = Me(e), a = e.map((e) => P(e.id)), { order: o, hasCycle: s } = F(a, i);
111
+ let i = Me(e), a = e.map((e) => P(e.id)), { order: o, hasCycle: s } = Pe(a, i);
112
112
  if (s) return n;
113
113
  let c = /* @__PURE__ */ new Map(), l = /* @__PURE__ */ new Map();
114
114
  for (let e of a) c.set(e, []), l.set(e, []);
@@ -129,19 +129,19 @@ function Pe(e, t) {
129
129
  let t = (m.get(e) ?? 0) - (u.get(e) ?? 0);
130
130
  Math.abs(t) <= h && g.add(e);
131
131
  }
132
+ let ee = /* @__PURE__ */ new Set();
133
+ for (let e of i) ee.add(e.pred), ee.add(e.succ);
134
+ for (let e of [...g]) !ee.has(e) && (r.get(e) ?? 0) === 0 && g.delete(e);
132
135
  let _ = /* @__PURE__ */ new Set();
133
- for (let e of i) _.add(e.pred), _.add(e.succ);
134
- for (let e of [...g]) !_.has(e) && (r.get(e) ?? 0) === 0 && g.delete(e);
135
- let v = /* @__PURE__ */ new Set();
136
- for (let e of i) !g.has(e.pred) || !g.has(e.succ) || Math.abs((d.get(e.pred) ?? 0) - (u.get(e.succ) ?? 0)) <= h && v.add(`${e.pred}->${e.succ}`);
136
+ for (let e of i) !g.has(e.pred) || !g.has(e.succ) || Math.abs((d.get(e.pred) ?? 0) - (u.get(e.succ) ?? 0)) <= h && _.add(`${e.pred}->${e.succ}`);
137
137
  return {
138
138
  criticalIds: g,
139
- criticalEdges: v
139
+ criticalEdges: _
140
140
  };
141
141
  }
142
- function Fe(e, t) {
142
+ function Ie(e, t) {
143
143
  if (!e.length) return [];
144
- let n = Me(e), r = e.map((e) => P(e.id)), { order: i, hasCycle: a } = F(r, n);
144
+ let n = Me(e), r = e.map((e) => P(e.id)), { order: i, hasCycle: a } = Pe(r, n);
145
145
  if (a) return [];
146
146
  let o = Ne(e), s = /* @__PURE__ */ new Map();
147
147
  for (let t of e) s.set(P(t.id), t);
@@ -153,7 +153,7 @@ function Fe(e, t) {
153
153
  for (let e of i) {
154
154
  let n = s.get(e);
155
155
  if (!n) continue;
156
- let r = t ? ke(l.get(e), u.get(e), t) : u.get(e) - l.get(e), i = n.start.getTime();
156
+ let r = t ? M(l.get(e), u.get(e), t) : u.get(e) - l.get(e), i = n.start.getTime();
157
157
  for (let n of c.get(e) ?? []) {
158
158
  let e = l.get(n.pred), a = u.get(n.pred), o;
159
159
  switch (n.type) {
@@ -161,10 +161,10 @@ function Fe(e, t) {
161
161
  o = e;
162
162
  break;
163
163
  case "ff":
164
- o = t ? Ae(a, r, t) : a - r;
164
+ o = t ? N(a, r, t) : a - r;
165
165
  break;
166
166
  case "sf":
167
- o = t ? Ae(e, r, t) : e - r;
167
+ o = t ? N(e, r, t) : e - r;
168
168
  break;
169
169
  default:
170
170
  o = a;
@@ -173,8 +173,8 @@ function Fe(e, t) {
173
173
  o > i && (i = o);
174
174
  }
175
175
  if (!o.has(e)) if (t) {
176
- let n = M(i, t);
177
- l.set(e, n), u.set(e, N(n, r, t));
176
+ let n = j(i, t);
177
+ l.set(e, n), u.set(e, Ae(n, r, t));
178
178
  } else l.set(e, i), u.set(e, i + r);
179
179
  }
180
180
  let d = [];
@@ -191,8 +191,50 @@ function Fe(e, t) {
191
191
  return d;
192
192
  }
193
193
  //#endregion
194
+ //#region src/shifts.ts
195
+ var F = 6e4;
196
+ 1440 * F;
197
+ var Le = 1440;
198
+ function I(e) {
199
+ if (typeof e != "string") return null;
200
+ let t = /^(\d{1,2}):(\d{2})$/.exec(e.trim());
201
+ if (!t) return null;
202
+ let n = Number(t[1]), r = Number(t[2]);
203
+ return n < 0 || n > 23 || r < 0 || r > 59 ? null : n * 60 + r;
204
+ }
205
+ function Re(e) {
206
+ if (!e || !Array.isArray(e.bands) || e.bands.length === 0) return null;
207
+ let t = I(e.dayStart) ?? 0, n = [];
208
+ for (let t = 0; t < e.bands.length; t++) {
209
+ let r = e.bands[t], i = I(r.start), a = I(r.end);
210
+ if (i == null || a == null || !r.label) return null;
211
+ let o = (a - i + Le) % Le || Le;
212
+ n.push({
213
+ key: r.key ?? `band${t}`,
214
+ label: r.label,
215
+ color: r.color,
216
+ durMs: o * F
217
+ });
218
+ }
219
+ return {
220
+ dayStartMin: t,
221
+ bands: n,
222
+ showMidnight: e.showMidnight !== !1
223
+ };
224
+ }
225
+ function ze(e, t) {
226
+ let n = new Date(e);
227
+ return n.setHours(0, 0, 0, 0), n.setMinutes(t), n.getTime() > e.getTime() && n.setDate(n.getDate() - 1), n;
228
+ }
229
+ function Be(e, t) {
230
+ if (t.bands.length === 0) return null;
231
+ let n = ze(e, t.dayStartMin).getTime(), r = e.getTime() - n, i = 0;
232
+ for (let e of t.bands) if (i += e.durMs, r < i) return e;
233
+ return t.bands[t.bands.length - 1];
234
+ }
235
+ //#endregion
194
236
  //#region src/useGanttTranslation.ts
195
- var Ie = {
237
+ var Ve = {
196
238
  "gantt.column.taskName": "Task Name",
197
239
  "gantt.column.start": "Start",
198
240
  "gantt.column.end": "End",
@@ -250,60 +292,60 @@ var Ie = {
250
292
  "gantt.readOnly": "Read-only",
251
293
  "gantt.readOnlyHint": "Editing is disabled for this view."
252
294
  };
253
- function I(e, t) {
254
- let n = Ie[e] || e;
295
+ function He(e, t) {
296
+ let n = Ve[e] || e;
255
297
  if (t) for (let [e, r] of Object.entries(t)) n = n.replace(`{{${e}}}`, String(r));
256
298
  return n;
257
299
  }
258
- function Le() {
300
+ function Ue() {
259
301
  try {
260
302
  let e = u();
261
303
  return {
262
304
  t: (t, n) => {
263
305
  let r = e.t(t, n);
264
- return typeof r == "string" && r !== t ? r : I(t, n);
306
+ return typeof r == "string" && r !== t ? r : He(t, n);
265
307
  },
266
308
  language: e.language
267
309
  };
268
310
  } catch {
269
311
  return {
270
- t: I,
312
+ t: He,
271
313
  language: void 0
272
314
  };
273
315
  }
274
316
  }
275
317
  //#endregion
276
318
  //#region src/GanttView.tsx
277
- function Re(e) {
319
+ function We(e) {
278
320
  return 110;
279
321
  }
280
- function ze(e) {
322
+ function Ge(e) {
281
323
  return e < 640 ? 140 : e < 1024 ? 220 : 320;
282
324
  }
283
- function Be(e) {
325
+ function Ke(e) {
284
326
  return e >= 280;
285
327
  }
286
- function Ve(e) {
328
+ function qe(e) {
287
329
  return e < 640 ? 32 : 40;
288
330
  }
289
- var He = [
331
+ var Je = [
290
332
  "day",
291
333
  "week",
292
334
  "month",
293
335
  "quarter",
294
336
  "year"
295
- ], Ue = {
337
+ ], Ye = {
296
338
  day: 1,
297
339
  week: 7,
298
340
  month: 30.44,
299
341
  quarter: 91.31,
300
342
  year: 365.25
301
- }, We = 1e3 * 60 * 60 * 24;
302
- function Ge(e, t) {
343
+ }, Xe = 1e3 * 60 * 60 * 24;
344
+ function Ze(e, t) {
303
345
  let n = new Date(e);
304
346
  return n.setHours(0, 0, 0, 0), t === "week" ? n.setDate(n.getDate() - (n.getDay() + 6) % 7) : t === "month" ? n.setDate(1) : t === "quarter" ? n.setMonth(Math.floor(n.getMonth() / 3) * 3, 1) : t === "year" && n.setMonth(0, 1), n;
305
347
  }
306
- function Ke(e, t, n) {
348
+ function Qe(e, t, n) {
307
349
  let r = e.length - 1, i = 0;
308
350
  for (; i < r && e[i + 1] < t;) i++;
309
351
  let a = i;
@@ -313,7 +355,7 @@ function Ke(e, t, n) {
313
355
  end: a
314
356
  };
315
357
  }
316
- function qe(e, t, n) {
358
+ function $e(e, t, n) {
317
359
  let r = new Date(e);
318
360
  if (n === "day") r.setDate(r.getDate() + t);
319
361
  else if (n === "week") r.setDate(r.getDate() + t * 7);
@@ -325,7 +367,7 @@ function qe(e, t, n) {
325
367
  }
326
368
  return r;
327
369
  }
328
- function Je(e, t, n, r = 2) {
370
+ function et(e, t, n, r = 2) {
329
371
  return new Promise((i) => {
330
372
  let a = new Blob([e], { type: "image/svg+xml;charset=utf-8" }), o = URL.createObjectURL(a), s = new Image();
331
373
  s.onload = () => {
@@ -338,11 +380,11 @@ function Je(e, t, n, r = 2) {
338
380
  }, s.src = o;
339
381
  });
340
382
  }
341
- function Ye(e, t) {
383
+ function tt(e, t) {
342
384
  let n = document.createElement("a");
343
385
  n.href = URL.createObjectURL(e), n.download = t, document.body.appendChild(n), n.click(), n.remove(), setTimeout(() => URL.revokeObjectURL(n.href), 1e3);
344
386
  }
345
- function Xe(e, t, n) {
387
+ function nt(e, t, n) {
346
388
  let r = (e) => {
347
389
  let t = new Uint8Array(e.length);
348
390
  for (let n = 0; n < e.length; n++) t[n] = e.charCodeAt(n) & 255;
@@ -357,18 +399,18 @@ function Xe(e, t, n) {
357
399
  for (let e of o) d += `${String(e).padStart(10, "0")} 00000 n \n`;
358
400
  return d += `trailer\n<< /Size 6 /Root 1 0 R >>\nstartxref\n${u}\n%%EOF\n`, c(r(d)), new Blob(a, { type: "application/pdf" });
359
401
  }
360
- function Ze(e) {
402
+ function rt(e) {
361
403
  let t = e.slice(e.indexOf(",") + 1), n = atob(t), r = new Uint8Array(n.length);
362
404
  for (let e = 0; e < n.length; e++) r[e] = n.charCodeAt(e);
363
405
  return r;
364
406
  }
365
- var Qe = "gantt-layout:";
366
- function $e(e) {
407
+ var it = "gantt-layout:";
408
+ function at(e) {
367
409
  if (!e || typeof window > "u") return null;
368
410
  try {
369
- let t = window.localStorage.getItem(Qe + e);
411
+ let t = window.localStorage.getItem(it + e);
370
412
  if (!t) return null;
371
- let n = JSON.parse(t), r = n.viewMode && He.includes(n.viewMode) ? n.viewMode : null;
413
+ let n = JSON.parse(t), r = n.viewMode && Je.includes(n.viewMode) ? n.viewMode : null;
372
414
  if (!r) return null;
373
415
  let i = typeof n.columnWidth == "number" && isFinite(n.columnWidth) ? n.columnWidth : null, a = typeof n.taskListWidth == "number" && isFinite(n.taskListWidth) ? n.taskListWidth : null;
374
416
  return {
@@ -381,43 +423,43 @@ function $e(e) {
381
423
  return null;
382
424
  }
383
425
  }
384
- function et(e, t) {
426
+ function ot(e, t) {
385
427
  if (!(typeof window > "u")) try {
386
- window.localStorage.setItem(Qe + e, JSON.stringify(t));
428
+ window.localStorage.setItem(it + e, JSON.stringify(t));
387
429
  } catch {}
388
430
  }
389
- function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTaskClick: o, onTaskUpdate: s, onTaskDelete: c, onViewChange: l, onDependencyCreate: u, onDependencyDelete: d, onTaskReorder: f, className: p, inlineEdit: m = !1, autoSchedule: h = !1, rescheduleOnConflict: g = !1, criticalPathDefault: _ = !1, workingCalendar: v, showBaselines: ee = !0, readOnly: te = !1, mobileReadOnly: ne = !1, groupBy: re, ungroupedLabel: ie = "Ungrouped", defaultCollapsedDepth: ae, persistLayoutKey: se, onLayoutChange: ce }) {
390
- let { t: x, language: le } = Le(), S = le || void 0, [ue, de] = e.useState(/* @__PURE__ */ new Date()), fe = e.useRef(null), { width: Oe } = oe(fe), k = Oe || (typeof window < "u" ? window.innerWidth : 1024), A = k < 640, j = te || ne && A, M = j ? void 0 : s, ke = j ? void 0 : c, N = j ? void 0 : u, Ae = j ? void 0 : d, P = j ? void 0 : f, je = j ? !1 : m, Me = j ? !1 : h, Ne = j ? !1 : g, F = Ve(k), Ie = Re(k), I = e.useRef(void 0);
391
- I.current === void 0 && (I.current = $e(se));
392
- let Qe = I.current, [tt, nt] = e.useState(Qe ? Qe.columnWidth : null), [rt, it] = e.useState(Qe ? Qe.taskListWidth ?? null : null), [L, at] = e.useState(n && He.includes(n) ? n : Qe?.viewMode ?? "day");
431
+ function L({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTaskClick: o, onTaskUpdate: s, onTaskDelete: c, onViewChange: l, onDependencyCreate: u, onDependencyDelete: d, onTaskReorder: f, className: p, inlineEdit: m = !1, autoSchedule: h = !1, rescheduleOnConflict: g = !1, criticalPathDefault: ee = !1, workingCalendar: _, shiftSegments: v, showBaselines: te = !0, readOnly: ne = !1, mobileReadOnly: re = !1, groupBy: ie, ungroupedLabel: ae = "Ungrouped", defaultCollapsedDepth: se, persistLayoutKey: ce, onLayoutChange: le }) {
432
+ let { t: x, language: ue } = Ue(), S = ue || void 0, [de, fe] = e.useState(/* @__PURE__ */ new Date()), O = e.useRef(null), { width: ke } = oe(O), k = ke || (typeof window < "u" ? window.innerWidth : 1024), A = k < 640, j = ne || re && A, M = j ? void 0 : s, Ae = j ? void 0 : c, N = j ? void 0 : u, P = j ? void 0 : d, je = j ? void 0 : f, Me = j ? !1 : m, Ne = j ? !1 : h, Pe = j ? !1 : g, F = qe(k), Le = We(k), I = e.useRef(void 0);
433
+ I.current === void 0 && (I.current = at(ce));
434
+ let Re = I.current, [Be, Ve] = e.useState(Re ? Re.columnWidth : null), [He, it] = e.useState(Re ? Re.taskListWidth ?? null : null), [L, st] = e.useState(n && Je.includes(n) ? n : Re?.viewMode ?? "day");
393
435
  e.useEffect(() => {
394
- n && He.includes(n) && at(n);
436
+ n && Je.includes(n) && st(n);
395
437
  }, [n]);
396
- let ot = e.useRef(null), st = e.useRef(null), ct = e.useRef(!0), [lt, ut] = e.useState(Qe ? Qe.taskListCollapsed : !1), dt = e.useRef(!1);
438
+ let ct = e.useRef(null), lt = e.useRef(null), ut = e.useRef(!0), [R, dt] = e.useState(Re ? Re.taskListCollapsed : !1), ft = e.useRef(!1);
397
439
  e.useEffect(() => {
398
- !dt.current && A && (ut(!0), dt.current = !0);
440
+ !ft.current && A && (dt(!0), ft.current = !0);
399
441
  }, [A]);
400
- let ft = Math.max(160, k - 200), R = lt ? 0 : rt == null ? ze(k) : Math.max(160, Math.min(rt, ft)), pt = e.useMemo(() => {
401
- if (tt != null || i || t.length === 0) return null;
442
+ let pt = Math.max(160, k - 200), z = R ? 0 : He == null ? Ge(k) : Math.max(160, Math.min(He, pt)), mt = e.useMemo(() => {
443
+ if (Be != null || i || t.length === 0) return null;
402
444
  let e = r ? new Date(r) : new Date(Math.min(...t.map((e) => e.start.getTime()))), n = new Date(Math.max(...t.map((e) => e.end.getTime())));
403
- r || e.setDate(e.getDate() - 7), n.setDate(n.getDate() + 14), e = Ge(e, L), n.setHours(23, 59, 59, 999);
404
- let a = Math.max(1, (n.getTime() - e.getTime()) / We), o = Math.max(0, k - R);
445
+ r || e.setDate(e.getDate() - 7), n.setDate(n.getDate() + 14), e = Ze(e, L), n.setHours(23, 59, 59, 999);
446
+ let a = Math.max(1, (n.getTime() - e.getTime()) / Xe), o = Math.max(0, k - z);
405
447
  if (o <= 0) return null;
406
- let s = o / a * Ue[L];
407
- if (s <= Ie) return null;
448
+ let s = o / a * Ye[L];
449
+ if (s <= Le) return null;
408
450
  let c = Math.min(s, o * .6);
409
- return c > Ie ? c : null;
451
+ return c > Le ? c : null;
410
452
  }, [
411
- tt,
453
+ Be,
412
454
  t,
413
455
  r,
414
456
  i,
415
457
  L,
416
458
  k,
417
- R,
418
- Ie
419
- ]), z = tt ?? pt ?? Ie, mt = z / Ue[L], ht = Be(R), [gt, _t] = e.useState(null), [vt, yt] = e.useState({}), [bt, xt] = e.useState(null), B = e.useMemo(() => {
420
- if (!re) return t;
459
+ z,
460
+ Le
461
+ ]), B = Be ?? mt ?? Le, ht = B / Ye[L], gt = Ke(z), [_t, vt] = e.useState(null), [yt, bt] = e.useState({}), [xt, St] = e.useState(null), V = e.useMemo(() => {
462
+ if (!ie) return t;
421
463
  let e = /* @__PURE__ */ new Set();
422
464
  for (let n of t) {
423
465
  let t = n.parent != null && n.parent !== "" ? String(n.parent) : null;
@@ -426,7 +468,7 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
426
468
  let n = /* @__PURE__ */ new Map();
427
469
  for (let r of t) {
428
470
  if (e.has(String(r.id))) continue;
429
- let t = re(r), i = t ? String(t.key) : "__ungrouped__", a = t ? t.label : ie, o = n.get(i);
471
+ let t = ie(r), i = t ? String(t.key) : "__ungrouped__", a = t ? t.label : ae, o = n.get(i);
430
472
  o || (o = {
431
473
  key: i,
432
474
  label: a,
@@ -453,12 +495,12 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
453
495
  }
454
496
  return r;
455
497
  }, [
456
- re,
498
+ ie,
457
499
  t,
458
- ie
459
- ]), St = e.useMemo(() => {
460
- let e = new Set(B.map((e) => String(e.id))), t = /* @__PURE__ */ new Map();
461
- for (let n of B) {
500
+ ae
501
+ ]), Ct = e.useMemo(() => {
502
+ let e = new Set(V.map((e) => String(e.id))), t = /* @__PURE__ */ new Map();
503
+ for (let n of V) {
462
504
  let r = n.parent != null && n.parent !== "" ? String(n.parent) : null;
463
505
  if (r && r !== String(n.id) && e.has(r)) {
464
506
  let e = t.get(r);
@@ -466,31 +508,31 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
466
508
  }
467
509
  }
468
510
  return t;
469
- }, [B]), Ct = e.useMemo(() => {
511
+ }, [V]), wt = e.useMemo(() => {
470
512
  let e = /* @__PURE__ */ new Map();
471
- for (let t of B) e.set(String(t.id), t);
513
+ for (let t of V) e.set(String(t.id), t);
472
514
  return e;
473
- }, [B]), wt = e.useCallback((e) => {
515
+ }, [V]), Tt = e.useCallback((e) => {
474
516
  let t = [], n = /* @__PURE__ */ new Set(), r = (e) => {
475
- for (let i of St.get(e) ?? []) {
517
+ for (let i of Ct.get(e) ?? []) {
476
518
  let e = String(i.id);
477
519
  n.has(e) || (n.add(e), t.push(i), r(e));
478
520
  }
479
521
  };
480
522
  return r(String(e)), t;
481
- }, [St]), [V, Tt] = e.useState(null), Et = e.useRef(null);
523
+ }, [Ct]), [H, Et] = e.useState(null), Dt = e.useRef(null);
482
524
  e.useEffect(() => {
483
- Et.current = V;
484
- }, [V]);
485
- let Dt = e.useRef(!1), Ot = e.useCallback((e) => {
486
- let t = We, n = (e, t) => Cn.current ? Cn.current(e, t) : qe(e, t, L), r = new Date(e.originStart), i = new Date(e.originEnd);
487
- return e.mode === "move" ? (r = n(e.originStart, e.unitDelta), i = new Date(e.originEnd.getTime() + (r.getTime() - e.originStart.getTime()))) : e.mode === "resize-left" ? (r = n(e.originStart, e.unitDelta), i.getTime() - r.getTime() < t && (r = /* @__PURE__ */ new Date(i.getTime() - t))) : e.mode === "resize-right" && (i = n(e.originEnd, e.unitDelta), i.getTime() - r.getTime() < t && (i = new Date(r.getTime() + t))), {
525
+ Dt.current = H;
526
+ }, [H]);
527
+ let Ot = e.useRef(!1), kt = e.useCallback((e) => {
528
+ let t = L === "day" && v && v.bands.length > 0 && v ? Math.min(...v.bands.map((e) => e.durMs)) : Xe, n = (e, t) => En.current ? En.current(e, t) : $e(e, t, L), r = new Date(e.originStart), i = new Date(e.originEnd);
529
+ return e.mode === "move" ? (r = n(e.originStart, e.unitDelta), i = new Date(e.originEnd.getTime() + (r.getTime() - e.originStart.getTime()))) : e.mode === "resize-left" ? (r = n(e.originStart, e.unitDelta), i.getTime() - r.getTime() < t && (r = new Date(i.getTime() - t))) : e.mode === "resize-right" && (i = n(e.originEnd, e.unitDelta), i.getTime() - r.getTime() < t && (i = new Date(r.getTime() + t))), {
488
530
  start: r,
489
531
  end: i
490
532
  };
491
- }, [L]), kt = e.useRef(t);
492
- kt.current = t;
493
- let At = e.useRef([]), jt = e.useRef([]), [Mt, Nt] = e.useState(0), H = e.useCallback((e) => {
533
+ }, [L, v]), At = e.useRef(t);
534
+ At.current = t;
535
+ let jt = e.useRef([]), Mt = e.useRef([]), [Nt, Pt] = e.useState(0), Ft = e.useCallback((e) => {
494
536
  if (!M) return;
495
537
  let t = [];
496
538
  for (let { task: n, changes: r } of e) {
@@ -505,30 +547,30 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
505
547
  after: i
506
548
  });
507
549
  }
508
- t.length && (At.current.push(t), jt.current = [], Nt((e) => e + 1));
509
- }, [M]), [Pt, Ft] = e.useState(null), It = e.useCallback((e) => {
510
- if (!Ne) return;
550
+ t.length && (jt.current.push(t), Mt.current = [], Pt((e) => e + 1));
551
+ }, [M]), [It, Lt] = e.useState(null), Rt = e.useCallback((e) => {
552
+ if (!Pe) return;
511
553
  let t = /* @__PURE__ */ new Map();
512
554
  for (let { task: n, changes: r } of e) t.set(String(n.id), {
513
555
  start: r.start ?? n.start,
514
556
  end: r.end ?? n.end
515
557
  });
516
- let n = Fe(kt.current.map((e) => {
558
+ let n = Ie(At.current.map((e) => {
517
559
  let n = t.get(String(e.id));
518
560
  return n ? {
519
561
  ...e,
520
562
  start: n.start,
521
563
  end: n.end
522
564
  } : e;
523
- }), v).filter((e) => {
565
+ }), _).filter((e) => {
524
566
  let n = t.get(e.id);
525
567
  return !n || e.start.getTime() !== n.start.getTime() || e.end.getTime() !== n.end.getTime();
526
568
  });
527
- n.length && Ft(n);
528
- }, [Ne, v]), Lt = e.useCallback(() => {
529
- if (!Pt) return;
530
- let e = Pt.map((e) => {
531
- let t = kt.current.find((t) => String(t.id) === e.id);
569
+ n.length && Lt(n);
570
+ }, [Pe, _]), zt = e.useCallback(() => {
571
+ if (!It) return;
572
+ let e = It.map((e) => {
573
+ let t = At.current.find((t) => String(t.id) === e.id);
532
574
  return t ? {
533
575
  task: t,
534
576
  changes: {
@@ -537,48 +579,48 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
537
579
  }
538
580
  } : null;
539
581
  }).filter(Boolean);
540
- e.length && H(e), Ft(null);
541
- }, [Pt, H]), Rt = e.useCallback((e, t) => {
582
+ e.length && Ft(e), Lt(null);
583
+ }, [It, Ft]), Bt = e.useCallback((e, t) => {
542
584
  if (M) for (let n of e) {
543
- let e = kt.current.find((e) => String(e.id) === n.taskId);
585
+ let e = At.current.find((e) => String(e.id) === n.taskId);
544
586
  e && M(e, t === "undo" ? n.before : n.after);
545
587
  }
546
- }, [M]), zt = e.useCallback(() => {
547
- let e = At.current.pop();
548
- e && (Rt(e, "undo"), jt.current.push(e), Nt((e) => e + 1));
549
- }, [Rt]), Bt = e.useCallback(() => {
588
+ }, [M]), Vt = e.useCallback(() => {
550
589
  let e = jt.current.pop();
551
- e && (Rt(e, "redo"), At.current.push(e), Nt((e) => e + 1));
552
- }, [Rt]), { canUndo: Vt, canRedo: Ht } = e.useMemo(() => ({
553
- canUndo: At.current.length > 0,
554
- canRedo: jt.current.length > 0
555
- }), [Mt]);
590
+ e && (Bt(e, "undo"), Mt.current.push(e), Pt((e) => e + 1));
591
+ }, [Bt]), Ht = e.useCallback(() => {
592
+ let e = Mt.current.pop();
593
+ e && (Bt(e, "redo"), jt.current.push(e), Pt((e) => e + 1));
594
+ }, [Bt]), { canUndo: Ut, canRedo: Wt } = e.useMemo(() => ({
595
+ canUndo: jt.current.length > 0,
596
+ canRedo: Mt.current.length > 0
597
+ }), [Nt]);
556
598
  e.useEffect(() => {
557
- if (!V) return;
558
- let e = (e) => {
559
- let t = Et.current;
560
- if (!t) return;
561
- let n = Math.round((e.clientX - t.originClientX) / Math.max(z, 1));
562
- n !== t.unitDelta && Tt({
563
- ...t,
564
- unitDelta: n
599
+ if (!H) return;
600
+ let e = L === "day" && v && v.bands.length > 0 && v ? ht * Math.min(...v.bands.map((e) => e.durMs)) / Xe : B, n = (t) => {
601
+ let n = Dt.current;
602
+ if (!n) return;
603
+ let r = Math.round((t.clientX - n.originClientX) / Math.max(e, 1));
604
+ r !== n.unitDelta && Et({
605
+ ...n,
606
+ unitDelta: r
565
607
  });
566
- }, n = () => {
567
- let e = Et.current;
608
+ }, r = () => {
609
+ let e = Dt.current;
568
610
  if (e) {
569
611
  if (e.unitDelta !== 0) {
570
612
  let n = t.find((t) => t.id === e.taskId);
571
613
  if (n && M) {
572
- let { start: t, end: r } = Ot(e);
614
+ let { start: t, end: r } = kt(e);
573
615
  if (e.group) {
574
- let r = t.getTime() - e.originStart.getTime(), i = [n, ...wt(n.id)].map((e) => ({
616
+ let r = t.getTime() - e.originStart.getTime(), i = [n, ...Tt(n.id)].map((e) => ({
575
617
  task: e,
576
618
  changes: {
577
619
  start: new Date(e.start.getTime() + r),
578
620
  end: new Date(e.end.getTime() + r)
579
621
  }
580
622
  }));
581
- H(i), It(i);
623
+ Ft(i), Rt(i);
582
624
  } else {
583
625
  let e = [{
584
626
  task: n,
@@ -587,31 +629,34 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
587
629
  end: r
588
630
  }
589
631
  }];
590
- H(e), It(e);
632
+ Ft(e), Rt(e);
591
633
  }
592
634
  }
593
- Dt.current = !0, window.setTimeout(() => {
594
- Dt.current = !1;
635
+ Ot.current = !0, window.setTimeout(() => {
636
+ Ot.current = !1;
595
637
  }, 0);
596
638
  }
597
- Tt(null);
639
+ Et(null);
598
640
  }
599
641
  };
600
- return window.addEventListener("pointermove", e), window.addEventListener("pointerup", n), window.addEventListener("pointercancel", n), () => {
601
- window.removeEventListener("pointermove", e), window.removeEventListener("pointerup", n), window.removeEventListener("pointercancel", n);
642
+ return window.addEventListener("pointermove", n), window.addEventListener("pointerup", r), window.addEventListener("pointercancel", r), () => {
643
+ window.removeEventListener("pointermove", n), window.removeEventListener("pointerup", r), window.removeEventListener("pointercancel", r);
602
644
  };
603
645
  }, [
604
- V,
605
- z,
646
+ H,
647
+ B,
648
+ ht,
649
+ L,
650
+ v,
606
651
  t,
607
652
  M,
608
- Ot,
609
- wt,
610
- H,
611
- It
653
+ kt,
654
+ Tt,
655
+ Ft,
656
+ Rt
612
657
  ]);
613
- let Ut = e.useCallback((e, t, n, r) => {
614
- !M || e.data?.__group || (n.stopPropagation(), n.preventDefault(), Tt({
658
+ let Gt = e.useCallback((e, t, n, r) => {
659
+ !M || e.data?.__group || (n.stopPropagation(), n.preventDefault(), Et({
615
660
  taskId: e.id,
616
661
  mode: t,
617
662
  group: r?.group ?? !1,
@@ -620,66 +665,66 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
620
665
  originClientX: n.clientX,
621
666
  unitDelta: 0
622
667
  }));
623
- }, [M]), [Wt, Gt] = e.useState(null), Kt = e.useRef(null);
668
+ }, [M]), [Kt, qt] = e.useState(null), Jt = e.useRef(null);
624
669
  e.useEffect(() => {
625
- Kt.current = Wt;
626
- }, [Wt]), e.useEffect(() => {
627
- if (!Wt) return;
670
+ Jt.current = Kt;
671
+ }, [Kt]), e.useEffect(() => {
672
+ if (!Kt) return;
628
673
  let e = (e) => {
629
- let t = Kt.current;
674
+ let t = Jt.current;
630
675
  if (!t) return;
631
676
  let n = Math.min(100, Math.max(0, Math.round(t.originProgress + (e.clientX - t.originClientX) / Math.max(t.barWidth, 1) * 100)));
632
- n !== t.value && Gt({
677
+ n !== t.value && qt({
633
678
  ...t,
634
679
  value: n
635
680
  });
636
681
  }, n = () => {
637
- let e = Kt.current;
682
+ let e = Jt.current;
638
683
  if (e) {
639
684
  if (e.value !== e.originProgress) {
640
685
  let n = t.find((t) => t.id === e.taskId);
641
- n && M && H([{
686
+ n && M && Ft([{
642
687
  task: n,
643
688
  changes: { progress: e.value }
644
- }]), Dt.current = !0, window.setTimeout(() => {
645
- Dt.current = !1;
689
+ }]), Ot.current = !0, window.setTimeout(() => {
690
+ Ot.current = !1;
646
691
  }, 0);
647
692
  }
648
- Gt(null);
693
+ qt(null);
649
694
  }
650
695
  };
651
696
  return window.addEventListener("pointermove", e), window.addEventListener("pointerup", n), window.addEventListener("pointercancel", n), () => {
652
697
  window.removeEventListener("pointermove", e), window.removeEventListener("pointerup", n), window.removeEventListener("pointercancel", n);
653
698
  };
654
699
  }, [
655
- Wt,
700
+ Kt,
656
701
  t,
657
702
  M,
658
- H
703
+ Ft
659
704
  ]);
660
- let qt = e.useRef(null), [U, Jt] = e.useState(null), Yt = e.useRef(null);
705
+ let Yt = e.useRef(null), [U, Xt] = e.useState(null), Zt = e.useRef(null);
661
706
  e.useEffect(() => {
662
- Yt.current = U;
707
+ Zt.current = U;
663
708
  }, [U]), e.useEffect(() => {
664
709
  if (!U) return;
665
710
  let e = (e) => {
666
- let t = qt.current?.getBoundingClientRect();
711
+ let t = Yt.current?.getBoundingClientRect();
667
712
  if (!t) return;
668
713
  let n = e.clientX - t.left, r = e.clientY - t.top;
669
- Jt((e) => e && {
714
+ Xt((e) => e && {
670
715
  ...e,
671
716
  x: n,
672
717
  y: r
673
718
  });
674
719
  }, n = () => {
675
- let e = Yt.current;
720
+ let e = Zt.current;
676
721
  if (e && e.targetId != null && String(e.targetId) !== String(e.sourceId) && N) {
677
722
  let n = t.find((t) => String(t.id) === String(e.sourceId)), r = t.find((t) => String(t.id) === String(e.targetId)), i = e.targetEnd ?? "start", a = `${e.sourceEnd === "end" ? "f" : "s"}${i === "end" ? "f" : "s"}`;
678
723
  n && r && N(n, r, a);
679
724
  }
680
- Dt.current = !0, window.setTimeout(() => {
681
- Dt.current = !1;
682
- }, 0), Jt(null);
725
+ Ot.current = !0, window.setTimeout(() => {
726
+ Ot.current = !1;
727
+ }, 0), Xt(null);
683
728
  };
684
729
  return window.addEventListener("pointermove", e), window.addEventListener("pointerup", n), window.addEventListener("pointercancel", n), () => {
685
730
  window.removeEventListener("pointermove", e), window.removeEventListener("pointerup", n), window.removeEventListener("pointercancel", n);
@@ -689,67 +734,67 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
689
734
  t,
690
735
  N
691
736
  ]);
692
- let [Xt, Zt] = e.useState(null), Qt = e.useRef(null);
737
+ let [Qt, $t] = e.useState(null), en = e.useRef(null);
693
738
  e.useEffect(() => {
694
- if (!Xt) return;
739
+ if (!Qt) return;
695
740
  let e = (e) => {
696
- Qt.current && e.target instanceof Node && Qt.current.contains(e.target) || Zt(null);
741
+ en.current && e.target instanceof Node && en.current.contains(e.target) || $t(null);
697
742
  }, t = (e) => {
698
- e.key === "Escape" && Zt(null);
743
+ e.key === "Escape" && $t(null);
699
744
  };
700
745
  return window.addEventListener("pointerdown", e, !0), window.addEventListener("keydown", t), () => {
701
746
  window.removeEventListener("pointerdown", e, !0), window.removeEventListener("keydown", t);
702
747
  };
703
- }, [Xt]);
704
- let [W, $t] = e.useState(null), en = e.useRef(null);
748
+ }, [Qt]);
749
+ let [W, tn] = e.useState(null), nn = e.useRef(null);
705
750
  e.useEffect(() => {
706
751
  if (!W) return;
707
752
  let e = (e) => {
708
- en.current && e.target instanceof Node && en.current.contains(e.target) || $t(null);
753
+ nn.current && e.target instanceof Node && nn.current.contains(e.target) || tn(null);
709
754
  }, t = (e) => {
710
- e.key === "Escape" && $t(null);
755
+ e.key === "Escape" && tn(null);
711
756
  };
712
757
  return window.addEventListener("pointerdown", e, !0), window.addEventListener("keydown", t), () => {
713
758
  window.removeEventListener("pointerdown", e, !0), window.removeEventListener("keydown", t);
714
759
  };
715
760
  }, [W]);
716
- let [tn, nn] = e.useState(null), rn = e.useRef(null);
761
+ let [rn, an] = e.useState(null), on = e.useRef(null);
717
762
  e.useEffect(() => {
718
- if (!tn) return;
763
+ if (!rn) return;
719
764
  let e = (e) => {
720
- rn.current && e.target instanceof Node && rn.current.contains(e.target) || nn(null);
765
+ on.current && e.target instanceof Node && on.current.contains(e.target) || an(null);
721
766
  }, t = (e) => {
722
- e.key === "Escape" && nn(null);
767
+ e.key === "Escape" && an(null);
723
768
  };
724
769
  return window.addEventListener("pointerdown", e, !0), window.addEventListener("keydown", t), () => {
725
770
  window.removeEventListener("pointerdown", e, !0), window.removeEventListener("keydown", t);
726
771
  };
727
- }, [tn]);
728
- let [an, on] = e.useState(null), sn = !!(o || M || N || ke), cn = e.useCallback((e, t) => {
729
- t.preventDefault(), t.stopPropagation(), on(e.id), sn && Zt({
772
+ }, [rn]);
773
+ let [sn, cn] = e.useState(null), ln = !!(o || M || N || Ae), un = e.useCallback((e, t) => {
774
+ t.preventDefault(), t.stopPropagation(), cn(e.id), ln && $t({
730
775
  x: t.clientX,
731
776
  y: t.clientY,
732
777
  taskId: e.id
733
778
  });
734
- }, [sn]), ln = e.useCallback((e, t, n, r) => {
735
- r.preventDefault(), r.stopPropagation(), !(!N && !Ae) && $t({
779
+ }, [ln]), dn = e.useCallback((e, t, n, r) => {
780
+ r.preventDefault(), r.stopPropagation(), !(!N && !P) && tn({
736
781
  x: r.clientX,
737
782
  y: r.clientY,
738
783
  sourceId: e,
739
784
  targetId: t,
740
785
  type: n
741
786
  });
742
- }, [N, Ae]), [un, dn] = e.useState(() => /* @__PURE__ */ new Set()), fn = e.useCallback((e) => {
743
- dn((t) => {
787
+ }, [N, P]), [fn, pn] = e.useState(() => /* @__PURE__ */ new Set()), mn = e.useCallback((e) => {
788
+ pn((t) => {
744
789
  let n = new Set(t), r = String(e);
745
790
  return n.has(r) ? n.delete(r) : n.add(r), n;
746
791
  });
747
- }, []), pn = e.useRef(!1);
792
+ }, []), hn = e.useRef(!1);
748
793
  e.useEffect(() => {
749
- if (pn.current || ae == null || B.length === 0) return;
750
- pn.current = !0;
751
- let e = new Map(B.map((e) => [String(e.id), e])), t = /* @__PURE__ */ new Set();
752
- for (let n of B) {
794
+ if (hn.current || se == null || V.length === 0) return;
795
+ hn.current = !0;
796
+ let e = new Map(V.map((e) => [String(e.id), e])), t = /* @__PURE__ */ new Set();
797
+ for (let n of V) {
753
798
  let r = n.parent != null && n.parent !== "" ? String(n.parent) : null;
754
799
  r && r !== String(n.id) && e.has(r) && t.add(r);
755
800
  }
@@ -758,15 +803,15 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
758
803
  for (; i && !r.has(String(i.id));) n += 1, r.add(String(i.id)), i = i.parent != null && i.parent !== "" ? e.get(String(i.parent)) : void 0;
759
804
  return n;
760
805
  }, r = /* @__PURE__ */ new Set();
761
- for (let e of B) {
806
+ for (let e of V) {
762
807
  let i = String(e.id);
763
- t.has(i) && n(e) >= ae && r.add(i);
808
+ t.has(i) && n(e) >= se && r.add(i);
764
809
  }
765
- r.size && dn((e) => e.size ? e : r);
766
- }, [ae, B]);
810
+ r.size && pn((e) => e.size ? e : r);
811
+ }, [se, V]);
767
812
  let G = e.useMemo(() => {
768
- let e = new Set(B.map((e) => String(e.id))), t = /* @__PURE__ */ new Map(), n = [];
769
- for (let r of B) {
813
+ let e = new Set(V.map((e) => String(e.id))), t = /* @__PURE__ */ new Map(), n = [];
814
+ for (let r of V) {
770
815
  let i = r.parent != null && r.parent !== "" ? String(r.parent) : null;
771
816
  if (i && i !== String(r.id) && e.has(i)) {
772
817
  let e = t.get(i);
@@ -788,7 +833,7 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
788
833
  for (let a of s) {
789
834
  let s = i(a, n);
790
835
  (!e || s.start < e) && (e = s.start), (!t || s.end > t) && (t = s.end);
791
- let c = Math.max(s.end.getTime() - s.start.getTime(), We);
836
+ let c = Math.max(s.end.getTime() - s.start.getTime(), Xe);
792
837
  r += c * s.progress, o += c;
793
838
  }
794
839
  n.delete(a), c = {
@@ -816,28 +861,28 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
816
861
  isSummary: d,
817
862
  isMilestone: p,
818
863
  ...f
819
- }), u) if (un.has(r)) s(e);
864
+ }), u) if (fn.has(r)) s(e);
820
865
  else for (let e of l) c(e, n + 1);
821
866
  };
822
867
  for (let e of n) c(e, 0);
823
- for (let e of B) o.has(String(e.id)) || c(e, 0);
868
+ for (let e of V) o.has(String(e.id)) || c(e, 0);
824
869
  return a;
825
- }, [B, un]), mn = e.useCallback((e) => {
870
+ }, [V, fn]), gn = e.useCallback((e) => {
826
871
  if (e.target instanceof HTMLInputElement || e.target instanceof HTMLTextAreaElement) return;
827
872
  if ((e.ctrlKey || e.metaKey) && (e.key === "z" || e.key === "Z")) {
828
- e.preventDefault(), e.shiftKey ? Bt() : zt();
873
+ e.preventDefault(), e.shiftKey ? Ht() : Vt();
829
874
  return;
830
875
  }
831
876
  if ((e.ctrlKey || e.metaKey) && (e.key === "y" || e.key === "Y")) {
832
- e.preventDefault(), Bt();
877
+ e.preventDefault(), Ht();
833
878
  return;
834
879
  }
835
880
  if (!G.length) return;
836
- let t = an == null ? -1 : G.findIndex((e) => String(e.task.id) === String(an));
881
+ let t = sn == null ? -1 : G.findIndex((e) => String(e.task.id) === String(sn));
837
882
  if (e.key === "ArrowDown" || e.key === "ArrowUp") {
838
883
  e.preventDefault();
839
884
  let n = e.key === "ArrowDown" ? Math.min(G.length - 1, t + 1) : Math.max(0, t <= 0 ? 0 : t - 1);
840
- on(G[n].task.id);
885
+ cn(G[n].task.id);
841
886
  let r = X.current;
842
887
  if (r) {
843
888
  let e = n * F;
@@ -847,20 +892,20 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
847
892
  }
848
893
  if (t < 0) return;
849
894
  let n = G[t];
850
- e.key === "Enter" ? (e.preventDefault(), o?.(n.task)) : e.key === "Delete" || e.key === "Backspace" ? ke && (e.preventDefault(), ke(n.task)) : (e.key === "ArrowRight" && n.hasChildren && un.has(String(n.task.id)) || e.key === "ArrowLeft" && n.hasChildren && !un.has(String(n.task.id))) && (e.preventDefault(), fn(n.task.id));
895
+ e.key === "Enter" ? (e.preventDefault(), o?.(n.task)) : e.key === "Delete" || e.key === "Backspace" ? Ae && (e.preventDefault(), Ae(n.task)) : (e.key === "ArrowRight" && n.hasChildren && fn.has(String(n.task.id)) || e.key === "ArrowLeft" && n.hasChildren && !fn.has(String(n.task.id))) && (e.preventDefault(), mn(n.task.id));
851
896
  }, [
852
897
  G,
853
- an,
898
+ sn,
854
899
  o,
855
- ke,
856
- un,
900
+ Ae,
857
901
  fn,
902
+ mn,
858
903
  F,
859
- zt,
860
- Bt
904
+ Vt,
905
+ Ht
861
906
  ]), K = e.useMemo(() => {
862
907
  let e = r ? new Date(r) : /* @__PURE__ */ new Date(), n = i ? new Date(i) : /* @__PURE__ */ new Date();
863
- return !r && t.length > 0 && (e = new Date(Math.min(...t.map((e) => e.start.getTime()))), e.setDate(e.getDate() - 7)), !i && t.length > 0 && (n = new Date(Math.max(...t.map((e) => e.end.getTime()))), n.setDate(n.getDate() + 14)), e = Ge(e, L), n.setHours(23, 59, 59, 999), {
908
+ return !r && t.length > 0 && (e = new Date(Math.min(...t.map((e) => e.start.getTime()))), e.setDate(e.getDate() - 7)), !i && t.length > 0 && (n = new Date(Math.max(...t.map((e) => e.end.getTime()))), n.setDate(n.getDate() + 14)), e = L === "day" && v && v.bands.length > 0 ? ze(e, v.dayStartMin) : Ze(e, L), n.setHours(23, 59, 59, 999), {
864
909
  start: e,
865
910
  end: n
866
911
  };
@@ -868,27 +913,44 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
868
913
  r,
869
914
  i,
870
915
  t,
871
- L
872
- ]), hn = L === "day" && !!v && (!!v.skipWeekends || !!(v.holidays && v.holidays.size)), gn = e.useCallback((e) => {
873
- if (!v) return !0;
874
- if (v.skipWeekends) {
916
+ L,
917
+ v
918
+ ]), _n = L === "day" && !!v && v.bands.length > 0, vn = !_n && L === "day" && !!_ && (!!_.skipWeekends || !!(_.holidays && _.holidays.size)), yn = e.useCallback((e) => {
919
+ if (!_) return !0;
920
+ if (_.skipWeekends) {
875
921
  let t = e.getDay();
876
922
  if (t === 0 || t === 6) return !1;
877
923
  }
878
- if (v.holidays && v.holidays.size) {
924
+ if (_.holidays && _.holidays.size) {
879
925
  let t = `${e.getFullYear()}-${String(e.getMonth() + 1).padStart(2, "0")}-${String(e.getDate()).padStart(2, "0")}`;
880
- if (v.holidays.has(t)) return !1;
926
+ if (_.holidays.has(t)) return !1;
881
927
  }
882
928
  return !0;
883
- }, [v]), q = e.useMemo(() => {
884
- let e = [], t = new Date(K.start);
929
+ }, [_]), q = e.useMemo(() => {
930
+ let e = [];
931
+ if (_n && v) {
932
+ let t = new Date(K.start);
933
+ for (; t <= K.end;) for (let n of v.bands) {
934
+ let r = n.durMs / Xe * ht;
935
+ e.push({
936
+ date: new Date(t),
937
+ label: n.label,
938
+ isWeekend: !1,
939
+ width: r,
940
+ realMs: n.durMs,
941
+ bandColor: n.color
942
+ }), t = new Date(t.getTime() + n.durMs);
943
+ }
944
+ return e;
945
+ }
946
+ let t = new Date(K.start);
885
947
  for (; t <= K.end;) {
886
- let n = qe(t, 1, L);
887
- if (hn && !gn(t)) {
948
+ let n = $e(t, 1, L);
949
+ if (vn && !yn(t)) {
888
950
  t = n;
889
951
  continue;
890
952
  }
891
- let r = (n.getTime() - t.getTime()) / We * mt, i, a;
953
+ let r = (n.getTime() - t.getTime()) / Xe * ht, i, a;
892
954
  L === "day" ? (i = String(t.getDate()), a = t.toLocaleDateString(S, { weekday: "narrow" })) : i = L === "week" ? t.toLocaleDateString(S, {
893
955
  month: "numeric",
894
956
  day: "numeric"
@@ -904,31 +966,34 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
904
966
  }, [
905
967
  K,
906
968
  L,
907
- mt,
969
+ ht,
908
970
  S,
909
- hn,
910
- gn
971
+ vn,
972
+ yn,
973
+ _n,
974
+ v
911
975
  ]), J = e.useMemo(() => {
912
976
  let e = Array(q.length + 1), t = 0;
913
977
  for (let n = 0; n < q.length; n++) e[n] = t, t += q[n].width;
914
978
  return e[q.length] = t, e;
915
- }, [q]), _n = J[J.length - 1], vn = e.useMemo(() => q.map((e) => e.date.getTime()), [q]), yn = e.useMemo(() => q.map((e) => qe(e.date, 1, L).getTime() - e.date.getTime()), [q, L]), Y = e.useCallback((e) => {
979
+ }, [q]), bn = J[J.length - 1], xn = e.useMemo(() => q.map((e) => e.date.getTime()), [q]), Sn = e.useMemo(() => q.map((e) => e.realMs == null ? $e(e.date, 1, L).getTime() - e.date.getTime() : e.realMs), [q, L]), Y = e.useCallback((e) => {
916
980
  let t = q.length;
917
981
  if (t === 0) return 0;
918
982
  let n = e.getTime(), r = 0, i = t - 1, a = 0;
919
983
  for (; r <= i;) {
920
984
  let e = r + i >> 1;
921
- vn[e] <= n ? (a = e, r = e + 1) : i = e - 1;
985
+ xn[e] <= n ? (a = e, r = e + 1) : i = e - 1;
922
986
  }
923
- let o = yn[a] || 864e5, s = (n - vn[a]) / o;
924
- return hn && (s = Math.max(0, Math.min(s, 1))), J[a] + s * q[a].width;
987
+ let o = Sn[a] || 864e5, s = (n - xn[a]) / o;
988
+ return (vn || _n) && (s = Math.max(0, Math.min(s, 1))), J[a] + s * q[a].width;
925
989
  }, [
926
990
  q,
927
- vn,
928
- yn,
991
+ xn,
992
+ Sn,
929
993
  J,
930
- hn
931
- ]), bn = e.useCallback((e) => {
994
+ vn,
995
+ _n
996
+ ]), Cn = e.useCallback((e) => {
932
997
  let t = q.length;
933
998
  if (t === 0) return new Date(K.start);
934
999
  let n = 0, r = t - 1, i = 0;
@@ -937,40 +1002,57 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
937
1002
  J[t] <= e ? (i = t, n = t + 1) : r = t - 1;
938
1003
  }
939
1004
  let a = q[i].width || 1, o = (e - J[i]) / a;
940
- return new Date(vn[i] + o * (yn[i] || 864e5));
1005
+ return new Date(xn[i] + o * (Sn[i] || 864e5));
941
1006
  }, [
942
1007
  q,
943
- vn,
944
- yn,
1008
+ xn,
1009
+ Sn,
945
1010
  J,
946
1011
  K
947
- ]), xn = e.useCallback((e) => {
1012
+ ]), wn = e.useCallback((e) => {
948
1013
  let t = X.current;
949
- st.current == null && t && t.clientWidth > 0 && (st.current = bn(t.scrollLeft)), ot.current = st.current, ct.current = !0, at(e), l?.(e);
950
- }, [l, bn]);
1014
+ lt.current == null && t && t.clientWidth > 0 && (lt.current = Cn(t.scrollLeft)), ct.current = lt.current, ut.current = !0, st(e), l?.(e);
1015
+ }, [l, Cn]);
951
1016
  e.useLayoutEffect(() => {
952
- let e = ot.current;
1017
+ let e = ct.current;
953
1018
  if (e == null) return;
954
- ot.current = null;
1019
+ ct.current = null;
955
1020
  let t = X.current;
956
1021
  if (!t || t.clientWidth === 0) return;
957
- let n = Math.max(0, t.scrollWidth - t.clientWidth), r = Math.max(0, Math.min(Math.round(Y(Ge(e, L))), n));
1022
+ let n = Math.max(0, t.scrollWidth - t.clientWidth), r = Math.max(0, Math.min(Math.round(Y(Ze(e, L))), n));
958
1023
  t.scrollLeft !== r && (t.scrollLeft = r);
959
1024
  }, [L, Y]);
960
- let Sn = e.useCallback((e, t) => {
1025
+ let Tn = e.useCallback((e, t) => {
961
1026
  let n = q.length;
962
1027
  if (n === 0 || t === 0) return new Date(e);
963
1028
  let r = e.getTime(), i = 0, a = n - 1, o = 0;
964
1029
  for (; i <= a;) {
965
1030
  let e = i + a >> 1;
966
- vn[e] <= r ? (o = e, i = e + 1) : a = e - 1;
1031
+ xn[e] <= r ? (o = e, i = e + 1) : a = e - 1;
967
1032
  }
968
- let s = Math.min(n - 1, Math.max(0, o + t)), c = r - vn[o];
969
- return new Date(vn[s] + c);
970
- }, [q, vn]), Cn = e.useRef(null);
971
- Cn.current = hn ? Sn : null;
972
- let wn = e.useMemo(() => {
973
- let e = [], t = L === "year" ? "decade" : L === "month" || L === "quarter" ? "year" : "month", n = 0;
1033
+ let s = Math.min(n - 1, Math.max(0, o + t)), c = r - xn[o];
1034
+ return new Date(xn[s] + c);
1035
+ }, [q, xn]), En = e.useRef(null);
1036
+ En.current = vn || _n ? Tn : null;
1037
+ let Dn = e.useMemo(() => {
1038
+ let e = [];
1039
+ if (_n && v) {
1040
+ let t = 0;
1041
+ for (let n of q) {
1042
+ let r = String(ze(n.date, v.dayStartMin).getTime()), i = e[e.length - 1];
1043
+ i && i.key === r ? i.width += n.width : e.push({
1044
+ key: r,
1045
+ label: n.date.toLocaleDateString(S, {
1046
+ month: "short",
1047
+ day: "numeric"
1048
+ }),
1049
+ width: n.width,
1050
+ offset: t
1051
+ }), t += n.width;
1052
+ }
1053
+ return e;
1054
+ }
1055
+ let t = L === "year" ? "decade" : L === "month" || L === "quarter" ? "year" : "month", n = 0;
974
1056
  for (let r of q) {
975
1057
  let i = r.date.getFullYear(), a = Math.floor(i / 10) * 10, o = t === "decade" ? String(a) : t === "year" ? String(i) : `${i}-${r.date.getMonth()}`, s = e[e.length - 1];
976
1058
  s && s.key === o ? s.width += r.width : e.push({
@@ -987,8 +1069,10 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
987
1069
  }, [
988
1070
  q,
989
1071
  L,
990
- S
991
- ]), Tn = e.useMemo(() => (a ?? []).map((e, t) => {
1072
+ S,
1073
+ _n,
1074
+ v
1075
+ ]), On = e.useMemo(() => (a ?? []).map((e, t) => {
992
1076
  let n = e.date instanceof Date ? e.date : new Date(e.date);
993
1077
  return {
994
1078
  index: t,
@@ -1001,12 +1085,12 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
1001
1085
  a,
1002
1086
  K,
1003
1087
  Y
1004
- ]), En = e.useRef(null), Dn = e.useRef(null), On = e.useRef(null), X = e.useRef(null);
1088
+ ]), kn = e.useRef(null), An = e.useRef(null), jn = e.useRef(null), X = e.useRef(null);
1005
1089
  e.useEffect(() => {
1006
1090
  let e = X.current;
1007
1091
  if (!e) return;
1008
1092
  let t = () => {
1009
- ct.current = !1;
1093
+ ut.current = !1;
1010
1094
  }, n = new Set([
1011
1095
  "ArrowLeft",
1012
1096
  "ArrowRight",
@@ -1025,82 +1109,82 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
1025
1109
  e.removeEventListener("wheel", t), e.removeEventListener("touchstart", t), e.removeEventListener("pointerdown", t), e.removeEventListener("keydown", r);
1026
1110
  };
1027
1111
  }, []);
1028
- let [kn, An] = e.useState(null), jn = e.useRef([]), Mn = e.useRef(null), [Nn, Pn] = e.useState({
1112
+ let [Mn, Nn] = e.useState(null), Pn = e.useRef([]), Fn = e.useRef(null), [In, Ln] = e.useState({
1029
1113
  top: 0,
1030
1114
  left: 0
1031
- }), [Fn, In] = e.useState({
1115
+ }), [Rn, zn] = e.useState({
1032
1116
  width: 4e3,
1033
1117
  height: 600
1034
- }), Ln = e.useCallback(() => {
1118
+ }), Bn = e.useCallback(() => {
1035
1119
  let e = X.current;
1036
1120
  if (!e) return;
1037
1121
  let t = e.clientWidth || 4e3, n = e.clientHeight || 600;
1038
- In((e) => e.width === t && e.height === n ? e : {
1122
+ zn((e) => e.width === t && e.height === n ? e : {
1039
1123
  width: t,
1040
1124
  height: n
1041
1125
  });
1042
1126
  }, []);
1043
1127
  e.useLayoutEffect(() => {
1044
- Ln();
1128
+ Bn();
1045
1129
  let e = X.current;
1046
1130
  if (!e || typeof ResizeObserver > "u") return;
1047
- let t = new ResizeObserver(Ln);
1131
+ let t = new ResizeObserver(Bn);
1048
1132
  return t.observe(e), () => t.disconnect();
1049
- }, [Ln]);
1050
- let Rn = e.useMemo(() => Ke(J, Nn.left - 240, Nn.left + Fn.width + 240), [
1133
+ }, [Bn]);
1134
+ let Vn = e.useMemo(() => Qe(J, In.left - 240, In.left + Rn.width + 240), [
1051
1135
  J,
1052
- Nn.left,
1053
- Fn.width
1054
- ]), zn = e.useMemo(() => {
1055
- let e = wn.map((e) => e.offset);
1056
- return e.push(_n), e;
1057
- }, [wn, _n]), Bn = e.useMemo(() => Ke(zn, Nn.left - 240, Nn.left + Fn.width + 240), [
1058
- zn,
1059
- Nn.left,
1060
- Fn.width
1136
+ In.left,
1137
+ Rn.width
1138
+ ]), Hn = e.useMemo(() => {
1139
+ let e = Dn.map((e) => e.offset);
1140
+ return e.push(bn), e;
1141
+ }, [Dn, bn]), Un = e.useMemo(() => Qe(Hn, In.left - 240, In.left + Rn.width + 240), [
1142
+ Hn,
1143
+ In.left,
1144
+ Rn.width
1061
1145
  ]), Z = e.useMemo(() => ({
1062
- startIdx: Math.max(0, Math.floor(Nn.top / F) - 6),
1063
- endIdx: Math.min(G.length, Math.ceil((Nn.top + Fn.height) / F) + 6)
1146
+ startIdx: Math.max(0, Math.floor(In.top / F) - 6),
1147
+ endIdx: Math.min(G.length, Math.ceil((In.top + Rn.height) / F) + 6)
1064
1148
  }), [
1065
- Nn.top,
1066
- Fn.height,
1149
+ In.top,
1150
+ Rn.height,
1067
1151
  F,
1068
1152
  G.length
1069
- ]), Vn = G.length * F, [Hn, Un] = e.useState(!1);
1153
+ ]), Wn = G.length * F, [Gn, Kn] = e.useState(!1);
1070
1154
  e.useEffect(() => {
1071
- let e = () => Un(!!document.fullscreenElement);
1155
+ let e = () => Kn(!!document.fullscreenElement);
1072
1156
  return document.addEventListener("fullscreenchange", e), () => document.removeEventListener("fullscreenchange", e);
1073
1157
  }, []);
1074
- let Wn = e.useCallback(() => {
1075
- let e = fe.current;
1158
+ let qn = e.useCallback(() => {
1159
+ let e = O.current;
1076
1160
  e && (document.fullscreenElement ? document.exitFullscreen?.() : e.requestFullscreen?.());
1077
- }, []), Gn = e.useRef(null), Kn = e.useCallback((e) => {
1161
+ }, []), Jn = e.useRef(null), Yn = e.useCallback((e) => {
1078
1162
  if (e.touches.length === 2) {
1079
1163
  let t = e.touches[0].clientX - e.touches[1].clientX, n = e.touches[0].clientY - e.touches[1].clientY;
1080
- Gn.current = {
1164
+ Jn.current = {
1081
1165
  baseDistance: Math.max(1, Math.sqrt(t * t + n * n)),
1082
- baseColumn: z
1166
+ baseColumn: B
1083
1167
  };
1084
1168
  }
1085
- }, [z]), qn = e.useCallback((e) => {
1086
- if (e.touches.length !== 2 || !Gn.current) return;
1087
- let t = e.touches[0].clientX - e.touches[1].clientX, n = e.touches[0].clientY - e.touches[1].clientY, r = Math.max(1, Math.sqrt(t * t + n * n)) / Gn.current.baseDistance;
1088
- nt(Math.max(15, Math.min(120, Math.round(Gn.current.baseColumn * r))));
1089
- }, []), Jn = e.useCallback(() => {
1090
- Gn.current = null;
1169
+ }, [B]), Xn = e.useCallback((e) => {
1170
+ if (e.touches.length !== 2 || !Jn.current) return;
1171
+ let t = e.touches[0].clientX - e.touches[1].clientX, n = e.touches[0].clientY - e.touches[1].clientY, r = Math.max(1, Math.sqrt(t * t + n * n)) / Jn.current.baseDistance;
1172
+ Ve(Math.max(15, Math.min(120, Math.round(Jn.current.baseColumn * r))));
1173
+ }, []), Zn = e.useCallback(() => {
1174
+ Jn.current = null;
1091
1175
  }, []), Q = e.useMemo(() => {
1092
1176
  let e = /* @__PURE__ */ new Date();
1093
1177
  return e < K.start || e > K.end ? null : Math.round(Y(e));
1094
- }, [K, Y]), Yn = e.useCallback(() => {
1178
+ }, [K, Y]), Qn = e.useCallback(() => {
1095
1179
  if (Q == null || !X.current) return;
1096
1180
  let e = Math.max(0, Q - X.current.clientWidth / 2);
1097
1181
  X.current.scrollTo({
1098
1182
  left: e,
1099
1183
  behavior: "smooth"
1100
1184
  });
1101
- }, [Q]), Xn = e.useRef(!1);
1185
+ }, [Q]), $n = e.useRef(!1);
1102
1186
  e.useEffect(() => {
1103
- if (Xn.current || t.length === 0) return;
1187
+ if ($n.current || t.length === 0) return;
1104
1188
  let e = window.requestAnimationFrame(() => {
1105
1189
  let e = X.current;
1106
1190
  if (!e || e.clientWidth === 0) return;
@@ -1109,7 +1193,7 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
1109
1193
  let e = new Date(Math.min(...t.map((e) => e.start.getTime())));
1110
1194
  n = Math.round(Y(e));
1111
1195
  }
1112
- e.scrollLeft = Math.max(0, n - e.clientWidth / 2), Xn.current = !0;
1196
+ e.scrollLeft = Math.max(0, n - e.clientWidth / 2), $n.current = !0;
1113
1197
  });
1114
1198
  return () => window.cancelAnimationFrame(e);
1115
1199
  }, [
@@ -1117,7 +1201,7 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
1117
1201
  Q,
1118
1202
  Y
1119
1203
  ]);
1120
- let Zn = e.useCallback((e, t = "left") => {
1204
+ let er = e.useCallback((e, t = "left") => {
1121
1205
  let n = X.current;
1122
1206
  if (!n || e < K.start || e > K.end) return !1;
1123
1207
  let r = Math.round(Y(e)), i = t === "center" ? r - n.clientWidth / 2 : r - 24;
@@ -1125,17 +1209,17 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
1125
1209
  left: Math.max(0, i),
1126
1210
  behavior: "smooth"
1127
1211
  }), !0;
1128
- }, [K, Y]), Qn = e.useCallback((e, t, n) => {
1212
+ }, [K, Y]), tr = e.useCallback((e, t, n) => {
1129
1213
  let r = X.current;
1130
1214
  if (!r) return;
1131
1215
  let i = Y(e), a = Y(t), o = Math.max(0, r.scrollWidth - r.clientWidth), s = Math.min(96, r.clientWidth * .15), c = a - i <= r.clientWidth - s ? (i + a) / 2 - r.clientWidth / 2 : i - s, l = Math.max(0, Math.min(c, o));
1132
- jn.current.forEach((e) => window.clearTimeout(e)), jn.current = [], Mn.current?.(), Mn.current = null, An(null);
1216
+ Pn.current.forEach((e) => window.clearTimeout(e)), Pn.current = [], Fn.current?.(), Fn.current = null, Nn(null);
1133
1217
  let u = () => {
1134
1218
  if (n == null) return;
1135
1219
  let e = window.requestAnimationFrame(() => {
1136
- An(n), jn.current.push(window.setTimeout(() => An((e) => e === n ? null : e), 1500));
1220
+ Nn(n), Pn.current.push(window.setTimeout(() => Nn((e) => e === n ? null : e), 1500));
1137
1221
  });
1138
- Mn.current = () => window.cancelAnimationFrame(e);
1222
+ Fn.current = () => window.cancelAnimationFrame(e);
1139
1223
  }, d = Math.abs(r.scrollLeft - l) > 2;
1140
1224
  if (r.scrollTo({
1141
1225
  left: l,
@@ -1147,65 +1231,65 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
1147
1231
  let f = "onscrollend" in r, p = !1, m = () => {
1148
1232
  p || (p = !0, r.removeEventListener("scrollend", m), u());
1149
1233
  };
1150
- r.addEventListener("scrollend", m), jn.current.push(window.setTimeout(m, f ? 1500 : 500)), Mn.current = () => r.removeEventListener("scrollend", m);
1234
+ r.addEventListener("scrollend", m), Pn.current.push(window.setTimeout(m, f ? 1500 : 500)), Fn.current = () => r.removeEventListener("scrollend", m);
1151
1235
  }, [Y]);
1152
1236
  e.useEffect(() => () => {
1153
- jn.current.forEach((e) => window.clearTimeout(e)), Mn.current?.();
1237
+ Pn.current.forEach((e) => window.clearTimeout(e)), Fn.current?.();
1154
1238
  }, []);
1155
- let $n = e.useCallback(() => Zn(Ge(/* @__PURE__ */ new Date(), "week")), [Zn]), er = e.useCallback(() => Zn(Ge(/* @__PURE__ */ new Date(), "month")), [Zn]), tr = (e) => {
1239
+ let nr = e.useCallback(() => er(Ze(/* @__PURE__ */ new Date(), "week")), [er]), rr = e.useCallback(() => er(Ze(/* @__PURE__ */ new Date(), "month")), [er]), ir = (e) => {
1156
1240
  let t = e.currentTarget;
1157
- !ct.current && t.clientWidth > 0 && (st.current = bn(t.scrollLeft)), En.current && (En.current.scrollLeft = t.scrollLeft), Dn.current && Dn.current.scrollTop !== t.scrollTop && (Dn.current.scrollTop = t.scrollTop), Pn((e) => e.top === t.scrollTop && e.left === t.scrollLeft ? e : {
1241
+ !ut.current && t.clientWidth > 0 && (lt.current = Cn(t.scrollLeft)), kn.current && (kn.current.scrollLeft = t.scrollLeft), An.current && An.current.scrollTop !== t.scrollTop && (An.current.scrollTop = t.scrollTop), Ln((e) => e.top === t.scrollTop && e.left === t.scrollLeft ? e : {
1158
1242
  top: t.scrollTop,
1159
1243
  left: t.scrollLeft
1160
- }), Ln();
1161
- }, nr = (e) => {
1244
+ }), Bn();
1245
+ }, ar = (e) => {
1162
1246
  let t = e.currentTarget, n = X.current;
1163
- n && n.scrollTop !== t.scrollTop && (n.scrollTop = t.scrollTop), Pn((e) => e.top === t.scrollTop ? e : {
1247
+ n && n.scrollTop !== t.scrollTop && (n.scrollTop = t.scrollTop), Ln((e) => e.top === t.scrollTop ? e : {
1164
1248
  ...e,
1165
1249
  top: t.scrollTop
1166
1250
  });
1167
- }, rr = (e, t) => {
1168
- let n = Y(e);
1251
+ }, or = (e, t) => {
1252
+ let n = Y(e), r = _n && v ? ht * Math.min(...v.bands.map((e) => e.durMs)) / Xe : ht;
1169
1253
  return {
1170
1254
  left: n,
1171
- width: Math.max(Y(t) - n, mt, 3)
1255
+ width: Math.max(Y(t) - n, r, 3)
1172
1256
  };
1173
- }, ir = V?.group ? V.taskId : null, ar = e.useMemo(() => {
1174
- if (ir == null) return null;
1175
- let e = new Set([String(ir)]);
1176
- for (let t of wt(ir)) e.add(String(t.id));
1257
+ }, sr = H?.group ? H.taskId : null, cr = e.useMemo(() => {
1258
+ if (sr == null) return null;
1259
+ let e = new Set([String(sr)]);
1260
+ for (let t of Tt(sr)) e.add(String(t.id));
1177
1261
  return e;
1178
- }, [ir, wt]), or = e.useMemo(() => {
1179
- if (!V || V.group) return null;
1180
- let e = /* @__PURE__ */ new Set(), t = /* @__PURE__ */ new Set(), n = Ct.get(String(V.taskId));
1262
+ }, [sr, Tt]), lr = e.useMemo(() => {
1263
+ if (!H || H.group) return null;
1264
+ let e = /* @__PURE__ */ new Set(), t = /* @__PURE__ */ new Set(), n = wt.get(String(H.taskId));
1181
1265
  for (; n && n.parent != null && n.parent !== "";) {
1182
1266
  let r = String(n.parent);
1183
- if (t.has(r) || !Ct.has(r)) break;
1184
- t.add(r), e.add(r), n = Ct.get(r);
1267
+ if (t.has(r) || !wt.has(r)) break;
1268
+ t.add(r), e.add(r), n = wt.get(r);
1185
1269
  }
1186
1270
  return e.size ? e : null;
1187
- }, [V, Ct]), sr = (e) => {
1188
- if (V) {
1189
- if (ar?.has(String(e.task.id))) {
1190
- let t = Ot(V).start.getTime() - V.originStart.getTime();
1191
- return rr(new Date(e.start.getTime() + t), new Date(e.end.getTime() + t));
1271
+ }, [H, wt]), ur = (e) => {
1272
+ if (H) {
1273
+ if (cr?.has(String(e.task.id))) {
1274
+ let t = kt(H).start.getTime() - H.originStart.getTime();
1275
+ return or(new Date(e.start.getTime() + t), new Date(e.end.getTime() + t));
1192
1276
  }
1193
- if (!e.isSummary && V.taskId === e.task.id) {
1194
- let e = Ot(V);
1195
- return rr(e.start, e.end);
1277
+ if (!e.isSummary && H.taskId === e.task.id) {
1278
+ let e = kt(H);
1279
+ return or(e.start, e.end);
1196
1280
  }
1197
- if (e.isSummary && or?.has(String(e.task.id))) {
1198
- let t = Ot(V), n = String(V.taskId), r = null, i = null;
1199
- for (let a of wt(e.task.id)) {
1200
- if ((St.get(String(a.id)) ?? []).length !== 0) continue;
1281
+ if (e.isSummary && lr?.has(String(e.task.id))) {
1282
+ let t = kt(H), n = String(H.taskId), r = null, i = null;
1283
+ for (let a of Tt(e.task.id)) {
1284
+ if ((Ct.get(String(a.id)) ?? []).length !== 0) continue;
1201
1285
  let e = String(a.id) === n ? t.start : a.start, o = String(a.id) === n ? t.end : a.end;
1202
1286
  (!r || e < r) && (r = e), (!i || o > i) && (i = o);
1203
1287
  }
1204
- if (r && i) return rr(r, i);
1288
+ if (r && i) return or(r, i);
1205
1289
  }
1206
1290
  }
1207
- return rr(e.start, e.end);
1208
- }, cr = e.useMemo(() => {
1291
+ return or(e.start, e.end);
1292
+ }, dr = e.useMemo(() => {
1209
1293
  let e = /* @__PURE__ */ new Map();
1210
1294
  G.forEach((t, n) => e.set(String(t.task.id), n));
1211
1295
  let t = [];
@@ -1226,23 +1310,23 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
1226
1310
  });
1227
1311
  }
1228
1312
  }), t;
1229
- }, [G]), lr = Math.round(F * .2), ur = F - lr * 2, dr = Math.max(Math.round(F * .4), 12), fr = dr * Math.SQRT2 / 2, pr = ur, mr = lr, hr = Math.max(3, Math.round(F * .13)), gr = F - hr - 1, _r = "rgba(100, 116, 139, 0.35)", vr = "rgba(100, 116, 139, 0.6)", yr = (e) => {
1313
+ }, [G]), fr = Math.round(F * .2), pr = F - fr * 2, mr = Math.max(Math.round(F * .4), 12), hr = mr * Math.SQRT2 / 2, gr = pr, _r = fr, vr = Math.max(3, Math.round(F * .13)), yr = F - vr - 1, br = "rgba(100, 116, 139, 0.35)", xr = "rgba(100, 116, 139, 0.6)", Sr = (e) => {
1230
1314
  let t = G[e.sourceIndex], n = G[e.targetIndex];
1231
1315
  if (!t || !n) return null;
1232
- let r = sr(t), i = sr(n), a = (e) => e.isSummary ? mr + pr / 2 : F / 2, o = e.sourceIndex * F + a(t), s = e.targetIndex * F + a(n), c = e.type === "fs" || e.type === "ff", l = e.type === "ff" || e.type === "sf", u = t.isMilestone ? r.left + (c ? fr : -fr) : c ? r.left + r.width : r.left, d = n.isMilestone ? i.left + (l ? fr : -fr) : l ? i.left + i.width : i.left, f = u + (c ? 10 : -10), p = d + (l ? 10 : -10), m = Math.round, h = [`M ${m(u)} ${m(o)}`, `L ${m(f)} ${m(o)}`];
1316
+ let r = ur(t), i = ur(n), a = (e) => e.isSummary ? _r + gr / 2 : F / 2, o = e.sourceIndex * F + a(t), s = e.targetIndex * F + a(n), c = e.type === "fs" || e.type === "ff", l = e.type === "ff" || e.type === "sf", u = t.isMilestone ? r.left + (c ? hr : -hr) : c ? r.left + r.width : r.left, d = n.isMilestone ? i.left + (l ? hr : -hr) : l ? i.left + i.width : i.left, f = u + (c ? 10 : -10), p = d + (l ? 10 : -10), m = Math.round, h = [`M ${m(u)} ${m(o)}`, `L ${m(f)} ${m(o)}`];
1233
1317
  if (l ? f >= p : f <= p) h.push(`L ${m(f)} ${m(s)}`, `L ${m(d)} ${m(s)}`);
1234
1318
  else {
1235
1319
  let t = s >= o ? (e.sourceIndex + 1) * F : e.sourceIndex * F;
1236
1320
  h.push(`L ${m(f)} ${m(t)}`, `L ${m(p)} ${m(t)}`, `L ${m(p)} ${m(s)}`, `L ${m(d)} ${m(s)}`);
1237
1321
  }
1238
1322
  return h.join(" ");
1239
- }, br = V?.taskId ?? bt, [xr, Sr] = e.useState(_), Cr = e.useMemo(() => xr ? Pe(t, v) : null, [
1240
- xr,
1323
+ }, Cr = H?.taskId ?? xt, [wr, Tr] = e.useState(ee), Er = e.useMemo(() => wr ? Fe(t, _) : null, [
1324
+ wr,
1241
1325
  t,
1242
- v
1243
- ]), wr = e.useCallback((e) => Cr?.criticalIds.has(String(e)) ?? !1, [Cr]), $ = "#dc2626", Tr = e.useCallback(() => {
1326
+ _
1327
+ ]), Dr = e.useCallback((e) => Er?.criticalIds.has(String(e)) ?? !1, [Er]), $ = "#dc2626", Or = e.useCallback(() => {
1244
1328
  if (!M) return;
1245
- let e = Fe(t, v), n = [];
1329
+ let e = Ie(t, _), n = [];
1246
1330
  for (let r of e) {
1247
1331
  let e = t.find((e) => String(e.id) === r.id);
1248
1332
  e && n.push({
@@ -1253,21 +1337,21 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
1253
1337
  }
1254
1338
  });
1255
1339
  }
1256
- H(n);
1340
+ Ft(n);
1257
1341
  }, [
1258
1342
  t,
1259
1343
  M,
1260
- v,
1261
- H
1262
- ]), Er = e.useCallback(() => {
1344
+ _,
1345
+ Ft
1346
+ ]), kr = e.useCallback(() => {
1263
1347
  if (typeof document > "u" || !t.length) return null;
1264
1348
  let e = (e) => String(e).replace(/[&<>"]/g, (e) => ({
1265
1349
  "&": "&amp;",
1266
1350
  "<": "&lt;",
1267
1351
  ">": "&gt;",
1268
1352
  "\"": "&quot;"
1269
- })[e]), n = Math.max(R, 200), r = Math.ceil(n + _n), i = Math.ceil(36 + G.length * F), a = Cr?.criticalEdges ?? null, o = [];
1270
- o.push(`<rect x="0" y="0" width="${r}" height="${i}" fill="#ffffff"/>`), o.push(`<rect x="0" y="0" width="${r}" height="36" fill="#f8fafc"/>`), o.push(`<g transform="translate(${n},0)" font-family="sans-serif" font-size="10" fill="#475569">`), wn.forEach((t) => {
1353
+ })[e]), n = Math.max(z, 200), r = Math.ceil(n + bn), i = Math.ceil(36 + G.length * F), a = Er?.criticalEdges ?? null, o = [];
1354
+ o.push(`<rect x="0" y="0" width="${r}" height="${i}" fill="#ffffff"/>`), o.push(`<rect x="0" y="0" width="${r}" height="36" fill="#f8fafc"/>`), o.push(`<g transform="translate(${n},0)" font-family="sans-serif" font-size="10" fill="#475569">`), Dn.forEach((t) => {
1271
1355
  o.push(`<line x1="${t.offset.toFixed(1)}" y1="0" x2="${t.offset.toFixed(1)}" y2="36" stroke="#e2e8f0"/>`), o.push(`<text x="${(t.offset + t.width / 2).toFixed(1)}" y="12" text-anchor="middle" font-weight="600">${e(t.label)}</text>`);
1272
1356
  }), q.forEach((t, n) => {
1273
1357
  let r = J[n];
@@ -1278,33 +1362,33 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
1278
1362
  let a = 8 + t.depth * 14, s = Math.max(4, Math.floor((n - a) / 6.5)), c = t.task.title.length > s ? t.task.title.slice(0, s - 1) + "…" : t.task.title, l = t.isSummary ? " font-weight=\"600\"" : "";
1279
1363
  o.push(`<text x="${a}" y="${(i + F / 2 + 4).toFixed(1)}"${l}>${e(c)}</text>`);
1280
1364
  }), o.push("</g>"), o.push(`<g transform="translate(${n},36)" font-family="sans-serif" font-size="9">`), G.forEach((e, t) => {
1281
- let n = t * F, { left: r, width: i } = rr(e.start, e.end), a = wr(e.task.id), s = a ? ` stroke="${$}" stroke-width="2"` : "";
1282
- if (ee && e.task.baselineStart && e.task.baselineEnd) {
1283
- let t = rr(e.task.baselineStart, e.task.baselineEnd);
1284
- o.push(`<rect x="${t.left.toFixed(1)}" y="${(n + gr).toFixed(1)}" width="${Math.max(2, t.width).toFixed(1)}" height="${hr}" rx="1" fill="${_r}" stroke="${vr}"/>`);
1365
+ let n = t * F, { left: r, width: i } = or(e.start, e.end), a = Dr(e.task.id), s = a ? ` stroke="${$}" stroke-width="2"` : "";
1366
+ if (te && e.task.baselineStart && e.task.baselineEnd) {
1367
+ let t = or(e.task.baselineStart, e.task.baselineEnd);
1368
+ o.push(`<rect x="${t.left.toFixed(1)}" y="${(n + yr).toFixed(1)}" width="${Math.max(2, t.width).toFixed(1)}" height="${vr}" rx="1" fill="${br}" stroke="${xr}"/>`);
1285
1369
  }
1286
1370
  if (e.isMilestone) {
1287
- let t = r, i = n + F / 2, s = dr / 2, c = a ? $ : e.task.color || "#3b82f6";
1371
+ let t = r, i = n + F / 2, s = mr / 2, c = a ? $ : e.task.color || "#3b82f6";
1288
1372
  o.push(`<polygon points="${t},${i - s} ${t + s},${i} ${t},${i + s} ${t - s},${i}" fill="${c}"/>`);
1289
1373
  } else if (e.isSummary) {
1290
1374
  let t = e.task.color || "#64748b";
1291
- o.push(`<rect x="${r.toFixed(1)}" y="${(n + mr).toFixed(1)}" width="${i.toFixed(1)}" height="${pr}" rx="3" fill="${t}"${s}/>`);
1375
+ o.push(`<rect x="${r.toFixed(1)}" y="${(n + _r).toFixed(1)}" width="${i.toFixed(1)}" height="${gr}" rx="3" fill="${t}"${s}/>`);
1292
1376
  let a = i * Math.min(100, Math.max(0, e.progress)) / 100;
1293
- o.push(`<rect x="${r.toFixed(1)}" y="${(n + mr).toFixed(1)}" width="${a.toFixed(1)}" height="${pr}" rx="3" fill="rgba(0,0,0,0.2)"/>`);
1377
+ o.push(`<rect x="${r.toFixed(1)}" y="${(n + _r).toFixed(1)}" width="${a.toFixed(1)}" height="${gr}" rx="3" fill="rgba(0,0,0,0.2)"/>`);
1294
1378
  } else {
1295
1379
  let t = e.task.color || "#3b82f6";
1296
- o.push(`<rect x="${r.toFixed(1)}" y="${(n + lr).toFixed(1)}" width="${i.toFixed(1)}" height="${ur}" rx="3" fill="${t}"${s}/>`);
1380
+ o.push(`<rect x="${r.toFixed(1)}" y="${(n + fr).toFixed(1)}" width="${i.toFixed(1)}" height="${pr}" rx="3" fill="${t}"${s}/>`);
1297
1381
  let a = i * Math.min(100, Math.max(0, e.progress)) / 100;
1298
- o.push(`<rect x="${r.toFixed(1)}" y="${(n + lr).toFixed(1)}" width="${a.toFixed(1)}" height="${ur}" rx="3" fill="rgba(0,0,0,0.18)"/>`), i >= 24 && o.push(`<text x="${(r + i / 2).toFixed(1)}" y="${(n + F / 2 + 3).toFixed(1)}" text-anchor="middle" fill="#ffffff">${Math.round(e.progress)}%</text>`);
1382
+ o.push(`<rect x="${r.toFixed(1)}" y="${(n + fr).toFixed(1)}" width="${a.toFixed(1)}" height="${pr}" rx="3" fill="rgba(0,0,0,0.18)"/>`), i >= 24 && o.push(`<text x="${(r + i / 2).toFixed(1)}" y="${(n + F / 2 + 3).toFixed(1)}" text-anchor="middle" fill="#ffffff">${Math.round(e.progress)}%</text>`);
1299
1383
  }
1300
- }), cr.forEach((e) => {
1301
- let t = yr(e);
1384
+ }), dr.forEach((e) => {
1385
+ let t = Sr(e);
1302
1386
  if (!t) return;
1303
1387
  let n = a?.has(`${String(e.sourceId)}->${String(e.targetId)}`) ?? !1, r = n ? $ : "#94a3b8";
1304
1388
  o.push(`<path d="${t}" fill="none" stroke="${r}" stroke-width="${n ? 2 : 1.5}"/>`);
1305
1389
  }), Q != null && o.push(`<line x1="${Q.toFixed(1)}" y1="0" x2="${Q.toFixed(1)}" y2="${G.length * F}" stroke="#ef4444" stroke-width="1.5"/>`);
1306
1390
  let s = G.length * F;
1307
- return Tn.forEach((t) => {
1391
+ return On.forEach((t) => {
1308
1392
  let n = /var\(/.test(t.color) ? "#6366f1" : t.color;
1309
1393
  if (o.push(`<line x1="${t.left.toFixed(1)}" y1="0" x2="${t.left.toFixed(1)}" y2="${s}" stroke="${e(n)}" stroke-width="1.5"/>`), t.label) {
1310
1394
  let r = t.label.length * 6 + 8;
@@ -1318,278 +1402,278 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
1318
1402
  }, [
1319
1403
  t,
1320
1404
  G,
1321
- cr,
1322
- yr,
1323
- rr,
1324
- wr,
1325
- Cr,
1405
+ dr,
1406
+ Sr,
1407
+ or,
1408
+ Dr,
1409
+ Er,
1326
1410
  q,
1327
1411
  J,
1328
- _n,
1329
- R,
1412
+ bn,
1413
+ z,
1330
1414
  F,
1331
- lr,
1332
- ur,
1333
- mr,
1415
+ fr,
1334
1416
  pr,
1335
- dr,
1417
+ _r,
1418
+ gr,
1419
+ mr,
1336
1420
  Q,
1337
1421
  L,
1338
- ee,
1339
- gr,
1340
- hr,
1341
- _r,
1422
+ te,
1423
+ yr,
1342
1424
  vr,
1343
- Tn,
1344
- wn
1345
- ]), Dr = e.useCallback(async () => {
1346
- let e = Er();
1425
+ br,
1426
+ xr,
1427
+ On,
1428
+ Dn
1429
+ ]), Ar = e.useCallback(async () => {
1430
+ let e = kr();
1347
1431
  if (!e) return;
1348
- let t = await Je(e.svg, e.W, e.H);
1432
+ let t = await et(e.svg, e.W, e.H);
1349
1433
  t && t.toBlob((e) => {
1350
- e && Ye(e, `gantt-${L}.png`);
1434
+ e && tt(e, `gantt-${L}.png`);
1351
1435
  }, "image/png");
1352
- }, [Er, L]), Or = e.useCallback(async () => {
1353
- let e = Er();
1436
+ }, [kr, L]), jr = e.useCallback(async () => {
1437
+ let e = kr();
1354
1438
  if (!e) return;
1355
- let t = await Je(e.svg, e.W, e.H);
1356
- t && Ye(Xe(Ze(t.toDataURL("image/jpeg", .92)), t.width, t.height), `gantt-${L}.pdf`);
1357
- }, [Er, L]), [kr, Ar] = e.useState(!1), jr = e.useCallback(() => {
1439
+ let t = await et(e.svg, e.W, e.H);
1440
+ t && tt(nt(rt(t.toDataURL("image/jpeg", .92)), t.width, t.height), `gantt-${L}.pdf`);
1441
+ }, [kr, L]), [Mr, Nr] = e.useState(!1), Pr = e.useCallback(() => {
1358
1442
  let e = {
1359
1443
  viewMode: L,
1360
- columnWidth: tt,
1361
- taskListCollapsed: lt,
1362
- taskListWidth: rt
1444
+ columnWidth: Be,
1445
+ taskListCollapsed: R,
1446
+ taskListWidth: He
1363
1447
  };
1364
- se && et(se, e), ce?.(e), Ar(!0);
1448
+ ce && ot(ce, e), le?.(e), Nr(!0);
1365
1449
  }, [
1366
1450
  L,
1367
- tt,
1368
- lt,
1369
- rt,
1370
- se,
1371
- ce
1451
+ Be,
1452
+ R,
1453
+ He,
1454
+ ce,
1455
+ le
1372
1456
  ]);
1373
1457
  return e.useEffect(() => {
1374
- if (!kr) return;
1375
- let e = setTimeout(() => Ar(!1), 1500);
1458
+ if (!Mr) return;
1459
+ let e = setTimeout(() => Nr(!1), 1500);
1376
1460
  return () => clearTimeout(e);
1377
- }, [kr]), /* @__PURE__ */ O("div", {
1378
- ref: fe,
1461
+ }, [Mr]), /* @__PURE__ */ D("div", {
1462
+ ref: O,
1379
1463
  className: b("flex flex-col h-full bg-background overflow-hidden min-w-0", p),
1380
1464
  "data-readonly": j ? "true" : void 0,
1381
- "data-mobile-readonly": ne && A ? "true" : void 0,
1465
+ "data-mobile-readonly": re && A ? "true" : void 0,
1382
1466
  children: [
1383
- /* @__PURE__ */ D("style", { children: "\n .gantt-resize-handle:hover { background-color: rgba(255, 255, 255, 0.4); }\n .gantt-bar-hover:hover { filter: brightness(1.1); }\n .gantt-locate-btn { opacity: 0; transition: opacity 0.15s ease; }\n .group\\/task-row:hover .gantt-locate-btn { opacity: 0.6; }\n .gantt-locate-btn:hover, .gantt-locate-btn:focus-visible { opacity: 1; }\n /* 定位闪烁: blink the located bar 3× with a thick ring + colored glow so\n it's hard to miss. The ring is an outline (not box-shadow) and the glow\n is a drop-shadow *filter* — both stay clear of the critical-path bar's\n inline box-shadow, which they'd otherwise clobber. */\n @keyframes gantt-flash {\n 0%, 25%, 50%, 100% {\n outline-color: rgba(37, 99, 235, 0);\n filter: drop-shadow(0 0 0 rgba(37, 99, 235, 0));\n }\n 12%, 37%, 62% {\n outline-color: rgba(37, 99, 235, 1);\n filter: drop-shadow(0 0 9px rgba(37, 99, 235, 0.9));\n }\n }\n .gantt-flash {\n outline: 3px solid transparent;\n outline-offset: 3px;\n border-radius: 2px;\n animation: gantt-flash 1.5s ease-in-out;\n }\n @media (min-width: 640px) {\n .gantt-sm-h50 { height: 50px; }\n .gantt-sm-w20 { width: 80px; }\n .gantt-sm-hidden { display: none; }\n }\n /* Persistent, grabbable timeline scrollbars. macOS (and iOS) default to\n overlay scrollbars that collapse to 0px and auto-hide, so the\n timeline's vertical scrollbar was nearly impossible to find. Defining\n ::-webkit-scrollbar opts this pane into a classic, always-visible bar\n regardless of the OS overlay preference. The thumb gets a min size so\n that with thousands of virtualized rows (scrollHeight in the hundreds\n of thousands of px) it never shrinks to an un-grabbable sliver. Scoped\n to the gantt pane so the host app's own scrollbars are untouched, and\n themed with neutral rgba (not theme utilities, which don't always\n reach a consuming app) so it's visible on any background. */\n /* Firefox (and any engine without ::-webkit-scrollbar) only: the\n standard props. We must NOT set these unconditionally — modern Chrome\n now honors scrollbar-width and, when it's present, IGNORES the\n ::-webkit-scrollbar rule below, falling back to the 0px auto-hiding\n overlay bar we're trying to replace. */\n @supports not selector(::-webkit-scrollbar) {\n [data-testid=\"gantt-timeline\"] {\n scrollbar-width: thin;\n scrollbar-color: rgba(130,130,130,0.55) transparent;\n }\n }\n [data-testid=\"gantt-timeline\"]::-webkit-scrollbar {\n width: 14px;\n height: 14px;\n }\n [data-testid=\"gantt-timeline\"]::-webkit-scrollbar-track {\n background: transparent;\n }\n [data-testid=\"gantt-timeline\"]::-webkit-scrollbar-thumb {\n background-color: rgba(130,130,130,0.55);\n border-radius: 8px;\n border: 3px solid transparent;\n background-clip: padding-box;\n min-height: 40px;\n min-width: 40px;\n }\n [data-testid=\"gantt-timeline\"]::-webkit-scrollbar-thumb:hover {\n background-color: rgba(110,110,110,0.85);\n }\n [data-testid=\"gantt-timeline\"]::-webkit-scrollbar-corner {\n background: transparent;\n }\n /* The task-list pane scrolls in lockstep with the timeline, so its own\n vertical scrollbar (butted against the divider) was a confusing second\n bar. Hide it — the pane stays wheel/drag-scrollable and synced. */\n .gantt-task-list::-webkit-scrollbar { width: 0; height: 0; }\n .gantt-task-list { scrollbar-width: none; }\n " }),
1384
- /* @__PURE__ */ O("div", {
1467
+ /* @__PURE__ */ E("style", { children: "\n .gantt-resize-handle:hover { background-color: rgba(255, 255, 255, 0.4); }\n .gantt-bar-hover:hover { filter: brightness(1.1); }\n .gantt-locate-btn { opacity: 0; transition: opacity 0.15s ease; }\n .group\\/task-row:hover .gantt-locate-btn { opacity: 0.6; }\n .gantt-locate-btn:hover, .gantt-locate-btn:focus-visible { opacity: 1; }\n /* 定位闪烁: blink the located bar 3× with a thick ring + colored glow so\n it's hard to miss. The ring is an outline (not box-shadow) and the glow\n is a drop-shadow *filter* — both stay clear of the critical-path bar's\n inline box-shadow, which they'd otherwise clobber. */\n @keyframes gantt-flash {\n 0%, 25%, 50%, 100% {\n outline-color: rgba(37, 99, 235, 0);\n filter: drop-shadow(0 0 0 rgba(37, 99, 235, 0));\n }\n 12%, 37%, 62% {\n outline-color: rgba(37, 99, 235, 1);\n filter: drop-shadow(0 0 9px rgba(37, 99, 235, 0.9));\n }\n }\n .gantt-flash {\n outline: 3px solid transparent;\n outline-offset: 3px;\n border-radius: 2px;\n animation: gantt-flash 1.5s ease-in-out;\n }\n @media (min-width: 640px) {\n .gantt-sm-h50 { height: 50px; }\n .gantt-sm-w20 { width: 80px; }\n .gantt-sm-hidden { display: none; }\n }\n /* Persistent, grabbable timeline scrollbars. macOS (and iOS) default to\n overlay scrollbars that collapse to 0px and auto-hide, so the\n timeline's vertical scrollbar was nearly impossible to find. Defining\n ::-webkit-scrollbar opts this pane into a classic, always-visible bar\n regardless of the OS overlay preference. The thumb gets a min size so\n that with thousands of virtualized rows (scrollHeight in the hundreds\n of thousands of px) it never shrinks to an un-grabbable sliver. Scoped\n to the gantt pane so the host app's own scrollbars are untouched, and\n themed with neutral rgba (not theme utilities, which don't always\n reach a consuming app) so it's visible on any background. */\n /* Firefox (and any engine without ::-webkit-scrollbar) only: the\n standard props. We must NOT set these unconditionally — modern Chrome\n now honors scrollbar-width and, when it's present, IGNORES the\n ::-webkit-scrollbar rule below, falling back to the 0px auto-hiding\n overlay bar we're trying to replace. */\n @supports not selector(::-webkit-scrollbar) {\n [data-testid=\"gantt-timeline\"] {\n scrollbar-width: thin;\n scrollbar-color: rgba(130,130,130,0.55) transparent;\n }\n }\n [data-testid=\"gantt-timeline\"]::-webkit-scrollbar {\n width: 14px;\n height: 14px;\n }\n [data-testid=\"gantt-timeline\"]::-webkit-scrollbar-track {\n background: transparent;\n }\n [data-testid=\"gantt-timeline\"]::-webkit-scrollbar-thumb {\n background-color: rgba(130,130,130,0.55);\n border-radius: 8px;\n border: 3px solid transparent;\n background-clip: padding-box;\n min-height: 40px;\n min-width: 40px;\n }\n [data-testid=\"gantt-timeline\"]::-webkit-scrollbar-thumb:hover {\n background-color: rgba(110,110,110,0.85);\n }\n [data-testid=\"gantt-timeline\"]::-webkit-scrollbar-corner {\n background: transparent;\n }\n /* The task-list pane scrolls in lockstep with the timeline, so its own\n vertical scrollbar (butted against the divider) was a confusing second\n bar. Hide it — the pane stays wheel/drag-scrollable and synced. */\n .gantt-task-list::-webkit-scrollbar { width: 0; height: 0; }\n .gantt-task-list { scrollbar-width: none; }\n " }),
1468
+ /* @__PURE__ */ D("div", {
1385
1469
  className: "flex flex-col sm:flex-row items-start sm:items-center justify-between gap-2 p-2 border-b bg-card",
1386
- children: [/* @__PURE__ */ O("div", {
1470
+ children: [/* @__PURE__ */ D("div", {
1387
1471
  className: "flex items-center gap-2",
1388
1472
  children: [
1389
- /* @__PURE__ */ D(y, {
1473
+ /* @__PURE__ */ E(y, {
1390
1474
  variant: "ghost",
1391
1475
  size: "icon",
1392
1476
  className: "h-8 w-8",
1393
1477
  "aria-label": x("gantt.toolbar.prevPeriod"),
1394
- children: /* @__PURE__ */ D(he, { className: "h-4 w-4" })
1478
+ children: /* @__PURE__ */ E(he, { className: "h-4 w-4" })
1395
1479
  }),
1396
- /* @__PURE__ */ D(y, {
1480
+ /* @__PURE__ */ E(y, {
1397
1481
  variant: "ghost",
1398
1482
  size: "icon",
1399
1483
  className: "h-8 w-8",
1400
1484
  "aria-label": x("gantt.toolbar.nextPeriod"),
1401
- children: /* @__PURE__ */ D(C, { className: "h-4 w-4" })
1485
+ children: /* @__PURE__ */ E(C, { className: "h-4 w-4" })
1402
1486
  }),
1403
- /* @__PURE__ */ D("span", {
1487
+ /* @__PURE__ */ E("span", {
1404
1488
  className: "font-semibold text-xs sm:text-sm",
1405
1489
  children: K.start.toLocaleDateString(S, {
1406
1490
  month: "long",
1407
1491
  year: "numeric"
1408
1492
  })
1409
1493
  }),
1410
- j && /* @__PURE__ */ O("span", {
1494
+ j && /* @__PURE__ */ D("span", {
1411
1495
  className: "inline-flex items-center gap-1 rounded-full border bg-muted px-2 py-0.5 text-[10px] font-medium text-muted-foreground",
1412
1496
  "data-testid": "gantt-readonly-badge",
1413
1497
  title: x("gantt.readOnlyHint"),
1414
- children: [/* @__PURE__ */ D(w, { className: "h-3 w-3" }), x("gantt.readOnly")]
1498
+ children: [/* @__PURE__ */ E(w, { className: "h-3 w-3" }), x("gantt.readOnly")]
1415
1499
  })
1416
1500
  ]
1417
- }), /* @__PURE__ */ O("div", {
1501
+ }), /* @__PURE__ */ D("div", {
1418
1502
  className: "flex items-center gap-2",
1419
1503
  children: [
1420
- /* @__PURE__ */ D("div", {
1504
+ /* @__PURE__ */ E("div", {
1421
1505
  className: "flex bg-muted rounded-md p-1",
1422
1506
  role: "group",
1423
1507
  "aria-label": x("gantt.toolbar.viewMode"),
1424
- children: He.map((e) => /* @__PURE__ */ D(y, {
1508
+ children: Je.map((e) => /* @__PURE__ */ E(y, {
1425
1509
  variant: "ghost",
1426
1510
  size: "sm",
1427
1511
  className: b("h-6 px-1.5 sm:px-2 text-xs", L === e && "bg-background shadow-sm hover:bg-background"),
1428
- onClick: () => xn(e),
1512
+ onClick: () => wn(e),
1429
1513
  "aria-pressed": L === e,
1430
1514
  "data-testid": `gantt-view-mode-${e}`,
1431
1515
  children: x(`gantt.viewMode.${e}`)
1432
1516
  }, e))
1433
1517
  }),
1434
- /* @__PURE__ */ O("div", {
1518
+ /* @__PURE__ */ D("div", {
1435
1519
  className: "flex bg-muted rounded-md p-1",
1436
- children: [/* @__PURE__ */ D(y, {
1520
+ children: [/* @__PURE__ */ E(y, {
1437
1521
  variant: "ghost",
1438
1522
  size: "icon",
1439
1523
  className: "h-6 w-6",
1440
1524
  onClick: () => {
1441
- if (z > 15) nt(Math.max(15, z - 10));
1525
+ if (B > 15) Ve(Math.max(15, B - 10));
1442
1526
  else {
1443
- let e = He.indexOf(L);
1444
- e < He.length - 1 && (xn(He[e + 1]), nt(Ie));
1527
+ let e = Je.indexOf(L);
1528
+ e < Je.length - 1 && (wn(Je[e + 1]), Ve(Le));
1445
1529
  }
1446
1530
  },
1447
1531
  "aria-label": x("gantt.toolbar.zoomOut"),
1448
- children: /* @__PURE__ */ D(Ee, { className: "h-3 w-3" })
1449
- }), /* @__PURE__ */ D(y, {
1532
+ children: /* @__PURE__ */ E(De, { className: "h-3 w-3" })
1533
+ }), /* @__PURE__ */ E(y, {
1450
1534
  variant: "ghost",
1451
1535
  size: "icon",
1452
1536
  className: "h-6 w-6",
1453
1537
  onClick: () => {
1454
- if (z < 120) nt(Math.min(120, z + 10));
1538
+ if (B < 120) Ve(Math.min(120, B + 10));
1455
1539
  else {
1456
- let e = He.indexOf(L);
1457
- e > 0 && (xn(He[e - 1]), nt(Ie));
1540
+ let e = Je.indexOf(L);
1541
+ e > 0 && (wn(Je[e - 1]), Ve(Le));
1458
1542
  }
1459
1543
  },
1460
1544
  "aria-label": x("gantt.toolbar.zoomIn"),
1461
- children: /* @__PURE__ */ D(Te, { className: "h-3 w-3" })
1545
+ children: /* @__PURE__ */ E(Ee, { className: "h-3 w-3" })
1462
1546
  })]
1463
1547
  }),
1464
- /* @__PURE__ */ D(y, {
1548
+ /* @__PURE__ */ E(y, {
1465
1549
  variant: "ghost",
1466
1550
  size: "icon",
1467
1551
  className: "h-8 w-8",
1468
- onClick: () => ut((e) => !e),
1469
- "aria-label": x(lt ? "gantt.toolbar.showTaskList" : "gantt.toolbar.hideTaskList"),
1470
- "aria-pressed": lt,
1552
+ onClick: () => dt((e) => !e),
1553
+ "aria-label": x(R ? "gantt.toolbar.showTaskList" : "gantt.toolbar.hideTaskList"),
1554
+ "aria-pressed": R,
1471
1555
  "data-testid": "gantt-toggle-task-list",
1472
- children: D(lt ? E : be, { className: "h-4 w-4" })
1556
+ children: E(R ? be : xe, { className: "h-4 w-4" })
1473
1557
  }),
1474
- /* @__PURE__ */ D(y, {
1558
+ /* @__PURE__ */ E(y, {
1475
1559
  variant: "ghost",
1476
1560
  size: "sm",
1477
1561
  className: "h-8 px-2 text-xs",
1478
- onClick: Yn,
1562
+ onClick: Qn,
1479
1563
  disabled: Q == null,
1480
1564
  "aria-label": x("gantt.toolbar.jumpToToday"),
1481
1565
  "data-testid": "gantt-jump-today",
1482
1566
  children: x("gantt.toolbar.today")
1483
1567
  }),
1484
- /* @__PURE__ */ D(y, {
1568
+ /* @__PURE__ */ E(y, {
1485
1569
  variant: "ghost",
1486
1570
  size: "sm",
1487
1571
  className: "h-8 px-2 text-xs",
1488
- onClick: $n,
1572
+ onClick: nr,
1489
1573
  "aria-label": x("gantt.toolbar.thisWeek"),
1490
1574
  "data-testid": "gantt-jump-week",
1491
1575
  children: x("gantt.toolbar.thisWeek")
1492
1576
  }),
1493
- /* @__PURE__ */ D(y, {
1577
+ /* @__PURE__ */ E(y, {
1494
1578
  variant: "ghost",
1495
1579
  size: "sm",
1496
1580
  className: "h-8 px-2 text-xs",
1497
- onClick: er,
1581
+ onClick: rr,
1498
1582
  "aria-label": x("gantt.toolbar.thisMonth"),
1499
1583
  "data-testid": "gantt-jump-month",
1500
1584
  children: x("gantt.toolbar.thisMonth")
1501
1585
  }),
1502
- M ? /* @__PURE__ */ O(De, { children: [/* @__PURE__ */ D(y, {
1586
+ M ? /* @__PURE__ */ D(Oe, { children: [/* @__PURE__ */ E(y, {
1503
1587
  variant: "ghost",
1504
1588
  size: "icon",
1505
1589
  className: "h-8 w-8",
1506
- onClick: zt,
1507
- disabled: !Vt,
1590
+ onClick: Vt,
1591
+ disabled: !Ut,
1508
1592
  "aria-label": x("gantt.toolbar.undo"),
1509
1593
  "data-testid": "gantt-undo",
1510
- children: /* @__PURE__ */ D(Ce, { className: "h-4 w-4" })
1511
- }), /* @__PURE__ */ D(y, {
1594
+ children: /* @__PURE__ */ E(we, { className: "h-4 w-4" })
1595
+ }), /* @__PURE__ */ E(y, {
1512
1596
  variant: "ghost",
1513
1597
  size: "icon",
1514
1598
  className: "h-8 w-8",
1515
- onClick: Bt,
1516
- disabled: !Ht,
1599
+ onClick: Ht,
1600
+ disabled: !Wt,
1517
1601
  "aria-label": x("gantt.toolbar.redo"),
1518
1602
  "data-testid": "gantt-redo",
1519
- children: /* @__PURE__ */ D(xe, { className: "h-4 w-4" })
1603
+ children: /* @__PURE__ */ E(Se, { className: "h-4 w-4" })
1520
1604
  })] }) : null,
1521
- /* @__PURE__ */ D(y, {
1605
+ /* @__PURE__ */ E(y, {
1522
1606
  variant: "ghost",
1523
1607
  size: "icon",
1524
1608
  className: "h-8 w-8",
1525
- onClick: () => Sr((e) => !e),
1609
+ onClick: () => Tr((e) => !e),
1526
1610
  "aria-label": x("gantt.toolbar.criticalPath"),
1527
- "aria-pressed": xr,
1611
+ "aria-pressed": wr,
1528
1612
  "data-testid": "gantt-critical-path",
1529
- style: xr ? { color: $ } : void 0,
1530
- children: /* @__PURE__ */ D(pe, { className: "h-4 w-4" })
1613
+ style: wr ? { color: $ } : void 0,
1614
+ children: /* @__PURE__ */ E(pe, { className: "h-4 w-4" })
1531
1615
  }),
1532
- Me && M ? /* @__PURE__ */ D(y, {
1616
+ Ne && M ? /* @__PURE__ */ E(y, {
1533
1617
  variant: "ghost",
1534
1618
  size: "icon",
1535
1619
  className: "h-8 w-8",
1536
- onClick: Tr,
1620
+ onClick: Or,
1537
1621
  "aria-label": x("gantt.toolbar.autoSchedule"),
1538
1622
  "data-testid": "gantt-auto-schedule",
1539
- children: /* @__PURE__ */ D(we, { className: "h-4 w-4" })
1623
+ children: /* @__PURE__ */ E(Te, { className: "h-4 w-4" })
1540
1624
  }) : null,
1541
- /* @__PURE__ */ D(y, {
1625
+ /* @__PURE__ */ E(y, {
1542
1626
  variant: "ghost",
1543
1627
  size: "icon",
1544
1628
  className: "h-8 w-8",
1545
- onClick: Dr,
1629
+ onClick: Ar,
1546
1630
  "aria-label": x("gantt.toolbar.exportPng"),
1547
1631
  "data-testid": "gantt-export-png",
1548
- children: /* @__PURE__ */ D(_e, { className: "h-4 w-4" })
1632
+ children: /* @__PURE__ */ E(_e, { className: "h-4 w-4" })
1549
1633
  }),
1550
- /* @__PURE__ */ D(y, {
1634
+ /* @__PURE__ */ E(y, {
1551
1635
  variant: "ghost",
1552
1636
  size: "icon",
1553
1637
  className: "h-8 w-8",
1554
- onClick: Or,
1638
+ onClick: jr,
1555
1639
  "aria-label": x("gantt.toolbar.exportPdf"),
1556
1640
  "data-testid": "gantt-export-pdf",
1557
- children: /* @__PURE__ */ D(ve, { className: "h-4 w-4" })
1641
+ children: /* @__PURE__ */ E(ve, { className: "h-4 w-4" })
1558
1642
  }),
1559
- ce || se ? /* @__PURE__ */ D(y, {
1643
+ le || ce ? /* @__PURE__ */ E(y, {
1560
1644
  variant: "ghost",
1561
1645
  size: "icon",
1562
1646
  className: "h-8 w-8",
1563
- onClick: jr,
1647
+ onClick: Pr,
1564
1648
  "aria-label": x("gantt.toolbar.saveLayout"),
1565
- "aria-pressed": kr,
1649
+ "aria-pressed": Mr,
1566
1650
  "data-testid": "gantt-save-layout",
1567
- style: kr ? { color: $ } : void 0,
1568
- children: /* @__PURE__ */ D(Se, { className: "h-4 w-4" })
1651
+ style: Mr ? { color: $ } : void 0,
1652
+ children: /* @__PURE__ */ E(Ce, { className: "h-4 w-4" })
1569
1653
  }) : null,
1570
- /* @__PURE__ */ D(y, {
1654
+ /* @__PURE__ */ E(y, {
1571
1655
  variant: "ghost",
1572
1656
  size: "icon",
1573
1657
  className: "h-8 w-8",
1574
- onClick: Wn,
1575
- "aria-label": x(Hn ? "gantt.toolbar.exitFullscreen" : "gantt.toolbar.enterFullscreen"),
1576
- "aria-pressed": Hn,
1658
+ onClick: qn,
1659
+ "aria-label": x(Gn ? "gantt.toolbar.exitFullscreen" : "gantt.toolbar.enterFullscreen"),
1660
+ "aria-pressed": Gn,
1577
1661
  "data-testid": "gantt-fullscreen",
1578
- children: D(Hn ? ye : T, { className: "h-4 w-4" })
1662
+ children: E(Gn ? ye : T, { className: "h-4 w-4" })
1579
1663
  })
1580
1664
  ]
1581
1665
  })]
1582
1666
  }),
1583
- /* @__PURE__ */ O("div", {
1667
+ /* @__PURE__ */ D("div", {
1584
1668
  className: "relative flex flex-col flex-1 overflow-hidden outline-none focus-visible:ring-1 focus-visible:ring-ring",
1585
1669
  tabIndex: 0,
1586
- onKeyDown: mn,
1670
+ onKeyDown: gn,
1587
1671
  "data-testid": "gantt-body",
1588
1672
  children: [
1589
- !lt && R > 0 && /* @__PURE__ */ D("div", {
1673
+ !R && z > 0 && /* @__PURE__ */ E("div", {
1590
1674
  className: "absolute top-0 bottom-0 z-30 group/splitter",
1591
1675
  style: {
1592
- left: R - 3,
1676
+ left: z - 3,
1593
1677
  width: 7,
1594
1678
  cursor: "col-resize"
1595
1679
  },
@@ -1599,7 +1683,7 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
1599
1683
  onPointerDown: (e) => {
1600
1684
  if (e.button !== 0) return;
1601
1685
  e.preventDefault();
1602
- let t = e.clientX, n = R, r = Math.max(160, k - 200), i = (e) => {
1686
+ let t = e.clientX, n = z, r = Math.max(160, k - 200), i = (e) => {
1603
1687
  it(Math.max(160, Math.min(n + (e.clientX - t), r)));
1604
1688
  }, a = () => {
1605
1689
  window.removeEventListener("pointermove", i), window.removeEventListener("pointerup", a), window.removeEventListener("pointercancel", a), document.body.style.cursor = "";
@@ -1607,62 +1691,63 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
1607
1691
  document.body.style.cursor = "col-resize", window.addEventListener("pointermove", i), window.addEventListener("pointerup", a), window.addEventListener("pointercancel", a);
1608
1692
  },
1609
1693
  onDoubleClick: () => it(null),
1610
- children: /* @__PURE__ */ D("div", { className: "absolute inset-y-0 left-1/2 -translate-x-1/2 w-px bg-border group-hover/splitter:w-[3px] group-hover/splitter:bg-primary transition-all" })
1694
+ children: /* @__PURE__ */ E("div", { className: "absolute inset-y-0 left-1/2 -translate-x-1/2 w-px bg-border group-hover/splitter:w-[3px] group-hover/splitter:bg-primary transition-all" })
1611
1695
  }),
1612
- /* @__PURE__ */ O("div", {
1696
+ /* @__PURE__ */ D("div", {
1613
1697
  className: "flex border-b bg-muted/30 shrink-0 h-10 gantt-sm-h50",
1614
- children: [/* @__PURE__ */ O("div", {
1698
+ children: [/* @__PURE__ */ D("div", {
1615
1699
  className: "flex items-center font-medium text-xs text-muted-foreground px-2 sm:px-4 border-r bg-card z-20 shadow-sm",
1616
1700
  style: {
1617
- width: R,
1618
- minWidth: R
1701
+ width: z,
1702
+ minWidth: z
1619
1703
  },
1620
- children: [/* @__PURE__ */ D("div", {
1704
+ children: [/* @__PURE__ */ E("div", {
1621
1705
  className: "flex-1 truncate",
1622
1706
  children: x("gantt.column.taskName")
1623
- }), ht && /* @__PURE__ */ O(De, { children: [/* @__PURE__ */ D("div", {
1707
+ }), gt && /* @__PURE__ */ D(Oe, { children: [/* @__PURE__ */ E("div", {
1624
1708
  className: "w-16 gantt-sm-w20 text-right",
1625
1709
  children: x("gantt.column.start")
1626
- }), /* @__PURE__ */ D("div", {
1710
+ }), /* @__PURE__ */ E("div", {
1627
1711
  className: "w-16 gantt-sm-w20 text-right",
1628
1712
  children: x("gantt.column.end")
1629
1713
  })] })]
1630
- }), /* @__PURE__ */ D("div", {
1714
+ }), /* @__PURE__ */ E("div", {
1631
1715
  className: "flex-1 overflow-hidden",
1632
- ref: En,
1633
- children: /* @__PURE__ */ O("div", {
1716
+ ref: kn,
1717
+ children: /* @__PURE__ */ D("div", {
1634
1718
  className: "flex flex-col h-full",
1635
- style: { width: _n },
1636
- children: [/* @__PURE__ */ D("div", {
1719
+ style: { width: bn },
1720
+ children: [/* @__PURE__ */ E("div", {
1637
1721
  className: "relative border-b",
1638
1722
  style: { height: "45%" },
1639
1723
  "data-testid": "gantt-header-groups",
1640
- children: wn.slice(Bn.start, Bn.end).map((e) => /* @__PURE__ */ D("div", {
1724
+ children: Dn.slice(Un.start, Un.end).map((e) => /* @__PURE__ */ E("div", {
1641
1725
  className: "absolute top-0 bottom-0 flex items-center justify-center border-r text-[10px] font-medium text-muted-foreground overflow-hidden",
1642
1726
  style: {
1643
1727
  left: e.offset,
1644
1728
  width: e.width
1645
1729
  },
1646
- children: /* @__PURE__ */ D("span", {
1730
+ children: /* @__PURE__ */ E("span", {
1647
1731
  className: "truncate px-1",
1648
1732
  children: e.label
1649
1733
  })
1650
1734
  }, e.key))
1651
- }), /* @__PURE__ */ D("div", {
1735
+ }), /* @__PURE__ */ E("div", {
1652
1736
  className: "relative flex-1",
1653
1737
  "data-testid": "gantt-header-units",
1654
- children: q.slice(Rn.start, Rn.end).map((e, t) => {
1655
- let n = Rn.start + t;
1656
- return /* @__PURE__ */ O("div", {
1738
+ children: q.slice(Vn.start, Vn.end).map((e, t) => {
1739
+ let n = Vn.start + t;
1740
+ return /* @__PURE__ */ D("div", {
1657
1741
  className: b("absolute top-0 bottom-0 flex items-center justify-center gap-1 border-r text-xs text-muted-foreground overflow-hidden", e.isWeekend && "bg-muted/50"),
1658
1742
  style: {
1659
1743
  left: J[n],
1660
- width: e.width
1744
+ width: e.width,
1745
+ backgroundColor: e.bandColor ? `color-mix(in srgb, ${e.bandColor} 16%, transparent)` : void 0
1661
1746
  },
1662
- children: [/* @__PURE__ */ D("span", {
1747
+ children: [/* @__PURE__ */ E("span", {
1663
1748
  className: "font-medium text-foreground truncate",
1664
1749
  children: e.label
1665
- }), e.sublabel && z >= 32 && /* @__PURE__ */ D("span", {
1750
+ }), e.sublabel && B >= 32 && /* @__PURE__ */ E("span", {
1666
1751
  className: "text-[10px] opacity-70",
1667
1752
  children: e.sublabel
1668
1753
  })]
@@ -1672,26 +1757,26 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
1672
1757
  })
1673
1758
  })]
1674
1759
  }),
1675
- /* @__PURE__ */ O("div", {
1760
+ /* @__PURE__ */ D("div", {
1676
1761
  className: "flex flex-1 overflow-hidden",
1677
- children: [/* @__PURE__ */ O("div", {
1762
+ children: [/* @__PURE__ */ D("div", {
1678
1763
  className: "gantt-task-list overflow-y-auto overflow-x-hidden border-r bg-card z-10 shadow-sm",
1679
- ref: Dn,
1680
- onScroll: nr,
1764
+ ref: An,
1765
+ onScroll: ar,
1681
1766
  style: {
1682
- width: R,
1683
- minWidth: R
1767
+ width: z,
1768
+ minWidth: z
1684
1769
  },
1685
1770
  role: "tree",
1686
1771
  "aria-label": x("gantt.aria.taskList"),
1687
1772
  children: [
1688
- Z.startIdx > 0 && /* @__PURE__ */ D("div", {
1773
+ Z.startIdx > 0 && /* @__PURE__ */ E("div", {
1689
1774
  style: { height: Z.startIdx * F },
1690
1775
  "aria-hidden": "true"
1691
1776
  }),
1692
1777
  G.slice(Z.startIdx, Z.endIdx).map((e) => {
1693
- let t = e.task, n = je && gt === t.id, r = un.has(String(t.id)), i = an != null && String(an) === String(t.id);
1694
- return /* @__PURE__ */ O("div", {
1778
+ let t = e.task, n = Me && _t === t.id, r = fn.has(String(t.id)), i = sn != null && String(sn) === String(t.id);
1779
+ return /* @__PURE__ */ D("div", {
1695
1780
  className: b("group/task-row relative flex items-center border-b px-2 sm:px-4 hover:bg-accent/50 cursor-pointer transition-colors", i && "bg-accent/50"),
1696
1781
  style: {
1697
1782
  height: F,
@@ -1701,26 +1786,26 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
1701
1786
  "aria-level": e.depth + 1,
1702
1787
  "aria-selected": i,
1703
1788
  "aria-expanded": e.hasChildren ? !r : void 0,
1704
- draggable: !!P && !n && !t.locked,
1705
- onDragStart: P ? (e) => {
1789
+ draggable: !!je && !n && !t.locked,
1790
+ onDragStart: je ? (e) => {
1706
1791
  e.dataTransfer.setData("text/plain", String(t.id)), e.dataTransfer.effectAllowed = "move";
1707
1792
  } : void 0,
1708
- onDragOver: P ? (e) => {
1793
+ onDragOver: je ? (e) => {
1709
1794
  e.preventDefault(), e.dataTransfer.dropEffect = "move";
1710
1795
  } : void 0,
1711
- onDrop: P ? (e) => {
1796
+ onDrop: je ? (e) => {
1712
1797
  e.preventDefault();
1713
1798
  let n = e.dataTransfer.getData("text/plain");
1714
1799
  if (!n || n === String(t.id)) return;
1715
- let r = Ct.get(n);
1716
- r && String(r.parent ?? "") === String(t.parent ?? "") && P(r, t);
1800
+ let r = wt.get(n);
1801
+ r && String(r.parent ?? "") === String(t.parent ?? "") && je(r, t);
1717
1802
  } : void 0,
1718
- onContextMenu: (e) => cn(t, e),
1803
+ onContextMenu: (e) => un(t, e),
1719
1804
  onClick: () => {
1720
- on(t.id), n || o?.(t);
1805
+ cn(t.id), n || o?.(t);
1721
1806
  },
1722
1807
  onDoubleClick: () => {
1723
- je && M && !e.isSummary && !t.locked && (_t(t.id), yt({
1808
+ Me && M && !e.isSummary && !t.locked && (vt(t.id), bt({
1724
1809
  title: t.title,
1725
1810
  start: t.start.toLocaleDateString("en-CA"),
1726
1811
  end: t.end.toLocaleDateString("en-CA"),
@@ -1728,56 +1813,56 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
1728
1813
  }));
1729
1814
  },
1730
1815
  children: [
1731
- /* @__PURE__ */ O("div", {
1816
+ /* @__PURE__ */ D("div", {
1732
1817
  className: "flex-1 truncate font-medium text-xs sm:text-sm flex items-center gap-2",
1733
1818
  style: e.depth > 0 ? { paddingLeft: e.depth * 14 } : void 0,
1734
1819
  children: [
1735
- e.hasChildren ? /* @__PURE__ */ D("button", {
1820
+ e.hasChildren ? /* @__PURE__ */ E("button", {
1736
1821
  type: "button",
1737
1822
  className: "h-4 w-4 shrink-0 flex items-center justify-center text-muted-foreground hover:text-foreground",
1738
1823
  style: { marginLeft: -4 },
1739
1824
  onClick: (e) => {
1740
- e.stopPropagation(), fn(t.id);
1825
+ e.stopPropagation(), mn(t.id);
1741
1826
  },
1742
1827
  "aria-expanded": !r,
1743
1828
  "aria-label": x(r ? "gantt.row.expand" : "gantt.row.collapse"),
1744
1829
  "data-testid": `gantt-row-toggle-${t.id}`,
1745
- children: D(r ? C : me, { className: "h-3.5 w-3.5" })
1746
- }) : /* @__PURE__ */ D("span", {
1830
+ children: E(r ? C : me, { className: "h-3.5 w-3.5" })
1831
+ }) : /* @__PURE__ */ E("span", {
1747
1832
  className: "w-3 shrink-0",
1748
1833
  style: { marginLeft: -4 },
1749
1834
  "aria-hidden": "true"
1750
1835
  }),
1751
- /* @__PURE__ */ D("div", {
1836
+ /* @__PURE__ */ E("div", {
1752
1837
  className: "w-2 h-2 rounded-full shrink-0",
1753
1838
  style: { backgroundColor: t.color || "#3b82f6" }
1754
1839
  }),
1755
- n ? /* @__PURE__ */ D("input", {
1840
+ n ? /* @__PURE__ */ E("input", {
1756
1841
  className: "border rounded px-1 py-0.5 text-xs w-full bg-background",
1757
- value: vt.title || "",
1758
- onChange: (e) => yt((t) => ({
1842
+ value: yt.title || "",
1843
+ onChange: (e) => bt((t) => ({
1759
1844
  ...t,
1760
1845
  title: e.target.value
1761
1846
  })),
1762
1847
  onKeyDown: (e) => {
1763
- e.key === "Enter" ? (H([{
1848
+ e.key === "Enter" ? (Ft([{
1764
1849
  task: t,
1765
1850
  changes: {
1766
- title: vt.title,
1767
- start: new Date(vt.start),
1768
- end: new Date(vt.end),
1769
- progress: Number(vt.progress) || 0
1851
+ title: yt.title,
1852
+ start: new Date(yt.start),
1853
+ end: new Date(yt.end),
1854
+ progress: Number(yt.progress) || 0
1770
1855
  }
1771
- }]), _t(null)) : e.key === "Escape" && _t(null);
1856
+ }]), vt(null)) : e.key === "Escape" && vt(null);
1772
1857
  },
1773
1858
  onClick: (e) => e.stopPropagation(),
1774
1859
  autoFocus: !0
1775
- }) : /* @__PURE__ */ O("span", {
1860
+ }) : /* @__PURE__ */ D("span", {
1776
1861
  className: "flex flex-col min-w-0",
1777
- children: [/* @__PURE__ */ D("span", {
1862
+ children: [/* @__PURE__ */ E("span", {
1778
1863
  className: b("truncate", e.isSummary && "font-semibold"),
1779
1864
  children: t.title
1780
- }), /* @__PURE__ */ O("span", {
1865
+ }), /* @__PURE__ */ D("span", {
1781
1866
  className: "text-[10px] text-muted-foreground gantt-sm-hidden",
1782
1867
  children: [
1783
1868
  e.start.toLocaleDateString(S, {
@@ -1794,15 +1879,15 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
1794
1879
  })
1795
1880
  ]
1796
1881
  }),
1797
- /* @__PURE__ */ D("div", {
1882
+ /* @__PURE__ */ E("div", {
1798
1883
  className: "w-16 gantt-sm-w20 text-right text-xs text-muted-foreground hidden sm:block",
1799
- hidden: !ht,
1800
- style: ht ? void 0 : { display: "none" },
1801
- children: n ? /* @__PURE__ */ D("input", {
1884
+ hidden: !gt,
1885
+ style: gt ? void 0 : { display: "none" },
1886
+ children: n ? /* @__PURE__ */ E("input", {
1802
1887
  type: "date",
1803
1888
  className: "border rounded px-1 py-0.5 text-xs w-full bg-background",
1804
- value: vt.start || "",
1805
- onChange: (e) => yt((t) => ({
1889
+ value: yt.start || "",
1890
+ onChange: (e) => bt((t) => ({
1806
1891
  ...t,
1807
1892
  start: e.target.value
1808
1893
  })),
@@ -1812,15 +1897,15 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
1812
1897
  day: "numeric"
1813
1898
  })
1814
1899
  }),
1815
- /* @__PURE__ */ D("div", {
1900
+ /* @__PURE__ */ E("div", {
1816
1901
  className: "w-16 gantt-sm-w20 text-right text-xs text-muted-foreground hidden sm:block",
1817
- hidden: !ht,
1818
- style: ht ? void 0 : { display: "none" },
1819
- children: n ? /* @__PURE__ */ D("input", {
1902
+ hidden: !gt,
1903
+ style: gt ? void 0 : { display: "none" },
1904
+ children: n ? /* @__PURE__ */ E("input", {
1820
1905
  type: "date",
1821
1906
  className: "border rounded px-1 py-0.5 text-xs w-full bg-background",
1822
- value: vt.end || "",
1823
- onChange: (e) => yt((t) => ({
1907
+ value: yt.end || "",
1908
+ onChange: (e) => bt((t) => ({
1824
1909
  ...t,
1825
1910
  end: e.target.value
1826
1911
  })),
@@ -1830,40 +1915,40 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
1830
1915
  day: "numeric"
1831
1916
  })
1832
1917
  }),
1833
- !n && /* @__PURE__ */ D("button", {
1918
+ !n && /* @__PURE__ */ E("button", {
1834
1919
  type: "button",
1835
1920
  title: x("gantt.row.locate"),
1836
1921
  "aria-label": x("gantt.row.locate"),
1837
1922
  className: "gantt-locate-btn hidden sm:block absolute top-1/2 -translate-y-1/2",
1838
1923
  style: { right: 1 },
1839
1924
  onClick: (t) => {
1840
- t.stopPropagation(), Qn(e.start, e.end, e.task.id);
1925
+ t.stopPropagation(), tr(e.start, e.end, e.task.id);
1841
1926
  },
1842
- children: /* @__PURE__ */ D(ge, { className: "w-3 h-3" })
1927
+ children: /* @__PURE__ */ E(ge, { className: "w-3 h-3" })
1843
1928
  })
1844
1929
  ]
1845
1930
  }, t.id);
1846
1931
  }),
1847
- Z.endIdx < G.length && /* @__PURE__ */ D("div", {
1932
+ Z.endIdx < G.length && /* @__PURE__ */ E("div", {
1848
1933
  style: { height: (G.length - Z.endIdx) * F },
1849
1934
  "aria-hidden": "true"
1850
1935
  })
1851
1936
  ]
1852
- }), /* @__PURE__ */ D("div", {
1937
+ }), /* @__PURE__ */ E("div", {
1853
1938
  className: "flex-1 overflow-auto bg-background/50 relative [-webkit-overflow-scrolling:touch]",
1854
1939
  ref: (e) => {
1855
- On.current = e, X.current = e;
1940
+ jn.current = e, X.current = e;
1856
1941
  },
1857
- onScroll: tr,
1858
- onTouchStart: Kn,
1859
- onTouchMove: qn,
1860
- onTouchEnd: Jn,
1942
+ onScroll: ir,
1943
+ onTouchStart: Yn,
1944
+ onTouchMove: Xn,
1945
+ onTouchEnd: Zn,
1861
1946
  "data-testid": "gantt-timeline",
1862
- children: /* @__PURE__ */ O("div", {
1947
+ children: /* @__PURE__ */ D("div", {
1863
1948
  className: "relative",
1864
- style: { width: _n },
1949
+ style: { width: bn },
1865
1950
  children: [
1866
- Q != null && /* @__PURE__ */ D("div", {
1951
+ Q != null && /* @__PURE__ */ E("div", {
1867
1952
  className: "absolute top-0 bottom-0 w-px z-20 pointer-events-none",
1868
1953
  style: {
1869
1954
  left: Q,
@@ -1871,7 +1956,7 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
1871
1956
  },
1872
1957
  "data-testid": "gantt-today-marker",
1873
1958
  "aria-label": x("gantt.toolbar.today"),
1874
- children: /* @__PURE__ */ D("div", {
1959
+ children: /* @__PURE__ */ E("div", {
1875
1960
  className: "absolute -translate-x-1/2 left-0 text-[10px] font-semibold text-white rounded-sm px-1 py-0.5 whitespace-nowrap z-30",
1876
1961
  style: {
1877
1962
  top: 2,
@@ -1880,7 +1965,7 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
1880
1965
  children: x("gantt.toolbar.today")
1881
1966
  })
1882
1967
  }),
1883
- Tn.map((e) => /* @__PURE__ */ D("div", {
1968
+ On.map((e) => /* @__PURE__ */ E("div", {
1884
1969
  className: "absolute top-0 bottom-0 w-px z-20 pointer-events-none",
1885
1970
  style: {
1886
1971
  left: e.left,
@@ -1888,7 +1973,7 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
1888
1973
  },
1889
1974
  "data-testid": `gantt-marker-${e.index}`,
1890
1975
  "aria-label": e.label,
1891
- children: e.label && /* @__PURE__ */ D("div", {
1976
+ children: e.label && /* @__PURE__ */ E("div", {
1892
1977
  className: "absolute -translate-x-1/2 left-0 text-[10px] font-semibold text-white rounded-sm px-1 py-0.5 whitespace-nowrap z-30",
1893
1978
  style: {
1894
1979
  top: 2,
@@ -1897,56 +1982,74 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
1897
1982
  children: e.label
1898
1983
  })
1899
1984
  }, e.index)),
1900
- /* @__PURE__ */ O("div", {
1985
+ /* @__PURE__ */ D("div", {
1901
1986
  className: "relative",
1902
- ref: qt,
1987
+ ref: Yt,
1903
1988
  children: [
1904
- /* @__PURE__ */ D("div", {
1989
+ /* @__PURE__ */ E("div", {
1905
1990
  className: "absolute inset-0 pointer-events-none",
1906
1991
  style: { zIndex: 0 },
1907
- children: q.slice(Rn.start, Rn.end).map((e, t) => {
1908
- let n = Rn.start + t;
1909
- return /* @__PURE__ */ D("div", {
1992
+ children: q.slice(Vn.start, Vn.end).map((e, t) => {
1993
+ let n = Vn.start + t;
1994
+ return /* @__PURE__ */ E("div", {
1910
1995
  className: "absolute top-0 bottom-0 border-r",
1911
1996
  style: {
1912
1997
  left: J[n],
1913
1998
  width: e.width,
1914
- backgroundColor: e.isWeekend ? "hsl(var(--muted) / 0.4)" : void 0
1999
+ backgroundColor: e.bandColor ? `color-mix(in srgb, ${e.bandColor} 8%, transparent)` : e.isWeekend ? "hsl(var(--muted) / 0.4)" : void 0
1915
2000
  }
1916
2001
  }, n);
1917
2002
  })
1918
2003
  }),
1919
- Z.startIdx > 0 && /* @__PURE__ */ D("div", {
2004
+ _n && v && v.showMidnight && /* @__PURE__ */ E("div", {
2005
+ className: "absolute inset-0 pointer-events-none",
2006
+ style: { zIndex: 0 },
2007
+ children: q.slice(Vn.start, Vn.end).map((e, t) => {
2008
+ let n = Vn.start + t, r = e.realMs ?? 0;
2009
+ if (!r) return null;
2010
+ let i = e.date.getTime(), a = e.date, o = new Date(a.getFullYear(), a.getMonth(), a.getDate() + 1, 0, 0, 0, 0).getTime();
2011
+ return o <= i || o >= i + r ? null : /* @__PURE__ */ E("div", {
2012
+ className: "absolute top-0 bottom-0",
2013
+ style: {
2014
+ left: J[n] + (o - i) / r * e.width,
2015
+ borderLeft: "1px dashed hsl(var(--muted-foreground) / 0.4)"
2016
+ },
2017
+ "data-testid": `gantt-midnight-${n}`,
2018
+ "aria-hidden": "true"
2019
+ }, `midnight-${n}`);
2020
+ })
2021
+ }),
2022
+ Z.startIdx > 0 && /* @__PURE__ */ E("div", {
1920
2023
  style: { height: Z.startIdx * F },
1921
2024
  "aria-hidden": "true"
1922
2025
  }),
1923
2026
  G.slice(Z.startIdx, Z.endIdx).map((t) => {
1924
- let n = t.task, r = wr(n.id), i = rr(t.start, t.end), a = ee && n.baselineStart && n.baselineEnd ? rr(n.baselineStart, n.baselineEnd) : null, s = a ? /* @__PURE__ */ D("div", {
2027
+ let n = t.task, r = Dr(n.id), i = or(t.start, t.end), a = te && n.baselineStart && n.baselineEnd ? or(n.baselineStart, n.baselineEnd) : null, s = a ? /* @__PURE__ */ E("div", {
1925
2028
  className: "absolute pointer-events-none rounded-[1px]",
1926
2029
  style: {
1927
2030
  left: a.left,
1928
2031
  width: Math.max(2, a.width),
1929
- top: gr,
1930
- height: hr,
1931
- backgroundColor: _r,
1932
- border: `1px solid ${vr}`
2032
+ top: yr,
2033
+ height: vr,
2034
+ backgroundColor: br,
2035
+ border: `1px solid ${xr}`
1933
2036
  },
1934
2037
  "data-testid": `gantt-baseline-${n.id}`,
1935
2038
  "aria-hidden": "true"
1936
- }) : null, c = V?.taskId === n.id, l = ar?.has(String(n.id)) ?? !1, u = or?.has(String(n.id)) ?? !1, d = c || l || u ? sr(t) : i, f = !!n.locked, p = !!M && !t.isSummary && !f, m = U != null && U.targetId != null && String(U.targetId) === String(n.id) && String(U.sourceId) !== String(n.id), h = U ? (e) => {
2039
+ }) : null, c = H?.taskId === n.id, l = cr?.has(String(n.id)) ?? !1, u = lr?.has(String(n.id)) ?? !1, d = c || l || u ? ur(t) : i, f = !!n.locked, p = !!M && !t.isSummary && !f, m = U != null && U.targetId != null && String(U.targetId) === String(n.id) && String(U.sourceId) !== String(n.id), h = U ? (e) => {
1937
2040
  let t = e.currentTarget.getBoundingClientRect(), r = t.width > 0 && e.clientX - t.left > t.width / 2 ? "end" : "start";
1938
- Jt((e) => e && String(e.sourceId) !== String(n.id) ? {
2041
+ Xt((e) => e && String(e.sourceId) !== String(n.id) ? {
1939
2042
  ...e,
1940
2043
  targetId: n.id,
1941
2044
  targetEnd: r
1942
2045
  } : e);
1943
2046
  } : void 0, g = U ? (e) => {
1944
- e.target === e.currentTarget && Jt((e) => e && {
2047
+ e.target === e.currentTarget && Xt((e) => e && {
1945
2048
  ...e,
1946
2049
  targetId: null,
1947
2050
  targetEnd: null
1948
2051
  });
1949
- } : void 0, _ = Math.max(1, Math.round((t.end.getTime() - t.start.getTime()) / We)), v = bt === n.id && !V && !Wt && !U ? /* @__PURE__ */ O("div", {
2052
+ } : void 0, ee = Math.max(1, Math.round((t.end.getTime() - t.start.getTime()) / Xe)), _ = xt === n.id && !H && !Kt && !U ? /* @__PURE__ */ D("div", {
1950
2053
  className: "absolute z-30 pointer-events-none rounded-md border bg-popover text-popover-foreground px-2.5 py-1.5 text-xs shadow-md whitespace-nowrap",
1951
2054
  style: {
1952
2055
  left: Math.max(d.left + 8, 4),
@@ -1954,10 +2057,10 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
1954
2057
  },
1955
2058
  role: "tooltip",
1956
2059
  "data-testid": `gantt-tooltip-${n.id}`,
1957
- children: [/* @__PURE__ */ D("div", {
2060
+ children: [/* @__PURE__ */ E("div", {
1958
2061
  className: "font-semibold",
1959
2062
  children: n.title
1960
- }), n.fields && n.fields.length > 0 ? /* @__PURE__ */ D("div", {
2063
+ }), n.fields && n.fields.length > 0 ? /* @__PURE__ */ E("div", {
1961
2064
  style: {
1962
2065
  display: "grid",
1963
2066
  gridTemplateColumns: "auto 1fr",
@@ -1965,14 +2068,14 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
1965
2068
  rowGap: 2,
1966
2069
  marginTop: 4
1967
2070
  },
1968
- children: n.fields.map((t, n) => /* @__PURE__ */ O(e.Fragment, { children: [/* @__PURE__ */ D("span", {
2071
+ children: n.fields.map((t, n) => /* @__PURE__ */ D(e.Fragment, { children: [/* @__PURE__ */ E("span", {
1969
2072
  className: "text-muted-foreground",
1970
2073
  children: t.label
1971
- }), /* @__PURE__ */ D("span", {
2074
+ }), /* @__PURE__ */ E("span", {
1972
2075
  style: { fontWeight: 500 },
1973
2076
  children: t.value
1974
2077
  })] }, n))
1975
- }) : /* @__PURE__ */ O("div", {
2078
+ }) : /* @__PURE__ */ D("div", {
1976
2079
  className: "text-muted-foreground",
1977
2080
  children: [
1978
2081
  t.start.toLocaleDateString(S, {
@@ -1985,7 +2088,7 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
1985
2088
  day: "numeric"
1986
2089
  }),
1987
2090
  " · ",
1988
- _,
2091
+ ee,
1989
2092
  x("gantt.tooltip.days"),
1990
2093
  " · ",
1991
2094
  Math.round(t.progress),
@@ -1993,27 +2096,27 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
1993
2096
  ]
1994
2097
  })]
1995
2098
  }) : null;
1996
- if (n.type === "group") return /* @__PURE__ */ D("div", {
2099
+ if (n.type === "group") return /* @__PURE__ */ E("div", {
1997
2100
  className: "relative border-b hover:bg-accent/50",
1998
2101
  style: { height: F },
1999
2102
  onPointerMove: g,
2000
- children: v
2103
+ children: _
2001
2104
  }, n.id);
2002
2105
  if (t.isSummary) {
2003
2106
  let e = n.color || "#0d9488";
2004
- return /* @__PURE__ */ O("div", {
2107
+ return /* @__PURE__ */ D("div", {
2005
2108
  className: "relative border-b hover:bg-accent/50",
2006
2109
  style: { height: F },
2007
2110
  onPointerMove: g,
2008
2111
  children: [
2009
2112
  s,
2010
- /* @__PURE__ */ O("div", {
2011
- className: b("gantt-bar-hover absolute rounded-sm border shadow-sm flex items-center px-2 select-none", M ? "cursor-grab active:cursor-grabbing" : "cursor-pointer", c && "ring-2 ring-primary z-10", kn === n.id && "gantt-flash z-10"),
2113
+ /* @__PURE__ */ D("div", {
2114
+ className: b("gantt-bar-hover absolute rounded-sm border shadow-sm flex items-center px-2 select-none", M ? "cursor-grab active:cursor-grabbing" : "cursor-pointer", c && "ring-2 ring-primary z-10", Mn === n.id && "gantt-flash z-10"),
2012
2115
  style: {
2013
2116
  left: d.left,
2014
2117
  width: d.width,
2015
- top: mr,
2016
- height: pr,
2118
+ top: _r,
2119
+ height: gr,
2017
2120
  backgroundColor: e,
2018
2121
  borderColor: r ? $ : "hsl(var(--primary-foreground) / 0.2)",
2019
2122
  boxShadow: r ? `0 0 0 2px ${$}` : void 0
@@ -2021,20 +2124,20 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
2021
2124
  "data-critical": r ? "true" : void 0,
2022
2125
  "data-testid": `gantt-summary-bar-${n.id}`,
2023
2126
  "data-progress": Math.round(t.progress),
2024
- onMouseEnter: () => xt(n.id),
2025
- onMouseLeave: () => xt((e) => e === n.id ? null : e),
2127
+ onMouseEnter: () => St(n.id),
2128
+ onMouseLeave: () => St((e) => e === n.id ? null : e),
2026
2129
  onPointerDown: (e) => {
2027
- e.button === 0 && Ut(n, "move", e, {
2130
+ e.button === 0 && Gt(n, "move", e, {
2028
2131
  group: !0,
2029
2132
  originStart: t.start,
2030
2133
  originEnd: t.end
2031
2134
  });
2032
2135
  },
2033
2136
  onClick: () => {
2034
- Dt.current || o?.(n);
2137
+ Ot.current || o?.(n);
2035
2138
  },
2036
- onContextMenu: (e) => cn(n, e),
2037
- children: [/* @__PURE__ */ D("div", {
2139
+ onContextMenu: (e) => un(n, e),
2140
+ children: [/* @__PURE__ */ E("div", {
2038
2141
  className: "absolute left-0 top-0 bottom-0 pointer-events-none",
2039
2142
  style: {
2040
2143
  width: `${Math.round(t.progress)}%`,
@@ -2042,44 +2145,44 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
2042
2145
  borderTopLeftRadius: "var(--radius-sm)",
2043
2146
  borderBottomLeftRadius: "var(--radius-sm)"
2044
2147
  }
2045
- }), /* @__PURE__ */ D("span", {
2148
+ }), /* @__PURE__ */ E("span", {
2046
2149
  className: "relative text-[10px] text-white font-medium truncate pointer-events-none",
2047
2150
  children: n.title
2048
2151
  })]
2049
2152
  }),
2050
- c && V && /* @__PURE__ */ O("div", {
2153
+ c && H && /* @__PURE__ */ D("div", {
2051
2154
  className: "absolute z-30 pointer-events-none rounded border bg-popover text-popover-foreground px-1.5 py-0.5 text-[10px] shadow whitespace-nowrap",
2052
2155
  style: {
2053
2156
  left: Math.max(d.left, 4),
2054
- top: mr + pr + 2
2157
+ top: _r + gr + 2
2055
2158
  },
2056
2159
  "data-testid": `gantt-summary-drag-chip-${n.id}`,
2057
2160
  children: [
2058
- Ot(V).start.toLocaleDateString(S, {
2161
+ kt(H).start.toLocaleDateString(S, {
2059
2162
  month: "numeric",
2060
2163
  day: "numeric"
2061
2164
  }),
2062
2165
  " → ",
2063
- Ot(V).end.toLocaleDateString(S, {
2166
+ kt(H).end.toLocaleDateString(S, {
2064
2167
  month: "numeric",
2065
2168
  day: "numeric"
2066
2169
  })
2067
2170
  ]
2068
2171
  }),
2069
- v
2172
+ _
2070
2173
  ]
2071
2174
  }, n.id);
2072
2175
  }
2073
2176
  if (t.isMilestone) {
2074
- let e = dr;
2075
- return /* @__PURE__ */ O("div", {
2177
+ let e = mr;
2178
+ return /* @__PURE__ */ D("div", {
2076
2179
  className: "relative border-b hover:bg-accent/50",
2077
2180
  style: { height: F },
2078
2181
  onPointerMove: g,
2079
2182
  children: [
2080
2183
  s,
2081
- /* @__PURE__ */ D("div", {
2082
- className: b("gantt-bar-hover absolute rotate-45 rounded-[2px] border shadow-sm select-none", p ? "cursor-grab active:cursor-grabbing" : "cursor-pointer", c && "ring-2 ring-primary z-10", m && "ring-2 ring-primary", kn === n.id && "gantt-flash z-10"),
2184
+ /* @__PURE__ */ E("div", {
2185
+ className: b("gantt-bar-hover absolute rotate-45 rounded-[2px] border shadow-sm select-none", p ? "cursor-grab active:cursor-grabbing" : "cursor-pointer", c && "ring-2 ring-primary z-10", m && "ring-2 ring-primary", Mn === n.id && "gantt-flash z-10"),
2083
2186
  style: {
2084
2187
  left: d.left - e / 2,
2085
2188
  top: (F - e) / 2,
@@ -2091,49 +2194,49 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
2091
2194
  },
2092
2195
  "data-critical": r ? "true" : void 0,
2093
2196
  "data-testid": `gantt-milestone-${n.id}`,
2094
- onMouseEnter: () => xt(n.id),
2095
- onMouseLeave: () => xt((e) => e === n.id ? null : e),
2197
+ onMouseEnter: () => St(n.id),
2198
+ onMouseLeave: () => St((e) => e === n.id ? null : e),
2096
2199
  onClick: () => {
2097
- Dt.current || o?.(n);
2200
+ Ot.current || o?.(n);
2098
2201
  },
2099
- onContextMenu: (e) => cn(n, e),
2202
+ onContextMenu: (e) => un(n, e),
2100
2203
  onPointerMove: h,
2101
2204
  onPointerDown: p ? (e) => {
2102
- e.button === 0 && Ut(n, "move", e);
2205
+ e.button === 0 && Gt(n, "move", e);
2103
2206
  } : void 0
2104
2207
  }),
2105
- v
2208
+ _
2106
2209
  ]
2107
2210
  }, n.id);
2108
2211
  }
2109
- let te = Wt && Wt.taskId === n.id ? Wt.value : n.progress;
2110
- return /* @__PURE__ */ O("div", {
2212
+ let v = Kt && Kt.taskId === n.id ? Kt.value : n.progress;
2213
+ return /* @__PURE__ */ D("div", {
2111
2214
  className: "relative border-b hover:bg-accent/50",
2112
2215
  style: { height: F },
2113
2216
  onPointerMove: g,
2114
- onMouseEnter: () => xt(n.id),
2115
- onMouseLeave: () => xt((e) => e === n.id ? null : e),
2217
+ onMouseEnter: () => St(n.id),
2218
+ onMouseLeave: () => St((e) => e === n.id ? null : e),
2116
2219
  children: [
2117
- c && /* @__PURE__ */ D("div", {
2220
+ c && /* @__PURE__ */ E("div", {
2118
2221
  className: "absolute rounded-sm border border-dashed pointer-events-none",
2119
2222
  style: {
2120
2223
  left: i.left,
2121
2224
  width: i.width,
2122
- top: lr,
2123
- height: ur,
2225
+ top: fr,
2226
+ height: pr,
2124
2227
  opacity: .35,
2125
2228
  borderColor: "hsl(var(--primary) / 0.6)"
2126
2229
  },
2127
2230
  "aria-hidden": "true"
2128
2231
  }),
2129
2232
  s,
2130
- /* @__PURE__ */ O("div", {
2131
- className: b("gantt-bar-hover absolute rounded-sm bg-primary border shadow-sm flex items-center px-2 group select-none", p ? "cursor-grab active:cursor-grabbing" : "cursor-pointer", c && "ring-2 ring-primary z-10", m && "ring-2 ring-primary", kn === n.id && "gantt-flash z-10"),
2233
+ /* @__PURE__ */ D("div", {
2234
+ className: b("gantt-bar-hover absolute rounded-sm bg-primary border shadow-sm flex items-center px-2 group select-none", p ? "cursor-grab active:cursor-grabbing" : "cursor-pointer", c && "ring-2 ring-primary z-10", m && "ring-2 ring-primary", Mn === n.id && "gantt-flash z-10"),
2132
2235
  style: {
2133
2236
  left: d.left,
2134
2237
  width: d.width,
2135
- top: lr,
2136
- height: ur,
2238
+ top: fr,
2239
+ height: pr,
2137
2240
  backgroundColor: n.color || "#3b82f6",
2138
2241
  borderColor: r ? $ : "hsl(var(--primary-foreground) / 0.2)",
2139
2242
  boxShadow: r ? `0 0 0 2px ${$}` : void 0
@@ -2141,15 +2244,15 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
2141
2244
  "data-critical": r ? "true" : void 0,
2142
2245
  "data-testid": `gantt-task-bar-${n.id}`,
2143
2246
  onClick: () => {
2144
- Dt.current || o?.(n);
2247
+ Ot.current || o?.(n);
2145
2248
  },
2146
- onContextMenu: (e) => cn(n, e),
2249
+ onContextMenu: (e) => un(n, e),
2147
2250
  onPointerMove: h,
2148
2251
  onPointerDown: p ? (e) => {
2149
- e.button === 0 && Ut(n, "move", e);
2252
+ e.button === 0 && Gt(n, "move", e);
2150
2253
  } : void 0,
2151
2254
  children: [
2152
- p && d.width >= 14 && /* @__PURE__ */ O(De, { children: [/* @__PURE__ */ D("div", {
2255
+ p && d.width >= 14 && /* @__PURE__ */ D(Oe, { children: [/* @__PURE__ */ E("div", {
2153
2256
  className: "gantt-resize-handle absolute left-0 top-0 bottom-0",
2154
2257
  style: {
2155
2258
  width: 6,
@@ -2157,10 +2260,10 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
2157
2260
  },
2158
2261
  "data-testid": `gantt-task-resize-left-${n.id}`,
2159
2262
  onPointerDown: (e) => {
2160
- e.button === 0 && Ut(n, "resize-left", e);
2263
+ e.button === 0 && Gt(n, "resize-left", e);
2161
2264
  },
2162
2265
  onClick: (e) => e.stopPropagation()
2163
- }), /* @__PURE__ */ D("div", {
2266
+ }), /* @__PURE__ */ E("div", {
2164
2267
  className: "gantt-resize-handle absolute right-0 top-0 bottom-0",
2165
2268
  style: {
2166
2269
  width: 6,
@@ -2168,25 +2271,25 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
2168
2271
  },
2169
2272
  "data-testid": `gantt-task-resize-right-${n.id}`,
2170
2273
  onPointerDown: (e) => {
2171
- e.button === 0 && Ut(n, "resize-right", e);
2274
+ e.button === 0 && Gt(n, "resize-right", e);
2172
2275
  },
2173
2276
  onClick: (e) => e.stopPropagation()
2174
2277
  })] }),
2175
- te > 0 && /* @__PURE__ */ D("div", {
2278
+ v > 0 && /* @__PURE__ */ E("div", {
2176
2279
  className: "absolute left-0 top-0 bottom-0 pointer-events-none",
2177
2280
  style: {
2178
- width: `${te}%`,
2281
+ width: `${v}%`,
2179
2282
  backgroundColor: "rgba(0, 0, 0, 0.2)",
2180
2283
  borderTopLeftRadius: "var(--radius-sm)",
2181
2284
  borderBottomLeftRadius: "var(--radius-sm)"
2182
2285
  }
2183
2286
  }),
2184
- p && d.width >= 30 && /* @__PURE__ */ D("div", {
2185
- className: b("absolute bottom-0 h-1/2 w-4 -translate-x-1/2 cursor-col-resize flex items-end justify-center pb-px", Wt?.taskId === n.id ? "opacity-100" : "opacity-0 group-hover:opacity-100 transition-opacity"),
2186
- style: { left: `${te}%` },
2287
+ p && d.width >= 30 && /* @__PURE__ */ E("div", {
2288
+ className: b("absolute bottom-0 h-1/2 w-4 -translate-x-1/2 cursor-col-resize flex items-end justify-center pb-px", Kt?.taskId === n.id ? "opacity-100" : "opacity-0 group-hover:opacity-100 transition-opacity"),
2289
+ style: { left: `${v}%` },
2187
2290
  "data-testid": `gantt-progress-handle-${n.id}`,
2188
2291
  onPointerDown: (e) => {
2189
- e.button === 0 && (e.stopPropagation(), e.preventDefault(), Gt({
2292
+ e.button === 0 && (e.stopPropagation(), e.preventDefault(), qt({
2190
2293
  taskId: n.id,
2191
2294
  originClientX: e.clientX,
2192
2295
  originProgress: n.progress,
@@ -2195,7 +2298,7 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
2195
2298
  }));
2196
2299
  },
2197
2300
  onClick: (e) => e.stopPropagation(),
2198
- children: /* @__PURE__ */ D("div", { style: {
2301
+ children: /* @__PURE__ */ E("div", { style: {
2199
2302
  width: 0,
2200
2303
  height: 0,
2201
2304
  borderLeft: "5px solid transparent",
@@ -2205,8 +2308,8 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
2205
2308
  } })
2206
2309
  }),
2207
2310
  N && !f && ["start", "end"].map((e) => {
2208
- let t = U != null && String(U.sourceId) === String(n.id) && U.sourceEnd === e, r = t || bt === n.id, i = r && U == null;
2209
- return /* @__PURE__ */ D("div", {
2311
+ let t = U != null && String(U.sourceId) === String(n.id) && U.sourceEnd === e, r = t || xt === n.id, i = r && U == null;
2312
+ return /* @__PURE__ */ E("div", {
2210
2313
  className: "absolute top-1/2 -translate-y-1/2 z-20 flex items-center transition-opacity",
2211
2314
  style: {
2212
2315
  [e === "start" ? "left" : "right"]: -28,
@@ -2223,8 +2326,8 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
2223
2326
  onPointerDown: (t) => {
2224
2327
  if (t.button !== 0) return;
2225
2328
  t.stopPropagation(), t.preventDefault();
2226
- let r = qt.current?.getBoundingClientRect();
2227
- Jt({
2329
+ let r = Yt.current?.getBoundingClientRect();
2330
+ Xt({
2228
2331
  sourceId: n.id,
2229
2332
  sourceEnd: e,
2230
2333
  x: r ? t.clientX - r.left : 0,
@@ -2234,7 +2337,7 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
2234
2337
  });
2235
2338
  },
2236
2339
  onClick: (e) => e.stopPropagation(),
2237
- children: /* @__PURE__ */ D("div", {
2340
+ children: /* @__PURE__ */ E("div", {
2238
2341
  className: "rounded-full",
2239
2342
  style: {
2240
2343
  height: 12,
@@ -2246,39 +2349,39 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
2246
2349
  })
2247
2350
  }, e);
2248
2351
  }),
2249
- /* @__PURE__ */ D("span", {
2352
+ /* @__PURE__ */ E("span", {
2250
2353
  className: "relative text-[10px] text-white font-medium truncate pointer-events-none group-hover:opacity-0 transition-opacity",
2251
2354
  children: n.title
2252
2355
  }),
2253
- /* @__PURE__ */ D("span", {
2356
+ /* @__PURE__ */ E("span", {
2254
2357
  className: "absolute inset-0 flex items-center px-2 text-[10px] text-white font-medium truncate opacity-0 group-hover:opacity-100 transition-opacity pointer-events-none",
2255
- children: c ? `${Ot(V).start.toLocaleDateString(S, {
2358
+ children: c ? `${kt(H).start.toLocaleDateString(S, {
2256
2359
  month: "numeric",
2257
2360
  day: "numeric"
2258
- })} → ${Ot(V).end.toLocaleDateString(S, {
2361
+ })} → ${kt(H).end.toLocaleDateString(S, {
2259
2362
  month: "numeric",
2260
2363
  day: "numeric"
2261
- })}` : `${Math.round(te)}%`
2364
+ })}` : `${Math.round(v)}%`
2262
2365
  })
2263
2366
  ]
2264
2367
  }),
2265
- v
2368
+ _
2266
2369
  ]
2267
2370
  }, n.id);
2268
2371
  }),
2269
- Z.endIdx < G.length && /* @__PURE__ */ D("div", {
2372
+ Z.endIdx < G.length && /* @__PURE__ */ E("div", {
2270
2373
  style: { height: (G.length - Z.endIdx) * F },
2271
2374
  "aria-hidden": "true"
2272
2375
  }),
2273
- (cr.length > 0 || U) && /* @__PURE__ */ O("svg", {
2376
+ (dr.length > 0 || U) && /* @__PURE__ */ D("svg", {
2274
2377
  className: "absolute top-0 left-0 pointer-events-none z-10",
2275
- width: _n,
2276
- height: Vn,
2378
+ width: bn,
2379
+ height: Wn,
2277
2380
  "data-testid": "gantt-links",
2278
2381
  "aria-hidden": "true",
2279
2382
  children: [
2280
- /* @__PURE__ */ O("defs", { children: [
2281
- /* @__PURE__ */ D("marker", {
2383
+ /* @__PURE__ */ D("defs", { children: [
2384
+ /* @__PURE__ */ E("marker", {
2282
2385
  id: "gantt-link-arrow",
2283
2386
  viewBox: "0 0 8 8",
2284
2387
  refX: "7",
@@ -2286,12 +2389,12 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
2286
2389
  markerWidth: "6",
2287
2390
  markerHeight: "6",
2288
2391
  orient: "auto",
2289
- children: /* @__PURE__ */ D("path", {
2392
+ children: /* @__PURE__ */ E("path", {
2290
2393
  d: "M 0 0 L 8 4 L 0 8 z",
2291
2394
  fill: "hsl(var(--muted-foreground))"
2292
2395
  })
2293
2396
  }),
2294
- /* @__PURE__ */ D("marker", {
2397
+ /* @__PURE__ */ E("marker", {
2295
2398
  id: "gantt-link-arrow-active",
2296
2399
  viewBox: "0 0 8 8",
2297
2400
  refX: "7",
@@ -2299,12 +2402,12 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
2299
2402
  markerWidth: "6",
2300
2403
  markerHeight: "6",
2301
2404
  orient: "auto",
2302
- children: /* @__PURE__ */ D("path", {
2405
+ children: /* @__PURE__ */ E("path", {
2303
2406
  d: "M 0 0 L 8 4 L 0 8 z",
2304
2407
  fill: "hsl(var(--primary))"
2305
2408
  })
2306
2409
  }),
2307
- /* @__PURE__ */ D("marker", {
2410
+ /* @__PURE__ */ E("marker", {
2308
2411
  id: "gantt-link-arrow-critical",
2309
2412
  viewBox: "0 0 8 8",
2310
2413
  refX: "7",
@@ -2312,19 +2415,19 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
2312
2415
  markerWidth: "6",
2313
2416
  markerHeight: "6",
2314
2417
  orient: "auto",
2315
- children: /* @__PURE__ */ D("path", {
2418
+ children: /* @__PURE__ */ E("path", {
2316
2419
  d: "M 0 0 L 8 4 L 0 8 z",
2317
2420
  fill: $
2318
2421
  })
2319
2422
  })
2320
2423
  ] }),
2321
- cr.map((t) => {
2424
+ dr.map((t) => {
2322
2425
  let n = Math.min(t.sourceIndex, t.targetIndex);
2323
2426
  if (Math.max(t.sourceIndex, t.targetIndex) < Z.startIdx - 6 || n > Z.endIdx + 6) return null;
2324
- let r = yr(t);
2427
+ let r = Sr(t);
2325
2428
  if (!r) return null;
2326
- let i = br != null && (String(t.sourceId) === String(br) || String(t.targetId) === String(br)), a = Cr?.criticalEdges.has(`${String(t.sourceId)}->${String(t.targetId)}`) ?? !1, o = a ? "gantt-link-arrow-critical" : i ? "gantt-link-arrow-active" : "gantt-link-arrow", s = !!(Ae || N);
2327
- return /* @__PURE__ */ O(e.Fragment, { children: [/* @__PURE__ */ D("path", {
2429
+ let i = Cr != null && (String(t.sourceId) === String(Cr) || String(t.targetId) === String(Cr)), a = Er?.criticalEdges.has(`${String(t.sourceId)}->${String(t.targetId)}`) ?? !1, o = a ? "gantt-link-arrow-critical" : i ? "gantt-link-arrow-active" : "gantt-link-arrow", s = !!(P || N);
2430
+ return /* @__PURE__ */ D(e.Fragment, { children: [/* @__PURE__ */ E("path", {
2328
2431
  d: r,
2329
2432
  fill: "none",
2330
2433
  stroke: a ? $ : i ? "hsl(var(--primary))" : "hsl(var(--muted-foreground))",
@@ -2335,7 +2438,7 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
2335
2438
  "data-link-type": t.type,
2336
2439
  "data-active": i ? "true" : "false",
2337
2440
  "data-critical": a ? "true" : void 0
2338
- }), s && /* @__PURE__ */ D("path", {
2441
+ }), s && /* @__PURE__ */ E("path", {
2339
2442
  d: r,
2340
2443
  fill: "none",
2341
2444
  stroke: "transparent",
@@ -2345,14 +2448,14 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
2345
2448
  cursor: "context-menu"
2346
2449
  },
2347
2450
  "data-testid": `gantt-link-hit-${t.sourceId}-${t.targetId}`,
2348
- onContextMenu: (e) => ln(t.sourceId, t.targetId, t.type, e)
2451
+ onContextMenu: (e) => dn(t.sourceId, t.targetId, t.type, e)
2349
2452
  })] }, t.key);
2350
2453
  }),
2351
2454
  U && (() => {
2352
2455
  let e = G.findIndex((e) => String(e.task.id) === String(U.sourceId));
2353
2456
  if (e < 0) return null;
2354
- let t = sr(G[e]), n = G[e].isMilestone ? t.left + (U.sourceEnd === "start" ? -fr : fr) : U.sourceEnd === "start" ? t.left : t.left + t.width, r = e * F + F / 2;
2355
- return /* @__PURE__ */ D("path", {
2457
+ let t = ur(G[e]), n = G[e].isMilestone ? t.left + (U.sourceEnd === "start" ? -hr : hr) : U.sourceEnd === "start" ? t.left : t.left + t.width, r = e * F + F / 2;
2458
+ return /* @__PURE__ */ E("path", {
2356
2459
  d: `M ${Math.round(n)} ${Math.round(r)} L ${Math.round(U.x)} ${Math.round(U.y)}`,
2357
2460
  fill: "none",
2358
2461
  stroke: "hsl(var(--primary))",
@@ -2367,7 +2470,7 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
2367
2470
  let e = t.find((e) => String(e.id) === String(U.sourceId));
2368
2471
  if (!e) return null;
2369
2472
  let n = U.targetId == null ? null : t.find((e) => String(e.id) === String(U.targetId)), r = (e) => x(`gantt.linkEnd.${e}`), i = n ? `${e.title} (${r(U.sourceEnd)}) → ${n.title} (${r(U.targetEnd ?? "start")})` : `${e.title} (${r(U.sourceEnd)})`;
2370
- return /* @__PURE__ */ D("div", {
2473
+ return /* @__PURE__ */ E("div", {
2371
2474
  className: "absolute z-30 pointer-events-none rounded-md border bg-popover text-popover-foreground px-2 py-1 text-[11px] font-medium shadow-md whitespace-nowrap",
2372
2475
  style: {
2373
2476
  left: U.x + 12,
@@ -2385,37 +2488,37 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
2385
2488
  })
2386
2489
  ]
2387
2490
  }),
2388
- Xt && (() => {
2389
- let e = t.find((e) => String(e.id) === String(Xt.taskId));
2491
+ Qt && (() => {
2492
+ let e = t.find((e) => String(e.id) === String(Qt.taskId));
2390
2493
  if (!e) return null;
2391
- let n = G.find((e) => String(e.task.id) === String(Xt.taskId)), r = "w-full text-left px-3 py-1.5 hover:bg-accent focus:bg-accent outline-none";
2392
- return /* @__PURE__ */ O("div", {
2393
- ref: Qt,
2494
+ let n = G.find((e) => String(e.task.id) === String(Qt.taskId)), r = "w-full text-left px-3 py-1.5 hover:bg-accent focus:bg-accent outline-none";
2495
+ return /* @__PURE__ */ D("div", {
2496
+ ref: en,
2394
2497
  className: "fixed z-50 min-w-[160px] rounded-md border bg-popover text-popover-foreground shadow-md py-1 text-sm",
2395
2498
  style: {
2396
- left: Xt.x,
2397
- top: Xt.y
2499
+ left: Qt.x,
2500
+ top: Qt.y
2398
2501
  },
2399
2502
  role: "menu",
2400
2503
  "data-testid": "gantt-context-menu",
2401
2504
  children: [
2402
- o && /* @__PURE__ */ D("button", {
2505
+ o && /* @__PURE__ */ E("button", {
2403
2506
  type: "button",
2404
2507
  role: "menuitem",
2405
2508
  className: r,
2406
2509
  "data-testid": "gantt-context-menu-view",
2407
2510
  onClick: () => {
2408
- Zt(null), o(e);
2511
+ $t(null), o(e);
2409
2512
  },
2410
2513
  children: x("gantt.menu.view")
2411
2514
  }),
2412
- je && M && n && !n.isSummary && !e.locked && /* @__PURE__ */ D("button", {
2515
+ Me && M && n && !n.isSummary && !e.locked && /* @__PURE__ */ E("button", {
2413
2516
  type: "button",
2414
2517
  role: "menuitem",
2415
2518
  className: r,
2416
2519
  "data-testid": "gantt-context-menu-edit",
2417
2520
  onClick: () => {
2418
- Zt(null), _t(e.id), yt({
2521
+ $t(null), vt(e.id), bt({
2419
2522
  title: e.title,
2420
2523
  start: e.start.toLocaleDateString("en-CA"),
2421
2524
  end: e.end.toLocaleDateString("en-CA"),
@@ -2424,14 +2527,14 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
2424
2527
  },
2425
2528
  children: x("gantt.menu.edit")
2426
2529
  }),
2427
- N && n && !n.isMilestone && !e.locked && /* @__PURE__ */ O(De, { children: [/* @__PURE__ */ D("button", {
2530
+ N && n && !n.isMilestone && !e.locked && /* @__PURE__ */ D(Oe, { children: [/* @__PURE__ */ E("button", {
2428
2531
  type: "button",
2429
2532
  role: "menuitem",
2430
2533
  className: r,
2431
2534
  "data-testid": "gantt-context-menu-add-predecessor",
2432
2535
  onClick: () => {
2433
- let t = Xt;
2434
- Zt(null), nn({
2536
+ let t = Qt;
2537
+ $t(null), an({
2435
2538
  x: t.x,
2436
2539
  y: t.y,
2437
2540
  taskId: e.id,
@@ -2439,14 +2542,14 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
2439
2542
  });
2440
2543
  },
2441
2544
  children: x("gantt.menu.addPredecessor")
2442
- }), /* @__PURE__ */ D("button", {
2545
+ }), /* @__PURE__ */ E("button", {
2443
2546
  type: "button",
2444
2547
  role: "menuitem",
2445
2548
  className: r,
2446
2549
  "data-testid": "gantt-context-menu-add-successor",
2447
2550
  onClick: () => {
2448
- let t = Xt;
2449
- Zt(null), nn({
2551
+ let t = Qt;
2552
+ $t(null), an({
2450
2553
  x: t.x,
2451
2554
  y: t.y,
2452
2555
  taskId: e.id,
@@ -2455,13 +2558,13 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
2455
2558
  },
2456
2559
  children: x("gantt.menu.addSuccessor")
2457
2560
  })] }),
2458
- ke && !e.locked && /* @__PURE__ */ D("button", {
2561
+ Ae && !e.locked && /* @__PURE__ */ E("button", {
2459
2562
  type: "button",
2460
2563
  role: "menuitem",
2461
2564
  className: b(r, "text-destructive"),
2462
2565
  "data-testid": "gantt-context-menu-delete",
2463
2566
  onClick: () => {
2464
- Zt(null), ke(e);
2567
+ $t(null), Ae(e);
2465
2568
  },
2466
2569
  children: x("gantt.menu.delete")
2467
2570
  })
@@ -2472,8 +2575,8 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
2472
2575
  let e = t.find((e) => String(e.id) === String(W.sourceId)), n = t.find((e) => String(e.id) === String(W.targetId));
2473
2576
  if (!e || !n) return null;
2474
2577
  let r = "w-full text-left px-3 py-1.5 hover:bg-accent focus:bg-accent outline-none";
2475
- return /* @__PURE__ */ O("div", {
2476
- ref: en,
2578
+ return /* @__PURE__ */ D("div", {
2579
+ ref: nn,
2477
2580
  className: "fixed z-50 min-w-[180px] rounded-md border bg-popover text-popover-foreground shadow-md py-1 text-sm",
2478
2581
  style: {
2479
2582
  left: W.x,
@@ -2482,7 +2585,7 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
2482
2585
  role: "menu",
2483
2586
  "data-testid": "gantt-link-context-menu",
2484
2587
  children: [
2485
- /* @__PURE__ */ O("div", {
2588
+ /* @__PURE__ */ D("div", {
2486
2589
  className: "px-3 py-1 text-xs text-muted-foreground truncate",
2487
2590
  children: [
2488
2591
  e.title,
@@ -2495,98 +2598,98 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
2495
2598
  "ss",
2496
2599
  "ff",
2497
2600
  "sf"
2498
- ].map((t) => /* @__PURE__ */ O("button", {
2601
+ ].map((t) => /* @__PURE__ */ D("button", {
2499
2602
  type: "button",
2500
2603
  role: "menuitemradio",
2501
2604
  "aria-checked": W.type === t,
2502
2605
  className: b(r, W.type === t && "font-semibold"),
2503
2606
  "data-testid": `gantt-link-menu-type-${t}`,
2504
2607
  onClick: () => {
2505
- $t(null), t !== W.type && N(e, n, t);
2608
+ tn(null), t !== W.type && N(e, n, t);
2506
2609
  },
2507
2610
  children: [W.type === t ? "✓ " : "\xA0\xA0", x(`gantt.linkType.${t}`)]
2508
2611
  }, t)),
2509
- Ae && /* @__PURE__ */ O(De, { children: [/* @__PURE__ */ D("div", { className: "my-1 border-t" }), /* @__PURE__ */ D("button", {
2612
+ P && /* @__PURE__ */ D(Oe, { children: [/* @__PURE__ */ E("div", { className: "my-1 border-t" }), /* @__PURE__ */ E("button", {
2510
2613
  type: "button",
2511
2614
  role: "menuitem",
2512
2615
  className: b(r, "text-destructive"),
2513
2616
  "data-testid": "gantt-link-menu-remove",
2514
2617
  onClick: () => {
2515
- $t(null), Ae(e, n);
2618
+ tn(null), P(e, n);
2516
2619
  },
2517
2620
  children: x("gantt.menu.removeDependency")
2518
2621
  })] })
2519
2622
  ]
2520
2623
  });
2521
2624
  })(),
2522
- tn && N && (() => {
2523
- let e = t.find((e) => String(e.id) === String(tn.taskId));
2625
+ rn && N && (() => {
2626
+ let e = t.find((e) => String(e.id) === String(rn.taskId));
2524
2627
  if (!e) return null;
2525
- let n = new Set(cr.map((e) => `${String(e.sourceId)}->${String(e.targetId)}`)), r = t.filter((t) => {
2628
+ let n = new Set(dr.map((e) => `${String(e.sourceId)}->${String(e.targetId)}`)), r = t.filter((t) => {
2526
2629
  if (String(t.id) === String(e.id) || t.type === "summary") return !1;
2527
- let r = tn.relation === "pred" ? `${String(t.id)}->${String(e.id)}` : `${String(e.id)}->${String(t.id)}`;
2630
+ let r = rn.relation === "pred" ? `${String(t.id)}->${String(e.id)}` : `${String(e.id)}->${String(t.id)}`;
2528
2631
  return !n.has(r);
2529
2632
  });
2530
- return /* @__PURE__ */ O("div", {
2531
- ref: rn,
2633
+ return /* @__PURE__ */ D("div", {
2634
+ ref: on,
2532
2635
  className: "fixed z-50 min-w-[200px] max-h-[280px] overflow-y-auto rounded-md border bg-popover text-popover-foreground shadow-md py-1 text-sm",
2533
2636
  style: {
2534
- left: tn.x,
2535
- top: tn.y
2637
+ left: rn.x,
2638
+ top: rn.y
2536
2639
  },
2537
2640
  role: "menu",
2538
2641
  "data-testid": "gantt-dep-picker",
2539
- children: [/* @__PURE__ */ D("div", {
2642
+ children: [/* @__PURE__ */ E("div", {
2540
2643
  className: "px-3 py-1 text-xs text-muted-foreground",
2541
- children: tn.relation === "pred" ? x("gantt.menu.addPredecessor") : x("gantt.menu.addSuccessor")
2542
- }), r.length === 0 ? /* @__PURE__ */ D("div", {
2644
+ children: rn.relation === "pred" ? x("gantt.menu.addPredecessor") : x("gantt.menu.addSuccessor")
2645
+ }), r.length === 0 ? /* @__PURE__ */ E("div", {
2543
2646
  className: "px-3 py-1.5 text-muted-foreground",
2544
2647
  children: x("gantt.menu.noCandidates")
2545
- }) : r.map((t) => /* @__PURE__ */ D("button", {
2648
+ }) : r.map((t) => /* @__PURE__ */ E("button", {
2546
2649
  type: "button",
2547
2650
  role: "menuitem",
2548
2651
  className: "w-full text-left px-3 py-1.5 hover:bg-accent focus:bg-accent outline-none truncate",
2549
2652
  "data-testid": `gantt-dep-picker-option-${t.id}`,
2550
2653
  onClick: () => {
2551
- nn(null), tn.relation === "pred" ? N(t, e, "fs") : N(e, t, "fs");
2654
+ an(null), rn.relation === "pred" ? N(t, e, "fs") : N(e, t, "fs");
2552
2655
  },
2553
2656
  children: t.title
2554
2657
  }, String(t.id)))]
2555
2658
  });
2556
2659
  })(),
2557
- Pt && /* @__PURE__ */ D("div", {
2660
+ It && /* @__PURE__ */ E("div", {
2558
2661
  className: "fixed inset-0 z-[60] flex items-center justify-center bg-black/30",
2559
2662
  "data-testid": "gantt-conflict-overlay",
2560
- onClick: () => Ft(null),
2561
- children: /* @__PURE__ */ O("div", {
2663
+ onClick: () => Lt(null),
2664
+ children: /* @__PURE__ */ D("div", {
2562
2665
  className: "min-w-[280px] max-w-[360px] rounded-lg border bg-popover text-popover-foreground shadow-lg p-4",
2563
2666
  role: "alertdialog",
2564
2667
  "aria-modal": "true",
2565
2668
  "data-testid": "gantt-conflict-dialog",
2566
2669
  onClick: (e) => e.stopPropagation(),
2567
2670
  children: [
2568
- /* @__PURE__ */ D("div", {
2671
+ /* @__PURE__ */ E("div", {
2569
2672
  className: "text-sm font-semibold mb-1",
2570
2673
  "data-testid": "gantt-conflict-title",
2571
2674
  children: x("gantt.conflict.title")
2572
2675
  }),
2573
- /* @__PURE__ */ D("div", {
2676
+ /* @__PURE__ */ E("div", {
2574
2677
  className: "text-sm text-muted-foreground mb-3",
2575
- children: x("gantt.conflict.body").replace("{count}", String(Pt.length))
2678
+ children: x("gantt.conflict.body").replace("{count}", String(It.length))
2576
2679
  }),
2577
- /* @__PURE__ */ O("div", {
2680
+ /* @__PURE__ */ D("div", {
2578
2681
  className: "flex justify-end gap-2",
2579
- children: [/* @__PURE__ */ D("button", {
2682
+ children: [/* @__PURE__ */ E("button", {
2580
2683
  type: "button",
2581
2684
  className: "px-3 py-1.5 text-sm rounded-md border hover:bg-accent outline-none",
2582
2685
  "data-testid": "gantt-conflict-cancel",
2583
- onClick: () => Ft(null),
2686
+ onClick: () => Lt(null),
2584
2687
  children: x("gantt.conflict.cancel")
2585
- }), /* @__PURE__ */ D("button", {
2688
+ }), /* @__PURE__ */ E("button", {
2586
2689
  type: "button",
2587
2690
  className: "px-3 py-1.5 text-sm rounded-md bg-primary text-primary-foreground hover:opacity-90 outline-none",
2588
2691
  "data-testid": "gantt-conflict-confirm",
2589
- onClick: Lt,
2692
+ onClick: zt,
2590
2693
  children: x("gantt.conflict.confirm")
2591
2694
  })]
2592
2695
  })
@@ -2598,10 +2701,10 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
2598
2701
  }
2599
2702
  //#endregion
2600
2703
  //#region src/workload.ts
2601
- function nt(e, t, n, r) {
2704
+ function st(e, t, n, r) {
2602
2705
  return t.getTime() === e.getTime() ? e.getTime() >= n.getTime() && e.getTime() < r.getTime() : e.getTime() < r.getTime() && t.getTime() > n.getTime();
2603
2706
  }
2604
- function rt(e, t, n) {
2707
+ function ct(e, t, n) {
2605
2708
  let { assignee: r, effort: i, capacity: a = 1, unassignedLabel: o = "Unassigned" } = n, s = (e) => typeof a == "function" ? a(e) : a, c = (e) => {
2606
2709
  let t = i ? i(e) : 1;
2607
2710
  return Number.isFinite(t) && t > 0 ? t : 0;
@@ -2618,7 +2721,7 @@ function rt(e, t, n) {
2618
2721
  for (let e of l.values()) {
2619
2722
  let n = s(e.key), r = 0, i = 0, a = t.map((t) => {
2620
2723
  let a = 0;
2621
- for (let n of e.items) nt(n.start, n.end, t.start, t.end) && (a += c(n));
2724
+ for (let n of e.items) st(n.start, n.end, t.start, t.end) && (a += c(n));
2622
2725
  a > r && (r = a);
2623
2726
  let o = a > n + 1e-9;
2624
2727
  return o && i++, {
@@ -2640,32 +2743,32 @@ function rt(e, t, n) {
2640
2743
  }
2641
2744
  //#endregion
2642
2745
  //#region src/ResourceWorkload.tsx
2643
- var it = {
2746
+ var lt = {
2644
2747
  day: 26,
2645
2748
  week: 56,
2646
2749
  month: 76,
2647
2750
  quarter: 88,
2648
2751
  year: 104
2649
- }, L = 48, at = 34, ot = 180;
2650
- function st(e, t, n) {
2752
+ }, ut = 48, R = 34, dt = 180;
2753
+ function ft(e, t, n) {
2651
2754
  return t === "day" ? String(e.getDate()) : t === "week" ? e.toLocaleDateString(n, {
2652
2755
  month: "numeric",
2653
2756
  day: "numeric"
2654
2757
  }) : t === "month" ? e.toLocaleDateString(n, { month: "short" }) : t === "year" ? String(e.getFullYear()) : `Q${Math.floor(e.getMonth() / 3) + 1}`;
2655
2758
  }
2656
- function ct({ tasks: t, assignee: n, effort: r, capacity: i = 1, viewMode: a = "day", unassignedLabel: o = "Unassigned", className: s }) {
2657
- let { t: c, language: l } = Le(), u = l || void 0, d = it[a], f = e.useMemo(() => {
2759
+ function pt({ tasks: t, assignee: n, effort: r, capacity: i = 1, viewMode: a = "day", unassignedLabel: o = "Unassigned", className: s }) {
2760
+ let { t: c, language: l } = Ue(), u = l || void 0, d = lt[a], f = e.useMemo(() => {
2658
2761
  if (!t.length) return [];
2659
- let e = new Date(Math.min(...t.map((e) => e.start.getTime()))), n = new Date(Math.max(...t.map((e) => e.end.getTime()))), r = Ge(e, a), i = qe(Ge(n, a), 1, a), o = [], s = 0;
2762
+ let e = new Date(Math.min(...t.map((e) => e.start.getTime()))), n = new Date(Math.max(...t.map((e) => e.end.getTime()))), r = Ze(e, a), i = $e(Ze(n, a), 1, a), o = [], s = 0;
2660
2763
  for (; r < i && s++ < 4e3;) {
2661
- let e = qe(r, 1, a);
2764
+ let e = $e(r, 1, a);
2662
2765
  o.push({
2663
2766
  date: new Date(r),
2664
2767
  col: {
2665
2768
  start: new Date(r),
2666
2769
  end: new Date(e)
2667
2770
  },
2668
- label: st(r, a, u)
2771
+ label: ft(r, a, u)
2669
2772
  }), r = e;
2670
2773
  }
2671
2774
  return o;
@@ -2673,7 +2776,7 @@ function ct({ tasks: t, assignee: n, effort: r, capacity: i = 1, viewMode: a = "
2673
2776
  t,
2674
2777
  a,
2675
2778
  u
2676
- ]), p = e.useMemo(() => rt(t, f.map((e) => e.col), {
2779
+ ]), p = e.useMemo(() => ct(t, f.map((e) => e.col), {
2677
2780
  assignee: n,
2678
2781
  effort: r,
2679
2782
  capacity: i,
@@ -2690,7 +2793,7 @@ function ct({ tasks: t, assignee: n, effort: r, capacity: i = 1, viewMode: a = "
2690
2793
  for (let t of p) e = Math.max(e, t.peak, t.capacity);
2691
2794
  return e || 1;
2692
2795
  }, [p]), h = f.length * d;
2693
- return t.length ? /* @__PURE__ */ D("div", {
2796
+ return t.length ? /* @__PURE__ */ E("div", {
2694
2797
  className: s,
2695
2798
  "data-testid": "resource-workload",
2696
2799
  style: {
@@ -2699,17 +2802,17 @@ function ct({ tasks: t, assignee: n, effort: r, capacity: i = 1, viewMode: a = "
2699
2802
  height: "100%",
2700
2803
  overflow: "auto"
2701
2804
  },
2702
- children: /* @__PURE__ */ O("div", {
2805
+ children: /* @__PURE__ */ D("div", {
2703
2806
  style: {
2704
2807
  display: "flex",
2705
- minWidth: ot + h
2808
+ minWidth: dt + h
2706
2809
  },
2707
- children: [/* @__PURE__ */ O("div", {
2810
+ children: [/* @__PURE__ */ D("div", {
2708
2811
  style: {
2709
- width: ot,
2812
+ width: dt,
2710
2813
  flexShrink: 0
2711
2814
  },
2712
- children: [/* @__PURE__ */ D("div", {
2815
+ children: [/* @__PURE__ */ E("div", {
2713
2816
  style: {
2714
2817
  height: 28,
2715
2818
  display: "flex",
@@ -2720,17 +2823,17 @@ function ct({ tasks: t, assignee: n, effort: r, capacity: i = 1, viewMode: a = "
2720
2823
  borderBottom: "1px solid hsl(var(--border))"
2721
2824
  },
2722
2825
  children: c("gantt.resource.header")
2723
- }), p.map((e) => /* @__PURE__ */ O("div", {
2826
+ }), p.map((e) => /* @__PURE__ */ D("div", {
2724
2827
  "data-testid": `resource-row-${e.key}`,
2725
2828
  style: {
2726
- height: L,
2829
+ height: ut,
2727
2830
  display: "flex",
2728
2831
  flexDirection: "column",
2729
2832
  justifyContent: "center",
2730
2833
  padding: "0 12px",
2731
2834
  borderBottom: "1px solid hsl(var(--border) / 0.5)"
2732
2835
  },
2733
- children: [/* @__PURE__ */ D("span", {
2836
+ children: [/* @__PURE__ */ E("span", {
2734
2837
  style: {
2735
2838
  fontSize: 13,
2736
2839
  fontWeight: 500,
@@ -2739,7 +2842,7 @@ function ct({ tasks: t, assignee: n, effort: r, capacity: i = 1, viewMode: a = "
2739
2842
  textOverflow: "ellipsis"
2740
2843
  },
2741
2844
  children: e.label
2742
- }), /* @__PURE__ */ O("span", {
2845
+ }), /* @__PURE__ */ D("span", {
2743
2846
  "data-testid": `resource-peak-${e.key}`,
2744
2847
  "data-overloaded": e.overloadedCount > 0 ? "true" : void 0,
2745
2848
  style: {
@@ -2756,15 +2859,15 @@ function ct({ tasks: t, assignee: n, effort: r, capacity: i = 1, viewMode: a = "
2756
2859
  ]
2757
2860
  })]
2758
2861
  }, e.key))]
2759
- }), /* @__PURE__ */ O("div", {
2862
+ }), /* @__PURE__ */ D("div", {
2760
2863
  style: { flex: 1 },
2761
- children: [/* @__PURE__ */ D("div", {
2864
+ children: [/* @__PURE__ */ E("div", {
2762
2865
  style: {
2763
2866
  display: "flex",
2764
2867
  height: 28,
2765
2868
  borderBottom: "1px solid hsl(var(--border))"
2766
2869
  },
2767
- children: f.map((e, t) => /* @__PURE__ */ D("div", {
2870
+ children: f.map((e, t) => /* @__PURE__ */ E("div", {
2768
2871
  style: {
2769
2872
  width: d,
2770
2873
  flexShrink: 0,
@@ -2779,28 +2882,28 @@ function ct({ tasks: t, assignee: n, effort: r, capacity: i = 1, viewMode: a = "
2779
2882
  children: e.label
2780
2883
  }, t))
2781
2884
  }), p.map((e) => {
2782
- let t = at * (1 - Math.min(e.capacity / m, 1));
2783
- return /* @__PURE__ */ O("div", {
2885
+ let t = R * (1 - Math.min(e.capacity / m, 1));
2886
+ return /* @__PURE__ */ D("div", {
2784
2887
  style: {
2785
2888
  position: "relative",
2786
2889
  display: "flex",
2787
- height: L,
2890
+ height: ut,
2788
2891
  borderBottom: "1px solid hsl(var(--border) / 0.5)"
2789
2892
  },
2790
- children: [/* @__PURE__ */ D("div", {
2893
+ children: [/* @__PURE__ */ E("div", {
2791
2894
  "aria-hidden": "true",
2792
2895
  style: {
2793
2896
  position: "absolute",
2794
2897
  left: 0,
2795
2898
  right: 0,
2796
- top: (L - at) / 2 + t,
2899
+ top: (ut - R) / 2 + t,
2797
2900
  borderTop: "1px dashed hsl(var(--muted-foreground) / 0.6)",
2798
2901
  pointerEvents: "none",
2799
2902
  zIndex: 1
2800
2903
  }
2801
2904
  }), e.cells.map((t, n) => {
2802
- let r = Math.max(t.load > 0 ? 2 : 0, at * Math.min(t.load / m, 1));
2803
- return /* @__PURE__ */ D("div", {
2905
+ let r = Math.max(t.load > 0 ? 2 : 0, R * Math.min(t.load / m, 1));
2906
+ return /* @__PURE__ */ E("div", {
2804
2907
  "data-testid": `resource-cell-${e.key}-${n}`,
2805
2908
  "data-load": t.load,
2806
2909
  "data-overloaded": t.overloaded ? "true" : void 0,
@@ -2813,9 +2916,9 @@ function ct({ tasks: t, assignee: n, effort: r, capacity: i = 1, viewMode: a = "
2813
2916
  display: "flex",
2814
2917
  alignItems: "flex-end",
2815
2918
  justifyContent: "center",
2816
- paddingBottom: (L - at) / 2
2919
+ paddingBottom: (ut - R) / 2
2817
2920
  },
2818
- children: t.load > 0 && /* @__PURE__ */ D("div", { style: {
2921
+ children: t.load > 0 && /* @__PURE__ */ E("div", { style: {
2819
2922
  width: d - 6,
2820
2923
  height: r,
2821
2924
  borderRadius: 2,
@@ -2828,10 +2931,10 @@ function ct({ tasks: t, assignee: n, effort: r, capacity: i = 1, viewMode: a = "
2828
2931
  })]
2829
2932
  })]
2830
2933
  })
2831
- }) : /* @__PURE__ */ D("div", {
2934
+ }) : /* @__PURE__ */ E("div", {
2832
2935
  className: s,
2833
2936
  "data-testid": "resource-workload",
2834
- children: /* @__PURE__ */ D("div", {
2937
+ children: /* @__PURE__ */ E("div", {
2835
2938
  className: "flex items-center justify-center h-40 text-sm text-muted-foreground",
2836
2939
  children: c("gantt.resource.empty")
2837
2940
  })
@@ -2839,7 +2942,7 @@ function ct({ tasks: t, assignee: n, effort: r, capacity: i = 1, viewMode: a = "
2839
2942
  }
2840
2943
  //#endregion
2841
2944
  //#region src/QuickFilterBar.tsx
2842
- var lt = {
2945
+ var z = {
2843
2946
  display: "flex",
2844
2947
  flexWrap: "wrap",
2845
2948
  alignItems: "center",
@@ -2848,7 +2951,7 @@ var lt = {
2848
2951
  borderBottom: "1px solid hsl(var(--border))",
2849
2952
  background: "hsl(var(--background))",
2850
2953
  fontSize: 13
2851
- }, ut = {
2954
+ }, mt = {
2852
2955
  display: "inline-flex",
2853
2956
  alignItems: "center",
2854
2957
  gap: 6,
@@ -2861,7 +2964,7 @@ var lt = {
2861
2964
  cursor: "pointer",
2862
2965
  whiteSpace: "nowrap",
2863
2966
  lineHeight: "28px"
2864
- }, dt = {
2967
+ }, B = {
2865
2968
  position: "absolute",
2866
2969
  top: "calc(100% + 4px)",
2867
2970
  left: 0,
@@ -2875,7 +2978,7 @@ var lt = {
2875
2978
  background: "hsl(var(--popover, var(--background)))",
2876
2979
  color: "hsl(var(--popover-foreground, var(--foreground)))",
2877
2980
  boxShadow: "0 8px 24px rgba(0,0,0,0.18)"
2878
- }, ft = {
2981
+ }, ht = {
2879
2982
  display: "flex",
2880
2983
  alignItems: "center",
2881
2984
  gap: 8,
@@ -2884,8 +2987,8 @@ var lt = {
2884
2987
  cursor: "pointer",
2885
2988
  userSelect: "none"
2886
2989
  };
2887
- function R({ checked: e }) {
2888
- return /* @__PURE__ */ D("span", {
2990
+ function gt({ checked: e }) {
2991
+ return /* @__PURE__ */ E("span", {
2889
2992
  "aria-hidden": !0,
2890
2993
  style: {
2891
2994
  display: "inline-flex",
@@ -2904,7 +3007,7 @@ function R({ checked: e }) {
2904
3007
  children: e ? "✓" : ""
2905
3008
  });
2906
3009
  }
2907
- function pt({ filter: e, selected: t, onChange: r, labels: o }) {
3010
+ function _t({ filter: e, selected: t, onChange: r, labels: o }) {
2908
3011
  let [s, c] = a(!1), l = i(null);
2909
3012
  n(() => {
2910
3013
  if (!s) return;
@@ -2923,14 +3026,14 @@ function pt({ filter: e, selected: t, onChange: r, labels: o }) {
2923
3026
  }, m = () => {
2924
3027
  r(d > 0 ? [] : e.options.map((e) => e.value));
2925
3028
  }, h = d === 0 ? e.label : d === 1 ? `${e.label}: ${e.options.find((e) => e.value === t[0])?.label ?? t[0]}` : `${e.label} · ${d}`;
2926
- return /* @__PURE__ */ O("div", {
3029
+ return /* @__PURE__ */ D("div", {
2927
3030
  ref: l,
2928
3031
  style: { position: "relative" },
2929
3032
  "data-testid": `quick-filter-${e.field}`,
2930
- children: [/* @__PURE__ */ O("button", {
3033
+ children: [/* @__PURE__ */ D("button", {
2931
3034
  type: "button",
2932
3035
  style: {
2933
- ...ut,
3036
+ ...mt,
2934
3037
  borderColor: d > 0 ? "hsl(var(--primary))" : "hsl(var(--border))",
2935
3038
  color: d > 0 ? "hsl(var(--primary))" : "hsl(var(--foreground))"
2936
3039
  },
@@ -2938,7 +3041,7 @@ function pt({ filter: e, selected: t, onChange: r, labels: o }) {
2938
3041
  "aria-expanded": s,
2939
3042
  "data-testid": `quick-filter-trigger-${e.field}`,
2940
3043
  onClick: () => c((e) => !e),
2941
- children: [/* @__PURE__ */ D("span", { children: h }), /* @__PURE__ */ D("span", {
3044
+ children: [/* @__PURE__ */ E("span", { children: h }), /* @__PURE__ */ E("span", {
2942
3045
  "aria-hidden": !0,
2943
3046
  style: {
2944
3047
  fontSize: 10,
@@ -2946,61 +3049,61 @@ function pt({ filter: e, selected: t, onChange: r, labels: o }) {
2946
3049
  },
2947
3050
  children: "▾"
2948
3051
  })]
2949
- }), s && /* @__PURE__ */ D("div", {
3052
+ }), s && /* @__PURE__ */ E("div", {
2950
3053
  role: "listbox",
2951
- style: dt,
3054
+ style: B,
2952
3055
  "data-testid": `quick-filter-panel-${e.field}`,
2953
- children: e.options.length === 0 ? /* @__PURE__ */ D("div", {
3056
+ children: e.options.length === 0 ? /* @__PURE__ */ E("div", {
2954
3057
  style: {
2955
- ...ft,
3058
+ ...ht,
2956
3059
  cursor: "default",
2957
3060
  opacity: .6
2958
3061
  },
2959
3062
  children: o.empty
2960
- }) : /* @__PURE__ */ O(De, { children: [
2961
- /* @__PURE__ */ O("div", {
3063
+ }) : /* @__PURE__ */ D(Oe, { children: [
3064
+ /* @__PURE__ */ D("div", {
2962
3065
  role: "option",
2963
3066
  "aria-selected": f,
2964
3067
  style: {
2965
- ...ft,
3068
+ ...ht,
2966
3069
  fontWeight: 600
2967
3070
  },
2968
3071
  "data-testid": `quick-filter-all-${e.field}`,
2969
3072
  onClick: () => m(),
2970
- children: [/* @__PURE__ */ D(R, { checked: f }), /* @__PURE__ */ D("span", { children: o.all })]
3073
+ children: [/* @__PURE__ */ E(gt, { checked: f }), /* @__PURE__ */ E("span", { children: o.all })]
2971
3074
  }),
2972
- /* @__PURE__ */ D("div", { style: {
3075
+ /* @__PURE__ */ E("div", { style: {
2973
3076
  height: 1,
2974
3077
  background: "hsl(var(--border))",
2975
3078
  margin: "2px 0"
2976
3079
  } }),
2977
3080
  e.options.map((t) => {
2978
3081
  let n = u.has(t.value);
2979
- return /* @__PURE__ */ O("div", {
3082
+ return /* @__PURE__ */ D("div", {
2980
3083
  role: "option",
2981
3084
  "aria-selected": n,
2982
3085
  style: {
2983
- ...ft,
3086
+ ...ht,
2984
3087
  background: n ? "hsl(var(--accent, var(--muted)))" : "transparent"
2985
3088
  },
2986
3089
  "data-testid": `quick-filter-option-${e.field}-${t.value}`,
2987
3090
  onClick: () => p(t.value),
2988
- children: [/* @__PURE__ */ D(R, { checked: n }), /* @__PURE__ */ D("span", { children: t.label })]
3091
+ children: [/* @__PURE__ */ E(gt, { checked: n }), /* @__PURE__ */ E("span", { children: t.label })]
2989
3092
  }, t.value);
2990
3093
  })
2991
3094
  ] })
2992
3095
  })]
2993
3096
  });
2994
3097
  }
2995
- var z = ({ filters: e, value: t, onChange: n, onClear: r, resultCount: i, totalCount: a, labels: o, className: s }) => {
3098
+ var vt = ({ filters: e, value: t, onChange: n, onClear: r, resultCount: i, totalCount: a, labels: o, className: s }) => {
2996
3099
  if (!e.length) return null;
2997
3100
  let c = o?.all ?? "All", l = o?.empty ?? "No options", u = o?.clear ?? "Clear", d = e.some((e) => (t[e.field]?.length ?? 0) > 0);
2998
- return /* @__PURE__ */ O("div", {
2999
- style: lt,
3101
+ return /* @__PURE__ */ D("div", {
3102
+ style: z,
3000
3103
  className: s,
3001
3104
  "data-testid": "quick-filter-bar",
3002
3105
  children: [
3003
- e.map((e) => /* @__PURE__ */ D(pt, {
3106
+ e.map((e) => /* @__PURE__ */ E(_t, {
3004
3107
  filter: e,
3005
3108
  selected: t[e.field] ?? [],
3006
3109
  onChange: (t) => n(e.field, t),
@@ -3009,10 +3112,10 @@ var z = ({ filters: e, value: t, onChange: n, onClear: r, resultCount: i, totalC
3009
3112
  empty: l
3010
3113
  }
3011
3114
  }, e.field)),
3012
- d && /* @__PURE__ */ D("button", {
3115
+ d && /* @__PURE__ */ E("button", {
3013
3116
  type: "button",
3014
3117
  style: {
3015
- ...ut,
3118
+ ...mt,
3016
3119
  height: 28,
3017
3120
  color: "hsl(var(--muted-foreground))"
3018
3121
  },
@@ -3020,7 +3123,7 @@ var z = ({ filters: e, value: t, onChange: n, onClear: r, resultCount: i, totalC
3020
3123
  onClick: r,
3021
3124
  children: u
3022
3125
  }),
3023
- o?.resultSummary && i != null && a != null && /* @__PURE__ */ D("span", {
3126
+ o?.resultSummary && i != null && a != null && /* @__PURE__ */ E("span", {
3024
3127
  "data-testid": "quick-filter-summary",
3025
3128
  style: {
3026
3129
  marginLeft: "auto",
@@ -3033,7 +3136,7 @@ var z = ({ filters: e, value: t, onChange: n, onClear: r, resultCount: i, totalC
3033
3136
  };
3034
3137
  //#endregion
3035
3138
  //#region src/ObjectGantt.tsx
3036
- function mt(e) {
3139
+ function yt(e) {
3037
3140
  if (e == null) return;
3038
3141
  let t = String(e).toLowerCase().trim();
3039
3142
  if (t === "milestone") return "milestone";
@@ -3041,7 +3144,7 @@ function mt(e) {
3041
3144
  if (t === "summary" || t === "project" || t === "phase") return "summary";
3042
3145
  if (t === "task") return "task";
3043
3146
  }
3044
- var ht = {
3147
+ var bt = {
3045
3148
  fs: "fs",
3046
3149
  ss: "ss",
3047
3150
  ff: "ff",
@@ -3054,7 +3157,7 @@ var ht = {
3054
3157
  end_to_end: "ff",
3055
3158
  start_to_end: "sf"
3056
3159
  };
3057
- function gt(e) {
3160
+ function xt(e) {
3058
3161
  if (e == null || e === "") return [];
3059
3162
  if (typeof e == "string") return e.split(",").map((e) => e.trim()).filter(Boolean);
3060
3163
  if (typeof e == "number") return [e];
@@ -3063,7 +3166,7 @@ function gt(e) {
3063
3166
  for (let n of e) if (!(n == null || n === "")) if (typeof n == "object") {
3064
3167
  let e = n.id ?? n._id ?? n.task ?? n.target;
3065
3168
  if (e == null || e === "") continue;
3066
- let r = ht[String(n.type ?? "").toLowerCase().replace(/-/g, "_")];
3169
+ let r = bt[String(n.type ?? "").toLowerCase().replace(/-/g, "_")];
3067
3170
  t.push(r ? {
3068
3171
  id: e,
3069
3172
  type: r
@@ -3071,7 +3174,7 @@ function gt(e) {
3071
3174
  } else t.push(n);
3072
3175
  return t;
3073
3176
  }
3074
- function _t(e) {
3177
+ function St(e) {
3075
3178
  return e.data ? e.data : e.staticData ? {
3076
3179
  provider: "value",
3077
3180
  items: e.staticData
@@ -3080,7 +3183,7 @@ function _t(e) {
3080
3183
  object: e.objectName
3081
3184
  } : null;
3082
3185
  }
3083
- function vt(e) {
3186
+ function V(e) {
3084
3187
  if (e) {
3085
3188
  if (typeof e == "string") {
3086
3189
  let t = e.split(" "), n = t[0], r = t[1]?.toLowerCase() === "desc" ? "desc" : "asc";
@@ -3089,7 +3192,7 @@ function vt(e) {
3089
3192
  if (Array.isArray(e)) return e.reduce((e, t) => (t.field && t.order && (e[t.field] = t.order), e), {});
3090
3193
  }
3091
3194
  }
3092
- function yt(e) {
3195
+ function Ct(e) {
3093
3196
  let t = null;
3094
3197
  if (e.startDateField && e.endDateField) return t = {
3095
3198
  startDateField: e.startDateField,
@@ -3111,7 +3214,8 @@ function yt(e) {
3111
3214
  effortField: e.effortField,
3112
3215
  capacity: e.capacity,
3113
3216
  quickFilters: e.quickFilters,
3114
- autoZoomToFilter: e.autoZoomToFilter
3217
+ autoZoomToFilter: e.autoZoomToFilter,
3218
+ timeSegments: e.timeSegments
3115
3219
  }, t;
3116
3220
  if (e.gantt && (t = e.gantt), t) {
3117
3221
  let e = f.safeParse(t);
@@ -3119,8 +3223,8 @@ function yt(e) {
3119
3223
  }
3120
3224
  return null;
3121
3225
  }
3122
- var bt = ({ schema: e, dataSource: i, className: o, onTaskClick: u, onRowClick: d, ...f }) => {
3123
- let [y, b] = a([]), [oe, pe] = a(!0), [me, he] = a(null), [C, ge] = a(null), { currency: _e } = m(), ve = _t(e), w = r(() => ve, [JSON.stringify(ve)]), T = yt(e), ye = w?.provider === "value";
3226
+ var wt = ({ schema: e, dataSource: i, className: o, onTaskClick: u, onRowClick: d, ...f }) => {
3227
+ let [y, b] = a([]), [oe, pe] = a(!0), [me, he] = a(null), [C, ge] = a(null), { currency: _e } = m(), ve = St(e), w = r(() => ve, [JSON.stringify(ve)]), T = Ct(e), ye = w?.provider === "value";
3124
3228
  n(() => {
3125
3229
  (async () => {
3126
3230
  try {
@@ -3137,7 +3241,7 @@ var bt = ({ schema: e, dataSource: i, className: o, onTaskClick: u, onRowClick:
3137
3241
  let t = w.object, n = s(C?.fields);
3138
3242
  b(c(await i.find(t, {
3139
3243
  $filter: e.filter,
3140
- $orderby: vt(e.sort),
3244
+ $orderby: V(e.sort),
3141
3245
  ...n.length > 0 ? { $expand: n } : {}
3142
3246
  })));
3143
3247
  } else w?.provider === "api" && (console.warn("API provider not yet implemented for ObjectGantt"), b([]));
@@ -3170,7 +3274,7 @@ var bt = ({ schema: e, dataSource: i, className: o, onTaskClick: u, onRowClick:
3170
3274
  ye,
3171
3275
  w
3172
3276
  ]);
3173
- let E = r(() => {
3277
+ let be = r(() => {
3174
3278
  if (!T || !y.length) return [];
3175
3279
  let { startDateField: e, endDateField: t, titleField: n, progressField: r, dependenciesField: i, colorField: a, parentField: o, typeField: s, lockField: c, tooltipFields: l, baselineStartField: u, baselineEndField: d } = T, f = C?.fields ?? {}, m = (e, t) => {
3176
3280
  if (!t) return;
@@ -3199,7 +3303,7 @@ var bt = ({ schema: e, dataSource: i, className: o, onTaskClick: u, onRowClick:
3199
3303
  if (t) return t;
3200
3304
  let n = f[e] ?? f[e.split(".")[0]];
3201
3305
  return n?.label ? n.label : fe(e);
3202
- }, _ = (e, t) => {
3306
+ }, ee = (e, t) => {
3203
3307
  if (e == null || e === "") return "—";
3204
3308
  let n = f[t] ?? f[t.split(".")[0]], r = n?.type, i = n?.options;
3205
3309
  if (Array.isArray(i) && i.length) {
@@ -3208,13 +3312,13 @@ var bt = ({ schema: e, dataSource: i, className: o, onTaskClick: u, onRowClick:
3208
3312
  }
3209
3313
  switch (r) {
3210
3314
  case "date": return ce(e);
3211
- case "datetime": return x(e);
3315
+ case "datetime": return le(e);
3212
3316
  case "number":
3213
3317
  case "integer":
3214
3318
  case "float":
3215
- case "decimal": return le(Number(e));
3319
+ case "decimal": return x(Number(e));
3216
3320
  case "currency": return se(Number(e), p(n, _e));
3217
- case "percent": return S(Number(e));
3321
+ case "percent": return ue(Number(e));
3218
3322
  case "boolean":
3219
3323
  case "checkbox": return e ? "Yes" : "No";
3220
3324
  default:
@@ -3235,7 +3339,7 @@ var bt = ({ schema: e, dataSource: i, className: o, onTaskClick: u, onRowClick:
3235
3339
  }
3236
3340
  return String(e);
3237
3341
  }
3238
- }, v = (e) => {
3342
+ }, _ = (e) => {
3239
3343
  if (!l || !l.length) return;
3240
3344
  let t = [];
3241
3345
  for (let n of l) {
@@ -3244,17 +3348,17 @@ var bt = ({ schema: e, dataSource: i, className: o, onTaskClick: u, onRowClick:
3244
3348
  let i = typeof n == "object" ? n.label : void 0;
3245
3349
  t.push({
3246
3350
  label: g(r, i),
3247
- value: _(m(e, r), r)
3351
+ value: ee(m(e, r), r)
3248
3352
  });
3249
3353
  }
3250
3354
  return t.length ? t : void 0;
3251
3355
  };
3252
3356
  return y.map((n, l) => {
3253
- let f = n[e], p = n[t], m = u ? n[u] : void 0, g = d ? n[d] : void 0, _ = m ? new Date(m) : void 0, ee = g ? new Date(g) : void 0, te = h(n), ne = r ? n[r] : 0, re = i ? n[i] : [], ie = a ? n[a] : void 0;
3357
+ let f = n[e], p = n[t], m = u ? n[u] : void 0, g = d ? n[d] : void 0, ee = m ? new Date(m) : void 0, v = g ? new Date(g) : void 0, te = h(n), ne = r ? n[r] : 0, re = i ? n[i] : [], ie = a ? n[a] : void 0;
3254
3358
  if (!ie) {
3255
3359
  let e = n.status ?? n.state ?? n.priority ?? n.severity;
3256
3360
  if (e != null && e !== "") {
3257
- let t = ue(void 0, e);
3361
+ let t = S(void 0, e);
3258
3362
  t && (ie = de(t));
3259
3363
  }
3260
3364
  }
@@ -3264,14 +3368,14 @@ var bt = ({ schema: e, dataSource: i, className: o, onTaskClick: u, onRowClick:
3264
3368
  start: f ? new Date(f) : /* @__PURE__ */ new Date(),
3265
3369
  end: p ? new Date(p) : /* @__PURE__ */ new Date(),
3266
3370
  progress: Math.min(100, Math.max(0, ne || 0)),
3267
- dependencies: gt(re),
3371
+ dependencies: xt(re),
3268
3372
  parent: o ? n[o] ?? null : void 0,
3269
- type: s ? mt(n[s]) : void 0,
3373
+ type: s ? yt(n[s]) : void 0,
3270
3374
  locked: c ? !!n[c] : void 0,
3271
3375
  color: ie,
3272
- baselineStart: _ && !isNaN(_.getTime()) ? _ : void 0,
3273
- baselineEnd: ee && !isNaN(ee.getTime()) ? ee : void 0,
3274
- fields: v(n),
3376
+ baselineStart: ee && !isNaN(ee.getTime()) ? ee : void 0,
3377
+ baselineEnd: v && !isNaN(v.getTime()) ? v : void 0,
3378
+ fields: _(n),
3275
3379
  data: n
3276
3380
  };
3277
3381
  }).filter((e) => !isNaN(e.start.getTime()) && !isNaN(e.end.getTime()));
@@ -3279,7 +3383,7 @@ var bt = ({ schema: e, dataSource: i, className: o, onTaskClick: u, onRowClick:
3279
3383
  y,
3280
3384
  T,
3281
3385
  C
3282
- ]), be = r(() => {
3386
+ ]), xe = r(() => {
3283
3387
  let e = T?.groupByField;
3284
3388
  if (!e) return;
3285
3389
  let t = C?.fields ?? {}, n = (e, t) => {
@@ -3309,7 +3413,7 @@ var bt = ({ schema: e, dataSource: i, className: o, onTaskClick: u, onRowClick:
3309
3413
  label: r(i)
3310
3414
  };
3311
3415
  };
3312
- }, [T?.groupByField, C]), xe = r(() => {
3416
+ }, [T?.groupByField, C]), Se = r(() => {
3313
3417
  let e = T?.assigneeField;
3314
3418
  if (!e) return;
3315
3419
  let t = C?.fields ?? {}, n = (e, t) => {
@@ -3339,19 +3443,19 @@ var bt = ({ schema: e, dataSource: i, className: o, onTaskClick: u, onRowClick:
3339
3443
  label: r(i)
3340
3444
  };
3341
3445
  };
3342
- }, [T?.assigneeField, C]), Se = r(() => {
3446
+ }, [T?.assigneeField, C]), Ce = r(() => {
3343
3447
  let e = T?.effortField;
3344
3448
  if (e) return (t) => {
3345
3449
  let n = t.data?.[e], r = Number(n);
3346
3450
  return Number.isFinite(r) && r > 0 ? r : 1;
3347
3451
  };
3348
- }, [T?.effortField]), Ce = r(() => {
3452
+ }, [T?.effortField]), we = r(() => {
3349
3453
  let t = e.skipWeekends, n = e.holidays;
3350
3454
  if (!(!t && (!n || n.length === 0))) return {
3351
3455
  skipWeekends: !!t,
3352
3456
  holidays: n && n.length ? new Set(n) : void 0
3353
3457
  };
3354
- }, [e]), we = t((e, t) => {
3458
+ }, [e]), Te = r(() => Re(T?.timeSegments), [T?.timeSegments]), Ee = t((e, t) => {
3355
3459
  if (!e || !t) return null;
3356
3460
  let n = e;
3357
3461
  for (let e of t.split(".")) {
@@ -3364,13 +3468,13 @@ var bt = ({ schema: e, dataSource: i, className: o, onTaskClick: u, onRowClick:
3364
3468
  return String(e.id ?? e._id ?? e.value ?? e.name ?? "");
3365
3469
  }
3366
3470
  return String(n);
3367
- }, []), Te = T?.quickFilters, [Ee, Oe] = a({});
3471
+ }, []), De = T?.quickFilters, [O, ke] = a({});
3368
3472
  n(() => {
3369
- if (!Te?.length || !i || typeof i.find != "function") return;
3473
+ if (!De?.length || !i || typeof i.find != "function") return;
3370
3474
  let e = C?.fields ?? {}, t = !1;
3371
3475
  return (async () => {
3372
3476
  let n = {};
3373
- for (let t of Te) {
3477
+ for (let t of De) {
3374
3478
  if (t.options) continue;
3375
3479
  let r = e[t.field] ?? e[t.field.split(".")[0]], a = r?.type;
3376
3480
  if (a !== "lookup" && a !== "master_detail") continue;
@@ -3385,7 +3489,7 @@ var bt = ({ schema: e, dataSource: i, className: o, onTaskClick: u, onRowClick:
3385
3489
  console.warn(`[ObjectGantt] Failed to load quick-filter options for "${t.field}":`, e);
3386
3490
  }
3387
3491
  }
3388
- t || Oe((e) => ({
3492
+ t || ke((e) => ({
3389
3493
  ...e,
3390
3494
  ...n
3391
3495
  }));
@@ -3393,14 +3497,14 @@ var bt = ({ schema: e, dataSource: i, className: o, onTaskClick: u, onRowClick:
3393
3497
  t = !0;
3394
3498
  };
3395
3499
  }, [
3396
- JSON.stringify(Te),
3500
+ JSON.stringify(De),
3397
3501
  i,
3398
3502
  C
3399
3503
  ]);
3400
3504
  let k = r(() => {
3401
- if (!Te?.length) return [];
3505
+ if (!De?.length) return [];
3402
3506
  let e = C?.fields ?? {};
3403
- return Te.map((t) => {
3507
+ return De.map((t) => {
3404
3508
  let n = e[t.field] ?? e[t.field.split(".")[0]], r = t.label ?? n?.label ?? fe(t.field), i = [];
3405
3509
  if (t.options?.length) i = t.options.map((e) => typeof e == "object" ? {
3406
3510
  value: String(e.value),
@@ -3413,11 +3517,11 @@ var bt = ({ schema: e, dataSource: i, className: o, onTaskClick: u, onRowClick:
3413
3517
  value: String(e.value ?? e),
3414
3518
  label: String(e.label ?? e.value ?? e)
3415
3519
  }));
3416
- else if (Ee[t.field]?.length) i = Ee[t.field];
3520
+ else if (O[t.field]?.length) i = O[t.field];
3417
3521
  else {
3418
3522
  let e = /* @__PURE__ */ new Map();
3419
3523
  for (let n of y) {
3420
- let r = we(n, t.field);
3524
+ let r = Ee(n, t.field);
3421
3525
  if (r != null && !e.has(r)) {
3422
3526
  let i = n;
3423
3527
  for (let e of t.field.split(".")) i = i?.[e];
@@ -3437,42 +3541,42 @@ var bt = ({ schema: e, dataSource: i, className: o, onTaskClick: u, onRowClick:
3437
3541
  };
3438
3542
  });
3439
3543
  }, [
3440
- Te,
3544
+ De,
3441
3545
  C,
3442
- Ee,
3546
+ O,
3443
3547
  y,
3444
- we
3548
+ Ee
3445
3549
  ]), [A, j] = a({}), M = t((e, t) => {
3446
3550
  j((n) => ({
3447
3551
  ...n,
3448
3552
  [e]: t
3449
3553
  }));
3450
- }, []), ke = t(() => j({}), []), N = r(() => {
3554
+ }, []), Ae = t(() => j({}), []), N = r(() => {
3451
3555
  let e = Object.entries(A).filter(([, e]) => e.length > 0);
3452
- return e.length ? E.filter((t) => e.every(([e, n]) => {
3453
- let r = we(t.data, e);
3556
+ return e.length ? be.filter((t) => e.every(([e, n]) => {
3557
+ let r = Ee(t.data, e);
3454
3558
  return r != null && n.includes(r);
3455
- })) : E;
3559
+ })) : be;
3456
3560
  }, [
3457
- E,
3561
+ be,
3458
3562
  A,
3459
- we
3460
- ]), Ae = r(() => {
3461
- if (T?.autoZoomToFilter !== !1 || !E.length) return null;
3462
- let e = E[0].start.getTime(), t = E[0].end.getTime();
3463
- for (let n of E) e = Math.min(e, n.start.getTime()), t = Math.max(t, n.end.getTime());
3563
+ Ee
3564
+ ]), P = r(() => {
3565
+ if (T?.autoZoomToFilter !== !1 || !be.length) return null;
3566
+ let e = be[0].start.getTime(), t = be[0].end.getTime();
3567
+ for (let n of be) e = Math.min(e, n.start.getTime()), t = Math.max(t, n.end.getTime());
3464
3568
  return {
3465
3569
  start: new Date(e),
3466
3570
  end: new Date(t)
3467
3571
  };
3468
- }, [E, T?.autoZoomToFilter]), P = e.navigation ?? {
3572
+ }, [be, T?.autoZoomToFilter]), je = e.navigation ?? {
3469
3573
  mode: "drawer",
3470
3574
  width: "min(960px, 60vw)"
3471
- }, je = P.mode === "drawer" || P.mode === "modal" || P.mode === "split" || P.mode === "popover", Me = l({
3472
- navigation: P,
3575
+ }, Me = je.mode === "drawer" || je.mode === "modal" || je.mode === "split" || je.mode === "popover", Ne = l({
3576
+ navigation: je,
3473
3577
  objectName: e.objectName,
3474
- onRowClick: je ? void 0 : d
3475
- }), Ne = t(async (t, n) => {
3578
+ onRowClick: Me ? void 0 : d
3579
+ }), Pe = t(async (t, n) => {
3476
3580
  if (!T) return;
3477
3581
  let r = w?.provider === "object" ? w.object : e.objectName;
3478
3582
  if (!r || !i || typeof i.update != "function") return;
@@ -3496,18 +3600,18 @@ var bt = ({ schema: e, dataSource: i, className: o, onTaskClick: u, onRowClick:
3496
3600
  i,
3497
3601
  e.objectName,
3498
3602
  y
3499
- ]), F = (e, t) => {
3603
+ ]), Fe = (e, t) => {
3500
3604
  let n = t.some((e) => typeof e == "object" && e.type && e.type !== "fs");
3501
3605
  return !n && typeof e == "string" ? t.map((e) => String(typeof e == "object" ? e.id : e)).join(",") : n ? t.map((e) => typeof e == "object" ? e.type && e.type !== "fs" ? {
3502
3606
  id: e.id,
3503
3607
  type: e.type
3504
3608
  } : e.id : e) : t.map((e) => typeof e == "object" ? e.id : e);
3505
- }, Pe = t(async (t, n, r) => {
3609
+ }, Ie = t(async (t, n, r) => {
3506
3610
  let a = T?.dependenciesField;
3507
3611
  if (!a) return;
3508
3612
  let o = w?.provider === "object" ? w.object : e.objectName;
3509
3613
  if (!o || !i || typeof i.update != "function") return;
3510
- let s = F(n, r), c = y;
3614
+ let s = Fe(n, r), c = y;
3511
3615
  b((e) => e.map((e) => String(e.id ?? e._id) === String(t) ? {
3512
3616
  ...e,
3513
3617
  [a]: s
@@ -3523,56 +3627,56 @@ var bt = ({ schema: e, dataSource: i, className: o, onTaskClick: u, onRowClick:
3523
3627
  i,
3524
3628
  e.objectName,
3525
3629
  y
3526
- ]), Fe = t(async (e, t, n = "fs") => {
3630
+ ]), F = t(async (e, t, n = "fs") => {
3527
3631
  let r = e.data?.id ?? e.data?._id ?? e.id, i = t.data?.id ?? t.data?._id ?? t.id;
3528
3632
  if (r == null || i == null) return;
3529
3633
  let a = T?.dependenciesField;
3530
3634
  if (!a) return;
3531
- let o = y.find((e) => String(e.id ?? e._id) === String(i))?.[a], s = gt(o), c = (e) => String(typeof e == "object" ? e.id : e), l = s.find((e) => c(e) === String(r)), u = l && typeof l == "object" ? l.type ?? "fs" : "fs";
3635
+ let o = y.find((e) => String(e.id ?? e._id) === String(i))?.[a], s = xt(o), c = (e) => String(typeof e == "object" ? e.id : e), l = s.find((e) => c(e) === String(r)), u = l && typeof l == "object" ? l.type ?? "fs" : "fs";
3532
3636
  if (l && u === n) return;
3533
3637
  let d = n === "fs" ? r : {
3534
3638
  id: r,
3535
3639
  type: n
3536
3640
  };
3537
- await Pe(i, o, l ? s.map((e) => c(e) === String(r) ? d : e) : [...s, d]);
3641
+ await Ie(i, o, l ? s.map((e) => c(e) === String(r) ? d : e) : [...s, d]);
3538
3642
  }, [
3539
3643
  T,
3540
3644
  y,
3541
- Pe
3542
- ]), Ie = t(async (e, t) => {
3645
+ Ie
3646
+ ]), Le = t(async (e, t) => {
3543
3647
  let n = e.data?.id ?? e.data?._id ?? e.id, r = t.data?.id ?? t.data?._id ?? t.id;
3544
3648
  if (n == null || r == null) return;
3545
3649
  let i = T?.dependenciesField;
3546
3650
  if (!i) return;
3547
- let a = y.find((e) => String(e.id ?? e._id) === String(r))?.[i], o = gt(a), s = (e) => String(typeof e == "object" ? e.id : e), c = o.filter((e) => s(e) !== String(n));
3548
- c.length !== o.length && await Pe(r, a, c);
3651
+ let a = y.find((e) => String(e.id ?? e._id) === String(r))?.[i], o = xt(a), s = (e) => String(typeof e == "object" ? e.id : e), c = o.filter((e) => s(e) !== String(n));
3652
+ c.length !== o.length && await Ie(r, a, c);
3549
3653
  }, [
3550
3654
  T,
3551
3655
  y,
3552
- Pe
3553
- ]), [I, Le] = a(null), [Re, ze] = a(!1), Be = t((e) => {
3554
- Le(e);
3555
- }, []), Ve = t(async () => {
3656
+ Ie
3657
+ ]), [I, ze] = a(null), [Be, Ve] = a(!1), He = t((e) => {
3658
+ ze(e);
3659
+ }, []), Ue = t(async () => {
3556
3660
  if (!I) return;
3557
3661
  let t = w?.provider === "object" ? w.object : e.objectName;
3558
3662
  if (!t || !i?.delete) {
3559
- Le(null);
3663
+ ze(null);
3560
3664
  return;
3561
3665
  }
3562
3666
  let n = I.data?.id ?? I.data?._id ?? I.id;
3563
3667
  if (n == null) {
3564
- Le(null);
3668
+ ze(null);
3565
3669
  return;
3566
3670
  }
3567
- ze(!0);
3671
+ Ve(!0);
3568
3672
  let r = y;
3569
3673
  b((e) => e.filter((e) => String(e.id ?? e._id) !== String(n)));
3570
3674
  try {
3571
- await i.delete(t, String(n)), Le(null);
3675
+ await i.delete(t, String(n)), ze(null);
3572
3676
  } catch (e) {
3573
- console.error("[ObjectGantt] Failed to delete:", e), b(r), Le(null);
3677
+ console.error("[ObjectGantt] Failed to delete:", e), b(r), ze(null);
3574
3678
  } finally {
3575
- ze(!1);
3679
+ Ve(!1);
3576
3680
  }
3577
3681
  }, [
3578
3682
  I,
@@ -3581,34 +3685,34 @@ var bt = ({ schema: e, dataSource: i, className: o, onTaskClick: u, onRowClick:
3581
3685
  e.objectName,
3582
3686
  y
3583
3687
  ]);
3584
- return oe ? /* @__PURE__ */ D("div", {
3688
+ return oe ? /* @__PURE__ */ E("div", {
3585
3689
  className: o,
3586
- children: /* @__PURE__ */ D("div", {
3690
+ children: /* @__PURE__ */ E("div", {
3587
3691
  className: "flex items-center justify-center h-96",
3588
- children: /* @__PURE__ */ D("div", {
3692
+ children: /* @__PURE__ */ E("div", {
3589
3693
  className: "text-muted-foreground",
3590
3694
  children: "Loading Gantt chart..."
3591
3695
  })
3592
3696
  })
3593
- }) : me ? /* @__PURE__ */ D("div", {
3697
+ }) : me ? /* @__PURE__ */ E("div", {
3594
3698
  className: o,
3595
- children: /* @__PURE__ */ D("div", {
3699
+ children: /* @__PURE__ */ E("div", {
3596
3700
  className: "flex items-center justify-center h-96",
3597
- children: /* @__PURE__ */ O("div", {
3701
+ children: /* @__PURE__ */ D("div", {
3598
3702
  className: "text-destructive",
3599
3703
  children: ["Error: ", me.message]
3600
3704
  })
3601
3705
  })
3602
- }) : T ? /* @__PURE__ */ O("div", {
3706
+ }) : T ? /* @__PURE__ */ D("div", {
3603
3707
  className: o,
3604
3708
  children: [
3605
- k.length > 0 && /* @__PURE__ */ D(z, {
3709
+ k.length > 0 && /* @__PURE__ */ E(vt, {
3606
3710
  filters: k,
3607
3711
  value: A,
3608
3712
  onChange: M,
3609
- onClear: ke,
3713
+ onClear: Ae,
3610
3714
  resultCount: N.length,
3611
- totalCount: E.length,
3715
+ totalCount: be.length,
3612
3716
  labels: {
3613
3717
  all: "全部",
3614
3718
  clear: "清除筛选",
@@ -3616,53 +3720,54 @@ var bt = ({ schema: e, dataSource: i, className: o, onTaskClick: u, onRowClick:
3616
3720
  resultSummary: (e, t) => `显示 ${e} / ${t} 项任务`
3617
3721
  }
3618
3722
  }),
3619
- /* @__PURE__ */ D("div", {
3723
+ /* @__PURE__ */ E("div", {
3620
3724
  className: "h-[calc(100vh-200px)] min-h-[600px]",
3621
- children: T?.resourceView && xe ? /* @__PURE__ */ D(ct, {
3725
+ children: T?.resourceView && Se ? /* @__PURE__ */ E(pt, {
3622
3726
  tasks: N,
3623
- assignee: xe,
3624
- effort: Se,
3727
+ assignee: Se,
3728
+ effort: Ce,
3625
3729
  capacity: T?.capacity ?? 1,
3626
3730
  viewMode: e.viewMode || "day"
3627
- }) : /* @__PURE__ */ D(tt, {
3731
+ }) : /* @__PURE__ */ E(L, {
3628
3732
  tasks: N,
3629
- startDate: Ae?.start,
3630
- endDate: Ae?.end,
3733
+ startDate: P?.start,
3734
+ endDate: P?.end,
3631
3735
  onTaskClick: (e) => {
3632
- Me.handleClick(e.data), u?.(e.data);
3736
+ Ne.handleClick(e.data), u?.(e.data);
3633
3737
  },
3634
- onTaskUpdate: Ne,
3635
- onTaskDelete: Be,
3636
- onDependencyCreate: T?.dependenciesField ? Fe : void 0,
3637
- onDependencyDelete: T?.dependenciesField ? Ie : void 0,
3738
+ onTaskUpdate: Pe,
3739
+ onTaskDelete: He,
3740
+ onDependencyCreate: T?.dependenciesField ? F : void 0,
3741
+ onDependencyDelete: T?.dependenciesField ? Le : void 0,
3638
3742
  markers: e.markers,
3639
3743
  autoSchedule: !!T?.dependenciesField,
3640
3744
  rescheduleOnConflict: !!T?.dependenciesField,
3641
3745
  criticalPathDefault: !!e.criticalPath,
3642
- workingCalendar: Ce,
3746
+ workingCalendar: we,
3747
+ shiftSegments: Te,
3643
3748
  showBaselines: e.showBaselines !== !1,
3644
3749
  readOnly: !!e.readOnly,
3645
3750
  mobileReadOnly: e.mobileReadOnly !== !1,
3646
3751
  persistLayoutKey: e.persistLayout === !1 ? void 0 : `${e.objectName || (w?.provider === "object" ? w.object : "") || "gantt"}:${e.viewName || "default"}`,
3647
- groupBy: be,
3752
+ groupBy: xe,
3648
3753
  defaultCollapsedDepth: T?.defaultCollapsedDepth,
3649
3754
  inlineEdit: !0
3650
3755
  })
3651
3756
  }),
3652
- Me.isOverlay && Me.isOpen && Me.selectedRecord && (() => {
3653
- let t = w?.provider === "object" ? w.object : e.objectName, n = Me.selectedRecord, r = n.id ?? n._id;
3757
+ Ne.isOverlay && Ne.isOpen && Ne.selectedRecord && (() => {
3758
+ let t = w?.provider === "object" ? w.object : e.objectName, n = Ne.selectedRecord, r = n.id ?? n._id;
3654
3759
  if (!t || r == null) return null;
3655
3760
  let a = T?.titleField ? String(n[T.titleField] ?? "Task Details") : "Task Details";
3656
- return /* @__PURE__ */ D(h, {
3761
+ return /* @__PURE__ */ E(h, {
3657
3762
  open: !0,
3658
- onClose: Me.close,
3763
+ onClose: Ne.close,
3659
3764
  title: a,
3660
3765
  record: n,
3661
3766
  objectName: t,
3662
3767
  recordId: r,
3663
3768
  dataSource: i,
3664
3769
  objectSchema: C,
3665
- width: Me.width,
3770
+ width: Ne.width,
3666
3771
  fullPageHref: g(t, r) ?? void 0,
3667
3772
  onFieldSave: async (e, n) => {
3668
3773
  i?.update && (await i.update(t, String(r), { [e]: n }), b((t) => t.map((t) => String(t.id ?? t._id) === String(r) ? {
@@ -3675,47 +3780,47 @@ var bt = ({ schema: e, dataSource: i, className: o, onTaskClick: u, onRowClick:
3675
3780
  }
3676
3781
  });
3677
3782
  })(),
3678
- /* @__PURE__ */ D(_, {
3783
+ /* @__PURE__ */ E(ee, {
3679
3784
  open: !!I,
3680
3785
  onOpenChange: (e) => {
3681
- !e && !Re && Le(null);
3786
+ !e && !Be && ze(null);
3682
3787
  },
3683
- children: /* @__PURE__ */ O(te, { children: [/* @__PURE__ */ O(ie, { children: [/* @__PURE__ */ D(ae, { children: "Delete this task?" }), /* @__PURE__ */ D(ne, { children: I ? /* @__PURE__ */ O(De, { children: [
3788
+ children: /* @__PURE__ */ D(te, { children: [/* @__PURE__ */ D(ie, { children: [/* @__PURE__ */ E(ae, { children: "Delete this task?" }), /* @__PURE__ */ E(ne, { children: I ? /* @__PURE__ */ D(Oe, { children: [
3684
3789
  "\"",
3685
3790
  I.title,
3686
3791
  "\" will be permanently removed. This action cannot be undone."
3687
- ] }) : null })] }), /* @__PURE__ */ O(re, { children: [/* @__PURE__ */ D(ee, {
3688
- disabled: Re,
3792
+ ] }) : null })] }), /* @__PURE__ */ D(re, { children: [/* @__PURE__ */ E(v, {
3793
+ disabled: Be,
3689
3794
  children: "Cancel"
3690
- }), /* @__PURE__ */ D(v, {
3795
+ }), /* @__PURE__ */ E(_, {
3691
3796
  onClick: (e) => {
3692
- e.preventDefault(), Ve();
3797
+ e.preventDefault(), Ue();
3693
3798
  },
3694
- disabled: Re,
3799
+ disabled: Be,
3695
3800
  "data-testid": "gantt-delete-confirm",
3696
3801
  className: "bg-destructive text-destructive-foreground hover:bg-destructive/90",
3697
- children: Re ? "Deleting…" : "Delete"
3802
+ children: Be ? "Deleting…" : "Delete"
3698
3803
  })] })] })
3699
3804
  })
3700
3805
  ]
3701
- }) : /* @__PURE__ */ D("div", {
3806
+ }) : /* @__PURE__ */ E("div", {
3702
3807
  className: o,
3703
- children: /* @__PURE__ */ D("div", {
3808
+ children: /* @__PURE__ */ E("div", {
3704
3809
  className: "flex items-center justify-center h-96",
3705
- children: /* @__PURE__ */ D("div", {
3810
+ children: /* @__PURE__ */ E("div", {
3706
3811
  className: "text-muted-foreground",
3707
3812
  children: "Gantt configuration required. Please specify startDateField, endDateField, and titleField."
3708
3813
  })
3709
3814
  })
3710
3815
  });
3711
- }, xt = ({ schema: e }) => {
3816
+ }, Tt = ({ schema: e }) => {
3712
3817
  let { dataSource: t } = d() || {};
3713
- return /* @__PURE__ */ D(bt, {
3818
+ return /* @__PURE__ */ E(wt, {
3714
3819
  schema: e,
3715
3820
  dataSource: t
3716
3821
  });
3717
3822
  };
3718
- o.register("object-gantt", xt, {
3823
+ o.register("object-gantt", Tt, {
3719
3824
  namespace: "plugin-gantt",
3720
3825
  label: "Object Gantt",
3721
3826
  category: "view",
@@ -3730,7 +3835,7 @@ o.register("object-gantt", xt, {
3730
3835
  label: "Gantt Config",
3731
3836
  description: "startDateField, endDateField, titleField, progressField, percentageField, colorField, dependenciesField"
3732
3837
  }]
3733
- }), o.register("gantt", xt, {
3838
+ }), o.register("gantt", Tt, {
3734
3839
  namespace: "view",
3735
3840
  label: "Gantt View",
3736
3841
  category: "view",
@@ -3747,4 +3852,4 @@ o.register("object-gantt", xt, {
3747
3852
  }]
3748
3853
  });
3749
3854
  //#endregion
3750
- export { tt as GanttView, bt as ObjectGantt, xt as ObjectGanttRenderer, z as QuickFilterBar, ct as ResourceWorkload, rt as computeWorkload, gt as normalizeDependencies, mt as normalizeTaskType };
3855
+ export { L as GanttView, wt as ObjectGantt, Tt as ObjectGanttRenderer, vt as QuickFilterBar, pt as ResourceWorkload, Be as bandAt, ct as computeWorkload, xt as normalizeDependencies, Re as normalizeShiftSegments, yt as normalizeTaskType, I as parseHHMM, ze as shiftDayStart };