@umriss-ui/schedule 0.45.0 → 0.47.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/schedule.js CHANGED
@@ -1,19 +1,19 @@
1
1
  "use client";
2
2
  import "./schedule.css";
3
- import { localOffset as Ke, toWorkingTimeClamped as Y, calendarFrom as bt, toWallClock as Wt, MINUTE as X, DAY as j, timeStep as Ls, workingTimeTicks as As, inDoubledHour as Cs, HOUR as Ut, LinearScale as Ds, resolveColours as _s, removedIntervals as Os, subscribeTheme as Fs } from "@umriss-ui/charts";
4
- import { useContext as Ve, createContext as qe, useRef as V, useEffect as q, useId as $s, useState as dt, useLayoutEffect as wt, useImperativeHandle as Es, useSyncExternalStore as ze, useMemo as z, createElement as xs } from "react";
5
- import { jsxs as B, Fragment as ht, jsx as m } from "react/jsx-runtime";
6
- import { zoneFields as We, zoneInstant as Gt, useFormats as Xt, useWording as Mt, useTimeZoneLabel as Rs, Skeleton as Ns, AngleGlyph as Bs, VisuallyHidden as be, createLongPress as Ps, zoneDayStart as Gs } from "@umriss-ui/core";
7
- function it(s) {
3
+ import { localOffset as je, toWorkingTimeClamped as V, calendarFrom as Tt, toWallClock as qt, MINUTE as Z, DAY as J, timeStep as _s, workingTimeTicks as Os, inDoubledHour as Fs, HOUR as jt, LinearScale as $s, resolveColours as Es, removedIntervals as Bs, subscribeTheme as xs } from "@umriss-ui/charts";
4
+ import { useContext as Zt, useEffect as Y, createContext as Ze, useRef as W, useId as Je, useState as ht, useLayoutEffect as yt, useImperativeHandle as Ns, useSyncExternalStore as Jt, useMemo as U, createElement as Rs } from "react";
5
+ import { jsxs as E, Fragment as it, jsx as p } from "react/jsx-runtime";
6
+ import { zoneFields as Qe, zoneInstant as Kt, useWording as mt, useFormats as St, useTimeZoneLabel as Ps, Skeleton as Gs, AngleGlyph as Hs, VisuallyHidden as Le, createLongPress as Ks, zoneDayStart as Ys } from "@umriss-ui/core";
7
+ function Q(s) {
8
8
  return { from: s.from - (s.leadIn ?? 0), to: s.to + (s.leadOut ?? 0) };
9
9
  }
10
- function jt(s, t) {
10
+ function Qt(s, t) {
11
11
  return (s.leaves ?? "leadOut") === "main" ? t.to : t.to + (t.leadOut ?? 0);
12
12
  }
13
- function Zt(s, t) {
13
+ function te(s, t) {
14
14
  return (s.arrives ?? "leadIn") === "main" ? t.from : t.from - (t.leadIn ?? 0);
15
15
  }
16
- function Me(s, t) {
16
+ function Ce(s, t) {
17
17
  if (t.kind === "place" || t.subtask !== s.id) return s;
18
18
  switch (t.kind) {
19
19
  case "move":
@@ -27,7 +27,7 @@ function Me(s, t) {
27
27
  return { ...s, lane: t.lane };
28
28
  }
29
29
  }
30
- function Yi(s, t) {
30
+ function Zi(s, t) {
31
31
  return {
32
32
  id: t,
33
33
  task: s.task,
@@ -38,388 +38,395 @@ function Yi(s, t) {
38
38
  ...s.leadOut === void 0 ? {} : { leadOut: s.leadOut }
39
39
  };
40
40
  }
41
- function Jt(s) {
41
+ function ee(s) {
42
42
  const t = [], e = /* @__PURE__ */ new Map();
43
- s.forEach((i, n) => {
44
- const { from: o, to: r } = it(i);
45
- if (!(o < r)) return;
46
- const a = e.get(i.lane) ?? [];
47
- a.push({ subtask: i, index: n, from: o, to: r }), e.set(i.lane, a);
43
+ s.forEach((n, i) => {
44
+ const { from: o, to: a } = Q(n);
45
+ if (!(o < a)) return;
46
+ const r = e.get(n.lane) ?? [];
47
+ r.push({ subtask: n, index: i, from: o, to: a }), e.set(n.lane, r);
48
48
  });
49
- for (const [i, n] of e) {
50
- n.sort((o, r) => o.from - r.from || o.index - r.index);
51
- for (let o = 0; o < n.length; o++) {
52
- const r = n[o];
53
- for (let a = o + 1; a < n.length; a++) {
54
- const l = n[a];
55
- if (l.from >= r.to) break;
56
- t.push({ lane: i, first: r.subtask.id, second: l.subtask.id, from: l.from, to: Math.min(r.to, l.to) });
49
+ for (const [n, i] of e) {
50
+ i.sort((o, a) => o.from - a.from || o.index - a.index);
51
+ for (let o = 0; o < i.length; o++) {
52
+ const a = i[o];
53
+ for (let r = o + 1; r < i.length; r++) {
54
+ const l = i[r];
55
+ if (l.from >= a.to) break;
56
+ t.push({ lane: n, first: a.subtask.id, second: l.subtask.id, from: l.from, to: Math.min(a.to, l.to) });
57
57
  }
58
58
  }
59
59
  }
60
60
  return t;
61
61
  }
62
- function Hs(s) {
62
+ function Vs(s) {
63
63
  const t = /* @__PURE__ */ new Map(), e = /* @__PURE__ */ new Map();
64
- for (const i of s) {
65
- const n = it(i), o = e.get(i.lane) ?? [];
66
- let r = 0;
67
- if (n.from < n.to) {
68
- for (const a of o) n.from < a.to && a.from < n.to && r++;
69
- o.push(n);
64
+ for (const n of s) {
65
+ const i = Q(n), o = e.get(n.lane) ?? [];
66
+ let a = 0;
67
+ if (i.from < i.to) {
68
+ for (const r of o) i.from < r.to && r.from < i.to && a++;
69
+ o.push(i);
70
70
  }
71
- e.set(i.lane, o), t.set(i.id, r);
71
+ e.set(n.lane, o), t.set(n.id, a);
72
72
  }
73
73
  return t;
74
74
  }
75
- function Qt(s, t) {
76
- const e = new Map(s.map((n) => [n.id, n])), i = [];
77
- for (const n of t) {
78
- const o = e.get(n.from), r = e.get(n.to);
79
- if (o === void 0 || r === void 0) continue;
80
- const a = jt(n, o), l = Zt(n, r), d = a + n.lag - l;
81
- d > 0 && i.push({ dependency: n.id, departure: a, arrival: l, shortBy: d });
75
+ function se(s, t) {
76
+ const e = new Map(s.map((i) => [i.id, i])), n = [];
77
+ for (const i of t) {
78
+ const o = e.get(i.from), a = e.get(i.to);
79
+ if (o === void 0 || a === void 0) continue;
80
+ const r = Qt(i, o), l = te(i, a), d = r + i.lag - l;
81
+ d > 0 && n.push({ dependency: i.id, departure: r, arrival: l, shortBy: d });
82
82
  }
83
- return i;
83
+ return n;
84
84
  }
85
- function Ue(s, t) {
85
+ function ts(s, t) {
86
86
  const e = [];
87
- for (const i of s) {
88
- const n = it(i);
87
+ for (const n of s) {
88
+ const i = Q(n);
89
89
  for (const o of t)
90
- o.lane !== i.lane || !(n.from < o.to && o.from < n.to) || e.push({ subtask: i.id, blocked: o.id, lane: o.lane, from: Math.max(n.from, o.from), to: Math.min(n.to, o.to) });
90
+ o.lane !== n.lane || !(i.from < o.to && o.from < i.to) || e.push({ subtask: n.id, blocked: o.id, lane: o.lane, from: Math.max(i.from, o.from), to: Math.min(i.to, o.to) });
91
91
  }
92
92
  return e;
93
93
  }
94
- function Ki(s, t, e = []) {
94
+ function Ji(s, t, e = []) {
95
95
  return {
96
- overlaps: Jt(s),
97
- violatedDependencies: Qt(s, t),
98
- inBlockedTime: Ue(s, e)
96
+ overlaps: ee(s),
97
+ violatedDependencies: se(s, t),
98
+ inBlockedTime: ts(s, e)
99
99
  };
100
100
  }
101
- function Vi(s, t, e) {
101
+ function Qi(s, t, e) {
102
102
  if (e.kind === "place") return [];
103
- const i = new Map(s.map((l) => [l.id, Me(l, e)])), n = /* @__PURE__ */ new Map();
103
+ const n = new Map(s.map((l) => [l.id, Ce(l, e)])), i = /* @__PURE__ */ new Map();
104
104
  for (const l of t) {
105
- const d = n.get(l.from) ?? [];
106
- d.push(l), n.set(l.from, d);
105
+ const d = i.get(l.from) ?? [];
106
+ d.push(l), i.set(l.from, d);
107
107
  }
108
- const o = /* @__PURE__ */ new Map(), r = [e.subtask];
109
- let a = (s.length + 1) * (t.length + 1);
110
- for (; r.length > 0 && a-- > 0; ) {
111
- const l = r.shift(), d = i.get(l);
108
+ const o = /* @__PURE__ */ new Map(), a = [e.subtask];
109
+ let r = (s.length + 1) * (t.length + 1);
110
+ for (; a.length > 0 && r-- > 0; ) {
111
+ const l = a.shift(), d = n.get(l);
112
112
  if (d !== void 0)
113
- for (const h of n.get(l) ?? []) {
113
+ for (const h of i.get(l) ?? []) {
114
114
  if (h.to === e.subtask) continue;
115
- const c = i.get(h.to);
115
+ const c = n.get(h.to);
116
116
  if (c === void 0) continue;
117
- const f = jt(h, d) + h.lag - Zt(h, c);
118
- if (!(f > 0)) continue;
119
- const g = { kind: "move", subtask: c.id, from: c.from + f, to: c.to + f };
120
- i.set(c.id, Me(c, g)), o.set(c.id, g), r.push(c.id);
117
+ const m = Qt(h, d) + h.lag - te(h, c);
118
+ if (!(m > 0)) continue;
119
+ const k = { kind: "move", subtask: c.id, from: c.from + m, to: c.to + m };
120
+ n.set(c.id, Ce(c, k)), o.set(c.id, k), a.push(c.id);
121
121
  }
122
122
  }
123
123
  return [...o.values()];
124
124
  }
125
- function Ys(s, t, e) {
126
- const { step: i, offset: n } = typeof t == "number" ? { step: t, offset: 0 } : t;
127
- if (!(i > 0) || !Number.isFinite(s)) return s;
128
- const o = Ke(s, e) + n;
129
- return o + Math.round((s - o) / i) * i;
125
+ function zs(s, t, e) {
126
+ const { step: n, offset: i } = typeof t == "number" ? { step: t, offset: 0 } : t;
127
+ if (!(n > 0) || !Number.isFinite(s)) return s;
128
+ const o = je(s, e) + i;
129
+ return o + Math.round((s - o) / n) * n;
130
130
  }
131
- function qi(s, t, e) {
132
- return e === 0 || !Number.isFinite(e) ? [] : s.filter((i) => i.task === t).map((i) => ({ kind: "move", subtask: i.id, from: i.from + e, to: i.to + e }));
131
+ function to(s, t, e) {
132
+ return e === 0 || !Number.isFinite(e) ? [] : s.filter((n) => n.task === t).map((n) => ({ kind: "move", subtask: n.id, from: n.from + e, to: n.to + e }));
133
133
  }
134
- function Tt(s) {
135
- let t = !1, e = !1, i = !1, n = !1;
134
+ function It(s) {
135
+ let t = !1, e = !1, n = !1, i = !1;
136
136
  for (const o of s ?? [])
137
- o === "provisional" ? (t = !0, e = !1) : o === "fixed" ? (e = !0, t = !1) : o === "muted" ? i = !0 : o === "open" && (n = !0);
138
- return { dashed: t, hatched: e, muted: i, open: n };
137
+ o === "provisional" ? (t = !0, e = !1) : o === "fixed" ? (e = !0, t = !1) : o === "muted" ? n = !0 : o === "open" && (i = !0);
138
+ return { dashed: t, hatched: e, muted: n, open: i };
139
139
  }
140
- const Xe = /* @__PURE__ */ qe(null), je = /* @__PURE__ */ qe(null);
141
- function Ze() {
142
- return Ve(je);
140
+ const ne = /* @__PURE__ */ Ze(null), es = /* @__PURE__ */ Ze(null);
141
+ function ss() {
142
+ return Zt(es);
143
143
  }
144
- function Ks(s) {
145
- const t = Ve(Xe);
144
+ function Ws(s) {
145
+ const t = Zt(ne);
146
146
  if (t === null)
147
147
  throw new Error(`@umriss-ui/schedule: <${s}> must be used inside a <Schedule>.`);
148
148
  return t;
149
149
  }
150
- function te(s, t, e, i, n) {
151
- const o = Ks(s), r = V(null);
152
- q(() => (r.current = e(o, t), () => {
153
- r.current !== null && n(o, r.current), r.current = null;
154
- }), [o]), q(() => {
155
- r.current !== null && i(o, r.current, t);
150
+ function ie(s, t, e, n, i) {
151
+ const o = Ws(s), a = W(null);
152
+ Y(() => (a.current = e(o, t), () => {
153
+ a.current !== null && i(o, a.current), a.current = null;
154
+ }), [o]), Y(() => {
155
+ a.current !== null && n(o, a.current, t);
156
156
  });
157
157
  }
158
- function Vs(s) {
159
- te("Lane", s, (t, e) => t.registerLane(e), (t, e, i) => t.updateLane(e, i), (t, e) => t.unregisterLane(e));
158
+ function Us(s) {
159
+ ie("Lane", s, (t, e) => t.registerLane(e), (t, e, n) => t.updateLane(e, n), (t, e) => t.unregisterLane(e));
160
160
  }
161
- function qs(s) {
162
- te("LaneGroup", s, (t, e) => t.registerGroup(e), (t, e, i) => t.updateGroup(e, i), (t, e) => t.unregisterGroup(e));
163
- }
164
- function St(s, t) {
165
- te(s, t, (e, i) => e.registerLayer(i), (e, i, n) => e.updateLayer(i, n), (e, i) => e.unregisterLayer(i));
161
+ function Xs(s) {
162
+ ie("LaneGroup", s, (t, e) => t.registerGroup(e), (t, e, n) => t.updateGroup(e, n), (t, e) => t.unregisterGroup(e));
166
163
  }
167
- const Je = 24, zs = 4, Ws = 3, Rt = 4;
168
- function Te(s) {
169
- const { lanes: t, groups: e, collapsed: i, laneHeight: n, headHeight: o = Je } = s, r = new Map(e.map((y) => [y.id, y])), a = (y) => y !== void 0 && r.has(y) ? y : void 0, l = /* @__PURE__ */ new Map(), d = (y) => {
170
- const M = [];
171
- let T = a(y.parent);
164
+ function qs(s) {
165
+ const t = Zt(ne);
166
+ return Y(() => {
167
+ if (t !== null)
168
+ return t.registerDataTable(s), () => t.unregisterDataTable();
169
+ }, [t, s]), t;
170
+ }
171
+ function Lt(s, t) {
172
+ ie(s, t, (e, n) => e.registerLayer(n), (e, n, i) => e.updateLayer(n, i), (e, n) => e.unregisterLayer(n));
173
+ }
174
+ const ns = 24, js = 4, Zs = 3, Rt = 4;
175
+ function Ae(s) {
176
+ const { lanes: t, groups: e, collapsed: n, laneHeight: i, headHeight: o = ns } = s, a = new Map(e.map((b) => [b.id, b])), r = (b) => b !== void 0 && a.has(b) ? b : void 0, l = /* @__PURE__ */ new Map(), d = (b) => {
177
+ const S = [];
178
+ let I = r(b.parent);
172
179
  const F = /* @__PURE__ */ new Set();
173
- for (; T !== void 0 && !F.has(T); )
174
- F.add(T), M.unshift(T), T = a(r.get(T).parent);
175
- return M;
180
+ for (; I !== void 0 && !F.has(I); )
181
+ F.add(I), S.unshift(I), I = r(a.get(I).parent);
182
+ return S;
176
183
  }, h = /* @__PURE__ */ new Map();
177
- for (const y of t) {
178
- const M = d(y);
179
- h.set(y.id, M);
180
- for (const T of M) {
181
- const F = l.get(T) ?? [];
182
- F.push(y.id), l.set(T, F);
184
+ for (const b of t) {
185
+ const S = d(b);
186
+ h.set(b.id, S);
187
+ for (const I of S) {
188
+ const F = l.get(I) ?? [];
189
+ F.push(b.id), l.set(I, F);
183
190
  }
184
191
  }
185
- const c = [], f = /* @__PURE__ */ new Map();
186
- let g = [], w = null, A = 0;
187
- const I = (y) => (c.push({ ...y, top: A }), A += y.height, c.length - 1), L = (y) => y.find((M) => i.has(M)), D = () => {
188
- if (w === null) return;
189
- const { row: y, lanes: M } = w, T = c[y], F = Math.max(T.height, M.length * zs + 2 * Rt);
190
- c[y] = { ...T, height: F }, A += F - T.height;
191
- const O = F - 2 * Rt, R = Math.max(Ws, Math.floor(O / M.length));
192
- M.forEach((U, pt) => {
193
- const gt = h.get(U) ?? [];
194
- f.set(U, {
195
- top: T.top + Rt + pt * R,
192
+ const c = [], m = /* @__PURE__ */ new Map();
193
+ let k = [], f = null, v = 0;
194
+ const C = (b) => (c.push({ ...b, top: v }), v += b.height, c.length - 1), A = (b) => b.find((S) => n.has(S)), M = () => {
195
+ if (f === null) return;
196
+ const { row: b, lanes: S } = f, I = c[b], F = Math.max(I.height, S.length * js + 2 * Rt);
197
+ c[b] = { ...I, height: F }, v += F - I.height;
198
+ const O = F - 2 * Rt, R = Math.max(Zs, Math.floor(O / S.length));
199
+ S.forEach((q, gt) => {
200
+ const kt = h.get(q) ?? [];
201
+ m.set(q, {
202
+ top: I.top + Rt + gt * R,
196
203
  height: R,
197
204
  miniature: !0,
198
- group: gt[gt.length - 1]
205
+ group: kt[kt.length - 1]
199
206
  });
200
- }), w = null;
207
+ }), f = null;
201
208
  };
202
- for (const y of t) {
203
- const M = (h.get(y.id) ?? []).filter((O) => (l.get(O) ?? []).length > 0), T = L(M);
204
- if (w !== null && T === w.group) {
205
- w.lanes.push(y.id);
209
+ for (const b of t) {
210
+ const S = (h.get(b.id) ?? []).filter((O) => (l.get(O) ?? []).length > 0), I = A(S);
211
+ if (f !== null && I === f.group) {
212
+ f.lanes.push(b.id);
206
213
  continue;
207
214
  }
208
- D();
209
- const F = M.filter((O, R) => g[R] === O).length;
210
- g = g.slice(0, F);
211
- for (const O of M.slice(F)) {
212
- if (g.push(O), O === T) break;
213
- I({
215
+ M();
216
+ const F = S.filter((O, R) => k[R] === O).length;
217
+ k = k.slice(0, F);
218
+ for (const O of S.slice(F)) {
219
+ if (k.push(O), O === I) break;
220
+ C({
214
221
  kind: "groupHead",
215
222
  lane: void 0,
216
223
  group: O,
217
- depth: g.length - 1,
218
- within: [...g],
224
+ depth: k.length - 1,
225
+ within: [...k],
219
226
  lanes: (l.get(O) ?? []).length,
220
227
  height: o
221
228
  });
222
229
  }
223
- if (T !== void 0) {
224
- const O = M.indexOf(T), R = I({
230
+ if (I !== void 0) {
231
+ const O = S.indexOf(I), R = C({
225
232
  kind: "miniature",
226
233
  lane: void 0,
227
- group: T,
234
+ group: I,
228
235
  depth: O,
229
- within: M.slice(0, O + 1),
230
- lanes: (l.get(T) ?? []).length,
231
- height: n
236
+ within: S.slice(0, O + 1),
237
+ lanes: (l.get(I) ?? []).length,
238
+ height: i
232
239
  });
233
- w = { group: T, row: R, lanes: [y.id] };
240
+ f = { group: I, row: R, lanes: [b.id] };
234
241
  continue;
235
242
  }
236
- I({ kind: "lane", lane: y.id, group: M[M.length - 1], depth: M.length, within: M, lanes: 1, height: n }), f.set(y.id, {
243
+ C({ kind: "lane", lane: b.id, group: S[S.length - 1], depth: S.length, within: S, lanes: 1, height: i }), m.set(b.id, {
237
244
  top: c[c.length - 1].top,
238
- height: n,
245
+ height: i,
239
246
  miniature: !1,
240
- group: M[M.length - 1]
247
+ group: S[S.length - 1]
241
248
  });
242
249
  }
243
- return D(), { rows: c, slots: f, height: A };
250
+ return M(), { rows: c, slots: m, height: v };
244
251
  }
245
- function Us(s, t) {
252
+ function Js(s, t) {
246
253
  if (t.size === 0) return s;
247
254
  const e = /* @__PURE__ */ new Set();
248
- for (const i of s) t.has(i) || e.add(i);
255
+ for (const n of s) t.has(n) || e.add(n);
249
256
  return e;
250
257
  }
251
- function nt(s, t) {
258
+ function ot(s, t) {
252
259
  if (t < 0 || t >= s.height) return null;
253
- let e = 0, i = s.rows.length - 1;
254
- for (; e <= i; ) {
255
- const n = e + i >> 1, o = s.rows[n];
256
- if (t < o.top) i = n - 1;
257
- else if (t >= o.top + o.height) e = n + 1;
260
+ let e = 0, n = s.rows.length - 1;
261
+ for (; e <= n; ) {
262
+ const i = e + n >> 1, o = s.rows[i];
263
+ if (t < o.top) n = i - 1;
264
+ else if (t >= o.top + o.height) e = i + 1;
258
265
  else return o;
259
266
  }
260
267
  return null;
261
268
  }
262
- function ee(s, t) {
269
+ function oe(s, t) {
263
270
  return s.slots.get(t) ?? null;
264
271
  }
265
- function Xs(s, t) {
266
- const e = nt(s, t);
272
+ function Qs(s, t) {
273
+ const e = ot(s, t);
267
274
  if (e === null) return null;
268
275
  if (e.kind === "lane") return e.lane ?? null;
269
276
  if (e.kind === "groupHead") return null;
270
- for (const [i, n] of s.slots)
271
- if (n.miniature && t >= n.top && t < n.top + n.height) return i;
277
+ for (const [n, i] of s.slots)
278
+ if (i.miniature && t >= i.top && t < i.top + i.height) return n;
272
279
  return null;
273
280
  }
274
- const js = 6, Qe = 3, lt = 2, Se = 3, Ie = 3;
275
- function E(s, t) {
276
- return Math.round(s.scale.toPx(Y(t, s.calendar)));
281
+ const tn = 6, is = 3, dt = 2, De = 3, _e = 3;
282
+ function B(s, t) {
283
+ return Math.round(s.scale.toPx(V(t, s.calendar)));
277
284
  }
278
- function Z(s, t) {
279
- const e = ee(s.rows, t);
285
+ function tt(s, t) {
286
+ const e = oe(s.rows, t);
280
287
  return e === null ? null : { ...e, top: e.top - s.scrollY };
281
288
  }
282
- function se(s, t) {
283
- const e = Z(s, t.lane);
284
- return e === null ? null : { x: E(s, t.at), y: e.top + e.height / 2, half: Math.max(2, Math.min(7, e.height * 0.3)) };
289
+ function ae(s, t) {
290
+ const e = tt(s, t.lane);
291
+ return e === null ? null : { x: B(s, t.at), y: e.top + e.height / 2, half: Math.max(2, Math.min(7, e.height * 0.3)) };
285
292
  }
286
- function Le(s, t) {
287
- return Xs(s.rows, t + s.scrollY);
293
+ function Oe(s, t) {
294
+ return Qs(s.rows, t + s.scrollY);
288
295
  }
289
- function ts(s, t, e, i) {
290
- const n = e.miniature ? 0 : js, o = e.miniature ? 0 : Ie * Se, r = Math.max(e.miniature ? 1 : 4, e.height - 2 * n - o), a = e.top - s.scrollY + Math.floor((e.height - r) / 2), l = it(t);
296
+ function os(s, t, e, n) {
297
+ const i = e.miniature ? 0 : tn, o = e.miniature ? 0 : _e * De, a = Math.max(e.miniature ? 1 : 4, e.height - 2 * i - o), r = e.top - s.scrollY + Math.floor((e.height - a) / 2), l = Q(t);
291
298
  return {
292
299
  subtask: t,
293
300
  miniature: e.miniature,
294
- depth: i,
295
- y: a + (e.miniature ? 0 : Math.min(i, Ie) * Se),
296
- height: r,
297
- outerFrom: E(s, l.from),
298
- mainFrom: E(s, t.from),
299
- mainTo: E(s, t.to),
300
- outerTo: E(s, l.to)
301
+ depth: n,
302
+ y: r + (e.miniature ? 0 : Math.min(n, _e) * De),
303
+ height: a,
304
+ outerFrom: B(s, l.from),
305
+ mainFrom: B(s, t.from),
306
+ mainTo: B(s, t.to),
307
+ outerTo: B(s, l.to)
301
308
  };
302
309
  }
303
- function es(s, t, e) {
310
+ function as(s, t, e) {
304
311
  if (e < s.y || e > s.y + s.height) return null;
305
- const i = Math.max(0, (6 - (s.outerTo - s.outerFrom)) / 2);
306
- return t < s.outerFrom - i || t > s.outerTo + i ? null : t < s.mainFrom ? "leadIn" : t > s.mainTo ? "leadOut" : "main";
312
+ const n = Math.max(0, (6 - (s.outerTo - s.outerFrom)) / 2);
313
+ return t < s.outerFrom - n || t > s.outerTo + n ? null : t < s.mainFrom ? "leadIn" : t > s.mainTo ? "leadOut" : "main";
307
314
  }
308
- function Zs(s, t, e, i = 5) {
315
+ function en(s, t, e, n = 5) {
309
316
  if (e < s.y || e > s.y + s.height) return null;
310
- const n = Math.abs(t - s.mainFrom), o = Math.abs(t - s.mainTo);
311
- return Math.min(n, o) > i ? null : n <= o ? "from" : "to";
317
+ const i = Math.abs(t - s.mainFrom), o = Math.abs(t - s.mainTo);
318
+ return Math.min(i, o) > n ? null : i <= o ? "from" : "to";
312
319
  }
313
- function Ht(s, t, e) {
320
+ function Yt(s, t, e) {
314
321
  return s.outerTo >= 0 && s.outerFrom <= t && s.y + s.height >= 0 && s.y <= e;
315
322
  }
316
- function Js(s, t, e) {
317
- let n = Math.min(s.x1, s.x2, s.c1x, s.c2x), o = Math.max(s.x1, s.x2, s.c1x, s.c2x), r = Math.min(s.y1, s.y2), a = Math.max(s.y1, s.y2);
323
+ function sn(s, t, e) {
324
+ let i = Math.min(s.x1, s.x2, s.c1x, s.c2x), o = Math.max(s.x1, s.x2, s.c1x, s.c2x), a = Math.min(s.y1, s.y2), r = Math.max(s.y1, s.y2);
318
325
  for (let l = 0; l + 1 < s.points.length; l += 2)
319
- n = Math.min(n, s.points[l]), o = Math.max(o, s.points[l]), r = Math.min(r, s.points[l + 1]), a = Math.max(a, s.points[l + 1]);
320
- return o >= -8 && n <= t + 8 && a >= -8 && r <= e + 8;
326
+ i = Math.min(i, s.points[l]), o = Math.max(o, s.points[l]), a = Math.min(a, s.points[l + 1]), r = Math.max(r, s.points[l + 1]);
327
+ return o >= -8 && i <= t + 8 && r >= -8 && a <= e + 8;
321
328
  }
322
- const Qs = 64;
323
- function tn(s, t) {
329
+ const nn = 64;
330
+ function on(s, t) {
324
331
  if (s.miniature) return null;
325
- const e = Tt(s.subtask.appearance).hatched ? lt + Qe + 1 : 0, i = Math.max(s.mainFrom + e, 0), n = Math.min(s.mainTo - e, t) - i;
326
- return n < Qs ? null : { x: i, width: n, y: s.y, height: s.height };
332
+ const e = It(s.subtask.appearance).hatched ? dt + is + 1 : 0, n = Math.max(s.mainFrom + e, 0), i = Math.min(s.mainTo - e, t) - n;
333
+ return i < nn ? null : { x: n, width: i, y: s.y, height: s.height };
327
334
  }
328
- const en = 10;
329
- function Ae(s, t, e) {
330
- const i = Math.round(t.y + t.height / 2);
331
- return s === "centre" || e.y === t.y ? i : Math.round(e.y > t.y ? t.y + t.height - 1 : t.y + 1);
335
+ const an = 10;
336
+ function Fe(s, t, e) {
337
+ const n = Math.round(t.y + t.height / 2);
338
+ return s === "centre" || e.y === t.y ? n : Math.round(e.y > t.y ? t.y + t.height - 1 : t.y + 1);
332
339
  }
333
- function Yt(s, t, e, i, n) {
334
- const o = t.route ?? n.route, r = t.attach ?? n.attach, a = t.ends ?? n.ends, l = E(s, jt(t, e.subtask)), d = E(s, Zt(t, i.subtask)), h = Ae(r, e, i), c = Ae(r, i, e);
340
+ function Vt(s, t, e, n, i) {
341
+ const o = t.route ?? i.route, a = t.attach ?? i.attach, r = t.ends ?? i.ends, l = B(s, Qt(t, e.subtask)), d = B(s, te(t, n.subtask)), h = Fe(a, e, n), c = Fe(a, n, e);
335
342
  if (o === "straight")
336
- return { dependency: t, kind: o, ends: a, x1: l, y1: h, x2: d, y2: c, c1x: l, c2x: d, points: [l, h, d, c] };
343
+ return { dependency: t, kind: o, ends: r, x1: l, y1: h, x2: d, y2: c, c1x: l, c2x: d, points: [l, h, d, c] };
337
344
  if (o === "orthogonal") {
338
- const I = l + en, L = h === c ? I : Math.round((I + d) / 2);
339
- return { dependency: t, kind: o, ends: a, x1: l, y1: h, x2: d, y2: c, c1x: l, c2x: d, points: h === c ? [l, h, d, c] : [l, h, L, h, L, c, d, c] };
340
- }
341
- const f = Math.max(14, Math.abs(d - l) / 2), g = l + f, w = d - f, A = [];
342
- for (let I = 0; I <= 16; I++) {
343
- const L = I / 16, D = 1 - L;
344
- A.push(
345
- D * D * D * l + 3 * D * D * L * g + 3 * D * L * L * w + L * L * L * d,
346
- D * D * D * h + 3 * D * D * L * h + 3 * D * L * L * c + L * L * L * c
345
+ const C = l + an, A = h === c ? C : Math.round((C + d) / 2);
346
+ return { dependency: t, kind: o, ends: r, x1: l, y1: h, x2: d, y2: c, c1x: l, c2x: d, points: h === c ? [l, h, d, c] : [l, h, A, h, A, c, d, c] };
347
+ }
348
+ const m = Math.max(14, Math.abs(d - l) / 2), k = l + m, f = d - m, v = [];
349
+ for (let C = 0; C <= 16; C++) {
350
+ const A = C / 16, M = 1 - A;
351
+ v.push(
352
+ M * M * M * l + 3 * M * M * A * k + 3 * M * A * A * f + A * A * A * d,
353
+ M * M * M * h + 3 * M * M * A * h + 3 * M * A * A * c + A * A * A * c
347
354
  );
348
355
  }
349
- return { dependency: t, kind: "curve", ends: a, x1: l, y1: h, x2: d, y2: c, c1x: g, c2x: w, points: A };
356
+ return { dependency: t, kind: "curve", ends: r, x1: l, y1: h, x2: d, y2: c, c1x: k, c2x: f, points: v };
350
357
  }
351
- function sn(s, t, e) {
352
- let i = 1 / 0;
353
- const n = s.points;
354
- for (let o = 0; o + 3 < n.length; o += 2) {
355
- const r = n[o], a = n[o + 1], l = n[o + 2], d = n[o + 3], h = l - r, c = d - a, f = h * h + c * c, g = f === 0 ? 0 : Math.max(0, Math.min(1, ((t - r) * h + (e - a) * c) / f));
356
- i = Math.min(i, Math.hypot(t - (r + g * h), e - (a + g * c)));
358
+ function rn(s, t, e) {
359
+ let n = 1 / 0;
360
+ const i = s.points;
361
+ for (let o = 0; o + 3 < i.length; o += 2) {
362
+ const a = i[o], r = i[o + 1], l = i[o + 2], d = i[o + 3], h = l - a, c = d - r, m = h * h + c * c, k = m === 0 ? 0 : Math.max(0, Math.min(1, ((t - a) * h + (e - r) * c) / m));
363
+ n = Math.min(n, Math.hypot(t - (a + k * h), e - (r + k * c)));
357
364
  }
358
- return i;
365
+ return n;
359
366
  }
360
- const ss = [], ns = 56;
361
- function nn(s) {
367
+ const rs = [], ls = 56;
368
+ function ln(s) {
362
369
  return s > 16 ? s / 16 : 1;
363
370
  }
364
- function on(s, t = ns) {
365
- return s > 0 ? Math.min(j, Math.max(15 * X, Ls(s * t, 1))) : 15 * X;
371
+ function dn(s, t = ls) {
372
+ return s > 0 ? Math.min(J, Math.max(15 * Z, _s(s * t, 1))) : 15 * Z;
366
373
  }
367
- const rn = () => new Intl.DateTimeFormat().resolvedOptions().timeZone;
368
- function an(s, t, e = ss, i) {
369
- const [n, o] = is(s, e);
370
- return As(e, n, o, t, 0, i ?? rn()).filter(
371
- (r) => r.workingTime >= s[0] && r.workingTime <= s[1]
374
+ const hn = () => new Intl.DateTimeFormat().resolvedOptions().timeZone;
375
+ function cn(s, t, e = rs, n) {
376
+ const [i, o] = ds(s, e);
377
+ return Os(e, i, o, t, 0, n ?? hn()).filter(
378
+ (a) => a.workingTime >= s[0] && a.workingTime <= s[1]
372
379
  );
373
380
  }
374
- function ln(s, t = ss, e) {
375
- const [i, n] = is(s, t), o = [], { year: r, month: a, day: l } = We(i, e);
376
- let d = l, h = Gt({ year: r, month: a, day: d }, e).getTime();
377
- for (; h < n && o.length < 400; ) {
381
+ function un(s, t = rs, e) {
382
+ const [n, i] = ds(s, t), o = [], { year: a, month: r, day: l } = Qe(n, e);
383
+ let d = l, h = Kt({ year: a, month: r, day: d }, e).getTime();
384
+ for (; h < i && o.length < 400; ) {
378
385
  const c = h;
379
- h = Gt({ year: r, month: a, day: ++d }, e).getTime(), o.push({
386
+ h = Kt({ year: a, month: r, day: ++d }, e).getTime(), o.push({
380
387
  start: c,
381
- from: Y(c, t),
382
- to: Y(h, t)
388
+ from: V(c, t),
389
+ to: V(h, t)
383
390
  });
384
391
  }
385
392
  return o;
386
393
  }
387
- const Nt = [1, 2, 7, 14, 28];
388
- function dn(s, t) {
389
- return Nt.find((e) => e * s >= t) ?? Nt[Nt.length - 1];
394
+ const Pt = [1, 2, 7, 14, 28];
395
+ function fn(s, t) {
396
+ return Pt.find((e) => e * s >= t) ?? Pt[Pt.length - 1];
390
397
  }
391
- function Bt(s, t, e) {
392
- return ((Math.round((s - Ke(s, e)) / j) - 4) % t + t) % t === 0;
398
+ function Gt(s, t, e) {
399
+ return ((Math.round((s - je(s, e)) / J) - 4) % t + t) % t === 0;
393
400
  }
394
- function et(s, t) {
401
+ function j(s, t) {
395
402
  const e = s.time(new Date(t), !1);
396
- return Cs(t, s.timeZone) ? `${e} ${s.offset(new Date(t))}` : e;
403
+ return Fs(t, s.timeZone) ? `${e} ${s.offset(new Date(t))}` : e;
397
404
  }
398
- function hn(s, t, e, i) {
399
- const n = s[1] - s[0];
400
- if (!(n > 0)) return [s[0], s[1]];
401
- const o = Math.min(i.max, Math.max(i.min, n * e)), r = (t - s[0]) / n, a = t - r * o;
402
- return [a, a + o];
405
+ function mn(s, t, e, n) {
406
+ const i = s[1] - s[0];
407
+ if (!(i > 0)) return [s[0], s[1]];
408
+ const o = Math.min(n.max, Math.max(n.min, i * e)), a = (t - s[0]) / i, r = t - a * o;
409
+ return [r, r + o];
403
410
  }
404
- function cn(s, t) {
411
+ function pn(s, t) {
405
412
  return [s[0] + t, s[1] + t];
406
413
  }
407
414
  function ut(s, t) {
408
- const e = bt(t);
409
- return e.intervals.length === 0 ? s : Wt(Math.max(0, Math.min(e.total, s)), e);
415
+ const e = Tt(t);
416
+ return e.intervals.length === 0 ? s : qt(Math.max(0, Math.min(e.total, s)), e);
410
417
  }
411
- function is(s, t) {
418
+ function ds(s, t) {
412
419
  return [ut(s[0], t), ut(s[1], t)];
413
420
  }
414
- const Kt = 44;
415
- class un {
421
+ const zt = 44;
422
+ class gn {
416
423
  constructor(t) {
417
424
  this.data = t;
418
425
  }
419
426
  options = {
420
- laneHeight: Kt,
427
+ laneHeight: zt,
421
428
  calendar: [],
422
- zoomLimits: { min: Ut, max: 28 * j },
429
+ zoomLimits: { min: jt, max: 28 * J },
423
430
  snap: "ticks",
424
431
  intents: [],
425
432
  now: null,
@@ -429,14 +436,14 @@ class un {
429
436
  };
430
437
  /** The root font size over 16 px, 1 at the default size and below (`fontScaleOf`). */
431
438
  fontScale = 1;
432
- domain = [0, j];
439
+ domain = [0, J];
433
440
  scrollY = 0;
434
441
  width = 0;
435
442
  height = 0;
436
443
  /* What is laid out from top to bottom (`rows.ts`). It is derived here and
437
444
  not in the data, because a row's height comes from a view option; every y
438
445
  in the package reads it. */
439
- rows = Te({ lanes: [], groups: [], collapsed: /* @__PURE__ */ new Set(), laneHeight: Kt });
446
+ rows = Ae({ lanes: [], groups: [], collapsed: /* @__PURE__ */ new Set(), laneHeight: zt });
440
447
  /** The folded groups, as the scene holds them. */
441
448
  collapsed = /* @__PURE__ */ new Set();
442
449
  /** The groups a gesture in flight holds open. Dropped when it ends; the
@@ -470,22 +477,22 @@ class un {
470
477
  }
471
478
  /** Takes new options; a new calendar keeps the wall-clock span in view. */
472
479
  setOptions(t) {
473
- const e = t.calendar !== this.options.calendar, i = this.options.calendar;
480
+ const e = t.calendar !== this.options.calendar, n = this.options.calendar;
474
481
  if (this.options = t, e) {
475
- const n = bt(i), o = (r) => {
476
- const a = n.intervals.length === 0 ? r : Math.max(0, Math.min(n.total, r));
477
- return Y(Wt(a, n), t.calendar) + (r - a);
482
+ const i = Tt(n), o = (a) => {
483
+ const r = i.intervals.length === 0 ? a : Math.max(0, Math.min(i.total, a));
484
+ return V(qt(r, i), t.calendar) + (a - r);
478
485
  };
479
486
  this.domain = [o(this.domain[0]), o(this.domain[1])];
480
487
  }
481
488
  }
482
489
  /** Puts a span of two wall-clock instants in view. */
483
490
  showWall(t) {
484
- this.domain = [Y(t[0], this.options.calendar), Y(t[1], this.options.calendar)];
491
+ this.domain = [V(t[0], this.options.calendar), V(t[1], this.options.calendar)];
485
492
  }
486
493
  viewport() {
487
494
  return {
488
- scale: new Ds(this.domain, [0, this.width]),
495
+ scale: new $s(this.domain, [0, this.width]),
489
496
  calendar: this.options.calendar,
490
497
  scrollY: this.scrollY,
491
498
  rows: this.rows
@@ -501,42 +508,42 @@ class un {
501
508
  /** The fine band's step at the current zoom. */
502
509
  step() {
503
510
  const t = this.domain[1] - this.domain[0];
504
- return on(this.width > 0 ? t / this.width : t, ns * this.fontScale);
511
+ return dn(this.width > 0 ? t / this.width : t, ls * this.fontScale);
505
512
  }
506
513
  /** Lays the rows out, clamps the scroll, and lays the data out anew. */
507
514
  layout() {
508
- this.moved = !1, this.rows = Te({
515
+ this.moved = !1, this.rows = Ae({
509
516
  lanes: this.data.lanes,
510
517
  groups: this.data.groups,
511
- collapsed: Us(this.collapsed, this.openForGesture),
518
+ collapsed: Js(this.collapsed, this.openForGesture),
512
519
  laneHeight: Math.round(this.options.laneHeight * this.fontScale),
513
- headHeight: Math.round(Je * this.fontScale)
520
+ headHeight: Math.round(ns * this.fontScale)
514
521
  }), this.scrollY = Math.max(0, Math.min(this.maxScroll(), this.scrollY));
515
522
  const t = this.viewport();
516
523
  this.laidBoxes = [], this.laidBoxById = /* @__PURE__ */ new Map();
517
524
  for (const e of this.data.subtasks) {
518
- const i = ee(this.rows, e.lane);
519
- if (i === null) continue;
520
- const n = ts(t, e, i, this.data.depth.get(e.id) ?? 0);
521
- this.laidBoxes.push(n), this.laidBoxById.set(e.id, n);
525
+ const n = oe(this.rows, e.lane);
526
+ if (n === null) continue;
527
+ const i = os(t, e, n, this.data.depth.get(e.id) ?? 0);
528
+ this.laidBoxes.push(i), this.laidBoxById.set(e.id, i);
522
529
  }
523
530
  this.laidPaths = [];
524
531
  for (const e of this.data.dependencies) {
525
- const i = this.boxById.get(e.from), n = this.boxById.get(e.to);
526
- i === void 0 || n === void 0 || this.laidPaths.push(Yt(t, e, i, n, this.options));
532
+ const n = this.boxById.get(e.from), i = this.boxById.get(e.to);
533
+ n === void 0 || i === void 0 || this.laidPaths.push(Vt(t, e, n, i, this.options));
527
534
  }
528
535
  }
529
536
  /** The days of the coarse band and the ticks of the fine band, in pixels. */
530
537
  bands() {
531
538
  const t = this.step();
532
539
  if (this.width <= 0) return { days: [], ticks: [], step: t };
533
- const e = this.viewport().scale, i = this.options.calendar;
540
+ const e = this.viewport().scale, n = this.options.calendar;
534
541
  return {
535
- days: ln(this.domain, i, this.options.timeZone).map((n) => {
536
- const o = Math.round(e.toPx(n.from));
537
- return { start: n.start, x: o, width: Math.round(e.toPx(n.to)) - o };
542
+ days: un(this.domain, n, this.options.timeZone).map((i) => {
543
+ const o = Math.round(e.toPx(i.from));
544
+ return { start: i.start, x: o, width: Math.round(e.toPx(i.to)) - o };
538
545
  }),
539
- ticks: an(this.domain, t, i, this.options.timeZone).map((n) => ({ wallClock: n.wallClock, x: Math.round(e.toPx(n.workingTime)) })),
546
+ ticks: cn(this.domain, t, n, this.options.timeZone).map((i) => ({ wallClock: i.wallClock, x: Math.round(e.toPx(i.workingTime)) })),
540
547
  step: t
541
548
  };
542
549
  }
@@ -544,27 +551,27 @@ class un {
544
551
  nowX() {
545
552
  const t = this.options.now;
546
553
  if (t === null || this.width <= 0) return null;
547
- const e = Math.round(this.viewport().scale.toPx(Y(t, this.options.calendar)));
554
+ const e = Math.round(this.viewport().scale.toPx(V(t, this.options.calendar)));
548
555
  return e >= 0 && e <= this.width ? e : null;
549
556
  }
550
557
  hitAt(t, e) {
551
- const i = this.viewport();
552
- for (let a = this.data.milestones.length - 1; a >= 0; a--) {
553
- const l = this.data.milestones[a], d = se(i, l);
558
+ const n = this.viewport();
559
+ for (let r = this.data.milestones.length - 1; r >= 0; r--) {
560
+ const l = this.data.milestones[r], d = ae(n, l);
554
561
  if (d !== null && Math.abs(t - d.x) + Math.abs(e - d.y) <= d.half + 2) return { kind: "milestone", milestone: l };
555
562
  }
556
- for (let a = this.boxes.length - 1; a >= 0; a--) {
557
- const l = this.boxes[a], d = es(l, t, e);
563
+ for (let r = this.boxes.length - 1; r >= 0; r--) {
564
+ const l = this.boxes[r], d = as(l, t, e);
558
565
  if (d !== null) return { kind: "subtask", subtask: l.subtask, part: d };
559
566
  }
560
- let n = null, o = 4;
561
- for (const a of this.paths) {
562
- const l = sn(a, t, e);
563
- l <= o && (o = l, n = a);
567
+ let i = null, o = 4;
568
+ for (const r of this.paths) {
569
+ const l = rn(r, t, e);
570
+ l <= o && (o = l, i = r);
564
571
  }
565
- if (n !== null) return { kind: "dependency", dependency: n.dependency };
566
- const r = Le(this.viewport(), e);
567
- return r !== null ? { kind: "lane", lane: r } : { kind: "nothing" };
572
+ if (i !== null) return { kind: "dependency", dependency: i.dependency };
573
+ const a = Oe(this.viewport(), e);
574
+ return a !== null ? { kind: "lane", lane: a } : { kind: "nothing" };
568
575
  }
569
576
  /** The wall-clock time at a plot x; within the calendar's extent. */
570
577
  timeAt(t) {
@@ -578,7 +585,7 @@ class un {
578
585
  `foldedGroupAt` - and a caller that reached through `viewport()` for it
579
586
  would be depending on the layout rather than asking the view. */
580
587
  laneIdAt(t) {
581
- return Le(this.viewport(), t);
588
+ return Oe(this.viewport(), t);
582
589
  }
583
590
  /** The lane a DROP at this y would land on.
584
591
 
@@ -588,478 +595,552 @@ class un {
588
595
  aim at. Hover, the tooltip and selection do read a strip - they cost
589
596
  nothing if they are a pixel out. */
590
597
  dropLaneIdAt(t) {
591
- const e = nt(this.rows, t + this.scrollY);
598
+ const e = ot(this.rows, t + this.scrollY);
592
599
  return e === null || e.kind !== "lane" ? null : e.lane ?? null;
593
600
  }
594
601
  /** The folded group a y lies over, or null. */
595
602
  foldedGroupAt(t) {
596
- const e = nt(this.rows, t + this.scrollY);
603
+ const e = ot(this.rows, t + this.scrollY);
597
604
  return e !== null && e.kind === "miniature" ? e.group ?? null : null;
598
605
  }
599
606
  /** Pans by pixels. Says what moved: the span through time, the lanes, or
600
607
  neither - a scroll through the lanes is no news about the time. */
601
608
  pan(t, e) {
602
- const i = this.domain[0], n = this.scrollY, o = this.domain[1] - i;
603
- this.width > 0 && t !== 0 && (this.domain = cn(this.domain, t / this.width * o)), this.scrollY = Math.max(0, Math.min(this.maxScroll(), this.scrollY + e));
604
- const r = this.domain[0] !== i;
605
- return { moved: r || this.scrollY !== n, time: r };
609
+ const n = this.domain[0], i = this.scrollY, o = this.domain[1] - n;
610
+ this.width > 0 && t !== 0 && (this.domain = pn(this.domain, t / this.width * o)), this.scrollY = Math.max(0, Math.min(this.maxScroll(), this.scrollY + e));
611
+ const a = this.domain[0] !== n;
612
+ return { moved: a || this.scrollY !== i, time: a };
606
613
  }
607
614
  /** Zooms around a plot x; says whether the span changed. */
608
615
  zoomAt(t, e) {
609
616
  if (this.width <= 0 || !Number.isFinite(e)) return !1;
610
- const i = this.domain, n = this.viewport().scale.fromPx(t);
611
- return this.domain = hn(this.domain, n, e, this.options.zoomLimits), i[0] !== this.domain[0] || i[1] !== this.domain[1];
612
- }
613
- }
614
- const fn = "_root_q0w8s_4 _text_18806_22", mn = "_corner_q0w8s_19", pn = "_zoneLabel_q0w8s_24", gn = "_dayBand_q0w8s_40", kn = "_tickBand_q0w8s_41", wn = "_day_q0w8s_40", vn = "_dayLabel_q0w8s_67", yn = "_tick_q0w8s_41", bn = "_tickLabel_q0w8s_88", Mn = "_headers_q0w8s_98", Tn = "_header_q0w8s_98", Sn = "_headerLabel_q0w8s_117", In = "_headerCount_q0w8s_153", Ln = "_chevron_q0w8s_162", An = "_plot_q0w8s_240", Cn = "_focusRing_q0w8s_254", Dn = "_layer_q0w8s_272", _n = "_grip_q0w8s_299", On = "_ghostLabel_q0w8s_309", Fn = "_finding_q0w8s_322", $n = "_refusal_q0w8s_330", En = "_tooltip_q0w8s_334", xn = "_tooltipHead_q0w8s_353", Rn = "_tooltipTimes_q0w8s_358", Nn = "_now_q0w8s_367", Bn = "_barLabel_q0w8s_381", Pn = "_barLabelText_q0w8s_394", p = {
615
- root: fn,
616
- corner: mn,
617
- zoneLabel: pn,
618
- dayBand: gn,
619
- tickBand: kn,
620
- day: wn,
621
- dayLabel: vn,
622
- tick: yn,
623
- tickLabel: bn,
624
- headers: Mn,
625
- header: Tn,
626
- headerLabel: Sn,
627
- headerCount: In,
628
- chevron: Ln,
629
- plot: An,
630
- focusRing: Cn,
631
- layer: Dn,
632
- grip: _n,
633
- ghostLabel: On,
634
- finding: Fn,
635
- refusal: $n,
636
- tooltip: En,
637
- tooltipHead: xn,
638
- tooltipTimes: Rn,
639
- now: Nn,
640
- barLabel: Bn,
641
- barLabelText: Pn
617
+ const n = this.domain, i = this.viewport().scale.fromPx(t);
618
+ return this.domain = mn(this.domain, i, e, this.options.zoomLimits), n[0] !== this.domain[0] || n[1] !== this.domain[1];
619
+ }
620
+ }
621
+ const kn = "_root_9ariw_4 _text_18806_22", wn = "_corner_9ariw_19", vn = "_zoneLabel_9ariw_24", yn = "_dayBand_9ariw_43", bn = "_headers_9ariw_48", Mn = "_plot_9ariw_53", Tn = "_cornerBottom_9ariw_58", Sn = "_tickBand_9ariw_63", In = "_dataKey_9ariw_69", Ln = "_dataPanel_9ariw_100", Cn = "_dataTable_9ariw_119", An = "_day_9ariw_43", Dn = "_dayLabel_9ariw_179", _n = "_tick_9ariw_63", On = "_tickLabel_9ariw_200", Fn = "_header_9ariw_48", $n = "_headerLabel_9ariw_229", En = "_headerCount_9ariw_265", Bn = "_chevron_9ariw_274", xn = "_focusRing_9ariw_372", Nn = "_layer_9ariw_390", Rn = "_grip_9ariw_417", Pn = "_ghostLabel_9ariw_427", Gn = "_finding_9ariw_440", Hn = "_refusal_9ariw_448", Kn = "_tooltip_9ariw_452", Yn = "_tooltipHead_9ariw_471", Vn = "_tooltipTimes_9ariw_476", zn = "_now_9ariw_485", Wn = "_barLabel_9ariw_499", Un = "_barLabelText_9ariw_512", g = {
622
+ root: kn,
623
+ corner: wn,
624
+ zoneLabel: vn,
625
+ dayBand: yn,
626
+ headers: bn,
627
+ plot: Mn,
628
+ cornerBottom: Tn,
629
+ tickBand: Sn,
630
+ dataKey: In,
631
+ dataPanel: Ln,
632
+ dataTable: Cn,
633
+ day: An,
634
+ dayLabel: Dn,
635
+ tick: _n,
636
+ tickLabel: On,
637
+ header: Fn,
638
+ headerLabel: $n,
639
+ headerCount: En,
640
+ chevron: Bn,
641
+ focusRing: xn,
642
+ layer: Nn,
643
+ grip: Rn,
644
+ ghostLabel: Pn,
645
+ finding: Gn,
646
+ refusal: Hn,
647
+ tooltip: Kn,
648
+ tooltipHead: Yn,
649
+ tooltipTimes: Vn,
650
+ now: zn,
651
+ barLabel: Wn,
652
+ barLabelText: Un
642
653
  };
643
- function os() {
644
- const s = Mt();
654
+ function re() {
655
+ const s = mt();
645
656
  return (t) => {
646
- const e = Math.round(t / X), i = Math.floor(e / 60), n = e % 60;
647
- return [i > 0 ? s.hoursShort(i) : "", n > 0 || i === 0 ? s.minutesShort(n) : ""].filter(Boolean).join(" ");
657
+ const e = Math.round(t / Z), n = Math.floor(e / 60), i = e % 60;
658
+ return [n > 0 ? s.hoursShort(n) : "", i > 0 || n === 0 ? s.minutesShort(i) : ""].filter(Boolean).join(" ");
648
659
  };
649
660
  }
650
- function Gn({ target: s, lane: t }) {
651
- const e = Xt(), i = Mt(), n = os(), o = (c) => et(e, c);
661
+ function Xn({ target: s, lane: t }) {
662
+ const e = St(), n = mt(), i = re(), o = (c) => j(e, c);
652
663
  if (s.kind === "subtask") {
653
- const { subtask: c, task: f } = s, g = [
654
- f?.name ?? c.task,
664
+ const { subtask: c, task: m } = s, k = [
665
+ m?.name ?? c.task,
655
666
  c.name ?? c.id,
656
- `${e.dateShort(new Date(c.from))} ${i.scheduleGhostTimes(o(c.from), o(c.to))}`,
657
- ...s.overlapping.map((w) => i.scheduleOverlapWith(w.name ?? w.id)),
658
- ...s.violatedDependencies.map((w) => i.scheduleViolatedBy(n(w.shortBy))),
659
- ...s.blocked.map((w) => i.scheduleInBlockedTime(w.label))
667
+ `${e.dateShort(new Date(c.from))} ${n.scheduleGhostTimes(o(c.from), o(c.to))}`,
668
+ ...s.overlapping.map((f) => n.scheduleOverlapWith(f.name ?? f.id)),
669
+ ...s.violatedDependencies.map((f) => n.scheduleViolatedBy(i(f.shortBy))),
670
+ ...s.blocked.map((f) => n.scheduleInBlockedTime(f.label))
660
671
  ];
661
- return /* @__PURE__ */ B(ht, { children: [
672
+ return /* @__PURE__ */ E(it, { children: [
662
673
  t,
663
- `, ${g.join(", ")}`
674
+ `, ${k.join(", ")}`
664
675
  ] });
665
676
  }
666
677
  if (s.kind === "milestone") {
667
678
  const { milestone: c } = s;
668
- return /* @__PURE__ */ B(ht, { children: [
679
+ return /* @__PURE__ */ E(it, { children: [
669
680
  t,
670
- `, ${i.scheduleMilestone(c.label ?? c.id)}, ${e.dateShort(new Date(c.at))} ${o(c.at)}`
681
+ `, ${n.scheduleMilestone(c.label ?? c.id)}, ${e.dateShort(new Date(c.at))} ${o(c.at)}`
671
682
  ] });
672
683
  }
673
- const { dependency: r, task: a, from: l, to: d, violated: h } = s;
684
+ const { dependency: a, task: r, from: l, to: d, violated: h } = s;
674
685
  return [
675
- a?.name ?? a?.id ?? r.id,
676
- `${i.scheduleDependency} ${n(r.lag)}`,
677
- i.scheduleRoute(l?.name ?? r.from, d?.name ?? r.to),
678
- ...h === void 0 ? [] : [i.scheduleViolatedBy(n(h.shortBy))]
686
+ r?.name ?? r?.id ?? a.id,
687
+ `${n.scheduleDependency} ${i(a.lag)}`,
688
+ n.scheduleRoute(l?.name ?? a.from, d?.name ?? a.to),
689
+ ...h === void 0 ? [] : [n.scheduleViolatedBy(i(h.shortBy))]
679
690
  ].join(", ");
680
691
  }
681
- function Hn({ target: s }) {
682
- const t = Xt(), e = Mt(), i = (h) => et(t, h), n = os();
692
+ function qn({ target: s }) {
693
+ const t = St(), e = mt(), n = (h) => j(t, h), i = re();
683
694
  if (s.kind === "subtask") {
684
695
  const { subtask: h, task: c } = s;
685
- return /* @__PURE__ */ B(ht, { children: [
686
- /* @__PURE__ */ m("span", { className: p.tooltipHead, children: c?.name ?? h.task }),
687
- /* @__PURE__ */ m("span", { children: h.name ?? h.id }),
688
- /* @__PURE__ */ m("span", { className: p.tooltipTimes, children: e.scheduleGhostTimes(i(h.from), i(h.to)) }),
689
- (h.leadIn ?? 0) > 0 && /* @__PURE__ */ m("span", { children: `${e.scheduleLeadIn} ${n(h.leadIn)}` }),
690
- (h.leadOut ?? 0) > 0 && /* @__PURE__ */ m("span", { children: `${e.scheduleLeadOut} ${n(h.leadOut)}` }),
691
- s.overlapping.map((f) => /* @__PURE__ */ m("span", { className: p.finding, children: e.scheduleOverlapWith(f.name ?? f.id) }, f.id)),
692
- s.violatedDependencies.map((f) => /* @__PURE__ */ m("span", { className: p.finding, children: e.scheduleViolatedBy(n(f.shortBy)) }, f.dependency)),
693
- s.blocked.map((f) => /* @__PURE__ */ m("span", { className: p.finding, children: e.scheduleInBlockedTime(f.label) }, f.id))
696
+ return /* @__PURE__ */ E(it, { children: [
697
+ /* @__PURE__ */ p("span", { className: g.tooltipHead, children: c?.name ?? h.task }),
698
+ /* @__PURE__ */ p("span", { children: h.name ?? h.id }),
699
+ /* @__PURE__ */ p("span", { className: g.tooltipTimes, children: e.scheduleGhostTimes(n(h.from), n(h.to)) }),
700
+ (h.leadIn ?? 0) > 0 && /* @__PURE__ */ p("span", { children: `${e.scheduleLeadIn} ${i(h.leadIn)}` }),
701
+ (h.leadOut ?? 0) > 0 && /* @__PURE__ */ p("span", { children: `${e.scheduleLeadOut} ${i(h.leadOut)}` }),
702
+ s.overlapping.map((m) => /* @__PURE__ */ p("span", { className: g.finding, children: e.scheduleOverlapWith(m.name ?? m.id) }, m.id)),
703
+ s.violatedDependencies.map((m) => /* @__PURE__ */ p("span", { className: g.finding, children: e.scheduleViolatedBy(i(m.shortBy)) }, m.dependency)),
704
+ s.blocked.map((m) => /* @__PURE__ */ p("span", { className: g.finding, children: e.scheduleInBlockedTime(m.label) }, m.id))
694
705
  ] });
695
706
  }
696
707
  if (s.kind === "milestone") {
697
708
  const { milestone: h } = s;
698
- return /* @__PURE__ */ B(ht, { children: [
699
- /* @__PURE__ */ m("span", { className: p.tooltipHead, children: e.scheduleMilestone(h.label ?? h.id) }),
700
- /* @__PURE__ */ m("span", { className: p.tooltipTimes, children: `${t.dateShort(new Date(h.at))} ${i(h.at)}` })
709
+ return /* @__PURE__ */ E(it, { children: [
710
+ /* @__PURE__ */ p("span", { className: g.tooltipHead, children: e.scheduleMilestone(h.label ?? h.id) }),
711
+ /* @__PURE__ */ p("span", { className: g.tooltipTimes, children: `${t.dateShort(new Date(h.at))} ${n(h.at)}` })
701
712
  ] });
702
713
  }
703
- const { dependency: o, task: r, from: a, to: l, violated: d } = s;
704
- return /* @__PURE__ */ B(ht, { children: [
705
- /* @__PURE__ */ m("span", { className: p.tooltipHead, children: r?.name ?? r?.id ?? o.id }),
706
- /* @__PURE__ */ m("span", { children: e.scheduleRoute(a?.name ?? o.from, l?.name ?? o.to) }),
707
- /* @__PURE__ */ m("span", { children: `${e.scheduleDependency} ${n(o.lag)}` }),
708
- d !== void 0 && /* @__PURE__ */ m("span", { className: p.finding, children: e.scheduleViolatedBy(n(d.shortBy)) })
714
+ const { dependency: o, task: a, from: r, to: l, violated: d } = s;
715
+ return /* @__PURE__ */ E(it, { children: [
716
+ /* @__PURE__ */ p("span", { className: g.tooltipHead, children: a?.name ?? a?.id ?? o.id }),
717
+ /* @__PURE__ */ p("span", { children: e.scheduleRoute(r?.name ?? o.from, l?.name ?? o.to) }),
718
+ /* @__PURE__ */ p("span", { children: `${e.scheduleDependency} ${i(o.lag)}` }),
719
+ d !== void 0 && /* @__PURE__ */ p("span", { className: g.finding, children: e.scheduleViolatedBy(i(d.shortBy)) })
709
720
  ] });
710
721
  }
711
- const Yn = [], Ce = { min: Ut, max: 28 * j }, Kn = [], De = 20, Vn = 44, qn = 84, zn = 200;
712
- function Wn(s) {
722
+ const jn = [], $e = { min: jt, max: 28 * J }, Zn = [], Ee = 20, Jn = 44, Qn = 84, ti = 200;
723
+ function ei(s) {
713
724
  const {
714
725
  ref: t,
715
726
  scene: e,
716
- "aria-label": i,
717
- "aria-labelledby": n,
727
+ "aria-label": n,
728
+ "aria-labelledby": i,
718
729
  "aria-describedby": o,
719
- height: r,
720
- laneHeight: a = Kt,
730
+ height: a,
731
+ laneHeight: r = zt,
721
732
  headerWidth: l = 160,
722
- calendar: d = Kn,
733
+ calendar: d = Zn,
723
734
  zoomLimits: h,
724
735
  snap: c = "ticks",
725
- intents: f = Yn,
726
- onIntent: g,
727
- canMoveTo: w,
728
- onInteraction: A,
729
- selectedTask: I,
730
- onSelectedTaskChange: L,
731
- placing: D,
732
- route: y = "curve",
733
- attach: M = "centre",
734
- ends: T = "dot",
736
+ intents: m = jn,
737
+ onIntent: k,
738
+ canMoveTo: f,
739
+ onInteraction: v,
740
+ selectedTask: C,
741
+ onSelectedTaskChange: A,
742
+ placing: M,
743
+ route: b = "curve",
744
+ attach: S = "centre",
745
+ ends: I = "dot",
735
746
  label: F,
736
747
  tooltip: O,
737
748
  now: R,
738
- loading: U = !1,
739
- className: pt,
740
- style: gt,
741
- children: ms,
742
- ...ps
743
- } = s, ie = { "aria-label": i, "aria-labelledby": n }, It = $s(), Lt = `${It}-summary`, At = V(null), oe = V(null), re = V(null), ae = V(null), H = Xt(), N = Mt(), ot = H.timeZone, kt = Rs(), le = h?.min ?? Ce.min, de = h?.max ?? Ce.max, he = typeof c == "object" ? c.step : null, ce = typeof c == "object" ? c.offset : null, ue = typeof c == "object" ? null : c, [gs, ks] = dt(() => Date.now());
744
- q(() => {
749
+ loading: q = !1,
750
+ className: gt,
751
+ style: kt,
752
+ children: ws,
753
+ ...vs
754
+ } = s, de = { "aria-label": n, "aria-labelledby": i }, Ct = Je(), At = `${Ct}-summary`, Dt = W(null), he = W(null), ce = W(null), ue = W(null), K = St(), x = mt(), at = K.timeZone, wt = Ps(), fe = h?.min ?? $e.min, me = h?.max ?? $e.max, pe = typeof c == "object" ? c.step : null, ge = typeof c == "object" ? c.offset : null, ke = typeof c == "object" ? null : c, [ys, bs] = ht(() => Date.now());
755
+ Y(() => {
745
756
  if (R !== !0) return;
746
- const u = setInterval(() => ks(Date.now()), X);
757
+ const u = setInterval(() => bs(Date.now()), Z);
747
758
  return () => clearInterval(u);
748
759
  }, [R]);
749
- const fe = R === !0 ? gs : typeof R == "number" ? R : null;
750
- wt(() => {
751
- const u = ue ?? { step: he ?? 0, offset: ce ?? 0 };
752
- e.setOptions({ laneHeight: a, calendar: d, zoomLimits: { min: le, max: de }, snap: u, intents: f, now: fe, timeZone: ot, route: y, attach: M, ends: T });
753
- }, [e, a, d, le, de, ue, he, ce, f, fe, ot, y, M, T]), q(() => {
754
- e.setHandlers({ onIntent: g, canMoveTo: w, onInteraction: A, onSelectedTaskChange: L });
755
- }, [e, g, w, A, L]), Es(t, () => At.current, []), q(() => {
756
- e.setLoading(U);
757
- }, [e, U]), q(() => {
758
- e.setControlledTask(I);
759
- }, [e, I]), q(() => {
760
- e.setPlacing(D ?? null);
761
- }, [e, D]), q(() => {
762
- const u = At.current, v = oe.current, S = re.current, $ = ae.current;
763
- if (!u || !v || !S || !$) return;
764
- e.bind(u, v, S, $);
765
- const C = v.getBoundingClientRect();
766
- e.resize(C.width, C.height);
767
- const _ = new ResizeObserver((K) => {
768
- const xt = K[K.length - 1]?.contentRect;
769
- xt !== void 0 && e.resize(xt.width, xt.height);
760
+ const we = R === !0 ? ys : typeof R == "number" ? R : null;
761
+ yt(() => {
762
+ const u = ke ?? { step: pe ?? 0, offset: ge ?? 0 };
763
+ e.setOptions({ laneHeight: r, calendar: d, zoomLimits: { min: fe, max: me }, snap: u, intents: m, now: we, timeZone: at, route: b, attach: S, ends: I });
764
+ }, [e, r, d, fe, me, ke, pe, ge, m, we, at, b, S, I]), Y(() => {
765
+ e.setHandlers({ onIntent: k, canMoveTo: f, onInteraction: v, onSelectedTaskChange: A });
766
+ }, [e, k, f, v, A]), Ns(t, () => Dt.current, []), Y(() => {
767
+ e.setLoading(q);
768
+ }, [e, q]), Y(() => {
769
+ e.setControlledTask(C);
770
+ }, [e, C]), Y(() => {
771
+ e.setPlacing(M ?? null);
772
+ }, [e, M]), Y(() => {
773
+ const u = Dt.current, y = he.current, L = ce.current, $ = ue.current;
774
+ if (!u || !y || !L || !$) return;
775
+ e.bind(u, y, L, $);
776
+ const D = y.getBoundingClientRect();
777
+ e.resize(D.width, D.height);
778
+ const _ = new ResizeObserver((z) => {
779
+ const Nt = z[z.length - 1]?.contentRect;
780
+ Nt !== void 0 && e.resize(Nt.width, Nt.height);
770
781
  });
771
- _.observe(v);
772
- const x = document.createElement("div");
773
- x.setAttribute("aria-hidden", "true"), x.style.cssText = "position:absolute;visibility:hidden;pointer-events:none;width:1rem;height:0", u.appendChild(x);
774
- const P = () => e.setFontScale(nn(parseFloat(getComputedStyle(x).width)));
775
- P();
776
- const G = new ResizeObserver(P);
777
- G.observe(x);
778
- const tt = (K) => e.wheel(K);
779
- u.addEventListener("wheel", tt, { passive: !1 });
780
- const ve = (K) => e.touchMove(K);
781
- u.addEventListener("touchmove", ve, { passive: !1 });
782
- const ye = (K) => {
783
- K.key === "Escape" && e.cancelEdit() && K.preventDefault();
782
+ _.observe(y);
783
+ const N = document.createElement("div");
784
+ N.setAttribute("aria-hidden", "true"), N.style.cssText = "position:absolute;visibility:hidden;pointer-events:none;width:1rem;height:0", u.appendChild(N);
785
+ const G = () => e.setFontScale(ln(parseFloat(getComputedStyle(N).width)));
786
+ G();
787
+ const H = new ResizeObserver(G);
788
+ H.observe(N);
789
+ const st = (z) => e.wheel(z);
790
+ u.addEventListener("wheel", st, { passive: !1 });
791
+ const Se = (z) => e.touchMove(z);
792
+ u.addEventListener("touchmove", Se, { passive: !1 });
793
+ const Ie = (z) => {
794
+ z.key === "Escape" && e.cancelEdit() && z.preventDefault();
784
795
  };
785
- return window.addEventListener("keydown", ye), () => {
786
- window.removeEventListener("keydown", ye), u.removeEventListener("wheel", tt), u.removeEventListener("touchmove", ve), _.disconnect(), G.disconnect(), x.remove(), e.unbind();
796
+ return window.addEventListener("keydown", Ie), () => {
797
+ window.removeEventListener("keydown", Ie), u.removeEventListener("wheel", st), u.removeEventListener("touchmove", Se), _.disconnect(), H.disconnect(), N.remove(), e.unbind();
787
798
  };
788
799
  }, [e]);
789
- const k = ze(e.subscribe, e.getSnapshot, e.getServerSnapshot), { fontScale: rt } = k, Ct = Vn * rt, ws = qn * rt, vs = zn * rt, ys = (u, v) => {
790
- const S = new Date(u);
791
- return v >= vs ? H.dateLong(S) : v >= ws ? H.date(S) : v >= Ct ? H.dateShort(S) : "";
792
- }, bs = k.days.reduce((u, v) => Math.max(u, v.width), 0), J = dn(bs, Ct), me = k.step >= j ? J : 1, b = k.ghost, Q = k.spoken, Dt = k.summary, pe = (u) => `${H.dateShort(new Date(u))} ${et(H, u)}`, _t = (u) => `${It}-row-${encodeURIComponent(u.key)}`, Ms = z(() => {
800
+ const w = Jt(e.subscribe, e.getSnapshot, e.getServerSnapshot), { fontScale: rt } = w, _t = Jn * rt, Ms = Qn * rt, Ts = ti * rt, Ss = (u, y) => {
801
+ const L = new Date(u);
802
+ return y >= Ts ? K.dateLong(L) : y >= Ms ? K.date(L) : y >= _t ? K.dateShort(L) : "";
803
+ }, Is = w.days.reduce((u, y) => Math.max(u, y.width), 0), et = fn(Is, _t), ve = w.step >= J ? et : 1, ye = w.dataTable?.open === !0, T = w.ghost, P = w.spoken, Ot = w.summary, vt = (u) => `${K.dateShort(new Date(u))} ${j(K, u)}`, Ft = (u) => `${Ct}-row-${encodeURIComponent(u.key)}`, Ls = U(() => {
793
804
  const u = /* @__PURE__ */ new Map();
794
- for (const v of k.headers)
795
- for (const S of v.within)
796
- v.kind === "groupHead" && S === v.group || u.set(S, [...u.get(S) ?? [], _t(v)]);
805
+ for (const y of w.headers)
806
+ for (const L of y.within)
807
+ y.kind === "groupHead" && L === y.group || u.set(L, [...u.get(L) ?? [], Ft(y)]);
797
808
  return u;
798
- }, [k.headers, It]), ge = V(null);
799
- wt(() => {
800
- const u = ge.current;
809
+ }, [w.headers, Ct]), be = W(null);
810
+ yt(() => {
811
+ const u = be.current;
801
812
  if (u === null) return;
802
- let v = !0;
803
- const S = () => {
804
- if (!v) return;
813
+ let y = !0;
814
+ const L = () => {
815
+ if (!y) return;
805
816
  const _ = [...u.querySelectorAll("[data-lane-count]")];
806
- for (const P of _) P.hidden = !1;
807
- const x = _.some((P) => {
808
- const G = P.previousElementSibling;
809
- if (!(G instanceof HTMLElement)) return !1;
810
- const tt = parseFloat(getComputedStyle(G).lineHeight);
811
- return G.scrollWidth > G.clientWidth || G.clientHeight > tt * 1.5;
817
+ for (const G of _) G.hidden = !1;
818
+ const N = _.some((G) => {
819
+ const H = G.previousElementSibling;
820
+ if (!(H instanceof HTMLElement)) return !1;
821
+ const st = parseFloat(getComputedStyle(H).lineHeight);
822
+ return H.scrollWidth > H.clientWidth || H.clientHeight > st * 1.5;
812
823
  });
813
- for (const P of _) P.hidden = x;
824
+ for (const G of _) G.hidden = N;
814
825
  };
815
- S(), document.fonts?.ready.then(S);
816
- const $ = new ResizeObserver(S);
826
+ L(), document.fonts?.ready.then(L);
827
+ const $ = new ResizeObserver(L);
817
828
  $.observe(u);
818
- const C = new MutationObserver(S);
819
- return C.observe(u, { childList: !0, characterData: !0, subtree: !0 }), () => {
820
- v = !1, $.disconnect(), C.disconnect();
829
+ const D = new MutationObserver(L);
830
+ return D.observe(u, { childList: !0, characterData: !0, subtree: !0 }), () => {
831
+ y = !1, $.disconnect(), D.disconnect();
821
832
  };
822
833
  }, []);
823
- const Ts = z(() => new Set(b?.refusedLanes ?? []), [b?.refusedLanes]), ke = V(null), [Ot, Ss] = dt({ x: 0, y: 0, at: "" }), Ft = b === null ? "" : `${b.x}:${b.y}:${b.from}:${b.to}:${b.overlap}:${b.violated}:${b.refused}:${b.blocked}`;
824
- wt(() => {
825
- const u = ke.current;
826
- if (b === null || u === null) return;
827
- const v = 4, S = b.y - u.offsetHeight - v, $ = b.y + b.height + v, C = {
828
- x: Math.max(2, Math.min(b.x, k.width - u.offsetWidth - 2)),
829
- y: S >= 2 ? S : Math.min($, k.height - u.offsetHeight - 2),
830
- at: Ft
834
+ const Cs = U(() => new Set(T?.refusedLanes ?? []), [T?.refusedLanes]), Me = W(null), [$t, As] = ht({ x: 0, y: 0, at: "" }), Et = T === null ? "" : `${T.x}:${T.y}:${T.from}:${T.to}:${T.overlap}:${T.violated}:${T.refused}:${T.blocked}`;
835
+ yt(() => {
836
+ const u = Me.current;
837
+ if (T === null || u === null) return;
838
+ const y = 4, L = T.y - u.offsetHeight - y, $ = T.y + T.height + y, D = {
839
+ x: Math.max(2, Math.min(T.x, w.width - u.offsetWidth - 2)),
840
+ y: L >= 2 ? L : Math.min($, w.height - u.offsetHeight - 2),
841
+ at: Et
831
842
  };
832
- Ss((_) => _.x === C.x && _.y === C.y && _.at === C.at ? _ : C);
833
- }, [b, Ft, k.width, k.height]);
834
- const we = V(null), [$t, Is] = dt({ x: 0, y: 0, at: "" }), W = k.tooltip, Et = W === null ? "" : `${W.x}:${W.y}:${W.target.kind}`;
835
- return wt(() => {
836
- const u = we.current;
837
- if (W === null || u === null) return;
838
- const v = 12, S = (C, _, x) => {
839
- const P = C + v, G = C - v - _, tt = P + _ <= x - 4 || G < 4 ? P : G;
840
- return Math.max(4, Math.min(tt, x - _ - 4));
843
+ As((_) => _.x === D.x && _.y === D.y && _.at === D.at ? _ : D);
844
+ }, [T, Et, w.width, w.height]);
845
+ const Te = W(null), [Bt, Ds] = ht({ x: 0, y: 0, at: "" }), X = w.tooltip, xt = X === null ? "" : `${X.x}:${X.y}:${X.target.kind}`;
846
+ return yt(() => {
847
+ const u = Te.current;
848
+ if (X === null || u === null) return;
849
+ const y = 12, L = (D, _, N) => {
850
+ const G = D + y, H = D - y - _, st = G + _ <= N - 4 || H < 4 ? G : H;
851
+ return Math.max(4, Math.min(st, N - _ - 4));
841
852
  }, $ = {
842
- x: S(W.x, u.offsetWidth, k.width),
843
- y: S(W.y, u.offsetHeight, k.height),
844
- at: Et
853
+ x: L(X.x, u.offsetWidth, w.width),
854
+ y: L(X.y, u.offsetHeight, w.height),
855
+ at: xt
845
856
  };
846
- Is((C) => C.x === $.x && C.y === $.y && C.at === $.at ? C : $);
847
- }, [W, Et, k.width, k.height]), /* @__PURE__ */ B(Xe, { value: e, children: [
848
- /* @__PURE__ */ B(
849
- "div",
850
- {
851
- ...ps,
852
- ref: At,
853
- role: "figure",
854
- ...ie,
855
- className: pt ? `${p.root} ${pt}` : p.root,
856
- style: { ...r === void 0 ? { height: "100%", minHeight: 400 } : { height: `${r}px` }, gridTemplateColumns: `min(${l}px, 40%) minmax(0, 1fr)`, ...gt },
857
- children: [
858
- /* @__PURE__ */ m("div", { className: p.corner, children: kt !== null && /* @__PURE__ */ m("span", { className: p.zoneLabel, "data-schedule-overlay": "zone label", children: kt }) }),
859
- /* @__PURE__ */ m("div", { className: p.dayBand, "aria-hidden": "true", "data-schedule-days": "", "data-schedule-clip": "day band", children: k.days.map((u, v) => {
860
- const S = J === 1 || v === 0 || Bt(u.start, J, ot), $ = J === 1 ? u.x + u.width : k.days.slice(v + 1).find((x) => Bt(x.start, J, ot))?.x ?? k.width, C = Math.max(0, -u.x), _ = Math.min($, k.width) - Math.max(u.x, 0);
861
- return /* @__PURE__ */ m("span", { className: p.day, style: { left: `${u.x}px`, width: `${S ? $ - u.x : u.width}px` }, children: /* @__PURE__ */ m("span", { className: p.dayLabel, "data-schedule-overlay": "day label", style: { marginLeft: `${C}px` }, children: S ? ys(u.start, J === 1 ? _ : Math.min(_, Ct)) : "" }) }, u.start);
862
- }) }),
863
- /* @__PURE__ */ m("div", { ref: ge, className: p.headers, "data-schedule-headers": "", children: /* @__PURE__ */ B("div", { className: p.headerRun, style: { transform: `translateY(${-k.scrollY}px)` }, children: [
864
- U && k.headers.length === 0 && Array.from({ length: Math.floor(k.height / Math.round(a * rt)) }, (u, v) => /* @__PURE__ */ m("div", { className: p.header, style: { height: `${Math.round(a * rt)}px` }, children: /* @__PURE__ */ m(Ns, { width: "60%" }) }, v)),
865
- k.headers.map((u) => /* @__PURE__ */ B(
866
- "div",
867
- {
868
- id: _t(u),
869
- className: p.header,
870
- style: { height: `${u.height}px`, paddingLeft: `calc(var(--u-space-3) + ${u.depth} * var(--u-space-3))` },
871
- "data-lane": u.lane,
872
- "data-group": u.group,
873
- "data-row": u.kind,
874
- "data-schedule-clip": `header ${u.kind}`,
875
- "data-refused": u.lane !== void 0 && Ts.has(u.lane) ? "" : void 0,
876
- children: [
877
- u.kind !== "lane" && u.group !== void 0 && /* @__PURE__ */ m(
878
- "button",
879
- {
880
- type: "button",
881
- className: p.chevron,
882
- "data-schedule-overlay": "fold control",
883
- "aria-expanded": u.collapsed === !1,
884
- "aria-controls": (Ms.get(u.group) ?? [_t(u)]).join(" "),
885
- "aria-label": `${u.collapsed === !0 ? N.scheduleUnfoldGroup : N.scheduleFoldGroup}: ${typeof u.label == "string" ? u.label : u.group}`,
886
- onClick: () => e.toggleGroup(u.group),
887
- children: /* @__PURE__ */ m(Bs, { size: 9, "data-open": u.collapsed === !1 ? "" : void 0 })
888
- }
889
- ),
890
- /* @__PURE__ */ m("span", { className: p.headerLabel, "data-schedule-overlay": "header label", children: u.label }),
891
- u.kind !== "lane" && /* @__PURE__ */ m("span", { className: p.headerCount, "data-schedule-overlay": "lane count", "data-lane-count": u.lanes, children: N.scheduleLaneCount(u.lanes) })
892
- ]
893
- },
894
- u.key
895
- ))
896
- ] }) }),
897
- /* @__PURE__ */ B(
857
+ Ds((D) => D.x === $.x && D.y === $.y && D.at === $.at ? D : $);
858
+ }, [X, xt, w.width, w.height]), /* @__PURE__ */ p(ne, { value: e, children: /* @__PURE__ */ E(
859
+ "div",
860
+ {
861
+ ...vs,
862
+ ref: Dt,
863
+ role: "figure",
864
+ "data-schedule-clip": "schedule",
865
+ ...de,
866
+ className: gt ? `${g.root} ${gt}` : g.root,
867
+ style: { ...a === void 0 ? { height: "100%", minHeight: 400 } : { height: `${a}px` }, gridTemplateColumns: `min(${l}px, 40%) minmax(0, 1fr)`, ...kt },
868
+ children: [
869
+ /* @__PURE__ */ p("div", { className: g.corner, children: wt !== null && /* @__PURE__ */ p("span", { className: g.zoneLabel, "data-schedule-overlay": "zone label", children: wt }) }),
870
+ /* @__PURE__ */ p("div", { className: g.dayBand, "aria-hidden": "true", "data-schedule-days": "", "data-schedule-clip": "day band", children: w.days.map((u, y) => {
871
+ const L = et === 1 || y === 0 || Gt(u.start, et, at), $ = et === 1 ? u.x + u.width : w.days.slice(y + 1).find((N) => Gt(N.start, et, at))?.x ?? w.width, D = Math.max(0, -u.x), _ = Math.min($, w.width) - Math.max(u.x, 0);
872
+ return /* @__PURE__ */ p("span", { className: g.day, style: { left: `${u.x}px`, width: `${L ? $ - u.x : u.width}px` }, children: /* @__PURE__ */ p("span", { className: g.dayLabel, "data-schedule-overlay": "day label", style: { marginLeft: `${D}px` }, children: L ? Ss(u.start, et === 1 ? _ : Math.min(_, _t)) : "" }) }, u.start);
873
+ }) }),
874
+ /* @__PURE__ */ p("div", { ref: be, className: g.headers, "data-schedule-headers": "", inert: ye || void 0, children: /* @__PURE__ */ E("div", { className: g.headerRun, style: { transform: `translateY(${-w.scrollY}px)` }, children: [
875
+ q && w.headers.length === 0 && Array.from({ length: Math.floor(w.height / Math.round(r * rt)) }, (u, y) => /* @__PURE__ */ p("div", { className: g.header, style: { height: `${Math.round(r * rt)}px` }, children: /* @__PURE__ */ p(Gs, { width: "60%" }) }, y)),
876
+ w.headers.map((u) => /* @__PURE__ */ E(
898
877
  "div",
899
878
  {
900
- ref: oe,
901
- className: p.plot,
902
- "data-schedule-plot": "",
903
- "data-schedule-clip": "plot",
904
- style: { cursor: k.cursor },
905
- "aria-busy": U || void 0,
906
- "data-stale": k.loading && k.headers.length > 0 || void 0,
907
- tabIndex: 0,
908
- role: "application",
909
- "aria-roledescription": N.scheduleRoleDescription,
910
- ...ie,
911
- "aria-describedby": o ? `${Lt} ${o}` : Lt,
912
- onKeyDown: (u) => {
913
- e.key(u.nativeEvent) && u.preventDefault();
914
- },
915
- onFocus: (u) => e.focus(Un(u.currentTarget)),
916
- onBlur: () => e.blur(),
917
- onPointerDown: (u) => e.pointerDown(u.nativeEvent),
918
- onPointerMove: (u) => e.pointerMove(u.nativeEvent),
919
- onPointerUp: (u) => e.pointerUp(u.nativeEvent),
920
- onPointerCancel: (u) => e.pointerCancel(u.nativeEvent),
921
- onPointerLeave: () => e.pointerLeave(),
922
- onContextMenu: (u) => e.contextMenu(u.nativeEvent),
923
- onDragOver: (u) => e.dragOver(u.nativeEvent),
924
- onDrop: (u) => e.drop(u.nativeEvent),
925
- onDragLeave: (u) => {
926
- const v = u.nativeEvent.relatedTarget;
927
- (!(v instanceof Node) || !u.currentTarget.contains(v)) && e.dragLeave();
928
- },
879
+ id: Ft(u),
880
+ className: g.header,
881
+ style: { height: `${u.height}px`, paddingLeft: `calc(var(--u-space-3) + ${u.depth} * var(--u-space-3))` },
882
+ "data-lane": u.lane,
883
+ "data-group": u.group,
884
+ "data-row": u.kind,
885
+ "data-schedule-clip": `header ${u.kind}`,
886
+ "data-refused": u.lane !== void 0 && Cs.has(u.lane) ? "" : void 0,
929
887
  children: [
930
- /* @__PURE__ */ m("canvas", { ref: re, className: p.layer, "aria-hidden": "true" }),
931
- /* @__PURE__ */ m("canvas", { ref: ae, className: p.layer, "aria-hidden": "true" }),
932
- k.grips.map((u) => /* @__PURE__ */ m(
933
- "span",
934
- {
935
- "data-grip": u.kind,
936
- "data-schedule-overlay": `${u.kind} grip`,
937
- "aria-hidden": "true",
938
- className: p.grip,
939
- style: { left: `${u.x}px`, top: `${u.y}px`, height: `${u.height}px` }
940
- },
941
- u.kind
942
- )),
943
- F !== void 0 && k.bars.map((u) => /* @__PURE__ */ m(
944
- "span",
945
- {
946
- className: p.barLabel,
947
- "data-bar-label": u.subtask.id,
948
- "data-schedule-overlay": "bar label",
949
- "data-schedule-may-cover": "",
950
- "data-on": u.dark ? "dark" : "light",
951
- style: { left: `${u.x}px`, top: `${u.y}px`, width: `${u.width}px`, height: `${u.height}px` },
952
- children: /* @__PURE__ */ m("span", { className: p.barLabelText, children: F(u.subtask) })
953
- },
954
- u.subtask.id
955
- )),
956
- O !== !1 && k.tooltip !== null && /* @__PURE__ */ m(
957
- "span",
958
- {
959
- ref: we,
960
- role: "tooltip",
961
- className: p.tooltip,
962
- "data-schedule-tooltip": "",
963
- "data-schedule-overlay": "tooltip",
964
- style: {
965
- left: `${$t.x}px`,
966
- top: `${$t.y}px`,
967
- visibility: $t.at === Et ? void 0 : "hidden"
968
- },
969
- children: typeof O == "function" ? O(k.tooltip.target) : /* @__PURE__ */ m(Hn, { target: k.tooltip.target })
970
- }
971
- ),
972
- b !== null && /* @__PURE__ */ B(
973
- "span",
888
+ u.kind !== "lane" && u.group !== void 0 && /* @__PURE__ */ p(
889
+ "button",
974
890
  {
975
- ref: ke,
976
- className: p.ghostLabel,
977
- "data-ghost": "",
978
- "data-schedule-overlay": "ghost label",
979
- "data-findings": [b.overlap ? "overlap" : "", b.violated ? "violated-dependency" : ""].filter(Boolean).join(" "),
980
- "data-refused": b.refused ? "" : void 0,
981
- "data-blocked": b.blocked ? "" : void 0,
982
- style: {
983
- left: `${Ot.x}px`,
984
- top: `${Ot.y}px`,
985
- visibility: Ot.at === Ft ? void 0 : "hidden"
986
- },
987
- children: [
988
- N.scheduleGhostTimes(et(H, b.from), et(H, b.to)),
989
- b.refused && /* @__PURE__ */ m("span", { className: p.refusal, children: N.scheduleLaneRefused }),
990
- b.blocked && /* @__PURE__ */ m("span", { className: p.refusal, children: N.scheduleBlockedTime }),
991
- b.overlap && /* @__PURE__ */ m("span", { className: p.finding, children: N.scheduleOverlap }),
992
- b.violated && /* @__PURE__ */ m("span", { className: p.finding, children: N.scheduleViolatedDependency })
993
- ]
891
+ type: "button",
892
+ className: g.chevron,
893
+ "data-schedule-overlay": "fold control",
894
+ "aria-expanded": u.collapsed === !1,
895
+ "aria-controls": (Ls.get(u.group) ?? [Ft(u)]).join(" "),
896
+ "aria-label": `${u.collapsed === !0 ? x.scheduleUnfoldGroup : x.scheduleFoldGroup}: ${typeof u.label == "string" ? u.label : u.group}`,
897
+ onClick: () => e.toggleGroup(u.group),
898
+ children: /* @__PURE__ */ p(Hs, { size: 9, "data-open": u.collapsed === !1 ? "" : void 0 })
994
899
  }
995
900
  ),
996
- /* @__PURE__ */ m("span", { className: p.focusRing, "aria-hidden": "true" })
901
+ /* @__PURE__ */ p("span", { className: g.headerLabel, "data-schedule-overlay": "header label", children: u.label }),
902
+ u.kind !== "lane" && /* @__PURE__ */ p("span", { className: g.headerCount, "data-schedule-overlay": "lane count", "data-lane-count": u.lanes, children: x.scheduleLaneCount(u.lanes) })
997
903
  ]
998
- }
999
- ),
1000
- /* @__PURE__ */ m("div", { className: p.corner }),
1001
- /* @__PURE__ */ B("div", { className: p.tickBand, "aria-hidden": "true", "data-schedule-ticks": "", "data-schedule-clip": "time band", children: [
1002
- k.now !== null && /* @__PURE__ */ m("span", { className: p.now, "data-now": "", "data-schedule-overlay": "now mark", style: { left: `${k.now}px` } }),
1003
- k.ticks.map((u) => /* @__PURE__ */ m("span", { className: p.tick, style: { left: `${u.x}px` }, children: u.x >= De && u.x <= k.width - De && (me === 1 || Bt(u.wallClock, me, ot)) && /* @__PURE__ */ m("span", { className: p.tickLabel, "data-schedule-overlay": "time label", children: k.step >= j ? H.dateShort(new Date(u.wallClock)) : et(H, u.wallClock) }) }, u.wallClock))
1004
- ] }),
1005
- /* @__PURE__ */ m(be, { "aria-live": "polite", children: Q !== null && /* @__PURE__ */ m(
1006
- Gn,
904
+ },
905
+ u.key
906
+ ))
907
+ ] }) }),
908
+ /* @__PURE__ */ E(
909
+ "div",
910
+ {
911
+ ref: he,
912
+ className: g.plot,
913
+ "data-schedule-plot": "",
914
+ "data-schedule-clip": "plot",
915
+ style: { cursor: w.cursor },
916
+ "aria-busy": q || void 0,
917
+ inert: ye || void 0,
918
+ "data-stale": w.loading && w.headers.length > 0 || void 0,
919
+ tabIndex: 0,
920
+ role: "application",
921
+ "aria-roledescription": x.scheduleRoleDescription,
922
+ ...de,
923
+ "aria-describedby": o ? `${At} ${o}` : At,
924
+ onKeyDown: (u) => {
925
+ e.key(u.nativeEvent) && u.preventDefault();
926
+ },
927
+ onFocus: (u) => e.focus(si(u.currentTarget)),
928
+ onBlur: () => e.blur(),
929
+ onPointerDown: (u) => e.pointerDown(u.nativeEvent),
930
+ onPointerMove: (u) => e.pointerMove(u.nativeEvent),
931
+ onPointerUp: (u) => e.pointerUp(u.nativeEvent),
932
+ onPointerCancel: (u) => e.pointerCancel(u.nativeEvent),
933
+ onPointerLeave: () => e.pointerLeave(),
934
+ onContextMenu: (u) => e.contextMenu(u.nativeEvent),
935
+ onDragOver: (u) => e.dragOver(u.nativeEvent),
936
+ onDrop: (u) => e.drop(u.nativeEvent),
937
+ onDragLeave: (u) => {
938
+ const y = u.nativeEvent.relatedTarget;
939
+ (!(y instanceof Node) || !u.currentTarget.contains(y)) && e.dragLeave();
940
+ },
941
+ children: [
942
+ /* @__PURE__ */ p("canvas", { ref: ce, className: g.layer, "aria-hidden": "true" }),
943
+ /* @__PURE__ */ p("canvas", { ref: ue, className: g.layer, "aria-hidden": "true" }),
944
+ w.grips.map((u) => /* @__PURE__ */ p(
945
+ "span",
946
+ {
947
+ "data-grip": u.kind,
948
+ "data-schedule-overlay": `${u.kind} grip`,
949
+ "aria-hidden": "true",
950
+ className: g.grip,
951
+ style: { left: `${u.x}px`, top: `${u.y}px`, height: `${u.height}px` }
952
+ },
953
+ u.kind
954
+ )),
955
+ F !== void 0 && w.bars.map((u) => /* @__PURE__ */ p(
956
+ "span",
957
+ {
958
+ className: g.barLabel,
959
+ "data-bar-label": u.subtask.id,
960
+ "data-schedule-overlay": "bar label",
961
+ "data-schedule-may-cover": "",
962
+ "data-on": u.dark ? "dark" : "light",
963
+ style: { left: `${u.x}px`, top: `${u.y}px`, width: `${u.width}px`, height: `${u.height}px` },
964
+ children: /* @__PURE__ */ p("span", { className: g.barLabelText, children: F(u.subtask) })
965
+ },
966
+ u.subtask.id
967
+ )),
968
+ O !== !1 && w.tooltip !== null && /* @__PURE__ */ p(
969
+ "span",
970
+ {
971
+ ref: Te,
972
+ role: "tooltip",
973
+ className: g.tooltip,
974
+ "data-schedule-tooltip": "",
975
+ "data-schedule-overlay": "tooltip",
976
+ style: {
977
+ left: `${Bt.x}px`,
978
+ top: `${Bt.y}px`,
979
+ visibility: Bt.at === xt ? void 0 : "hidden"
980
+ },
981
+ children: typeof O == "function" ? O(w.tooltip.target) : /* @__PURE__ */ p(qn, { target: w.tooltip.target })
982
+ }
983
+ ),
984
+ T !== null && /* @__PURE__ */ E(
985
+ "span",
986
+ {
987
+ ref: Me,
988
+ className: g.ghostLabel,
989
+ "data-ghost": "",
990
+ "data-schedule-overlay": "ghost label",
991
+ "data-findings": [T.overlap ? "overlap" : "", T.violated ? "violated-dependency" : ""].filter(Boolean).join(" "),
992
+ "data-refused": T.refused ? "" : void 0,
993
+ "data-blocked": T.blocked ? "" : void 0,
994
+ style: {
995
+ left: `${$t.x}px`,
996
+ top: `${$t.y}px`,
997
+ visibility: $t.at === Et ? void 0 : "hidden"
998
+ },
999
+ children: [
1000
+ x.scheduleGhostTimes(j(K, T.from), j(K, T.to)),
1001
+ T.refused && /* @__PURE__ */ p("span", { className: g.refusal, children: x.scheduleLaneRefused }),
1002
+ T.blocked && /* @__PURE__ */ p("span", { className: g.refusal, children: x.scheduleBlockedTime }),
1003
+ T.overlap && /* @__PURE__ */ p("span", { className: g.finding, children: x.scheduleOverlap }),
1004
+ T.violated && /* @__PURE__ */ p("span", { className: g.finding, children: x.scheduleViolatedDependency })
1005
+ ]
1006
+ }
1007
+ ),
1008
+ /* @__PURE__ */ p("span", { className: g.focusRing, "aria-hidden": "true" })
1009
+ ]
1010
+ }
1011
+ ),
1012
+ /* @__PURE__ */ p("div", { className: `${g.corner} ${g.cornerBottom}` }),
1013
+ /* @__PURE__ */ E("div", { className: g.tickBand, "aria-hidden": "true", "data-schedule-ticks": "", "data-schedule-clip": "time band", children: [
1014
+ w.now !== null && /* @__PURE__ */ p("span", { className: g.now, "data-now": "", "data-schedule-overlay": "now mark", style: { left: `${w.now}px` } }),
1015
+ w.ticks.map((u) => /* @__PURE__ */ p("span", { className: g.tick, style: { left: `${u.x}px` }, children: u.x >= Ee && u.x <= w.width - Ee && (ve === 1 || Gt(u.wallClock, ve, at)) && /* @__PURE__ */ p("span", { className: g.tickLabel, "data-schedule-overlay": "time label", children: w.step >= J ? K.dateShort(new Date(u.wallClock)) : j(K, u.wallClock) }) }, u.wallClock))
1016
+ ] }),
1017
+ /* @__PURE__ */ E(Le, { "aria-live": "polite", children: [
1018
+ P?.span !== void 0 && /* @__PURE__ */ p("span", { children: x.scheduleVisibleRange(vt(P.span[0]), vt(P.span[1])) }, P.count),
1019
+ P !== null && P.target !== null && /* @__PURE__ */ p(
1020
+ Xn,
1007
1021
  {
1008
- target: Q.target,
1009
- lane: Q.lane === null ? null : e.data.lanes.find((u) => u.id === Q.lane)?.label ?? Q.lane
1022
+ target: P.target,
1023
+ lane: P.lane === null ? null : e.data.lanes.find((u) => u.id === P.lane)?.label ?? P.lane
1010
1024
  },
1011
- Q.count
1012
- ) }),
1013
- /* @__PURE__ */ m(be, { id: Lt, children: k === e.getServerSnapshot() ? N.scheduleKeyHelp : `${N.scheduleSummary({ ...Dt, from: pe(Dt.from), to: pe(Dt.to) })}${kt === null ? "" : ` ${kt}.`} ${N.scheduleKeyHelp}` })
1014
- ]
1015
- }
1016
- ),
1017
- ms
1018
- ] });
1025
+ P.count
1026
+ )
1027
+ ] }),
1028
+ /* @__PURE__ */ p(Le, { id: At, children: w === e.getServerSnapshot() ? x.scheduleKeyHelp : `${x.scheduleSummary({ ...Ot, from: vt(Ot.from), to: vt(Ot.to) })}${wt === null ? "" : ` ${wt}.`} ${x.scheduleKeyHelp}` }),
1029
+ ws
1030
+ ]
1031
+ }
1032
+ ) });
1019
1033
  }
1020
- function Un(s) {
1034
+ function si(s) {
1021
1035
  try {
1022
1036
  return s.matches(":focus-visible");
1023
1037
  } catch {
1024
1038
  return !0;
1025
1039
  }
1026
1040
  }
1027
- function Xn({ id: s, label: t }) {
1028
- const e = Ze(), i = z(() => ({ id: s, label: t ?? s, ...e === null ? {} : { parent: e } }), [s, t, e]);
1029
- return Vs(i), null;
1041
+ function ni() {
1042
+ const s = Je(), t = qs(s), e = St(), n = mt(), i = re(), o = Jt(
1043
+ t?.subscribe ?? ii,
1044
+ t?.getSnapshot ?? (() => null),
1045
+ t?.getServerSnapshot ?? (() => null)
1046
+ );
1047
+ if (t === null) return null;
1048
+ const a = o?.dataTable?.open === !0;
1049
+ let r = null;
1050
+ if (a && o !== null) {
1051
+ const { from: l, to: d } = o.summary, { data: h } = t, c = (f) => `${e.dateShort(new Date(f))} ${j(e, f)}`, m = new Map(h.lanes.map((f, v) => [f.id, v])), k = h.subtasks.filter((f) => {
1052
+ const v = Q(f);
1053
+ return m.has(f.lane) && v.to >= l && v.from <= d;
1054
+ }).sort((f, v) => m.get(f.lane) - m.get(v.lane) || f.from - v.from);
1055
+ r = /* @__PURE__ */ E("table", { className: g.dataTable, children: [
1056
+ /* @__PURE__ */ p("caption", { children: n.scheduleTableCaption(c(l), c(d)) }),
1057
+ /* @__PURE__ */ p("thead", { children: /* @__PURE__ */ p("tr", { children: [
1058
+ n.scheduleColumnLane,
1059
+ n.scheduleColumnTask,
1060
+ n.scheduleColumnSubtask,
1061
+ n.scheduleColumnFrom,
1062
+ n.scheduleColumnTo,
1063
+ n.scheduleColumnDuration,
1064
+ n.scheduleColumnFindings
1065
+ ].map((f) => /* @__PURE__ */ p("th", { scope: "col", children: f }, f)) }) }),
1066
+ /* @__PURE__ */ p("tbody", { children: k.map((f) => {
1067
+ const v = h.tooltipTargetFor({ kind: "subtask", subtask: f, part: "main" }), C = v?.kind !== "subtask" ? [] : [
1068
+ ...v.overlapping.map((M) => n.scheduleOverlapWith(M.name ?? M.id)),
1069
+ ...v.violatedDependencies.map((M) => n.scheduleViolatedBy(i(M.shortBy))),
1070
+ ...v.blocked.map((M) => n.scheduleInBlockedTime(M.label))
1071
+ ], A = [
1072
+ i(f.to - f.from),
1073
+ ...(f.leadIn ?? 0) > 0 ? [`${n.scheduleLeadIn} ${i(f.leadIn)}`] : [],
1074
+ ...(f.leadOut ?? 0) > 0 ? [`${n.scheduleLeadOut} ${i(f.leadOut)}`] : []
1075
+ ].join(", ");
1076
+ return /* @__PURE__ */ E("tr", { children: [
1077
+ /* @__PURE__ */ p("td", { children: h.lanes.find((M) => M.id === f.lane)?.label }),
1078
+ /* @__PURE__ */ p("td", { children: h.tasks.get(f.task)?.name ?? f.task }),
1079
+ /* @__PURE__ */ p("th", { scope: "row", children: f.name ?? f.id }),
1080
+ /* @__PURE__ */ p("td", { children: c(f.from) }),
1081
+ /* @__PURE__ */ p("td", { children: c(f.to) }),
1082
+ /* @__PURE__ */ p("td", { children: A }),
1083
+ /* @__PURE__ */ p("td", { children: C.join("; ") })
1084
+ ] }, f.id);
1085
+ }) })
1086
+ ] });
1087
+ }
1088
+ return /* @__PURE__ */ E(it, { children: [
1089
+ /* @__PURE__ */ p(
1090
+ "button",
1091
+ {
1092
+ type: "button",
1093
+ className: g.dataKey,
1094
+ "data-schedule-overlay": "data key",
1095
+ "aria-expanded": a,
1096
+ "aria-controls": a ? s : void 0,
1097
+ onClick: () => t.toggleDataTable(),
1098
+ children: a ? n.scheduleHideData : n.scheduleShowData
1099
+ }
1100
+ ),
1101
+ a && // A tab stop of its own: the panel scrolls, and a keyboard has to be
1102
+ // able to scroll it.
1103
+ /* @__PURE__ */ p("div", { id: s, className: g.dataPanel, tabIndex: 0, children: r })
1104
+ ] });
1105
+ }
1106
+ const ii = () => () => {
1107
+ };
1108
+ function oi({ id: s, label: t }) {
1109
+ const e = ss(), n = U(() => ({ id: s, label: t ?? s, ...e === null ? {} : { parent: e } }), [s, t, e]);
1110
+ return Us(n), null;
1030
1111
  }
1031
- function jn({ id: s, label: t, children: e }) {
1032
- const i = Ze(), n = z(() => ({ id: s, label: t ?? s, ...i === null ? {} : { parent: i } }), [s, t, i]);
1033
- return qs(n), /* @__PURE__ */ m(je, { value: s, children: e });
1112
+ function ai({ id: s, label: t, children: e }) {
1113
+ const n = ss(), i = U(() => ({ id: s, label: t ?? s, ...n === null ? {} : { parent: n } }), [s, t, n]);
1114
+ return Xs(i), /* @__PURE__ */ p(es, { value: s, children: e });
1034
1115
  }
1035
- function Zn({ data: s, tasks: t }) {
1036
- const e = z(() => ({ kind: "subtasks", data: s, tasks: t }), [s, t]);
1037
- return St("Subtasks", e), null;
1116
+ function ri({ data: s, tasks: t }) {
1117
+ const e = U(() => ({ kind: "subtasks", data: s, tasks: t }), [s, t]);
1118
+ return Lt("Subtasks", e), null;
1038
1119
  }
1039
- function Jn({ data: s }) {
1040
- const t = z(() => ({ kind: "dependencies", data: s }), [s]);
1041
- return St("Dependencies", t), null;
1120
+ function li({ data: s }) {
1121
+ const t = U(() => ({ kind: "dependencies", data: s }), [s]);
1122
+ return Lt("Dependencies", t), null;
1042
1123
  }
1043
- function Qn({ data: s }) {
1044
- const t = z(() => ({ kind: "blocked", data: s }), [s]);
1045
- return St("BlockedTimes", t), null;
1124
+ function di({ data: s }) {
1125
+ const t = U(() => ({ kind: "blocked", data: s }), [s]);
1126
+ return Lt("BlockedTimes", t), null;
1046
1127
  }
1047
- function ti({ data: s }) {
1048
- const t = z(() => ({ kind: "milestones", data: s }), [s]);
1049
- return St("Milestones", t), null;
1128
+ function hi({ data: s }) {
1129
+ const t = U(() => ({ kind: "milestones", data: s }), [s]);
1130
+ return Lt("Milestones", t), null;
1050
1131
  }
1051
- function ei() {
1132
+ function ci() {
1052
1133
  try {
1053
1134
  return process.env.NODE_ENV !== "production";
1054
1135
  } catch {
1055
1136
  return !1;
1056
1137
  }
1057
1138
  }
1058
- const rs = ei(), _e = /* @__PURE__ */ new Set();
1059
- function at(s, t) {
1060
- !rs || _e.has(s) || (_e.add(s), console.warn(`@umriss-ui/schedule: ${t}`));
1139
+ const hs = ci(), Be = /* @__PURE__ */ new Set();
1140
+ function lt(s, t) {
1141
+ !hs || Be.has(s) || (Be.add(s), console.warn(`@umriss-ui/schedule: ${t}`));
1061
1142
  }
1062
- class si {
1143
+ class ui {
1063
1144
  /** `changed` is called after every registration change. */
1064
1145
  constructor(t) {
1065
1146
  this.changed = t;
@@ -1124,14 +1205,14 @@ class si {
1124
1205
  rebuild() {
1125
1206
  if (!this.dirty) return !1;
1126
1207
  this.dirty = !1;
1127
- const t = (e) => [...e.keys()].sort((i, n) => i - n).map((i) => e.get(i));
1208
+ const t = (e) => [...e.keys()].sort((n, i) => n - i).map((n) => e.get(n));
1128
1209
  this.lanes = t(this.laneEntries), this.groups = t(this.groupEntries), this.layers = t(this.layerEntries), this.subtasks = [], this.dependencies = [], this.blocked = [], this.milestones = [], this.tasks = /* @__PURE__ */ new Map();
1129
1210
  for (const e of this.layers)
1130
1211
  if (e.kind === "subtasks") {
1131
1212
  this.subtasks.push(...e.data);
1132
- for (const i of e.tasks) this.tasks.set(i.id, i);
1213
+ for (const n of e.tasks) this.tasks.set(n.id, n);
1133
1214
  } else e.kind === "dependencies" ? this.dependencies.push(...e.data) : e.kind === "milestones" ? this.milestones.push(...e.data) : this.blocked.push(...e.data);
1134
- return this.subtaskById = new Map(this.subtasks.map((e) => [e.id, e])), this.overlaps = Jt(this.subtasks), this.violatedById = new Map(Qt(this.subtasks, this.dependencies).map((e) => [e.dependency, e])), this.depth = Hs(this.subtasks), this.inBlocked = Ue(this.subtasks, this.blocked), this.warnOfMalformedData(), !0;
1215
+ return this.subtaskById = new Map(this.subtasks.map((e) => [e.id, e])), this.overlaps = ee(this.subtasks), this.violatedById = new Map(se(this.subtasks, this.dependencies).map((e) => [e.dependency, e])), this.depth = Vs(this.subtasks), this.inBlocked = ts(this.subtasks, this.blocked), this.warnOfMalformedData(), !0;
1135
1216
  }
1136
1217
  /** Says in development what the data gets wrong and is drawn, dropped or
1137
1218
  counted regardless. It runs here, once the parts have registered, so a
@@ -1139,30 +1220,30 @@ class si {
1139
1220
  the lanes are still on their way, and an empty `tasks` is a plan drawn
1140
1221
  muted on purpose. */
1141
1222
  warnOfMalformedData() {
1142
- if (!rs) return;
1143
- const t = (n, o) => {
1144
- const r = /* @__PURE__ */ new Set();
1145
- for (const a of o)
1146
- r.has(a) && at(`twice:${n}:${a}`, `the ${n} id "${a}" stands twice; give each ${n} an id of its own, or only the first is found.`), r.add(a);
1223
+ if (!hs) return;
1224
+ const t = (i, o) => {
1225
+ const a = /* @__PURE__ */ new Set();
1226
+ for (const r of o)
1227
+ a.has(r) && lt(`twice:${i}:${r}`, `the ${i} id "${r}" stands twice; give each ${i} an id of its own, or only the first is found.`), a.add(r);
1147
1228
  };
1148
- t("subtask", this.subtasks.map((n) => n.id)), t("dependency", this.dependencies.map((n) => n.id)), t("lane", this.lanes.map((n) => n.id));
1149
- for (const n of this.subtasks)
1150
- n.to > n.from || at(`span:${n.id}`, `subtask "${n.id}" does not end after it starts (from ${n.from}, to ${n.to}); a point in time is a Milestone, and a span with no length is drawn as a hairline.`);
1151
- for (const n of this.layers) {
1152
- if (n.kind !== "subtasks" || n.tasks.length === 0) continue;
1153
- const o = new Set(n.tasks.map((r) => r.id));
1154
- for (const r of n.data)
1155
- o.has(r.task) || at(`task:${r.id}`, `subtask "${r.id}" names the task "${r.task}", which is not among the tasks of its Subtasks layer; it is drawn muted. Add the task, or correct the subtask's task.`);
1229
+ t("subtask", this.subtasks.map((i) => i.id)), t("dependency", this.dependencies.map((i) => i.id)), t("lane", this.lanes.map((i) => i.id));
1230
+ for (const i of this.subtasks)
1231
+ i.to > i.from || lt(`span:${i.id}`, `subtask "${i.id}" does not end after it starts (from ${i.from}, to ${i.to}); a point in time is a Milestone, and a span with no length is drawn as a hairline.`);
1232
+ for (const i of this.layers) {
1233
+ if (i.kind !== "subtasks" || i.tasks.length === 0) continue;
1234
+ const o = new Set(i.tasks.map((a) => a.id));
1235
+ for (const a of i.data)
1236
+ o.has(a.task) || lt(`task:${a.id}`, `subtask "${a.id}" names the task "${a.task}", which is not among the tasks of its Subtasks layer; it is drawn muted. Add the task, or correct the subtask's task.`);
1156
1237
  }
1157
- for (const n of this.dependencies)
1158
- for (const o of [n.from, n.to])
1159
- this.subtaskById.has(o) || at(`end:${n.id}:${o}`, `dependency "${n.id}" names the subtask "${o}", and no subtask has that id; the dependency is left out.`);
1238
+ for (const i of this.dependencies)
1239
+ for (const o of [i.from, i.to])
1240
+ this.subtaskById.has(o) || lt(`end:${i.id}:${o}`, `dependency "${i.id}" names the subtask "${o}", and no subtask has that id; the dependency is left out.`);
1160
1241
  if (this.lanes.length === 0) return;
1161
- const e = new Set(this.lanes.map((n) => n.id)), i = (n, o) => {
1162
- for (const { id: r, lane: a } of o)
1163
- e.has(a) || at(`lane:${n}:${r}`, `${n} "${r}" is on the lane "${a}", which no Lane declares; it is left out. Declare <Lane id="${a}" />.`);
1242
+ const e = new Set(this.lanes.map((i) => i.id)), n = (i, o) => {
1243
+ for (const { id: a, lane: r } of o)
1244
+ e.has(r) || lt(`lane:${i}:${a}`, `${i} "${a}" is on the lane "${r}", which no Lane declares; it is left out. Declare <Lane id="${r}" />.`);
1164
1245
  };
1165
- i("subtask", this.subtasks), i("milestone", this.milestones), i("blocked time", this.blocked);
1246
+ n("subtask", this.subtasks), n("milestone", this.milestones), n("blocked time", this.blocked);
1166
1247
  }
1167
1248
  /** The task a dependency belongs to: its departing subtask's. */
1168
1249
  taskOfDependency(t) {
@@ -1172,76 +1253,76 @@ class si {
1172
1253
  data knows about it - its task, and the findings it stands in. */
1173
1254
  tooltipTargetFor(t) {
1174
1255
  if (t.kind === "subtask") {
1175
- const n = t.subtask.id, o = this.overlaps.filter((l) => l.first === n || l.second === n).map((l) => this.subtaskById.get(l.first === n ? l.second : l.first)).filter((l) => l !== void 0), r = this.dependencies.filter((l) => l.from === n || l.to === n).map((l) => this.violatedById.get(l.id)).filter((l) => l !== void 0), a = this.inBlocked.filter((l) => l.subtask === n).map((l) => this.blocked.find((d) => d.id === l.blocked)).filter((l) => l !== void 0);
1176
- return { kind: "subtask", subtask: t.subtask, task: this.tasks.get(t.subtask.task), overlapping: o, violatedDependencies: r, blocked: a };
1256
+ const i = t.subtask.id, o = this.overlaps.filter((l) => l.first === i || l.second === i).map((l) => this.subtaskById.get(l.first === i ? l.second : l.first)).filter((l) => l !== void 0), a = this.dependencies.filter((l) => l.from === i || l.to === i).map((l) => this.violatedById.get(l.id)).filter((l) => l !== void 0), r = this.inBlocked.filter((l) => l.subtask === i).map((l) => this.blocked.find((d) => d.id === l.blocked)).filter((l) => l !== void 0);
1257
+ return { kind: "subtask", subtask: t.subtask, task: this.tasks.get(t.subtask.task), overlapping: o, violatedDependencies: a, blocked: r };
1177
1258
  }
1178
1259
  if (t.kind === "milestone") return { kind: "milestone", milestone: t.milestone };
1179
1260
  if (t.kind !== "dependency") return null;
1180
- const e = t.dependency, i = this.taskOfDependency(e);
1261
+ const e = t.dependency, n = this.taskOfDependency(e);
1181
1262
  return {
1182
1263
  kind: "dependency",
1183
1264
  dependency: e,
1184
- task: i !== null ? this.tasks.get(i) : void 0,
1265
+ task: n !== null ? this.tasks.get(n) : void 0,
1185
1266
  from: this.subtaskById.get(e.from),
1186
1267
  to: this.subtaskById.get(e.to),
1187
1268
  violated: this.violatedById.get(e.id)
1188
1269
  };
1189
1270
  }
1190
1271
  }
1191
- const ni = 6;
1192
- function as(s, t, e, i, n, o) {
1193
- s.save(), s.beginPath(), s.rect(t, e, i, n), s.clip(), s.globalAlpha = 0.35, s.strokeStyle = o, s.lineWidth = 1, s.beginPath();
1194
- for (let r = t - n; r < t + i + n; r += ni)
1195
- s.moveTo(r, e + n), s.lineTo(r + n, e);
1272
+ const fi = 6;
1273
+ function cs(s, t, e, n, i, o) {
1274
+ s.save(), s.beginPath(), s.rect(t, e, n, i), s.clip(), s.globalAlpha = 0.35, s.strokeStyle = o, s.lineWidth = 1, s.beginPath();
1275
+ for (let a = t - i; a < t + n + i; a += fi)
1276
+ s.moveTo(a, e + i), s.lineTo(a + i, e);
1196
1277
  s.stroke(), s.restore();
1197
1278
  }
1198
- function ii(s, t, e, i) {
1199
- if (i.size === 0) return;
1200
- const { width: n, height: o } = t.view;
1201
- for (const r of i) {
1202
- const a = Z(e, r);
1203
- if (a === null) continue;
1204
- const { top: l, height: d } = a;
1205
- l + d < 0 || l > o || (s.globalAlpha = 0.6, s.fillStyle = t.colours.surface, s.fillRect(0, l, n, d), s.globalAlpha = 1, as(s, 0, l, n, d, t.colours.muted));
1206
- }
1207
- }
1208
- function oi(s, t, e) {
1209
- const { data: i } = t;
1210
- if (i.violatedById.size !== 0)
1211
- for (const n of i.violatedById.values()) {
1212
- const o = i.dependencies.find((c) => c.id === n.dependency), r = o === void 0 ? void 0 : i.subtaskById.get(o.to);
1213
- if (r === void 0) continue;
1214
- const a = Z(e, r.lane);
1215
- if (a === null || !a.miniature) continue;
1216
- const l = nt(e.rows, a.top + e.scrollY);
1279
+ function mi(s, t, e, n) {
1280
+ if (n.size === 0) return;
1281
+ const { width: i, height: o } = t.view;
1282
+ for (const a of n) {
1283
+ const r = tt(e, a);
1284
+ if (r === null) continue;
1285
+ const { top: l, height: d } = r;
1286
+ l + d < 0 || l > o || (s.globalAlpha = 0.6, s.fillStyle = t.colours.surface, s.fillRect(0, l, i, d), s.globalAlpha = 1, cs(s, 0, l, i, d, t.colours.muted));
1287
+ }
1288
+ }
1289
+ function pi(s, t, e) {
1290
+ const { data: n } = t;
1291
+ if (n.violatedById.size !== 0)
1292
+ for (const i of n.violatedById.values()) {
1293
+ const o = n.dependencies.find((c) => c.id === i.dependency), a = o === void 0 ? void 0 : n.subtaskById.get(o.to);
1294
+ if (a === void 0) continue;
1295
+ const r = tt(e, a.lane);
1296
+ if (r === null || !r.miniature) continue;
1297
+ const l = ot(e.rows, r.top + e.scrollY);
1217
1298
  if (l === null) continue;
1218
- const d = E(e, n.arrival), h = Math.max(d + 2, E(e, n.arrival + n.shortBy));
1219
- Vt(s, t, d, h, l.top - e.scrollY + 1, 3);
1299
+ const d = B(e, i.arrival), h = Math.max(d + 2, B(e, i.arrival + i.shortBy));
1300
+ Wt(s, t, d, h, l.top - e.scrollY + 1, 3);
1220
1301
  }
1221
1302
  }
1222
- function Vt(s, t, e, i, n, o) {
1303
+ function Wt(s, t, e, n, i, o) {
1223
1304
  if (!t.colours.forced) {
1224
- s.fillStyle = t.colours.alarm, s.fillRect(e, n, i - e, o);
1305
+ s.fillStyle = t.colours.alarm, s.fillRect(e, i, n - e, o);
1225
1306
  return;
1226
1307
  }
1227
- s.strokeStyle = t.colours.alarm, s.lineWidth = o, s.setLineDash([4, 3]), s.beginPath(), s.moveTo(e, n + o / 2), s.lineTo(i, n + o / 2), s.stroke(), s.setLineDash([]);
1308
+ s.strokeStyle = t.colours.alarm, s.lineWidth = o, s.setLineDash([4, 3]), s.beginPath(), s.moveTo(e, i + o / 2), s.lineTo(n, i + o / 2), s.stroke(), s.setLineDash([]);
1228
1309
  }
1229
- function ri(s, t, e, i) {
1230
- const n = Z(e, i.lane);
1231
- if (n === null || n.top + n.height < 0 || n.top > t.view.height) return;
1232
- const o = Math.max(0, E(e, i.from)), r = Math.min(t.view.width, E(e, i.to));
1233
- r <= o || (s.globalAlpha = 0.1, s.fillStyle = t.colours.muted, s.fillRect(o, n.top, r - o, n.height), s.globalAlpha = 1, as(s, o, n.top, r - o, n.height, t.colours.muted));
1310
+ function gi(s, t, e, n) {
1311
+ const i = tt(e, n.lane);
1312
+ if (i === null || i.top + i.height < 0 || i.top > t.view.height) return;
1313
+ const o = Math.max(0, B(e, n.from)), a = Math.min(t.view.width, B(e, n.to));
1314
+ a <= o || (s.globalAlpha = 0.1, s.fillStyle = t.colours.muted, s.fillRect(o, i.top, a - o, i.height), s.globalAlpha = 1, cs(s, o, i.top, a - o, i.height, t.colours.muted));
1234
1315
  }
1235
- function qt(s, t, e, i) {
1236
- const n = Z(e, i.lane);
1237
- if (n === null) return;
1238
- const o = E(e, i.from), r = Math.max(o + 2, E(e, i.to));
1239
- if (s.fillStyle = t.colours.alarm, s.globalAlpha = 0.14, s.fillRect(o, n.top + 1, r - o, Math.max(1, n.height - 2)), s.globalAlpha = 1, Vt(s, t, o, r, n.top + 1, Math.min(3, Math.max(1, n.height - 1))), n.miniature) {
1240
- const a = nt(e.rows, n.top + e.scrollY);
1241
- a !== null && Vt(s, t, o, r, a.top - e.scrollY + 1, 3);
1316
+ function Ut(s, t, e, n) {
1317
+ const i = tt(e, n.lane);
1318
+ if (i === null) return;
1319
+ const o = B(e, n.from), a = Math.max(o + 2, B(e, n.to));
1320
+ if (s.fillStyle = t.colours.alarm, s.globalAlpha = 0.14, s.fillRect(o, i.top + 1, a - o, Math.max(1, i.height - 2)), s.globalAlpha = 1, Wt(s, t, o, a, i.top + 1, Math.min(3, Math.max(1, i.height - 1))), i.miniature) {
1321
+ const r = ot(e.rows, i.top + e.scrollY);
1322
+ r !== null && Wt(s, t, o, a, r.top - e.scrollY + 1, 3);
1242
1323
  }
1243
1324
  }
1244
- const ai = {
1325
+ const ki = {
1245
1326
  line: "var(--u-hairline)",
1246
1327
  lineStrong: "var(--u-hairline-strong)",
1247
1328
  text: "var(--u-color-text)",
@@ -1255,7 +1336,7 @@ const ai = {
1255
1336
  /* What text and marks take ON a filled bar - the same token the bar labels
1256
1337
  use in CSS, so a cap and the label beside it are one colour. */
1257
1338
  onAccent: "var(--u-color-on-accent)"
1258
- }, ls = {
1339
+ }, us = {
1259
1340
  line: "GrayText",
1260
1341
  lineStrong: "CanvasText",
1261
1342
  text: "CanvasText",
@@ -1265,22 +1346,22 @@ const ai = {
1265
1346
  active: "Highlight",
1266
1347
  now: "GrayText",
1267
1348
  onAccent: "Canvas"
1268
- }, li = (s) => s ? ls : ai, di = () => typeof window < "u" && typeof window.matchMedia == "function" && window.matchMedia("(forced-colors: active)").matches;
1269
- function hi(s, t) {
1270
- const e = di(), i = {};
1271
- for (const r of t.tasks.values()) i[`task:${r.id}`] = e ? ls.text : r.color;
1272
- const n = _s(s, { ...li(e), ...i }), o = /* @__PURE__ */ new Map();
1273
- for (const r of t.tasks.values()) o.set(r.id, n[`task:${r.id}`] ?? r.color);
1349
+ }, wi = (s) => s ? us : ki, vi = () => typeof window < "u" && typeof window.matchMedia == "function" && window.matchMedia("(forced-colors: active)").matches;
1350
+ function yi(s, t) {
1351
+ const e = vi(), n = {};
1352
+ for (const a of t.tasks.values()) n[`task:${a.id}`] = e ? us.text : a.color;
1353
+ const i = Es(s, { ...wi(e), ...n }), o = /* @__PURE__ */ new Map();
1354
+ for (const a of t.tasks.values()) o.set(a.id, i[`task:${a.id}`] ?? a.color);
1274
1355
  return {
1275
- line: n.line,
1276
- lineStrong: n.lineStrong,
1277
- text: n.text,
1278
- muted: n.muted,
1279
- alarm: n.alarm,
1280
- surface: n.surface,
1281
- active: n.active,
1282
- now: n.now,
1283
- onAccent: n.onAccent,
1356
+ line: i.line,
1357
+ lineStrong: i.lineStrong,
1358
+ text: i.text,
1359
+ muted: i.muted,
1360
+ alarm: i.alarm,
1361
+ surface: i.surface,
1362
+ active: i.active,
1363
+ now: i.now,
1364
+ onAccent: i.onAccent,
1284
1365
  tasks: o,
1285
1366
  forced: e
1286
1367
  };
@@ -1289,258 +1370,258 @@ function ft(s) {
1289
1370
  const t = s.match(/[\d.]+/g);
1290
1371
  return t === null || t.length < 3 ? null : [Number(t[0]), Number(t[1]), Number(t[2])];
1291
1372
  }
1292
- function Oe(s) {
1373
+ function xe(s) {
1293
1374
  const t = ft(s);
1294
- return t === null ? 0 : hs(ds(t));
1375
+ return t === null ? 0 : ms(fs(t));
1295
1376
  }
1296
- function ds(s) {
1377
+ function fs(s) {
1297
1378
  return s.map((t) => {
1298
1379
  const e = t / 255;
1299
1380
  return e <= 0.04045 ? e / 12.92 : ((e + 0.055) / 1.055) ** 2.4;
1300
1381
  });
1301
1382
  }
1302
- function hs([s, t, e]) {
1383
+ function ms([s, t, e]) {
1303
1384
  return 0.2126 * s + 0.7152 * t + 0.0722 * e;
1304
1385
  }
1305
- function Fe(s, t) {
1306
- const e = Oe(s), i = Oe(t);
1307
- return (Math.max(e, i) + 0.05) / (Math.min(e, i) + 0.05);
1386
+ function Ne(s, t) {
1387
+ const e = xe(s), n = xe(t);
1388
+ return (Math.max(e, n) + 0.05) / (Math.min(e, n) + 0.05);
1308
1389
  }
1309
- function $e(s, t, e) {
1390
+ function Re(s, t, e) {
1310
1391
  if (s === null) return null;
1311
- const i = typeof window > "u" ? 1 : window.devicePixelRatio || 1, n = Math.round(t * i), o = Math.round(e * i);
1312
- s.width !== n && (s.width = n), s.height !== o && (s.height = o);
1313
- const r = s.getContext("2d");
1314
- return r === null ? null : (r.setTransform(i, 0, 0, i, 0, 0), r.clearRect(0, 0, t, e), r);
1315
- }
1316
- function ci(s, t) {
1317
- const { data: e, view: i } = t, n = i.viewport();
1318
- mi(s, t, n);
1319
- for (const o of e.blocked) ri(s, t, n, o);
1320
- pi(s, t);
1392
+ const n = typeof window > "u" ? 1 : window.devicePixelRatio || 1, i = Math.round(t * n), o = Math.round(e * n);
1393
+ s.width !== i && (s.width = i), s.height !== o && (s.height = o);
1394
+ const a = s.getContext("2d");
1395
+ return a === null ? null : (a.setTransform(n, 0, 0, n, 0, 0), a.clearRect(0, 0, t, e), a);
1396
+ }
1397
+ function bi(s, t) {
1398
+ const { data: e, view: n } = t, i = n.viewport();
1399
+ Si(s, t, i);
1400
+ for (const o of e.blocked) gi(s, t, i, o);
1401
+ Ii(s, t);
1321
1402
  for (const o of e.layers) {
1322
1403
  if (o.kind === "blocked" || o.kind === "milestones") continue;
1323
- const r = new Set(o.data);
1404
+ const a = new Set(o.data);
1324
1405
  if (o.kind === "dependencies")
1325
- for (const a of i.paths) r.has(a.dependency) && Js(a, i.width, i.height) && zt(s, t, a, !1);
1406
+ for (const r of n.paths) a.has(r.dependency) && sn(r, n.width, n.height) && Xt(s, t, r, !1);
1326
1407
  else
1327
- for (const a of i.boxes) r.has(a.subtask) && us(s, t, a, 1);
1408
+ for (const r of n.boxes) a.has(r.subtask) && gs(s, t, r, 1);
1328
1409
  }
1329
- for (const o of e.overlaps) qt(s, t, n, o);
1330
- for (const o of e.inBlocked) qt(s, t, n, o);
1331
- oi(s, t, n);
1332
- for (const o of e.milestones) fs(s, t, n, o, !1);
1333
- Ti(s, t);
1410
+ for (const o of e.overlaps) Ut(s, t, i, o);
1411
+ for (const o of e.inBlocked) Ut(s, t, i, o);
1412
+ pi(s, t, i);
1413
+ for (const o of e.milestones) ks(s, t, i, o, !1);
1414
+ $i(s, t);
1334
1415
  }
1335
- function ui(s, t) {
1336
- const { view: e, hover: i } = t, n = e.viewport();
1416
+ function Mi(s, t) {
1417
+ const { view: e, hover: n } = t, i = e.viewport();
1337
1418
  if (t.ghost === null) {
1338
- if (i.kind === "subtask") {
1339
- const c = e.boxById.get(i.subtask.id);
1340
- c !== void 0 && bi(s, t, c);
1341
- } else if (i.kind === "dependency") {
1342
- const c = e.paths.find((f) => f.dependency === i.dependency);
1343
- c !== void 0 && zt(s, t, c, !0);
1344
- } else i.kind === "milestone" && fs(s, t, n, i.milestone, !0);
1419
+ if (n.kind === "subtask") {
1420
+ const c = e.boxById.get(n.subtask.id);
1421
+ c !== void 0 && Oi(s, t, c);
1422
+ } else if (n.kind === "dependency") {
1423
+ const c = e.paths.find((m) => m.dependency === n.dependency);
1424
+ c !== void 0 && Xt(s, t, c, !0);
1425
+ } else n.kind === "milestone" && ks(s, t, i, n.milestone, !0);
1345
1426
  return;
1346
1427
  }
1347
- const o = t.ghost, { ghost: r, overlaps: a, violated: l } = o;
1348
- ii(s, t, n, o.refusedLanes);
1349
- const d = cs(n, r);
1428
+ const o = t.ghost, { ghost: a, overlaps: r, violated: l } = o;
1429
+ mi(s, t, i, o.refusedLanes);
1430
+ const d = ps(i, a);
1350
1431
  if (d === null) return;
1351
- for (const c of a) qt(s, t, n, c);
1432
+ for (const c of r) Ut(s, t, i, c);
1352
1433
  const h = new Set(l.map((c) => c.dependency));
1353
1434
  for (const c of t.data.dependencies) {
1354
- if (c.from !== r.id && c.to !== r.id) continue;
1355
- const f = e.boxById.get(c.from === r.id ? c.to : c.from);
1356
- if (f === void 0) continue;
1357
- const g = c.from === r.id ? Yt(n, c, d, f, e.options) : Yt(n, c, f, d, e.options);
1358
- zt(s, t, g, !0, h.has(c.id));
1435
+ if (c.from !== a.id && c.to !== a.id) continue;
1436
+ const m = e.boxById.get(c.from === a.id ? c.to : c.from);
1437
+ if (m === void 0) continue;
1438
+ const k = c.from === a.id ? Vt(i, c, d, m, e.options) : Vt(i, c, m, d, e.options);
1439
+ Xt(s, t, k, !0, h.has(c.id));
1359
1440
  }
1360
- us(s, { ...t, selectedTask: null }, d, 0.55), s.strokeStyle = t.colours.text, s.lineWidth = 1, s.setLineDash([3, 2]), s.strokeRect(d.outerFrom + 0.5, d.y + 0.5, Math.max(1, d.outerTo - d.outerFrom - 1), d.height - 1), s.setLineDash([]), o.tether !== null && fi(s, t, d, o.tether);
1441
+ gs(s, { ...t, selectedTask: null }, d, 0.55), s.strokeStyle = t.colours.text, s.lineWidth = 1, s.setLineDash([3, 2]), s.strokeRect(d.outerFrom + 0.5, d.y + 0.5, Math.max(1, d.outerTo - d.outerFrom - 1), d.height - 1), s.setLineDash([]), o.tether !== null && Ti(s, t, d, o.tether);
1361
1442
  }
1362
- function fi(s, t, e, i) {
1363
- const n = Math.max(e.outerFrom, Math.min(e.outerTo, i.x)), o = Math.max(e.y, Math.min(e.y + e.height, i.y));
1364
- Math.hypot(i.x - n, i.y - o) < 2 || (s.strokeStyle = t.colours.text, s.lineWidth = 1, s.setLineDash([2, 3]), s.beginPath(), s.moveTo(n + 0.5, o + 0.5), s.lineTo(i.x + 0.5, i.y + 0.5), s.stroke(), s.setLineDash([]));
1443
+ function Ti(s, t, e, n) {
1444
+ const i = Math.max(e.outerFrom, Math.min(e.outerTo, n.x)), o = Math.max(e.y, Math.min(e.y + e.height, n.y));
1445
+ Math.hypot(n.x - i, n.y - o) < 2 || (s.strokeStyle = t.colours.text, s.lineWidth = 1, s.setLineDash([2, 3]), s.beginPath(), s.moveTo(i + 0.5, o + 0.5), s.lineTo(n.x + 0.5, n.y + 0.5), s.stroke(), s.setLineDash([]));
1365
1446
  }
1366
- function cs(s, t) {
1367
- const e = ee(s.rows, t.lane);
1368
- return e === null ? null : ts(s, t, e, 0);
1447
+ function ps(s, t) {
1448
+ const e = oe(s.rows, t.lane);
1449
+ return e === null ? null : os(s, t, e, 0);
1369
1450
  }
1370
- function mi(s, t, e) {
1371
- const { view: i, colours: n, bands: o } = t, { width: r, height: a } = i;
1372
- s.lineWidth = 1, s.strokeStyle = n.line, s.beginPath();
1451
+ function Si(s, t, e) {
1452
+ const { view: n, colours: i, bands: o } = t, { width: a, height: r } = n;
1453
+ s.lineWidth = 1, s.strokeStyle = i.line, s.beginPath();
1373
1454
  for (const h of o.ticks)
1374
- s.moveTo(h.x + 0.5, 0), s.lineTo(h.x + 0.5, a);
1455
+ s.moveTo(h.x + 0.5, 0), s.lineTo(h.x + 0.5, r);
1375
1456
  for (const h of e.rows.rows) {
1376
1457
  const c = h.top + h.height - e.scrollY - 0.5;
1377
- c < 0 || c > a || (s.moveTo(0, c), s.lineTo(r, c));
1458
+ c < 0 || c > r || (s.moveTo(0, c), s.lineTo(a, c));
1378
1459
  }
1379
1460
  const l = [...e.rows.slots.values()].filter((h) => h.miniature).sort((h, c) => h.top - c.top);
1380
1461
  l.forEach((h, c) => {
1381
- const f = l[c + 1];
1382
- if (f === void 0 || f.top !== h.top + h.height || f.group === h.group) return;
1383
- const g = h.top + h.height - e.scrollY - 0.5;
1384
- g < 0 || g > a || (s.moveTo(0, g), s.lineTo(r, g));
1385
- }), s.stroke(), s.strokeStyle = n.lineStrong, s.beginPath();
1462
+ const m = l[c + 1];
1463
+ if (m === void 0 || m.top !== h.top + h.height || m.group === h.group) return;
1464
+ const k = h.top + h.height - e.scrollY - 0.5;
1465
+ k < 0 || k > r || (s.moveTo(0, k), s.lineTo(a, k));
1466
+ }), s.stroke(), s.strokeStyle = i.lineStrong, s.beginPath();
1386
1467
  for (const h of o.days)
1387
- s.moveTo(h.x + 0.5, 0), s.lineTo(h.x + 0.5, a);
1468
+ s.moveTo(h.x + 0.5, 0), s.lineTo(h.x + 0.5, r);
1388
1469
  s.stroke();
1389
- const d = Os(i.options.calendar);
1470
+ const d = Bs(n.options.calendar);
1390
1471
  if (d.length > 0) {
1391
- s.strokeStyle = n.muted, s.setLineDash([2, 3]), s.beginPath();
1472
+ s.strokeStyle = i.muted, s.setLineDash([2, 3]), s.beginPath();
1392
1473
  for (const h of d) {
1393
1474
  const c = Math.round(e.scale.toPx(h.workingTime)) + 0.5;
1394
- c < 0 || c > r || (s.moveTo(c, 0), s.lineTo(c, a));
1475
+ c < 0 || c > a || (s.moveTo(c, 0), s.lineTo(c, r));
1395
1476
  }
1396
1477
  s.stroke(), s.setLineDash([]);
1397
1478
  }
1398
1479
  }
1399
- function pi(s, t) {
1480
+ function Ii(s, t) {
1400
1481
  const e = t.view.nowX();
1401
1482
  e !== null && (s.fillStyle = t.colours.now, s.fillRect(e, 0, 2, t.view.height));
1402
1483
  }
1403
- function gi(s, t, e, i) {
1404
- const n = mt(t.colours, t, e.subtask.task, e.subtask.id);
1405
- s.fillStyle = n;
1406
- for (const [o, r] of [
1484
+ function Li(s, t, e, n) {
1485
+ const i = pt(t.colours, t, e.subtask.task, e.subtask.id);
1486
+ s.fillStyle = i;
1487
+ for (const [o, a] of [
1407
1488
  [e.outerFrom, e.mainFrom],
1408
1489
  [e.mainTo, e.outerTo]
1409
1490
  ])
1410
- r <= o || (s.globalAlpha = 0.28 * i, s.fillRect(o, e.y, r - o, e.height));
1411
- s.globalAlpha = i, s.fillRect(e.mainFrom, e.y, Math.max(1, e.mainTo - e.mainFrom), e.height), s.globalAlpha = 1;
1491
+ a <= o || (s.globalAlpha = 0.28 * n, s.fillRect(o, e.y, a - o, e.height));
1492
+ s.globalAlpha = n, s.fillRect(e.mainFrom, e.y, Math.max(1, e.mainTo - e.mainFrom), e.height), s.globalAlpha = 1;
1412
1493
  }
1413
- function ne(s, t, e) {
1494
+ function le(s, t, e) {
1414
1495
  if (s.dashed) return { fill: null, onDark: !1 };
1415
- const i = s.muted ? ki(t, e.surface, 0.5) : t;
1416
- return { fill: i, onDark: Fe(i, e.onAccent) > Fe(i, e.text) };
1496
+ const n = s.muted ? Ci(t, e.surface, 0.5) : t;
1497
+ return { fill: n, onDark: Ne(n, e.onAccent) > Ne(n, e.text) };
1417
1498
  }
1418
- function ki(s, t, e) {
1419
- const i = ft(s), n = ft(t);
1420
- if (i === null || n === null) return s;
1421
- const o = (r) => Math.round(i[r] + (n[r] - i[r]) * e);
1499
+ function Ci(s, t, e) {
1500
+ const n = ft(s), i = ft(t);
1501
+ if (n === null || i === null) return s;
1502
+ const o = (a) => Math.round(n[a] + (i[a] - n[a]) * e);
1422
1503
  return `rgb(${o(0)}, ${o(1)}, ${o(2)})`;
1423
1504
  }
1424
- function Ee(s, t) {
1505
+ function Pe(s, t) {
1425
1506
  const e = ft(s);
1426
1507
  if (e === null || t === 0) return s;
1427
- const i = ds(e), n = hs(i), [o, r, a] = i.map((l) => {
1428
- const d = l + (n - l) * t, h = d <= 31308e-7 ? d * 12.92 : 1.055 * d ** (1 / 2.4) - 0.055;
1508
+ const n = fs(e), i = ms(n), [o, a, r] = n.map((l) => {
1509
+ const d = l + (i - l) * t, h = d <= 31308e-7 ? d * 12.92 : 1.055 * d ** (1 / 2.4) - 0.055;
1429
1510
  return Math.round(Math.min(1, Math.max(0, h)) * 255);
1430
1511
  });
1431
- return `rgb(${o}, ${r}, ${a})`;
1512
+ return `rgb(${o}, ${a}, ${r})`;
1432
1513
  }
1433
- function mt(s, t, e, i) {
1434
- const n = (e === null ? void 0 : s.tasks.get(e)) ?? s.muted;
1435
- return t.selectedTask === null ? n : e !== t.selectedTask ? s.forced ? s.muted : Ee(n, 1) : s.forced || t.selectedSubtask === null || i === null || i === t.selectedSubtask ? n : Ee(n, 0.5);
1514
+ function pt(s, t, e, n) {
1515
+ const i = (e === null ? void 0 : s.tasks.get(e)) ?? s.muted;
1516
+ return t.selectedTask === null ? i : e !== t.selectedTask ? s.forced ? s.muted : Pe(i, 1) : s.forced || t.selectedSubtask === null || n === null || n === t.selectedSubtask ? i : Pe(i, 0.5);
1436
1517
  }
1437
- const wi = 2;
1438
- function us(s, t, e, i) {
1439
- const { view: n, colours: o } = t;
1440
- if (!Ht(e, n.width, n.height)) return;
1518
+ const Ai = 2;
1519
+ function gs(s, t, e, n) {
1520
+ const { view: i, colours: o } = t;
1521
+ if (!Yt(e, i.width, i.height)) return;
1441
1522
  if (e.miniature) {
1442
- gi(s, t, e, i);
1523
+ Li(s, t, e, n);
1443
1524
  return;
1444
1525
  }
1445
- const r = Tt(e.subtask.appearance), a = mt(o, t, e.subtask.task, e.subtask.id), l = ne(r, a, o), d = e.y, h = e.height, c = Math.max(1, e.mainTo - e.mainFrom), f = l.onDark ? o.onAccent : o.text;
1446
- s.lineWidth = 1, s.fillStyle = a, s.strokeStyle = a;
1447
- for (const [w, A] of [
1526
+ const a = It(e.subtask.appearance), r = pt(o, t, e.subtask.task, e.subtask.id), l = le(a, r, o), d = e.y, h = e.height, c = Math.max(1, e.mainTo - e.mainFrom), m = l.onDark ? o.onAccent : o.text;
1527
+ s.lineWidth = 1, s.fillStyle = r, s.strokeStyle = r;
1528
+ for (const [f, v] of [
1448
1529
  [e.outerFrom, e.mainFrom],
1449
1530
  [e.mainTo, e.outerTo]
1450
1531
  ])
1451
- A <= w || (s.globalAlpha = 0.28 * i, s.fillRect(w, d, A - w, h), s.globalAlpha = i, s.strokeRect(w + 0.5, d + 0.5, A - w - 1, h - 1));
1452
- l.fill !== null && (s.globalAlpha = i, s.fillStyle = l.fill, s.fillRect(e.mainFrom, d, c, h));
1453
- const g = e.subtask.progress;
1454
- if (g !== void 0) {
1455
- const w = Math.min(4, Math.max(2, Math.round(h / 6))), A = d + h - w - wi, I = Math.round(c * Math.max(0, Math.min(1, g)));
1456
- s.fillStyle = l.fill === null ? a : f, s.globalAlpha = 0.3 * i, s.fillRect(e.mainFrom, A, c, w), s.globalAlpha = i, I > 0 && s.fillRect(e.mainFrom, A, I, w);
1532
+ v <= f || (s.globalAlpha = 0.28 * n, s.fillRect(f, d, v - f, h), s.globalAlpha = n, s.strokeRect(f + 0.5, d + 0.5, v - f - 1, h - 1));
1533
+ l.fill !== null && (s.globalAlpha = n, s.fillStyle = l.fill, s.fillRect(e.mainFrom, d, c, h));
1534
+ const k = e.subtask.progress;
1535
+ if (k !== void 0) {
1536
+ const f = Math.min(4, Math.max(2, Math.round(h / 6))), v = d + h - f - Ai, C = Math.round(c * Math.max(0, Math.min(1, k)));
1537
+ s.fillStyle = l.fill === null ? r : m, s.globalAlpha = 0.3 * n, s.fillRect(e.mainFrom, v, c, f), s.globalAlpha = n, C > 0 && s.fillRect(e.mainFrom, v, C, f);
1457
1538
  }
1458
- if (r.hatched) {
1459
- const w = Math.max(1, Math.min(Qe, Math.floor((c - 2 * lt) / 3))), A = c >= 4 * w ? lt : 0, I = h >= 4 * lt ? lt : 0;
1460
- s.globalAlpha = i, s.fillStyle = f, s.fillRect(e.mainFrom + A, d + I, w, h - 2 * I), s.fillRect(e.mainTo - A - w, d + I, w, h - 2 * I);
1539
+ if (a.hatched) {
1540
+ const f = Math.max(1, Math.min(is, Math.floor((c - 2 * dt) / 3))), v = c >= 4 * f ? dt : 0, C = h >= 4 * dt ? dt : 0;
1541
+ s.globalAlpha = n, s.fillStyle = m, s.fillRect(e.mainFrom + v, d + C, f, h - 2 * C), s.fillRect(e.mainTo - v - f, d + C, f, h - 2 * C);
1461
1542
  }
1462
- r.open && yi(s, e, d, h, o.surface, n.width), r.dashed && (s.globalAlpha = i, s.strokeStyle = a, s.setLineDash([4, 3]), s.strokeRect(e.mainFrom + 0.5, d + 0.5, c - 1, h - 1), s.setLineDash([])), s.globalAlpha = 1, e.depth > 0 && i === 1 && (s.strokeStyle = o.surface, s.strokeRect(e.outerFrom - 0.5, d - 0.5, e.outerTo - e.outerFrom + 1, h + 1));
1543
+ a.open && _i(s, e, d, h, o.surface, i.width), a.dashed && (s.globalAlpha = n, s.strokeStyle = r, s.setLineDash([4, 3]), s.strokeRect(e.mainFrom + 0.5, d + 0.5, c - 1, h - 1), s.setLineDash([])), s.globalAlpha = 1, e.depth > 0 && n === 1 && (s.strokeStyle = o.surface, s.strokeRect(e.outerFrom - 0.5, d - 0.5, e.outerTo - e.outerFrom + 1, h + 1));
1463
1544
  }
1464
- const vi = 16;
1465
- function yi(s, t, e, i, n, o) {
1466
- const r = t.mainFrom < 0, a = t.mainTo > o, l = Math.max(1, Math.min(t.mainTo, o) - Math.max(t.mainFrom, 0)), d = Math.min(vi, l);
1467
- r && xe(s, 0, d, e, i, n), a && xe(s, o, -d, e, i, n);
1545
+ const Di = 16;
1546
+ function _i(s, t, e, n, i, o) {
1547
+ const a = t.mainFrom < 0, r = t.mainTo > o, l = Math.max(1, Math.min(t.mainTo, o) - Math.max(t.mainFrom, 0)), d = Math.min(Di, l);
1548
+ a && Ge(s, 0, d, e, n, i), r && Ge(s, o, -d, e, n, i);
1468
1549
  }
1469
- function xe(s, t, e, i, n, o) {
1470
- const r = s.createLinearGradient(t, 0, t + e, 0);
1471
- r.addColorStop(0, Re(o, 1)), r.addColorStop(1, Re(o, 0)), s.globalAlpha = 1, s.fillStyle = r, s.fillRect(Math.min(t, t + e), i, Math.abs(e), n);
1550
+ function Ge(s, t, e, n, i, o) {
1551
+ const a = s.createLinearGradient(t, 0, t + e, 0);
1552
+ a.addColorStop(0, He(o, 1)), a.addColorStop(1, He(o, 0)), s.globalAlpha = 1, s.fillStyle = a, s.fillRect(Math.min(t, t + e), n, Math.abs(e), i);
1472
1553
  }
1473
- function Re(s, t) {
1554
+ function He(s, t) {
1474
1555
  const e = ft(s);
1475
1556
  return e === null ? s : `rgba(${e[0]}, ${e[1]}, ${e[2]}, ${t})`;
1476
1557
  }
1477
- function zt(s, t, e, i, n) {
1478
- const { data: o, colours: r } = t, a = o.taskOfDependency(e.dependency), l = n ?? o.violatedById.has(e.dependency.id), d = a !== null && a === t.selectedTask, h = l ? r.alarm : mt(r, t, a, null);
1479
- if (s.strokeStyle = h, s.fillStyle = h, s.lineWidth = i || d ? 2 : 1.25, s.setLineDash(l ? [4, 3] : []), s.beginPath(), s.moveTo(e.x1, e.y1), e.kind === "curve")
1558
+ function Xt(s, t, e, n, i) {
1559
+ const { data: o, colours: a } = t, r = o.taskOfDependency(e.dependency), l = i ?? o.violatedById.has(e.dependency.id), d = r !== null && r === t.selectedTask, h = l ? a.alarm : pt(a, t, r, null);
1560
+ if (s.strokeStyle = h, s.fillStyle = h, s.lineWidth = n || d ? 2 : 1.25, s.setLineDash(l ? [4, 3] : []), s.beginPath(), s.moveTo(e.x1, e.y1), e.kind === "curve")
1480
1561
  s.bezierCurveTo(e.c1x, e.y1, e.c2x, e.y2, e.x2, e.y2);
1481
1562
  else
1482
1563
  for (let c = 2; c + 1 < e.points.length; c += 2) s.lineTo(e.points[c], e.points[c + 1]);
1483
1564
  if (s.stroke(), s.setLineDash([]), e.ends === "dot")
1484
- for (const [c, f] of [
1565
+ for (const [c, m] of [
1485
1566
  [e.x1, e.y1],
1486
1567
  [e.x2, e.y2]
1487
1568
  ])
1488
- s.beginPath(), s.arc(c, f, l ? 3 : 2.5, 0, Math.PI * 2), s.fill();
1569
+ s.beginPath(), s.arc(c, m, l ? 3 : 2.5, 0, Math.PI * 2), s.fill();
1489
1570
  }
1490
- function fs(s, t, e, i, n) {
1491
- const o = se(e, i);
1571
+ function ks(s, t, e, n, i) {
1572
+ const o = ae(e, n);
1492
1573
  if (o === null || o.x < -o.half || o.x > t.view.width + o.half) return;
1493
- const r = (a) => {
1494
- s.beginPath(), s.moveTo(o.x, o.y - a), s.lineTo(o.x + a, o.y), s.lineTo(o.x, o.y + a), s.lineTo(o.x - a, o.y), s.closePath();
1574
+ const a = (r) => {
1575
+ s.beginPath(), s.moveTo(o.x, o.y - r), s.lineTo(o.x + r, o.y), s.lineTo(o.x, o.y + r), s.lineTo(o.x - r, o.y), s.closePath();
1495
1576
  };
1496
- n && (r(o.half + 3), s.fillStyle = t.colours.active, s.fill()), r(o.half + 1), s.fillStyle = t.colours.surface, s.fill(), r(o.half), s.fillStyle = t.colours.text, s.fill();
1577
+ i && (a(o.half + 3), s.fillStyle = t.colours.active, s.fill()), a(o.half + 1), s.fillStyle = t.colours.surface, s.fill(), a(o.half), s.fillStyle = t.colours.text, s.fill();
1497
1578
  }
1498
- function bi(s, t, e) {
1499
- const { colours: i } = t, n = Tt(e.subtask.appearance), o = ne(n, mt(i, t, e.subtask.task, e.subtask.id), i);
1500
- if (i.forced) {
1501
- s.strokeStyle = i.active, s.lineWidth = 2, s.strokeRect(e.outerFrom - 2, e.y - 2, Math.max(1, e.outerTo - e.outerFrom) + 4, e.height + 4);
1579
+ function Oi(s, t, e) {
1580
+ const { colours: n } = t, i = It(e.subtask.appearance), o = le(i, pt(n, t, e.subtask.task, e.subtask.id), n);
1581
+ if (n.forced) {
1582
+ s.strokeStyle = n.active, s.lineWidth = 2, s.strokeRect(e.outerFrom - 2, e.y - 2, Math.max(1, e.outerTo - e.outerFrom) + 4, e.height + 4);
1502
1583
  return;
1503
1584
  }
1504
- s.globalAlpha = Mi, s.fillStyle = o.onDark ? i.onAccent : i.text, s.fillRect(e.outerFrom, e.y, Math.max(1, e.outerTo - e.outerFrom), e.height), s.globalAlpha = 1;
1585
+ s.globalAlpha = Fi, s.fillStyle = o.onDark ? n.onAccent : n.text, s.fillRect(e.outerFrom, e.y, Math.max(1, e.outerTo - e.outerFrom), e.height), s.globalAlpha = 1;
1505
1586
  }
1506
- const Mi = 0.2;
1507
- function Ti(s, t) {
1587
+ const Fi = 0.2;
1588
+ function $i(s, t) {
1508
1589
  const e = t.selectedTask;
1509
1590
  if (e !== null) {
1510
1591
  s.strokeStyle = t.colours.text;
1511
- for (const i of t.view.boxes) {
1512
- if (i.subtask.task !== e) continue;
1513
- const n = i.subtask.id === t.selectedSubtask;
1514
- s.lineWidth = n ? 2 : 1;
1515
- const o = n ? 1 : 0.5;
1516
- s.strokeRect(i.outerFrom - o, i.y - o, i.outerTo - i.outerFrom + 2 * o, i.height + 2 * o);
1592
+ for (const n of t.view.boxes) {
1593
+ if (n.subtask.task !== e) continue;
1594
+ const i = n.subtask.id === t.selectedSubtask;
1595
+ s.lineWidth = i ? 2 : 1;
1596
+ const o = i ? 1 : 0.5;
1597
+ s.strokeRect(n.outerFrom - o, n.y - o, n.outerTo - n.outerFrom + 2 * o, n.height + 2 * o);
1517
1598
  }
1518
1599
  }
1519
1600
  }
1520
- const vt = 32, Si = 18;
1521
- function Ne(s, t) {
1522
- if (!(t > 2 * vt)) return 0;
1523
- const e = vt - s, i = s - (t - vt), n = Math.max(e, i);
1524
- if (n <= 0) return 0;
1525
- const o = Math.min(1, n / vt), r = Si * o * o;
1526
- return e > 0 ? -r : r;
1601
+ const bt = 32, Ei = 18;
1602
+ function Ke(s, t) {
1603
+ if (!(t > 2 * bt)) return 0;
1604
+ const e = bt - s, n = s - (t - bt), i = Math.max(e, n);
1605
+ if (i <= 0) return 0;
1606
+ const o = Math.min(1, i / bt), a = Ei * o * o;
1607
+ return e > 0 ? -a : a;
1527
1608
  }
1528
1609
  function ct(s, t, e) {
1529
- const i = (n, o) => {
1530
- const r = it(n);
1531
- return n.lane === o.lane && r.from < o.to && o.from < r.to;
1610
+ const n = (i, o) => {
1611
+ const a = Q(i);
1612
+ return i.lane === o.lane && a.from < o.to && o.from < a.to;
1532
1613
  };
1533
- return e.some((n) => i(s, n) && !(t !== null && i(t, n)));
1614
+ return e.some((i) => n(s, i) && !(t !== null && n(t, i)));
1534
1615
  }
1535
- function Ii(s, t, e, i) {
1536
- const n = /* @__PURE__ */ new Set();
1537
- if (i === void 0) return n;
1616
+ function Bi(s, t, e, n) {
1617
+ const i = /* @__PURE__ */ new Set();
1618
+ if (n === void 0) return i;
1538
1619
  for (const o of s)
1539
- o !== e && (i(t, o) || n.add(o));
1540
- return n;
1620
+ o !== e && (n(t, o) || i.add(o));
1621
+ return i;
1541
1622
  }
1542
- const Be = "\0placing", Pe = /* @__PURE__ */ new Set();
1543
- function Pt(s) {
1623
+ const Ye = "\0placing", Ve = /* @__PURE__ */ new Set();
1624
+ function Ht(s) {
1544
1625
  switch (s.kind) {
1545
1626
  case "subtask":
1546
1627
  return `subtask:${s.subtask.id}:${s.part}`;
@@ -1554,8 +1635,8 @@ function Pt(s) {
1554
1635
  return "nothing";
1555
1636
  }
1556
1637
  }
1557
- const Ge = 3, Li = 10, Ai = 600;
1558
- class Ci {
1638
+ const ze = 3, xi = 10, Ni = 600;
1639
+ class Ri {
1559
1640
  constructor(t) {
1560
1641
  this.host = t;
1561
1642
  }
@@ -1582,7 +1663,7 @@ class Ci {
1582
1663
  /** The finger's long press, armed by a touch on a bar that may be moved.
1583
1664
  `armed` is whether the press may still turn into a grab - and, once it
1584
1665
  has, whether the `contextmenu` Android fires for it is the grab's. */
1585
- press = Ps((t) => this.grab(t));
1666
+ press = Ks((t) => this.grab(t));
1586
1667
  armed = !1;
1587
1668
  hover = { kind: "nothing" };
1588
1669
  /** Where the pointer rests on the plot while nothing is being dragged - or,
@@ -1621,46 +1702,46 @@ class Ci {
1621
1702
  ghostSummary() {
1622
1703
  const t = this.gesture;
1623
1704
  if (t.kind !== "edit" && t.kind !== "place") return null;
1624
- const e = cs(this.host.view.viewport(), t.ghost);
1705
+ const e = ps(this.host.view.viewport(), t.ghost);
1625
1706
  if (e === null) return null;
1626
- const i = this.ghostFindings(t.ghost, this.ghostHome(t)), n = t.kind === "edit" && (t.mode === "leadIn" || t.mode === "leadOut"), o = n ? it(t.ghost) : t.ghost;
1707
+ const n = this.ghostFindings(t.ghost, this.ghostHome(t)), i = t.kind === "edit" && (t.mode === "leadIn" || t.mode === "leadOut"), o = i ? Q(t.ghost) : t.ghost;
1627
1708
  return {
1628
1709
  refused: this.refused,
1629
1710
  refusedLanes: [...t.refused],
1630
1711
  blocked: this.blocked,
1631
- x: n ? e.outerFrom : e.mainFrom,
1712
+ x: i ? e.outerFrom : e.mainFrom,
1632
1713
  y: e.y,
1633
1714
  height: e.height,
1634
1715
  from: o.from,
1635
1716
  to: o.to,
1636
- overlap: i.overlaps.length > 0,
1637
- violated: i.violated.length > 0
1717
+ overlap: n.overlaps.length > 0,
1718
+ violated: n.violated.length > 0
1638
1719
  };
1639
1720
  }
1640
1721
  /* ---------------------------------------------------------------- */
1641
1722
  /* Pointer */
1642
1723
  /* ---------------------------------------------------------------- */
1643
1724
  local(t, e) {
1644
- const i = this.host.plotElement()?.getBoundingClientRect();
1645
- return { x: t - (i?.left ?? 0), y: e - (i?.top ?? 0) };
1725
+ const n = this.host.plotElement()?.getBoundingClientRect();
1726
+ return { x: t - (n?.left ?? 0), y: e - (n?.top ?? 0) };
1646
1727
  }
1647
- report(t, e, i, n, o, r) {
1648
- const a = this.host.view;
1649
- this.host.handlers().onInteraction?.({ type: t, hit: e, clientX: i, clientY: n, time: a.timeAt(o), lane: a.laneIdAt(r) });
1728
+ report(t, e, n, i, o, a) {
1729
+ const r = this.host.view;
1730
+ this.host.handlers().onInteraction?.({ type: t, hit: e, clientX: n, clientY: i, time: r.timeAt(o), lane: r.laneIdAt(a) });
1650
1731
  }
1651
1732
  /** The plan is on its way: no drag, no hover, no placing begins. One under
1652
1733
  way finishes and reports as usual. */
1653
1734
  loading = !1;
1654
1735
  pointerDown(t) {
1655
1736
  if (this.loading) return;
1656
- const { x: e, y: i } = this.local(t.clientX, t.clientY);
1657
- if (t.pointerType === "touch" && (this.touches.set(t.pointerId, { x: e, y: i }), this.touches.size >= 2)) {
1737
+ const { x: e, y: n } = this.local(t.clientX, t.clientY);
1738
+ if (t.pointerType === "touch" && (this.touches.set(t.pointerId, { x: e, y: n }), this.touches.size >= 2)) {
1658
1739
  this.press.dispose(), this.armed = !1, this.gesture.kind !== "pinch" && (this.cancelEdit(), this.gesture = { kind: "pinch", distance: this.touchDistance() });
1659
1740
  return;
1660
1741
  }
1661
1742
  if (t.button !== 0) return;
1662
- const n = t.target?.closest?.("[data-grip]")?.getAttribute("data-grip"), o = this.host.selectedSubtask(), r = o !== null ? this.host.data.subtaskById.get(o) ?? null : null;
1663
- t.pointerType === "touch" ? (this.gesture = { kind: "pending", pointerId: t.pointerId, x0: e, y0: i, mode: "pan", subtask: null }, this.armed = this.modeAt(e, i).mode === "move", this.press.pointerDown(t)) : (n === "leadIn" || n === "leadOut") && r !== null ? this.gesture = { kind: "pending", pointerId: t.pointerId, x0: e, y0: i, mode: n, subtask: r } : this.gesture = { kind: "pending", pointerId: t.pointerId, x0: e, y0: i, ...this.modeAt(e, i) }, this.host.plotElement()?.setPointerCapture?.(t.pointerId);
1743
+ const i = t.target?.closest?.("[data-grip]")?.getAttribute("data-grip"), o = this.host.selectedSubtask(), a = o !== null ? this.host.data.subtaskById.get(o) ?? null : null;
1744
+ t.pointerType === "touch" ? (this.gesture = { kind: "pending", pointerId: t.pointerId, x0: e, y0: n, mode: "pan", subtask: null }, this.armed = this.modeAt(e, n).mode === "move", this.press.pointerDown(t)) : (i === "leadIn" || i === "leadOut") && a !== null ? this.gesture = { kind: "pending", pointerId: t.pointerId, x0: e, y0: n, mode: i, subtask: a } : this.gesture = { kind: "pending", pointerId: t.pointerId, x0: e, y0: n, ...this.modeAt(e, n) }, this.host.plotElement()?.setPointerCapture?.(t.pointerId);
1664
1745
  }
1665
1746
  /** A drag over a folded group: resting on one opens it for the GESTURE.
1666
1747
 
@@ -1670,12 +1751,12 @@ class Ci {
1670
1751
  never written to and no change is reported, because the application did
1671
1752
  not fold anything (ADR-0025). */
1672
1753
  restOver(t) {
1673
- const e = this.host.view, i = e.foldedGroupAt(t);
1674
- i !== this.resting?.group && (this.stopResting(), i !== null && (this.resting = {
1675
- group: i,
1754
+ const e = this.host.view, n = e.foldedGroupAt(t);
1755
+ n !== this.resting?.group && (this.stopResting(), n !== null && (this.resting = {
1756
+ group: n,
1676
1757
  timer: setTimeout(() => {
1677
- this.resting = null, e.openForGesture = /* @__PURE__ */ new Set([...e.openForGesture, i]), this.host.viewChanged();
1678
- }, Ai)
1758
+ this.resting = null, e.openForGesture = /* @__PURE__ */ new Set([...e.openForGesture, n]), this.host.viewChanged();
1759
+ }, Ni)
1679
1760
  }));
1680
1761
  }
1681
1762
  stopResting() {
@@ -1703,64 +1784,64 @@ class Ci {
1703
1784
  gesture that cannot change a lane at all asks nothing: the intents the
1704
1785
  caller handles decide whether the question exists. */
1705
1786
  askRefused(t, e) {
1706
- if (!this.host.view.options.intents.includes(e === null ? "place" : "lane")) return Pe;
1707
- const i = this.host.data.lanes.map((n) => n.id);
1708
- return Ii(i, t, e, this.host.handlers().canMoveTo);
1787
+ if (!this.host.view.options.intents.includes(e === null ? "place" : "lane")) return Ve;
1788
+ const n = this.host.data.lanes.map((i) => i.id);
1789
+ return Bi(n, t, e, this.host.handlers().canMoveTo);
1709
1790
  }
1710
1791
  /** What a press at a point would start, given the intents the caller handles. */
1711
1792
  modeAt(t, e) {
1712
- const i = this.host.view, n = i.options.intents;
1713
- if (i.hitAt(t, e).kind === "milestone") return { mode: "pan", subtask: null };
1714
- for (let o = i.boxes.length - 1; o >= 0; o--) {
1715
- const r = i.boxes[o];
1716
- if (n.includes("stretch")) {
1717
- const a = Zs(r, t, e);
1718
- if (a !== null) return { mode: a === "from" ? "stretch-from" : "stretch-to", subtask: r.subtask };
1793
+ const n = this.host.view, i = n.options.intents;
1794
+ if (n.hitAt(t, e).kind === "milestone") return { mode: "pan", subtask: null };
1795
+ for (let o = n.boxes.length - 1; o >= 0; o--) {
1796
+ const a = n.boxes[o];
1797
+ if (i.includes("stretch")) {
1798
+ const r = en(a, t, e);
1799
+ if (r !== null) return { mode: r === "from" ? "stretch-from" : "stretch-to", subtask: a.subtask };
1719
1800
  }
1720
- if (es(r, t, e) !== null)
1721
- return n.includes("move") || n.includes("lane") ? { mode: "move", subtask: r.subtask } : { mode: "pan", subtask: r.subtask };
1801
+ if (as(a, t, e) !== null)
1802
+ return i.includes("move") || i.includes("lane") ? { mode: "move", subtask: a.subtask } : { mode: "pan", subtask: a.subtask };
1722
1803
  }
1723
1804
  return { mode: "pan", subtask: null };
1724
1805
  }
1725
1806
  pointerMove(t) {
1726
- const { x: e, y: i } = this.local(t.clientX, t.clientY);
1727
- if (t.pointerType === "touch" && this.touches.has(t.pointerId) && (this.touches.set(t.pointerId, { x: e, y: i }), this.press.pointerMove(t), this.gesture.kind === "pinch")) {
1728
- const r = this.touchDistance();
1729
- r > 0 && this.gesture.distance > 0 && this.host.view.zoomAt(this.touchCentre(), this.gesture.distance / r) && this.host.viewMoved(!0), this.gesture = { kind: "pinch", distance: r };
1807
+ const { x: e, y: n } = this.local(t.clientX, t.clientY);
1808
+ if (t.pointerType === "touch" && this.touches.has(t.pointerId) && (this.touches.set(t.pointerId, { x: e, y: n }), this.press.pointerMove(t), this.gesture.kind === "pinch")) {
1809
+ const a = this.touchDistance();
1810
+ a > 0 && this.gesture.distance > 0 && this.host.view.zoomAt(this.touchCentre(), this.gesture.distance / a) && this.host.viewMoved(!0), this.gesture = { kind: "pinch", distance: a };
1730
1811
  return;
1731
1812
  }
1732
- const n = this.gesture;
1733
- if (n.kind === "pending" && n.pointerId === t.pointerId) {
1734
- if (Math.hypot(e - n.x0, i - n.y0) < (t.pointerType === "touch" ? Li : Ge)) return;
1735
- n.mode === "pan" || n.subtask === null ? (this.gesture = { kind: "pan", pointerId: n.pointerId, lastX: n.x0, lastY: n.y0 }, this.setCursor("grabbing")) : this.startEdit(n, n.mode, n.subtask);
1813
+ const i = this.gesture;
1814
+ if (i.kind === "pending" && i.pointerId === t.pointerId) {
1815
+ if (Math.hypot(e - i.x0, n - i.y0) < (t.pointerType === "touch" ? xi : ze)) return;
1816
+ i.mode === "pan" || i.subtask === null ? (this.gesture = { kind: "pan", pointerId: i.pointerId, lastX: i.x0, lastY: i.y0 }, this.setCursor("grabbing")) : this.startEdit(i, i.mode, i.subtask);
1736
1817
  }
1737
1818
  const o = this.gesture;
1738
1819
  if (o.kind === "pan" && o.pointerId === t.pointerId) {
1739
- const r = this.host.view.pan(o.lastX - e, o.lastY - i);
1740
- r.moved && this.host.viewMoved(r.time), this.gesture = { ...o, lastX: e, lastY: i };
1820
+ const a = this.host.view.pan(o.lastX - e, o.lastY - n);
1821
+ a.moved && this.host.viewMoved(a.time), this.gesture = { ...o, lastX: e, lastY: n };
1741
1822
  return;
1742
1823
  }
1743
1824
  if (o.kind === "edit" && o.pointerId === t.pointerId) {
1744
- this.lastClient = { x: t.clientX, y: t.clientY }, this.dragPoint = { x: e, y: i }, this.restOver(i), this.gesture = { ...o, ghost: this.heldGhost(o, e, i) }, this.setCursor(this.refused || this.blocked ? "not-allowed" : o.mode === "move" ? "grabbing" : "ew-resize"), this.host.interactionChanged(), this.autoPan();
1825
+ this.lastClient = { x: t.clientX, y: t.clientY }, this.dragPoint = { x: e, y: n }, this.restOver(n), this.gesture = { ...o, ghost: this.heldGhost(o, e, n) }, this.setCursor(this.refused || this.blocked ? "not-allowed" : o.mode === "move" ? "grabbing" : "ew-resize"), this.host.interactionChanged(), this.autoPan();
1745
1826
  return;
1746
1827
  }
1747
- o.kind === "none" && !this.loading && (this.byKeyboard = !1, this.hoverAt(t.clientX, t.clientY, e, i));
1828
+ o.kind === "none" && !this.loading && (this.byKeyboard = !1, this.hoverAt(t.clientX, t.clientY, e, n));
1748
1829
  }
1749
1830
  /** The drag of `subtask` in `mode`, taking hold where the pending press
1750
1831
  stands. */
1751
- startEdit(t, e, i) {
1832
+ startEdit(t, e, n) {
1752
1833
  this.gesture = {
1753
1834
  kind: "edit",
1754
1835
  pointerId: t.pointerId,
1755
1836
  mode: e,
1756
- subtask: i,
1837
+ subtask: n,
1757
1838
  /* The working time the drag took hold at - not a pixel, because
1758
1839
  auto-pan moves the scale under a drag in flight. */
1759
1840
  t0: this.host.view.viewport().scale.fromPx(t.x0),
1760
- ghost: i,
1841
+ ghost: n,
1761
1842
  /* Asked here, once, and drawn from the first frame of the drag: the
1762
1843
  lanes that are closed are marked before the pointer reaches one. */
1763
- refused: e === "move" ? this.askRefused(i, i.lane) : Pe
1844
+ refused: e === "move" ? this.askRefused(n, n.lane) : Ve
1764
1845
  }, this.setCursor(e === "move" ? "grabbing" : "ew-resize");
1765
1846
  }
1766
1847
  /** The finger has been held on a bar: the bar is grabbed, unless the finger
@@ -1768,8 +1849,8 @@ class Ci {
1768
1849
  grab(t) {
1769
1850
  const e = this.gesture;
1770
1851
  if (!this.armed || this.loading || e.kind !== "pending") return;
1771
- const { x: i, y: n } = this.local(t.x, t.y), { mode: o, subtask: r } = this.modeAt(e.x0, e.y0);
1772
- o !== "move" || r === null || (this.lastClient = { x: t.x, y: t.y }, this.dragPoint = { x: i, y: n }, this.startEdit(e, o, r), this.host.interactionChanged());
1852
+ const { x: n, y: i } = this.local(t.x, t.y), { mode: o, subtask: a } = this.modeAt(e.x0, e.y0);
1853
+ o !== "move" || a === null || (this.lastClient = { x: t.x, y: t.y }, this.dragPoint = { x: n, y: i }, this.startEdit(e, o, a), this.host.interactionChanged());
1773
1854
  }
1774
1855
  /** The page's own scroll, while a bar is grabbed. Registered as not passive
1775
1856
  by the component: a passive listener cannot cancel it. Before the grab and
@@ -1783,22 +1864,22 @@ class Ci {
1783
1864
  this.touches.size === 1 && o !== void 0 ? this.gesture = { kind: "pan", pointerId: o[0], lastX: o[1].x, lastY: o[1].y } : this.touches.size === 0 && (this.gesture = { kind: "none" });
1784
1865
  return;
1785
1866
  }
1786
- const e = this.gesture, { x: i, y: n } = this.local(t.clientX, t.clientY);
1867
+ const e = this.gesture, { x: n, y: i } = this.local(t.clientX, t.clientY);
1787
1868
  if (e.kind === "pending" && e.pointerId === t.pointerId)
1788
- this.gesture = { kind: "none" }, this.click(t.clientX, t.clientY, i, n);
1869
+ this.gesture = { kind: "none" }, this.click(t.clientX, t.clientY, n, i);
1789
1870
  else if (e.kind === "pan" && e.pointerId === t.pointerId)
1790
- this.gesture = { kind: "none" }, this.setCursor("default"), this.hoverAt(t.clientX, t.clientY, i, n);
1871
+ this.gesture = { kind: "none" }, this.setCursor("default"), this.hoverAt(t.clientX, t.clientY, n, i);
1791
1872
  else if (e.kind === "edit" && e.pointerId === t.pointerId) {
1792
- if (t.pointerType === "touch" && (i < 0 || n < 0 || i > this.host.view.width || n > this.host.view.height)) {
1873
+ if (t.pointerType === "touch" && (n < 0 || i < 0 || n > this.host.view.width || i > this.host.view.height)) {
1793
1874
  this.cancelEdit();
1794
1875
  return;
1795
1876
  }
1796
1877
  this.stopAutoPan(), this.closeGestureFolds(), this.gesture = { kind: "none" };
1797
- const o = e.ghost.lane === e.subtask.lane || this.allowed(e.subtask, e.ghost.lane), r = this.intentsOf(e.subtask, e.ghost, e.mode).filter(
1798
- (a) => o || a.kind !== "lane"
1878
+ const o = e.ghost.lane === e.subtask.lane || this.allowed(e.subtask, e.ghost.lane), a = this.intentsOf(e.subtask, e.ghost, e.mode).filter(
1879
+ (r) => o || r.kind !== "lane"
1799
1880
  );
1800
1881
  this.refused = !1, this.blocked = !1, this.cursor = "default", this.host.interactionChanged();
1801
- for (const a of r) this.host.handlers().onIntent?.(a);
1882
+ for (const r of a) this.host.handlers().onIntent?.(r);
1802
1883
  }
1803
1884
  }
1804
1885
  /** While a drag is in flight near an edge, pans along once per frame and
@@ -1810,14 +1891,14 @@ class Ci {
1810
1891
  this.panFrame = 0;
1811
1892
  const e = this.gesture;
1812
1893
  if (e.kind !== "edit" && e.kind !== "place") return;
1813
- const i = this.host.view, { x: n, y: o } = this.local(this.lastClient.x, this.lastClient.y), r = Ne(n, i.width), a = Ne(o, i.height);
1814
- if (r === 0 && a === 0) return;
1815
- const l = i.pan(r, a);
1894
+ const n = this.host.view, { x: i, y: o } = this.local(this.lastClient.x, this.lastClient.y), a = Ke(i, n.width), r = Ke(o, n.height);
1895
+ if (a === 0 && r === 0) return;
1896
+ const l = n.pan(a, r);
1816
1897
  if (l.moved) {
1817
- if (this.dragPoint = { x: n, y: o }, e.kind === "edit")
1818
- this.gesture = { ...e, ghost: this.heldGhost(e, n, o) };
1898
+ if (this.dragPoint = { x: i, y: o }, e.kind === "edit")
1899
+ this.gesture = { ...e, ghost: this.heldGhost(e, i, o) };
1819
1900
  else {
1820
- const d = this.placeGhost(e.item, n, o, e.refused);
1901
+ const d = this.placeGhost(e.item, i, o, e.refused);
1821
1902
  this.refused = d.refused, this.blocked = d.blocked, this.gesture = { ...e, ghost: d.ghost ?? e.ghost };
1822
1903
  }
1823
1904
  this.host.viewMoved(l.time), this.panFrame = requestAnimationFrame(t);
@@ -1837,8 +1918,8 @@ class Ci {
1837
1918
  times would be a lie. Nothing is reported: no interaction happened. */
1838
1919
  refreshHover() {
1839
1920
  if (!this.idle || this.hoverKey === "nothing" || this.byKeyboard) return;
1840
- const { x: t, y: e } = this.hoverPoint, i = this.host.view.hitAt(t, e);
1841
- this.hover = i, this.hoverKey = Pt(i);
1921
+ const { x: t, y: e } = this.hoverPoint, n = this.host.view.hitAt(t, e);
1922
+ this.hover = n, this.hoverKey = Ht(n);
1842
1923
  }
1843
1924
  pointerLeave() {
1844
1925
  this.gesture.kind !== "none" || this.byKeyboard || this.setHover({ kind: "nothing" }, "nothing");
@@ -1850,50 +1931,50 @@ class Ci {
1850
1931
  }
1851
1932
  contextMenu(t) {
1852
1933
  if (this.host.handlers().onInteraction === void 0 || (t.preventDefault(), this.armed || this.editing || this.loading)) return;
1853
- const { x: e, y: i } = this.local(t.clientX, t.clientY);
1854
- this.report("contextmenu", this.host.view.hitAt(e, i), t.clientX, t.clientY, e, i);
1934
+ const { x: e, y: n } = this.local(t.clientX, t.clientY);
1935
+ this.report("contextmenu", this.host.view.hitAt(e, n), t.clientX, t.clientY, e, n);
1855
1936
  }
1856
1937
  /** The wheel, as every scrolling area has it:
1857
1938
  vertical scrolls the lanes, and lets the page scroll on once they are at
1858
1939
  their end; Ctrl or ⌘ zooms - a trackpad pinch arrives as a wheel with
1859
1940
  Ctrl -; horizontal or Shift pans through time. */
1860
1941
  wheel(t) {
1861
- const e = this.host.view, i = Math.max(0, Math.min(e.width, this.local(t.clientX, t.clientY).x)), n = t.deltaMode === 1 ? 16 : t.deltaMode === 2 ? e.height : 1, o = t.deltaX * n, r = t.deltaY * n;
1942
+ const e = this.host.view, n = Math.max(0, Math.min(e.width, this.local(t.clientX, t.clientY).x)), i = t.deltaMode === 1 ? 16 : t.deltaMode === 2 ? e.height : 1, o = t.deltaX * i, a = t.deltaY * i;
1862
1943
  if (t.ctrlKey || t.metaKey) {
1863
1944
  t.preventDefault();
1864
- const d = Math.abs(r) < 50 ? 0.01 : 15e-4;
1865
- e.zoomAt(i, Math.exp(r * d)) && this.host.viewMoved(!0);
1945
+ const d = Math.abs(a) < 50 ? 0.01 : 15e-4;
1946
+ e.zoomAt(n, Math.exp(a * d)) && this.host.viewMoved(!0);
1866
1947
  return;
1867
1948
  }
1868
- if (Math.abs(o) > Math.abs(r) || t.shiftKey) {
1949
+ if (Math.abs(o) > Math.abs(a) || t.shiftKey) {
1869
1950
  t.preventDefault();
1870
- const d = e.pan(t.shiftKey && o === 0 ? r : o, 0);
1951
+ const d = e.pan(t.shiftKey && o === 0 ? a : o, 0);
1871
1952
  d.moved && this.host.viewMoved(d.time);
1872
1953
  return;
1873
1954
  }
1874
- const a = r > 0 ? e.maxScroll() - e.scrollY : e.scrollY;
1875
- if (r === 0 || a <= 0) return;
1955
+ const r = a > 0 ? e.maxScroll() - e.scrollY : e.scrollY;
1956
+ if (a === 0 || r <= 0) return;
1876
1957
  t.preventDefault();
1877
- const l = e.pan(0, r);
1958
+ const l = e.pan(0, a);
1878
1959
  l.moved && this.host.viewMoved(l.time);
1879
1960
  }
1880
- click(t, e, i, n) {
1881
- const o = this.host.view.hitAt(i, n), r = o.kind === "subtask" ? o.subtask.task : o.kind === "dependency" ? this.host.data.taskOfDependency(o.dependency) : null;
1882
- this.host.select(r, o.kind === "subtask" ? o.subtask.id : null), this.report("click", o, t, e, i, n);
1961
+ click(t, e, n, i) {
1962
+ const o = this.host.view.hitAt(n, i), a = o.kind === "subtask" ? o.subtask.task : o.kind === "dependency" ? this.host.data.taskOfDependency(o.dependency) : null;
1963
+ this.host.select(a, o.kind === "subtask" ? o.subtask.id : null), this.report("click", o, t, e, n, i);
1883
1964
  }
1884
- hoverAt(t, e, i, n) {
1885
- const o = this.host.view.hitAt(i, n), r = Pt(o), { mode: a } = this.modeAt(i, n);
1886
- if (this.setCursor(a === "move" ? "grab" : a === "stretch-from" || a === "stretch-to" ? "ew-resize" : "default"), this.hoverPoint = { x: i, y: n }, r === this.hoverKey) {
1965
+ hoverAt(t, e, n, i) {
1966
+ const o = this.host.view.hitAt(n, i), a = Ht(o), { mode: r } = this.modeAt(n, i);
1967
+ if (this.setCursor(r === "move" ? "grab" : r === "stretch-from" || r === "stretch-to" ? "ew-resize" : "default"), this.hoverPoint = { x: n, y: i }, a === this.hoverKey) {
1887
1968
  (o.kind === "subtask" || o.kind === "dependency" || o.kind === "milestone") && this.host.hoverChanged();
1888
1969
  return;
1889
1970
  }
1890
- this.setHover(o, r), this.report("hover", o, t, e, i, n);
1971
+ this.setHover(o, a), this.report("hover", o, t, e, n, i);
1891
1972
  }
1892
1973
  /** The keyboard sets the hover: drawn, and its tooltip shown, as the
1893
1974
  pointer's would be - and reported to nobody, since `onInteraction`
1894
1975
  speaks of pointer positions. `nothing` hands the hover back. */
1895
1976
  setKeyboardHover(t, e) {
1896
- this.byKeyboard = t.kind !== "nothing", this.hoverPoint = e, this.hover = t, this.hoverKey = Pt(t), this.host.interactionChanged();
1977
+ this.byKeyboard = t.kind !== "nothing", this.hoverPoint = e, this.hover = t, this.hoverKey = Ht(t), this.host.interactionChanged();
1897
1978
  }
1898
1979
  setHover(t, e) {
1899
1980
  e !== this.hoverKey && (this.hoverKey = e, this.hover = t, this.host.hoverChanged());
@@ -1916,47 +1997,47 @@ class Ci {
1916
1997
  dragging and handles the place intent, the drop is accepted and a ghost
1917
1998
  shows where the work would land. */
1918
1999
  dragOver(t, e) {
1919
- const i = this.host.view;
1920
- if (this.loading || e === null || !i.options.intents.includes("place")) return;
1921
- const { x: n, y: o } = this.local(t.clientX, t.clientY);
1922
- if (i.laneIdAt(o) === null && i.foldedGroupAt(o) === null) {
2000
+ const n = this.host.view;
2001
+ if (this.loading || e === null || !n.options.intents.includes("place")) return;
2002
+ const { x: i, y: o } = this.local(t.clientX, t.clientY);
2003
+ if (n.laneIdAt(o) === null && n.foldedGroupAt(o) === null) {
1923
2004
  this.clearPlacing();
1924
2005
  return;
1925
2006
  }
1926
2007
  t.preventDefault(), this.restOver(o);
1927
- const r = this.gesture.kind === "place" ? this.gesture.refused : (
2008
+ const a = this.gesture.kind === "place" ? this.gesture.refused : (
1928
2009
  /* Work dragged in sits on no lane until it is dropped. Where the
1929
2010
  pointer is not over one either, the rule is asked about an item
1930
2011
  whose own lane is empty - which is the truth of it: `canMoveTo`
1931
2012
  is asked ABOUT a lane, and the one this item is on is none. */
1932
- this.askRefused(this.askedFor(e, this.onLane(o) ?? "", n), null)
1933
- ), a = this.placeGhost(e, n, o, r);
1934
- this.refused = a.refused, this.blocked = a.blocked, this.setCursor(a.refused || a.blocked ? "not-allowed" : "default");
1935
- const l = this.gesture.kind === "place" ? this.gesture.ghost : null, d = a.ghost ?? (a.refused || a.blocked ? l : null);
1936
- t.dataTransfer !== null && (t.dataTransfer.dropEffect = d === null ? "none" : "copy"), d !== null && (this.lastClient = { x: t.clientX, y: t.clientY }, this.dragPoint = { x: n, y: o }, this.gesture = { kind: "place", ghost: d, item: e, refused: r }, this.host.interactionChanged(), this.autoPan());
2013
+ this.askRefused(this.askedFor(e, this.onLane(o) ?? "", i), null)
2014
+ ), r = this.placeGhost(e, i, o, a);
2015
+ this.refused = r.refused, this.blocked = r.blocked, this.setCursor(r.refused || r.blocked ? "not-allowed" : "default");
2016
+ const l = this.gesture.kind === "place" ? this.gesture.ghost : null, d = r.ghost ?? (r.refused || r.blocked ? l : null);
2017
+ t.dataTransfer !== null && (t.dataTransfer.dropEffect = d === null ? "none" : "copy"), d !== null && (this.lastClient = { x: t.clientX, y: t.clientY }, this.dragPoint = { x: i, y: o }, this.gesture = { kind: "place", ghost: d, item: e, refused: a }, this.host.interactionChanged(), this.autoPan());
1937
2018
  }
1938
2019
  /** The ghost of a drag from outside at a point on the plot: none off the
1939
2020
  lanes, none where the caller refuses that lane and none where it would
1940
2021
  cover blocked time - which the answer says apart, because they mean
1941
2022
  different things to the drag. */
1942
- placeGhost(t, e, i, n) {
1943
- const o = this.onLane(i);
2023
+ placeGhost(t, e, n, i) {
2024
+ const o = this.onLane(n);
1944
2025
  if (o === null) return { ghost: null, refused: !1, blocked: !1 };
1945
- if (n.has(o)) return { ghost: null, refused: !0, blocked: !1 };
1946
- const r = { ...this.askedFor(t, o, e), id: Be };
1947
- return ct(r, null, this.host.data.blocked) ? { ghost: null, refused: !1, blocked: !0 } : { ghost: r, refused: !1, blocked: !1 };
2026
+ if (i.has(o)) return { ghost: null, refused: !0, blocked: !1 };
2027
+ const a = { ...this.askedFor(t, o, e), id: Ye };
2028
+ return ct(a, null, this.host.data.blocked) ? { ghost: null, refused: !1, blocked: !0 } : { ghost: a, refused: !1, blocked: !1 };
1948
2029
  }
1949
2030
  /** The dragged item as a subtask, under the caller's key for it - not the
1950
2031
  internal sentinel: the rule is asked about the thing the application says
1951
2032
  it is dragging, and the ghost only afterwards takes the sentinel. */
1952
- askedFor(t, e, i) {
1953
- const n = this.snapInside(this.host.view.timeAt(i), this.snapStep());
2033
+ askedFor(t, e, n) {
2034
+ const i = this.snapInside(this.host.view.timeAt(n), this.snapStep());
1954
2035
  return {
1955
2036
  id: t.item,
1956
2037
  task: t.task,
1957
2038
  lane: e,
1958
- from: n,
1959
- to: n + t.duration,
2039
+ from: i,
2040
+ to: i + t.duration,
1960
2041
  ...t.leadIn === void 0 ? {} : { leadIn: t.leadIn },
1961
2042
  ...t.leadOut === void 0 ? {} : { leadOut: t.leadOut }
1962
2043
  };
@@ -1967,17 +2048,17 @@ class Ci {
1967
2048
  const e = this.gesture;
1968
2049
  if (e.kind !== "place") return;
1969
2050
  t.preventDefault();
1970
- const { ghost: i, item: n } = e;
1971
- if (this.stopAutoPan(), this.closeGestureFolds(), this.gesture = { kind: "none" }, this.refused = !1, this.blocked = !1, this.cursor = "default", this.host.interactionChanged(), !this.allowed({ ...i, id: n.item }, i.lane)) return;
2051
+ const { ghost: n, item: i } = e;
2052
+ if (this.stopAutoPan(), this.closeGestureFolds(), this.gesture = { kind: "none" }, this.refused = !1, this.blocked = !1, this.cursor = "default", this.host.interactionChanged(), !this.allowed({ ...n, id: i.item }, n.lane)) return;
1972
2053
  const o = {
1973
2054
  kind: "place",
1974
- item: n.item,
1975
- task: i.task,
1976
- lane: i.lane,
1977
- from: i.from,
1978
- to: i.to,
1979
- ...i.leadIn === void 0 ? {} : { leadIn: i.leadIn },
1980
- ...i.leadOut === void 0 ? {} : { leadOut: i.leadOut }
2055
+ item: i.item,
2056
+ task: n.task,
2057
+ lane: n.lane,
2058
+ from: n.from,
2059
+ to: n.to,
2060
+ ...n.leadIn === void 0 ? {} : { leadIn: n.leadIn },
2061
+ ...n.leadOut === void 0 ? {} : { leadOut: n.leadOut }
1981
2062
  };
1982
2063
  this.host.handlers().onIntent?.(o);
1983
2064
  }
@@ -1999,29 +2080,29 @@ class Ci {
1999
2080
  put the work into blocked time it did not already cover, the ghost where
2000
2081
  it last stood. It is held, not clamped: a pointer carried on past the
2001
2082
  blocked time takes the ghost along again. */
2002
- heldGhost(t, e, i) {
2003
- const n = this.ghostFor(t, e, i);
2004
- return this.blocked = ct(n, t.subtask, this.host.data.blocked), this.blocked ? t.ghost : n;
2083
+ heldGhost(t, e, n) {
2084
+ const i = this.ghostFor(t, e, n);
2085
+ return this.blocked = ct(i, t.subtask, this.host.data.blocked), this.blocked ? t.ghost : i;
2005
2086
  }
2006
- ghostFor(t, e, i) {
2007
- const n = this.host.view, o = t.subtask, r = this.snapStep(), a = n.options.intents, l = this.snapInside(n.timeAt(e), r);
2087
+ ghostFor(t, e, n) {
2088
+ const i = this.host.view, o = t.subtask, a = this.snapStep(), r = i.options.intents, l = this.snapInside(i.timeAt(e), a);
2008
2089
  switch (t.mode) {
2009
2090
  case "move": {
2010
2091
  let d = o.from;
2011
- const h = n.viewport().scale, c = h.fromPx(e) - t.t0;
2012
- a.includes("move") && Math.abs(c * h.m) >= Ge && (d = this.shifted(o.from, c, r));
2013
- let f = t.ghost.lane;
2014
- if (a.includes("lane")) {
2015
- const g = this.onLane(i) ?? f;
2016
- this.refused = t.refused.has(g), this.refused || (f = g);
2092
+ const h = i.viewport().scale, c = h.fromPx(e) - t.t0;
2093
+ r.includes("move") && Math.abs(c * h.m) >= ze && (d = this.shifted(o.from, c, a));
2094
+ let m = t.ghost.lane;
2095
+ if (r.includes("lane")) {
2096
+ const k = this.onLane(n) ?? m;
2097
+ this.refused = t.refused.has(k), this.refused || (m = k);
2017
2098
  } else
2018
2099
  this.refused = !1;
2019
- return { ...o, from: d, to: d + (o.to - o.from), lane: f };
2100
+ return { ...o, from: d, to: d + (o.to - o.from), lane: m };
2020
2101
  }
2021
2102
  case "stretch-from":
2022
- return { ...o, from: Math.min(l, o.to - Math.max(r.step, X)) };
2103
+ return { ...o, from: Math.min(l, o.to - Math.max(a.step, Z)) };
2023
2104
  case "stretch-to":
2024
- return { ...o, to: Math.max(l, o.from + Math.max(r.step, X)) };
2105
+ return { ...o, to: Math.max(l, o.from + Math.max(a.step, Z)) };
2025
2106
  case "leadIn":
2026
2107
  return { ...o, leadIn: Math.max(0, o.from - l) };
2027
2108
  case "leadOut":
@@ -2031,20 +2112,20 @@ class Ci {
2031
2112
  /** A time moved by an amount of WORKING time and snapped: a drag moves
2032
2113
  a start this way, and a key by one step of the raster - one arithmetic,
2033
2114
  so a key proposes exactly what a drag of that length would. */
2034
- shifted(t, e, i) {
2035
- const n = bt(this.host.view.options.calendar), o = Y(t, n) + e, r = ut(o, n);
2036
- return this.snapInside(r, i);
2115
+ shifted(t, e, n) {
2116
+ const i = Tt(this.host.view.options.calendar), o = V(t, i) + e, a = ut(o, i);
2117
+ return this.snapInside(a, n);
2037
2118
  }
2038
2119
  /** Snapped - and, where the raster lands in time the calendar removes, moved
2039
2120
  on to the seam, where time counts again. An intent never asks for a time
2040
2121
  nobody works. */
2041
2122
  snapInside(t, e) {
2042
- const i = Ys(t, e, this.host.view.options.timeZone), n = bt(this.host.view.options.calendar);
2043
- return n.intervals.length === 0 ? i : Wt(Y(i, n), n);
2123
+ const n = zs(t, e, this.host.view.options.timeZone), i = Tt(this.host.view.options.calendar);
2124
+ return i.intervals.length === 0 ? n : qt(V(n, i), i);
2044
2125
  }
2045
- intentsOf(t, e, i) {
2046
- const n = [], o = this.host.view.options.intents, r = t.id;
2047
- return i === "move" ? (e.from !== t.from && o.includes("move") && n.push({ kind: "move", subtask: r, from: e.from, to: e.to }), e.lane !== t.lane && o.includes("lane") && n.push({ kind: "lane", subtask: r, lane: e.lane })) : i === "stretch-from" || i === "stretch-to" ? (e.from !== t.from || e.to !== t.to) && n.push({ kind: "stretch", subtask: r, from: e.from, to: e.to }) : i === "leadIn" ? (e.leadIn ?? 0) !== (t.leadIn ?? 0) && n.push({ kind: "leadIn", subtask: r, leadIn: e.leadIn ?? 0 }) : (e.leadOut ?? 0) !== (t.leadOut ?? 0) && n.push({ kind: "leadOut", subtask: r, leadOut: e.leadOut ?? 0 }), n;
2126
+ intentsOf(t, e, n) {
2127
+ const i = [], o = this.host.view.options.intents, a = t.id;
2128
+ return n === "move" ? (e.from !== t.from && o.includes("move") && i.push({ kind: "move", subtask: a, from: e.from, to: e.to }), e.lane !== t.lane && o.includes("lane") && i.push({ kind: "lane", subtask: a, lane: e.lane })) : n === "stretch-from" || n === "stretch-to" ? (e.from !== t.from || e.to !== t.to) && i.push({ kind: "stretch", subtask: a, from: e.from, to: e.to }) : n === "leadIn" ? (e.leadIn ?? 0) !== (t.leadIn ?? 0) && i.push({ kind: "leadIn", subtask: a, leadIn: e.leadIn ?? 0 }) : (e.leadOut ?? 0) !== (t.leadOut ?? 0) && i.push({ kind: "leadOut", subtask: a, leadOut: e.leadOut ?? 0 }), i;
2048
2129
  }
2049
2130
  /** The lane the ghost came from - the only other lane a drag can touch. */
2050
2131
  ghostHome(t) {
@@ -2060,68 +2141,68 @@ class Ci {
2060
2141
  keeps a plan of hundreds of tasks fluid while a drag runs, since this is
2061
2142
  computed on every pointer movement. */
2062
2143
  ghostFindings(t, e) {
2063
- const i = this.host.data, n = (h) => h.lane === t.lane || h.lane === e, r = [...i.subtasks.filter((h) => h.id !== t.id && n(h)), t], a = (h) => h.first === t.id || h.second === t.id, l = i.dependencies.filter((h) => h.from === t.id || h.to === t.id), d = t.id === Be ? i.subtasks : i.subtasks.map((h) => h.id === t.id ? t : h);
2064
- return { overlaps: Jt(r).filter(a), violated: Qt(d, l) };
2144
+ const n = this.host.data, i = (h) => h.lane === t.lane || h.lane === e, a = [...n.subtasks.filter((h) => h.id !== t.id && i(h)), t], r = (h) => h.first === t.id || h.second === t.id, l = n.dependencies.filter((h) => h.from === t.id || h.to === t.id), d = t.id === Ye ? n.subtasks : n.subtasks.map((h) => h.id === t.id ? t : h);
2145
+ return { overlaps: ee(a).filter(r), violated: se(d, l) };
2065
2146
  }
2066
2147
  }
2067
- function Di(s, t) {
2148
+ function Pi(s, t) {
2068
2149
  const e = /* @__PURE__ */ new Map();
2069
- for (const i of t) {
2070
- const n = s.slots.get(i.lane), o = n === void 0 ? null : nt(s, n.top);
2150
+ for (const n of t) {
2151
+ const i = s.slots.get(n.lane), o = i === void 0 ? null : ot(s, i.top);
2071
2152
  if (o === null) continue;
2072
- const r = s.rows.indexOf(o);
2073
- e.set(r, [...e.get(r) ?? [], i]);
2153
+ const a = s.rows.indexOf(o);
2154
+ e.set(a, [...e.get(a) ?? [], n]);
2074
2155
  }
2075
- return [...e.entries()].sort(([i], [n]) => i - n).map(([, i]) => i.sort((n, o) => n.from - o.from || n.to - o.to));
2156
+ return [...e.entries()].sort(([n], [i]) => n - i).map(([, n]) => n.sort((i, o) => i.from - o.from || i.to - o.to));
2076
2157
  }
2077
- const He = (s, t) => t < s.from ? s.from - t : t > s.to ? t - s.to : 0;
2078
- function _i(s, t, e, i) {
2079
- let n = -1, o = -1;
2080
- for (let d = 0; d < s.length && t !== null && n < 0; d++)
2081
- o = s[d].findIndex((h) => h.id === t), o >= 0 && (n = d);
2082
- if (n < 0) {
2158
+ const We = (s, t) => t < s.from ? s.from - t : t > s.to ? t - s.to : 0;
2159
+ function Gi(s, t, e, n) {
2160
+ let i = -1, o = -1;
2161
+ for (let d = 0; d < s.length && t !== null && i < 0; d++)
2162
+ o = s[d].findIndex((h) => h.id === t), o >= 0 && (i = d);
2163
+ if (i < 0) {
2083
2164
  for (const d of s) {
2084
- const h = d.find((c) => c.to > i[0] && c.from < i[1]);
2165
+ const h = d.find((c) => c.to > n[0] && c.from < n[1]);
2085
2166
  if (h !== void 0) return h;
2086
2167
  }
2087
2168
  return s[0]?.[0] ?? null;
2088
2169
  }
2089
- const r = s[n], a = r[o], l = (i[1] - i[0]) / 10;
2170
+ const a = s[i], r = a[o], l = (n[1] - n[0]) / 10;
2090
2171
  switch (e) {
2091
2172
  case "next":
2092
- return r[o + 1] ?? a;
2173
+ return a[o + 1] ?? r;
2093
2174
  case "previous":
2094
- return r[o - 1] ?? a;
2175
+ return a[o - 1] ?? r;
2095
2176
  case "first":
2096
- return r[0];
2177
+ return a[0];
2097
2178
  case "last":
2098
- return r[r.length - 1];
2179
+ return a[a.length - 1];
2099
2180
  case "pageNext":
2100
- return r.find((d, h) => h > o && d.from >= a.from + l) ?? r[r.length - 1];
2181
+ return a.find((d, h) => h > o && d.from >= r.from + l) ?? a[a.length - 1];
2101
2182
  case "pagePrevious":
2102
- for (let d = o - 1; d >= 0; d--) if (r[d].from <= a.from - l) return r[d];
2103
- return r[0];
2183
+ for (let d = o - 1; d >= 0; d--) if (a[d].from <= r.from - l) return a[d];
2184
+ return a[0];
2104
2185
  case "up":
2105
2186
  case "down": {
2106
- const d = s[e === "up" ? n - 1 : n + 1];
2107
- if (d === void 0) return a;
2108
- const h = (a.from + a.to) / 2;
2109
- return d.reduce((c, f) => He(f, h) < He(c, h) ? f : c);
2187
+ const d = s[e === "up" ? i - 1 : i + 1];
2188
+ if (d === void 0) return r;
2189
+ const h = (r.from + r.to) / 2;
2190
+ return d.reduce((c, m) => We(m, h) < We(c, h) ? m : c);
2110
2191
  }
2111
2192
  }
2112
2193
  }
2113
- function Oi(s, t, e, i) {
2194
+ function Hi(s, t, e, n) {
2114
2195
  if (e.kind === "milestone") return e;
2115
2196
  if (e.kind === "dependency") {
2116
- const o = s.find((a) => a.id === e.id), r = o === void 0 ? void 0 : i === "out" ? o.to : o.from;
2117
- return r !== void 0 && t.has(r) ? { kind: "subtask", id: r } : e;
2197
+ const o = s.find((r) => r.id === e.id), a = o === void 0 ? void 0 : n === "out" ? o.to : o.from;
2198
+ return a !== void 0 && t.has(a) ? { kind: "subtask", id: a } : e;
2118
2199
  }
2119
- const n = s.find(
2120
- (o) => (i === "out" ? o.from : o.to) === e.id && t.has(i === "out" ? o.to : o.from)
2200
+ const i = s.find(
2201
+ (o) => (n === "out" ? o.from : o.to) === e.id && t.has(n === "out" ? o.to : o.from)
2121
2202
  );
2122
- return n === void 0 ? e : { kind: "dependency", id: n.id };
2203
+ return i === void 0 ? e : { kind: "dependency", id: i.id };
2123
2204
  }
2124
- const yt = "\0milestone:", Fi = 150, $i = {
2205
+ const Mt = "\0milestone:", Ue = 150, Xe = 1.25, Ki = {
2125
2206
  ArrowRight: "next",
2126
2207
  ArrowLeft: "previous",
2127
2208
  ArrowUp: "up",
@@ -2131,7 +2212,7 @@ const yt = "\0milestone:", Fi = 150, $i = {
2131
2212
  PageDown: "pageNext",
2132
2213
  PageUp: "pagePrevious"
2133
2214
  };
2134
- class Ei {
2215
+ class Yi {
2135
2216
  constructor(t) {
2136
2217
  this.host = t;
2137
2218
  }
@@ -2156,33 +2237,46 @@ class Ei {
2156
2237
  key(t) {
2157
2238
  const e = this.host.gestures;
2158
2239
  if (t.metaKey || !e.idle) return !1;
2159
- const i = t.key.toLowerCase() === "t" && !t.ctrlKey && !t.altKey;
2160
- if (t.key === "]" || t.key === "[" || i) {
2240
+ const n = t.key.toLowerCase() === "t" && !t.ctrlKey && !t.altKey;
2241
+ if (t.key === "]" || t.key === "[" || n) {
2161
2242
  const o = this.active();
2162
2243
  if (o === null) return !1;
2163
- const r = this.host.data, a = i ? !t.shiftKey : t.key === "]";
2164
- return this.show(Oi(r.dependencies, r.subtaskById, o, a ? "out" : "back")), !0;
2244
+ const a = this.host.data, r = n ? !t.shiftKey : t.key === "]";
2245
+ return this.show(Hi(a.dependencies, a.subtaskById, o, r ? "out" : "back")), !0;
2165
2246
  }
2166
2247
  if (t.ctrlKey) return !1;
2248
+ if (!t.altKey && this.zoom(t)) return !0;
2167
2249
  if (t.altKey) return this.edit(t);
2168
2250
  if (t.key === "Escape")
2169
2251
  return e.byKeyboard ? (this.blur(), !0) : !1;
2170
2252
  if (t.key === "Enter" || t.key === " ") return this.select();
2171
- const n = t.shiftKey ? void 0 : $i[t.key];
2172
- return n === void 0 ? !1 : (this.walk(n), !0);
2253
+ const i = t.shiftKey ? void 0 : Ki[t.key];
2254
+ return i === void 0 ? !1 : (this.walk(i), !0);
2255
+ }
2256
+ /** + and = zoom in, - and _ zoom out, 0 fits the work: by the character, so
2257
+ that every layout reaches them (Shift is how a US keyboard types +). The
2258
+ anchor is the middle of the active subtask's main time, else of the plot. */
2259
+ zoom(t) {
2260
+ const e = t.key === "+" || t.key === "=" ? 1 / Xe : t.key === "-" || t.key === "_" ? Xe : 1;
2261
+ if (e === 1 && t.key !== "0") return !1;
2262
+ if (e !== 1) {
2263
+ const n = this.active(), i = n?.kind === "subtask" ? this.host.view.boxById.get(n.id) : void 0, o = this.host.view.width;
2264
+ this.host.zoomBy(i === void 0 ? o / 2 : Math.max(0, Math.min(o, (i.mainFrom + i.mainTo) / 2)), e);
2265
+ } else this.host.fitWork();
2266
+ return this.scheduleSpan(), !0;
2173
2267
  }
2174
2268
  walk(t) {
2175
- const { data: e, view: i } = this.host, n = this.active(), o = n === null ? null : n.kind === "subtask" ? n.id : n.kind === "milestone" ? yt + n.id : e.dependencies.find((d) => d.id === n.id)?.from ?? null, r = [...e.subtasks, ...e.milestones.map((d) => ({ id: yt + d.id, lane: d.lane, from: d.at, to: d.at }))];
2176
- let a = Di(i.rows, r);
2269
+ const { data: e, view: n } = this.host, i = this.active(), o = i === null ? null : i.kind === "subtask" ? i.id : i.kind === "milestone" ? Mt + i.id : e.dependencies.find((d) => d.id === i.id)?.from ?? null, a = [...e.subtasks, ...e.milestones.map((d) => ({ id: Mt + d.id, lane: d.lane, from: d.at, to: d.at }))];
2270
+ let r = Pi(n.rows, a);
2177
2271
  if (o === null) {
2178
- const d = a.filter((h) => {
2179
- const c = Z(i.viewport(), h[0].lane);
2180
- return c !== null && c.top + c.height > 0 && c.top < i.height;
2272
+ const d = r.filter((h) => {
2273
+ const c = tt(n.viewport(), h[0].lane);
2274
+ return c !== null && c.top + c.height > 0 && c.top < n.height;
2181
2275
  });
2182
- d.length > 0 && (a = d);
2276
+ d.length > 0 && (r = d);
2183
2277
  }
2184
- const l = _i(a, o, t, this.host.visibleDomain());
2185
- l !== null && this.show(l.id.startsWith(yt) ? { kind: "milestone", id: l.id.slice(yt.length) } : { kind: "subtask", id: l.id });
2278
+ const l = Gi(r, o, t, this.host.visibleDomain());
2279
+ l !== null && this.show(l.id.startsWith(Mt) ? { kind: "milestone", id: l.id.slice(Mt.length) } : { kind: "subtask", id: l.id });
2186
2280
  }
2187
2281
  /** Space and Enter select as a click does: the whole task, and the subtask. */
2188
2282
  select() {
@@ -2196,81 +2290,81 @@ class Ei {
2196
2290
  end - the intents a drag of that length reports (ADR-0023), and only
2197
2291
  where the caller handles them. Nothing is applied here. */
2198
2292
  edit(t) {
2199
- const e = this.host.gestures.hover, i = t.key === "ArrowRight" ? 1 : t.key === "ArrowLeft" ? -1 : 0;
2200
- if (i === 0) return !1;
2293
+ const e = this.host.gestures.hover, n = t.key === "ArrowRight" ? 1 : t.key === "ArrowLeft" ? -1 : 0;
2294
+ if (n === 0) return !1;
2201
2295
  if (this.host.gestures.loading || e.kind !== "subtask") return !0;
2202
- const n = e.subtask, o = this.host.gestures, r = this.host.view.options.intents, a = o.snapStep(), l = a.step > 0 ? a : { step: this.host.view.step(), offset: 0 }, d = this.host.data.blocked;
2296
+ const i = e.subtask, o = this.host.gestures, a = this.host.view.options.intents, r = o.snapStep(), l = r.step > 0 ? r : { step: this.host.view.step(), offset: 0 }, d = this.host.data.blocked;
2203
2297
  let h = null;
2204
- if (!t.shiftKey && r.includes("move")) {
2205
- const c = (g) => ({ ...n, from: g, to: g + (n.to - n.from) });
2206
- let f = n.from;
2207
- for (let g = 0; g < 1e3; g++) {
2208
- const w = o.shifted(f, i * l.step, l);
2209
- if (w === f || (f = w, !ct(c(f), n, d))) break;
2298
+ if (!t.shiftKey && a.includes("move")) {
2299
+ const c = (k) => ({ ...i, from: k, to: k + (i.to - i.from) });
2300
+ let m = i.from;
2301
+ for (let k = 0; k < 1e3; k++) {
2302
+ const f = o.shifted(m, n * l.step, l);
2303
+ if (f === m || (m = f, !ct(c(m), i, d))) break;
2210
2304
  }
2211
- f !== n.from && !ct(c(f), n, d) && (h = { kind: "move", subtask: n.id, from: f, to: c(f).to });
2212
- } else if (t.shiftKey && r.includes("stretch")) {
2213
- const c = Math.max(o.shifted(n.to, i * l.step, l), n.from + Math.max(l.step, X));
2214
- c !== n.to && !ct({ ...n, to: c }, n, d) && (h = { kind: "stretch", subtask: n.id, from: n.from, to: c });
2305
+ m !== i.from && !ct(c(m), i, d) && (h = { kind: "move", subtask: i.id, from: m, to: c(m).to });
2306
+ } else if (t.shiftKey && a.includes("stretch")) {
2307
+ const c = Math.max(o.shifted(i.to, n * l.step, l), i.from + Math.max(l.step, Z));
2308
+ c !== i.to && !ct({ ...i, to: c }, i, d) && (h = { kind: "stretch", subtask: i.id, from: i.from, to: c });
2215
2309
  }
2216
2310
  return o.byKeyboard = !0, h !== null && this.host.handlers().onIntent?.(h), this.scheduleReadout(), !0;
2217
2311
  }
2218
2312
  /** The keys stand on this target: brought into view, drawn as the hover. */
2219
2313
  show(t, e = !0) {
2220
- const i = this.hitOf(t);
2221
- if (i === null) return;
2222
- e && this.reveal(t);
2223
- const n = this.bounds(t);
2314
+ const n = this.hitOf(t);
2224
2315
  if (n === null) return;
2225
- const { view: o } = this.host, r = (a, l) => Math.max(0, Math.min(l, a));
2226
- this.host.gestures.setKeyboardHover(i, {
2227
- x: (r(n.x0, o.width) + r(n.x1, o.width)) / 2,
2228
- y: (r(n.y0, o.height) + r(n.y1, o.height)) / 2
2316
+ e && this.reveal(t);
2317
+ const i = this.bounds(t);
2318
+ if (i === null) return;
2319
+ const { view: o } = this.host, a = (r, l) => Math.max(0, Math.min(l, r));
2320
+ this.host.gestures.setKeyboardHover(n, {
2321
+ x: (a(i.x0, o.width) + a(i.x1, o.width)) / 2,
2322
+ y: (a(i.y0, o.height) + a(i.y1, o.height)) / 2
2229
2323
  }), e && this.scheduleReadout();
2230
2324
  }
2231
2325
  hitOf(t) {
2232
2326
  const e = this.host.data;
2233
2327
  if (t.kind === "subtask") {
2234
- const n = e.subtaskById.get(t.id);
2235
- return n === void 0 ? null : { kind: "subtask", subtask: n, part: "main" };
2328
+ const i = e.subtaskById.get(t.id);
2329
+ return i === void 0 ? null : { kind: "subtask", subtask: i, part: "main" };
2236
2330
  }
2237
2331
  if (t.kind === "milestone") {
2238
- const n = e.milestones.find((o) => o.id === t.id);
2239
- return n === void 0 ? null : { kind: "milestone", milestone: n };
2332
+ const i = e.milestones.find((o) => o.id === t.id);
2333
+ return i === void 0 ? null : { kind: "milestone", milestone: i };
2240
2334
  }
2241
- const i = e.dependencies.find((n) => n.id === t.id);
2242
- return i === void 0 ? null : { kind: "dependency", dependency: i };
2335
+ const n = e.dependencies.find((i) => i.id === t.id);
2336
+ return n === void 0 ? null : { kind: "dependency", dependency: n };
2243
2337
  }
2244
2338
  /** Where a target lies on the plot: a subtask's bar, or the span between
2245
2339
  the two bars a dependency joins. */
2246
2340
  bounds(t) {
2247
- const e = this.host.view, i = (a) => e.boxById.get(a);
2341
+ const e = this.host.view, n = (r) => e.boxById.get(r);
2248
2342
  if (t.kind === "subtask") {
2249
- const a = i(t.id);
2250
- return a === void 0 ? null : { x0: a.outerFrom, x1: a.outerTo, y0: a.y, y1: a.y + a.height };
2343
+ const r = n(t.id);
2344
+ return r === void 0 ? null : { x0: r.outerFrom, x1: r.outerTo, y0: r.y, y1: r.y + r.height };
2251
2345
  }
2252
2346
  if (t.kind === "milestone") {
2253
- const a = this.host.data.milestones.find((d) => d.id === t.id), l = a === void 0 ? null : se(e.viewport(), a);
2347
+ const r = this.host.data.milestones.find((d) => d.id === t.id), l = r === void 0 ? null : ae(e.viewport(), r);
2254
2348
  return l === null ? null : { x0: l.x - l.half, x1: l.x + l.half, y0: l.y - l.half, y1: l.y + l.half };
2255
2349
  }
2256
- const n = this.host.data.dependencies.find((a) => a.id === t.id), o = n === void 0 ? void 0 : i(n.from), r = n === void 0 ? void 0 : i(n.to);
2257
- return o === void 0 || r === void 0 ? null : {
2258
- x0: Math.min(o.mainTo, r.mainFrom),
2259
- x1: Math.max(o.mainTo, r.mainFrom),
2260
- y0: Math.min(o.y, r.y),
2261
- y1: Math.max(o.y + o.height, r.y + r.height)
2350
+ const i = this.host.data.dependencies.find((r) => r.id === t.id), o = i === void 0 ? void 0 : n(i.from), a = i === void 0 ? void 0 : n(i.to);
2351
+ return o === void 0 || a === void 0 ? null : {
2352
+ x0: Math.min(o.mainTo, a.mainFrom),
2353
+ x1: Math.max(o.mainTo, a.mainFrom),
2354
+ y0: Math.min(o.y, a.y),
2355
+ y1: Math.max(o.y + o.height, a.y + a.height)
2262
2356
  };
2263
2357
  }
2264
2358
  /** Pans and scrolls just enough to bring a target into view, with a margin
2265
2359
  at the side it came in from; a target wider than the view shows its
2266
2360
  start. As a drag at the edge pans along, the keys do. */
2267
2361
  reveal(t) {
2268
- const e = this.bounds(t), i = this.host.view;
2269
- if (e === null || i.width <= 0) return;
2270
- const n = Math.min(24, i.width / 10), o = e.x0 < 0 ? e.x0 - n : e.x1 > i.width ? Math.max(0, Math.min(e.x1 - i.width + n, e.x0 - n)) : 0, r = e.y0 < 0 ? e.y0 : e.y1 > i.height ? Math.min(e.y1 - i.height, e.y0) : 0;
2271
- if (o === 0 && r === 0) return;
2272
- const a = i.pan(o, r);
2273
- a.moved && this.host.viewMoved(a.time);
2362
+ const e = this.bounds(t), n = this.host.view;
2363
+ if (e === null || n.width <= 0) return;
2364
+ const i = Math.min(24, n.width / 10), o = e.x0 < 0 ? e.x0 - i : e.x1 > n.width ? Math.max(0, Math.min(e.x1 - n.width + i, e.x0 - i)) : 0, a = e.y0 < 0 ? e.y0 : e.y1 > n.height ? Math.min(e.y1 - n.height, e.y0) : 0;
2365
+ if (o === 0 && a === 0) return;
2366
+ const r = n.pan(o, a);
2367
+ r.moved && this.host.viewMoved(r.time);
2274
2368
  }
2275
2369
  /** After the data or the view changed: the keys' target is read anew by its
2276
2370
  id - its new times, its new place -, and dropped where it is gone. */
@@ -2287,36 +2381,42 @@ class Ei {
2287
2381
  if (!this.host.gestures.byKeyboard) return;
2288
2382
  const e = this.host.data.tooltipTargetFor(t);
2289
2383
  e !== null && (this.spoken = { target: e, lane: t.kind === "subtask" ? t.subtask.lane : t.kind === "milestone" ? t.milestone.lane : null, count: (this.spoken?.count ?? 0) + 1 }, this.host.spokenChanged());
2290
- }, Fi);
2384
+ }, Ue);
2385
+ }
2386
+ /** The span in view, said once the keys rest - also after a key that changed nothing. */
2387
+ scheduleSpan() {
2388
+ this.timer !== null && clearTimeout(this.timer), this.timer = setTimeout(() => {
2389
+ this.timer = null, this.spoken = { target: null, lane: null, span: this.host.visibleDomain(), count: (this.spoken?.count ?? 0) + 1 }, this.host.spokenChanged();
2390
+ }, Ue);
2291
2391
  }
2292
2392
  /** Unmount: no readout after it. */
2293
2393
  stop() {
2294
2394
  this.timer !== null && clearTimeout(this.timer), this.timer = null;
2295
2395
  }
2296
2396
  }
2297
- const st = (s) => JSON.stringify([s.domain ?? null, [...s.folded ?? []].sort()]);
2298
- function xi(s, t) {
2397
+ const nt = (s) => JSON.stringify([s.domain ?? null, [...s.folded ?? []].sort()]);
2398
+ function Vi(s, t) {
2299
2399
  if (t.size === 0 || s.folded === void 0) return s;
2300
- const e = s.folded.filter((i) => t.has(i));
2400
+ const e = s.folded.filter((n) => t.has(n));
2301
2401
  return e.length === s.folded.length ? s : { ...s.domain ? { domain: s.domain } : {}, ...e.length ? { folded: e } : {} };
2302
2402
  }
2303
- function Ri(s, t, e = (i) => i) {
2403
+ function zi(s, t, e = (n) => n) {
2304
2404
  if (s.length === 0) return null;
2305
- let i = 1 / 0, n = -1 / 0;
2306
- for (const a of s)
2307
- i = Math.min(i, a.from - (a.leadIn ?? 0)), n = Math.max(n, a.to + (a.leadOut ?? 0));
2308
- i = e(i), n = e(n);
2309
- const o = Math.min(t.max, Math.max(t.min, n - i)), r = (i + n) / 2;
2310
- return [r - o / 2, r + o / 2];
2311
- }
2312
- const Ye = {
2405
+ let n = 1 / 0, i = -1 / 0;
2406
+ for (const r of s)
2407
+ n = Math.min(n, r.from - (r.leadIn ?? 0)), i = Math.max(i, r.to + (r.leadOut ?? 0));
2408
+ n = e(n), i = e(i);
2409
+ const o = Math.min(t.max, Math.max(t.min, i - n)), a = (n + i) / 2;
2410
+ return [a - o / 2, a + o / 2];
2411
+ }
2412
+ const qe = {
2313
2413
  width: 0,
2314
2414
  height: 0,
2315
2415
  scrollY: 0,
2316
2416
  headers: [],
2317
2417
  days: [],
2318
2418
  ticks: [],
2319
- step: Ut,
2419
+ step: jt,
2320
2420
  fontScale: 1,
2321
2421
  ghost: null,
2322
2422
  grips: [],
@@ -2325,12 +2425,13 @@ const Ye = {
2325
2425
  loading: !1,
2326
2426
  now: null,
2327
2427
  bars: [],
2428
+ dataTable: null,
2328
2429
  spoken: null,
2329
2430
  summary: { lanes: 0, subtasks: 0, from: 0, to: 0, overlaps: 0, violated: 0, blocked: 0, milestones: 0 }
2330
2431
  };
2331
- class Ni {
2332
- data = new si(() => this.viewChanged());
2333
- view = new un(this.data);
2432
+ class Wi {
2433
+ data = new ui(() => this.viewChanged());
2434
+ view = new gn(this.data);
2334
2435
  gestures;
2335
2436
  keys;
2336
2437
  handlersNow = {};
@@ -2371,28 +2472,33 @@ class Ni {
2371
2472
  movePending = !1;
2372
2473
  domainFrame = 0;
2373
2474
  unsubscribeTheme = null;
2374
- snapshot = Ye;
2475
+ snapshot = qe;
2476
+ dataTable = null;
2375
2477
  listeners = /* @__PURE__ */ new Set();
2376
2478
  constructor(t = {}) {
2377
- this.folded = t.folded ?? [], this.domainInView = t.domain ?? null, this.domainInView !== null && this.view.showWall(this.domainInView), this.viewNow = this.currentView(), this.gestures = new Ci({
2479
+ this.folded = t.folded ?? [], this.domainInView = t.domain ?? null, this.domainInView !== null && this.view.showWall(this.domainInView), this.viewNow = this.currentView(), this.gestures = new Ri({
2378
2480
  data: this.data,
2379
2481
  view: this.view,
2380
2482
  plotElement: () => this.plot,
2381
2483
  handlers: () => this.handlersNow,
2382
2484
  selectedSubtask: () => this.selected,
2383
- select: (e, i) => this.select(e, i),
2485
+ select: (e, n) => this.select(e, n),
2384
2486
  viewChanged: () => this.viewChanged(),
2385
2487
  viewMoved: (e) => this.viewMoved(e),
2386
2488
  interactionChanged: () => this.interactionChanged(),
2387
2489
  hoverChanged: () => this.hoverChanged()
2388
- }), this.keys = new Ei({
2490
+ }), this.keys = new Yi({
2389
2491
  data: this.data,
2390
2492
  view: this.view,
2391
2493
  gestures: this.gestures,
2392
2494
  handlers: () => this.handlersNow,
2393
2495
  visibleDomain: () => this.visibleDomain(),
2394
- select: (e, i) => this.select(e, i),
2496
+ select: (e, n) => this.select(e, n),
2395
2497
  viewMoved: (e) => this.viewMoved(e),
2498
+ zoomBy: (e, n) => {
2499
+ this.view.zoomAt(e, n) && this.viewMoved(!0);
2500
+ },
2501
+ fitWork: () => this.setDomain(null),
2396
2502
  spokenChanged: () => this.publish()
2397
2503
  });
2398
2504
  }
@@ -2408,6 +2514,17 @@ class Ni {
2408
2514
  registerLayer = (t) => this.data.registerLayer(t);
2409
2515
  updateLayer = (t, e) => this.data.updateLayer(t, e);
2410
2516
  unregisterLayer = (t) => this.data.unregisterLayer(t);
2517
+ /** The plan's table (one per schedule) registers under its panel's id and
2518
+ starts closed; opening it changes no pixel of the plot. */
2519
+ registerDataTable(t) {
2520
+ this.dataTable = { id: t, open: !1 }, this.publish();
2521
+ }
2522
+ unregisterDataTable() {
2523
+ this.dataTable = null, this.publish();
2524
+ }
2525
+ toggleDataTable() {
2526
+ this.dataTable !== null && (this.dataTable = { ...this.dataTable, open: !this.dataTable.open }, this.publish());
2527
+ }
2411
2528
  setOptions(t) {
2412
2529
  this.view.setOptions(t), this.viewChanged();
2413
2530
  }
@@ -2435,7 +2552,7 @@ class Ni {
2435
2552
  getView = () => this.viewNow;
2436
2553
  /** Goes to a whole view (`setView`); what it leaves out goes back to its default. */
2437
2554
  applyView(t) {
2438
- st(t) !== st(this.viewNow) && (this.actedOn = !0, this.folded = t.folded ?? [], this.setDomain(t.domain ?? null));
2555
+ nt(t) !== nt(this.viewNow) && (this.actedOn = !0, this.folded = t.folded ?? [], this.setDomain(t.domain ?? null));
2439
2556
  }
2440
2557
  /** Puts a span of two wall-clock instants in view; null shows the
2441
2558
  subtasks' extent. */
@@ -2445,7 +2562,7 @@ class Ni {
2445
2562
  /** Folds or unfolds one group. */
2446
2563
  toggleGroup = (t) => {
2447
2564
  const e = this.viewNow.folded ?? [];
2448
- this.actedOn = !0, this.folded = e.includes(t) ? e.filter((i) => i !== t) : [...e, t], this.viewChanged();
2565
+ this.actedOn = !0, this.folded = e.includes(t) ? e.filter((n) => n !== t) : [...e, t], this.viewChanged();
2449
2566
  };
2450
2567
  foldAll = () => {
2451
2568
  this.actedOn = !0, this.folded = this.data.groups.map((t) => t.id), this.viewChanged();
@@ -2454,14 +2571,14 @@ class Ni {
2454
2571
  this.actedOn = !0, this.folded = [], this.viewChanged();
2455
2572
  };
2456
2573
  currentView() {
2457
- return xi(
2574
+ return Vi(
2458
2575
  { ...this.domainInView === null ? {} : { domain: this.domainInView }, ...this.folded.length > 0 ? { folded: this.folded } : {} },
2459
2576
  new Set(this.data.groups.map((t) => t.id))
2460
2577
  );
2461
2578
  }
2462
2579
  publishView() {
2463
2580
  const t = this.currentView();
2464
- if (st(t) !== st(this.viewNow)) {
2581
+ if (nt(t) !== nt(this.viewNow)) {
2465
2582
  this.viewNow = t;
2466
2583
  for (const e of this.viewListeners) e();
2467
2584
  }
@@ -2469,13 +2586,13 @@ class Ni {
2469
2586
  /** The subtasks' extent within the zoom limits, while the view names no
2470
2587
  span - and the local day of today while there is no work to show. */
2471
2588
  fit() {
2472
- const t = this.view.options.calendar, e = Ri(this.data.subtasks, this.view.options.zoomLimits, (l) => Y(l, t));
2589
+ const t = this.view.options.calendar, e = zi(this.data.subtasks, this.view.options.zoomLimits, (l) => V(l, t));
2473
2590
  if (e !== null) {
2474
2591
  this.view.domain = e, this.fitted = !0;
2475
2592
  return;
2476
2593
  }
2477
- const i = this.view.options.timeZone, n = Gs(Date.now(), i), { year: o, month: r, day: a } = We(n, i);
2478
- this.view.showWall([n.getTime(), Gt({ year: o, month: r, day: a + 1 }, i).getTime()]);
2594
+ const n = this.view.options.timeZone, i = Ys(Date.now(), n), { year: o, month: a, day: r } = Qe(i, n);
2595
+ this.view.showWall([i.getTime(), Kt({ year: o, month: a, day: r + 1 }, n).getTime()]);
2479
2596
  }
2480
2597
  /** `undefined`: the scene keeps the selection itself. */
2481
2598
  setControlledTask(t) {
@@ -2492,14 +2609,14 @@ class Ni {
2492
2609
  return t !== void 0 && t.task === this.selectedTask ? t.id : null;
2493
2610
  }
2494
2611
  select(t, e) {
2495
- const i = t !== this.selectedTask || e !== this.selected;
2496
- this.selected = e, t !== this.selectedTask && this.controlledTask === void 0 && (this.ownTask = t), i && this.handlersNow.onSelectedTaskChange?.(t, e), this.interactionChanged();
2612
+ const n = t !== this.selectedTask || e !== this.selected;
2613
+ this.selected = e, t !== this.selectedTask && this.controlledTask === void 0 && (this.ownTask = t), n && this.handlersNow.onSelectedTaskChange?.(t, e), this.interactionChanged();
2497
2614
  }
2498
2615
  /* ---------------------------------------------------------------- */
2499
2616
  /* DOM binding */
2500
2617
  /* ---------------------------------------------------------------- */
2501
- bind(t, e, i, n) {
2502
- this.root = t, this.plot = e, this.dataCanvas = i, this.overlayCanvas = n, this.unsubscribeTheme = Fs(() => {
2618
+ bind(t, e, n, i) {
2619
+ this.root = t, this.plot = e, this.dataCanvas = n, this.overlayCanvas = i, this.unsubscribeTheme = xs(() => {
2503
2620
  this.colours = null, this.dataStale = !0, this.requestDraw();
2504
2621
  }), this.viewChanged();
2505
2622
  }
@@ -2507,14 +2624,14 @@ class Ni {
2507
2624
  this.gestures.cancelEdit(), this.keys.stop(), this.unsubscribeTheme?.(), this.unsubscribeTheme = null, this.frame !== 0 && cancelAnimationFrame(this.frame), this.domainFrame !== 0 && cancelAnimationFrame(this.domainFrame), this.frame = this.domainFrame = 0, this.movePending = !1, this.root = this.plot = this.dataCanvas = this.overlayCanvas = null;
2508
2625
  }
2509
2626
  resize(t, e) {
2510
- const i = Math.max(0, Math.round(t)), n = Math.max(0, Math.round(e));
2511
- i === this.view.width && n === this.view.height || (this.view.width = i, this.view.height = n, this.viewChanged());
2627
+ const n = Math.max(0, Math.round(t)), i = Math.max(0, Math.round(e));
2628
+ n === this.view.width && i === this.view.height || (this.view.width = n, this.view.height = i, this.viewChanged());
2512
2629
  }
2513
2630
  subscribe = (t) => (this.listeners.add(t), () => {
2514
2631
  this.listeners.delete(t);
2515
2632
  });
2516
2633
  getSnapshot = () => this.snapshot;
2517
- getServerSnapshot = () => Ye;
2634
+ getServerSnapshot = () => qe;
2518
2635
  /* ---------------------------------------------------------------- */
2519
2636
  /* Changes */
2520
2637
  /* ---------------------------------------------------------------- */
@@ -2545,8 +2662,8 @@ class Ni {
2545
2662
  this.requestDraw();
2546
2663
  }
2547
2664
  publish() {
2548
- const t = this.view, e = this.selected !== null ? t.boxById.get(this.selected) : void 0, i = [];
2549
- e !== void 0 && !e.miniature && !this.gestures.editing && e.subtask.task === this.selectedTask && (t.options.intents.includes("leadIn") && i.push({ kind: "leadIn", x: e.outerFrom, y: e.y, height: e.height }), t.options.intents.includes("leadOut") && i.push({ kind: "leadOut", x: e.outerTo, y: e.y, height: e.height })), this.snapshot = {
2665
+ const t = this.view, e = this.selected !== null ? t.boxById.get(this.selected) : void 0, n = [];
2666
+ e !== void 0 && !e.miniature && !this.gestures.editing && e.subtask.task === this.selectedTask && (t.options.intents.includes("leadIn") && n.push({ kind: "leadIn", x: e.outerFrom, y: e.y, height: e.height }), t.options.intents.includes("leadOut") && n.push({ kind: "leadOut", x: e.outerTo, y: e.y, height: e.height })), this.snapshot = {
2550
2667
  width: t.width,
2551
2668
  height: t.height,
2552
2669
  scrollY: t.scrollY,
@@ -2554,34 +2671,35 @@ class Ni {
2554
2671
  ...t.bands(),
2555
2672
  fontScale: t.fontScale,
2556
2673
  ghost: this.gestures.ghostSummary(),
2557
- grips: i,
2674
+ grips: n,
2558
2675
  cursor: this.gestures.cursor,
2559
2676
  tooltip: this.tooltip(),
2560
2677
  loading: this.gestures.loading,
2561
2678
  now: t.nowX(),
2562
2679
  bars: this.bars(),
2680
+ dataTable: this.dataTable,
2563
2681
  spoken: this.keys.spoken,
2564
2682
  summary: this.summary()
2565
2683
  };
2566
- for (const n of this.listeners) n();
2684
+ for (const i of this.listeners) i();
2567
2685
  }
2568
2686
  /** One header per row, with what it says and where it sits. The scroll is
2569
2687
  not taken off here: the header column is moved as a whole, as it always
2570
2688
  was, so that a header and its row cannot drift apart by a rounding. */
2571
2689
  headers() {
2572
- const t = new Map(this.data.lanes.map((n) => [n.id, n.label])), e = new Map(this.data.groups.map((n) => [n.id, n.label])), i = new Set(this.folded);
2573
- return this.view.rows.rows.map((n) => ({
2574
- key: n.lane ?? n.group ?? "",
2575
- kind: n.kind,
2576
- lane: n.lane,
2577
- group: n.group,
2578
- label: (n.lane !== void 0 ? t.get(n.lane) : e.get(n.group ?? "")) ?? n.lane ?? n.group ?? "",
2579
- depth: n.depth,
2580
- within: n.within,
2581
- lanes: n.lanes,
2582
- collapsed: n.group === void 0 ? void 0 : i.has(n.group),
2583
- top: n.top,
2584
- height: n.height
2690
+ const t = new Map(this.data.lanes.map((i) => [i.id, i.label])), e = new Map(this.data.groups.map((i) => [i.id, i.label])), n = new Set(this.folded);
2691
+ return this.view.rows.rows.map((i) => ({
2692
+ key: i.lane ?? i.group ?? "",
2693
+ kind: i.kind,
2694
+ lane: i.lane,
2695
+ group: i.group,
2696
+ label: (i.lane !== void 0 ? t.get(i.lane) : e.get(i.group ?? "")) ?? i.lane ?? i.group ?? "",
2697
+ depth: i.depth,
2698
+ within: i.within,
2699
+ lanes: i.lanes,
2700
+ collapsed: i.group === void 0 ? void 0 : n.has(i.group),
2701
+ top: i.top,
2702
+ height: i.height
2585
2703
  }));
2586
2704
  }
2587
2705
  /** The bars a label could stand in: the visible part of every main time,
@@ -2591,27 +2709,27 @@ class Ni {
2591
2709
  const t = this.view;
2592
2710
  if (t.width <= 0) return [];
2593
2711
  const e = this.colours;
2594
- return t.boxes.flatMap((i) => {
2595
- if (!Ht(i, t.width, t.height)) return [];
2596
- const n = tn(i, t.width);
2597
- if (n === null) return [];
2598
- const o = e === null ? !0 : ne(
2599
- Tt(i.subtask.appearance),
2600
- mt(e, { selectedTask: this.selectedTask, selectedSubtask: this.selectedSubtask }, i.subtask.task, i.subtask.id),
2712
+ return t.boxes.flatMap((n) => {
2713
+ if (!Yt(n, t.width, t.height)) return [];
2714
+ const i = on(n, t.width);
2715
+ if (i === null) return [];
2716
+ const o = e === null ? !0 : le(
2717
+ It(n.subtask.appearance),
2718
+ pt(e, { selectedTask: this.selectedTask, selectedSubtask: this.selectedSubtask }, n.subtask.task, n.subtask.id),
2601
2719
  e
2602
2720
  ).onDark;
2603
- return [{ subtask: i.subtask, ...n, dark: o }];
2721
+ return [{ subtask: n.subtask, ...i, dark: o }];
2604
2722
  });
2605
2723
  }
2606
2724
  /** The findings count the whole plan - an overlap out of view is still one
2607
2725
  to know of -, the subtasks only what is in view. */
2608
2726
  summary() {
2609
- const t = this.view, [e, i] = this.visibleDomain();
2727
+ const t = this.view, [e, n] = this.visibleDomain();
2610
2728
  return {
2611
2729
  lanes: this.data.lanes.length,
2612
- subtasks: t.boxes.filter((n) => Ht(n, t.width, t.height)).length,
2730
+ subtasks: t.boxes.filter((i) => Yt(i, t.width, t.height)).length,
2613
2731
  from: e,
2614
- to: i,
2732
+ to: n,
2615
2733
  overlaps: this.data.overlaps.length,
2616
2734
  violated: this.data.violatedById.size,
2617
2735
  blocked: this.data.inBlocked.length,
@@ -2623,8 +2741,8 @@ class Ni {
2623
2741
  if (!this.gestures.idle) return null;
2624
2742
  const e = this.data.tooltipTargetFor(t);
2625
2743
  if (e === null) return null;
2626
- const { x: i, y: n } = this.gestures.hoverPoint;
2627
- return { target: e, x: i, y: n };
2744
+ const { x: n, y: i } = this.gestures.hoverPoint;
2745
+ return { target: e, x: n, y: i };
2628
2746
  }
2629
2747
  /** The visible span, as two wall-clock instants. */
2630
2748
  visibleDomain() {
@@ -2642,18 +2760,18 @@ class Ni {
2642
2760
  }
2643
2761
  /** The time and the lane at a client point, or null outside the plot. */
2644
2762
  positionAt(t, e) {
2645
- const i = this.plot?.getBoundingClientRect();
2646
- if (i === void 0) return null;
2647
- const n = t - i.left, o = e - i.top;
2648
- return n < 0 || o < 0 || n > i.width || o > i.height ? null : { time: this.view.timeAt(n), lane: this.view.laneIdAt(o) };
2763
+ const n = this.plot?.getBoundingClientRect();
2764
+ if (n === void 0) return null;
2765
+ const i = t - n.left, o = e - n.top;
2766
+ return i < 0 || o < 0 || i > n.width || o > n.height ? null : { time: this.view.timeAt(i), lane: this.view.laneIdAt(o) };
2649
2767
  }
2650
2768
  /** The client point of a time, on a lane's middle where one is named, or
2651
2769
  null while the schedule is not on screen. */
2652
2770
  clientPointOf(t, e) {
2653
- const i = this.plot?.getBoundingClientRect();
2654
- if (i === void 0) return null;
2655
- const n = this.view.viewport(), o = e === void 0 ? null : Z(n, e), r = o === null ? 0 : o.top + o.height / 2;
2656
- return { x: i.left + E(n, t), y: i.top + r };
2771
+ const n = this.plot?.getBoundingClientRect();
2772
+ if (n === void 0) return null;
2773
+ const i = this.view.viewport(), o = e === void 0 ? null : tt(i, e), a = o === null ? 0 : o.top + o.height / 2;
2774
+ return { x: n.left + B(i, t), y: n.top + a };
2657
2775
  }
2658
2776
  /** Whether a lane has a row of its own on a mounted plot: not unknown, not
2659
2777
  in a folded group, whose lanes are strips and no rows. */
@@ -2665,8 +2783,8 @@ class Ni {
2665
2783
  moved, for a lane without a row. */
2666
2784
  scrollToLane(t) {
2667
2785
  if (!this.hasRow(t)) return !1;
2668
- const e = this.view.rows.slots.get(t), i = e.top - this.view.scrollY, n = i < 0 ? i : i + e.height > this.view.height ? Math.min(i + e.height - this.view.height, i) : 0;
2669
- return this.view.pan(0, n).moved && this.viewMoved(!1), !0;
2786
+ const e = this.view.rows.slots.get(t), n = e.top - this.view.scrollY, i = n < 0 ? n : n + e.height > this.view.height ? Math.min(n + e.height - this.view.height, n) : 0;
2787
+ return this.view.pan(0, i).moved && this.viewMoved(!1), !0;
2670
2788
  }
2671
2789
  /** Brings a subtask's lane and time into view, the span keeping its width;
2672
2790
  false, and nothing moved, for one without a row. */
@@ -2685,9 +2803,9 @@ class Ni {
2685
2803
  }
2686
2804
  draw() {
2687
2805
  if (this.root === null) return;
2688
- this.colours === null && (this.colours = hi(this.root, this.data), this.publish());
2689
- const { width: t, height: e } = this.view, i = this.dataStale ? $e(this.dataCanvas, t, e) : null, n = $e(this.overlayCanvas, t, e);
2690
- if (n === null || t === 0 || this.dataStale && i === null) return;
2806
+ this.colours === null && (this.colours = yi(this.root, this.data), this.publish());
2807
+ const { width: t, height: e } = this.view, n = this.dataStale ? Re(this.dataCanvas, t, e) : null, i = Re(this.overlayCanvas, t, e);
2808
+ if (i === null || t === 0 || this.dataStale && n === null) return;
2691
2809
  this.dataStale = !1;
2692
2810
  const o = {
2693
2811
  data: this.data,
@@ -2699,7 +2817,7 @@ class Ni {
2699
2817
  hover: this.gestures.hover,
2700
2818
  ghost: this.gestures.ghostDrawing()
2701
2819
  };
2702
- i !== null && ci(i, o), ui(n, o);
2820
+ n !== null && bi(n, o), Mi(i, o);
2703
2821
  }
2704
2822
  /* ---------------------------------------------------------------- */
2705
2823
  /* Gestures, as the component hands them in */
@@ -2720,49 +2838,50 @@ class Ni {
2720
2838
  focus = (t) => this.keys.focus(t);
2721
2839
  blur = () => this.keys.blur();
2722
2840
  }
2723
- function zi(s = {}) {
2724
- const { initialView: t, onViewChange: e } = s, [i] = dt(() => new Ni(t)), n = V(""), [o] = dt(() => {
2725
- const l = (d) => xs(Wn, { ...d, scene: i });
2841
+ function eo(s = {}) {
2842
+ const { initialView: t, onViewChange: e } = s, [n] = ht(() => new Wi(t)), i = W(""), [o] = ht(() => {
2843
+ const l = (d) => Rs(ei, { ...d, scene: n });
2726
2844
  return l.displayName = "Schedule", {
2727
2845
  Schedule: l,
2728
- Lane: Xn,
2729
- LaneGroup: jn,
2730
- Subtasks: Zn,
2731
- Dependencies: Jn,
2732
- BlockedTimes: Qn,
2733
- Milestones: ti,
2846
+ Lane: oi,
2847
+ LaneGroup: ai,
2848
+ Subtasks: ri,
2849
+ Dependencies: li,
2850
+ BlockedTimes: di,
2851
+ Milestones: hi,
2852
+ DataTable: ni,
2734
2853
  setView: (d) => {
2735
- i.applyView(d), n.current = st(i.getView());
2854
+ n.applyView(d), i.current = nt(n.getView());
2736
2855
  },
2737
- setDomain: i.setDomain,
2738
- positionAt: (d, h) => i.positionAt(d, h),
2739
- clientPointOf: (d, h) => i.clientPointOf(d, h),
2740
- visibleDomain: () => i.visibleDomain(),
2741
- scrollToLane: (d) => i.scrollToLane(d),
2742
- scrollToSubtask: (d) => i.scrollToSubtask(d),
2743
- focusSubtask: (d) => i.focusSubtask(d),
2744
- toggleGroup: i.toggleGroup,
2745
- foldAll: i.foldAll,
2746
- unfoldAll: i.unfoldAll
2856
+ setDomain: n.setDomain,
2857
+ positionAt: (d, h) => n.positionAt(d, h),
2858
+ clientPointOf: (d, h) => n.clientPointOf(d, h),
2859
+ visibleDomain: () => n.visibleDomain(),
2860
+ scrollToLane: (d) => n.scrollToLane(d),
2861
+ scrollToSubtask: (d) => n.scrollToSubtask(d),
2862
+ focusSubtask: (d) => n.focusSubtask(d),
2863
+ toggleGroup: n.toggleGroup,
2864
+ foldAll: n.foldAll,
2865
+ unfoldAll: n.unfoldAll
2747
2866
  };
2748
- }), r = ze(i.subscribeView, i.getView, i.getView), a = st(r);
2749
- return q(() => {
2750
- n.current !== a && (n.current = a, i.acted && e?.(r));
2751
- }, [a]), z(() => ({ ...o, view: r }), [o, r]);
2867
+ }), a = Jt(n.subscribeView, n.getView, n.getView), r = nt(a);
2868
+ return Y(() => {
2869
+ i.current !== r && (i.current = r, n.acted && e?.(a));
2870
+ }, [r]), U(() => ({ ...o, view: a }), [o, a]);
2752
2871
  }
2753
2872
  export {
2754
- Me as applyIntent,
2755
- Zt as arrival,
2756
- jt as departure,
2757
- Ki as findings,
2758
- Ue as inBlockedTime,
2759
- it as occupied,
2760
- Jt as overlaps,
2761
- Tt as resolveAppearance,
2762
- Vi as ripple,
2763
- qi as shiftTask,
2764
- Ys as snapTime,
2765
- Yi as subtaskFromPlace,
2766
- zi as useSchedule,
2767
- Qt as violatedDependencies
2873
+ Ce as applyIntent,
2874
+ te as arrival,
2875
+ Qt as departure,
2876
+ Ji as findings,
2877
+ ts as inBlockedTime,
2878
+ Q as occupied,
2879
+ ee as overlaps,
2880
+ It as resolveAppearance,
2881
+ Qi as ripple,
2882
+ to as shiftTask,
2883
+ zs as snapTime,
2884
+ Zi as subtaskFromPlace,
2885
+ eo as useSchedule,
2886
+ se as violatedDependencies
2768
2887
  };