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