@umriss-ui/schedule 0.1.1 → 0.1.3
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/CHANGELOG.md +40 -0
- package/README.md +5 -2
- package/dist/index.d.ts +2 -1
- package/dist/schedule.css +1 -1
- package/dist/schedule.js +197 -194
- package/package.json +6 -6
package/CHANGELOG.md
CHANGED
|
@@ -15,6 +15,46 @@ moves from here under the rule above.
|
|
|
15
15
|
|
|
16
16
|
---
|
|
17
17
|
|
|
18
|
+
## 0.1.3 – Core 0.4.0 and charts 0.4.0 (Sep. 2026)
|
|
19
|
+
|
|
20
|
+
### Changed
|
|
21
|
+
|
|
22
|
+
- **The schedule takes `@umriss-ui/core` 0.4 and `@umriss-ui/charts` 0.4.**
|
|
23
|
+
The peer ranges move to `^0.4.0`. The schedule places its day and shift
|
|
24
|
+
boundaries with the local offset that charts now exports (`localOffset`);
|
|
25
|
+
its own copy is gone. What it draws is unchanged.
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
## 0.1.2 – Phones, touch and a review (Sep. 2026)
|
|
30
|
+
|
|
31
|
+
### Changed
|
|
32
|
+
|
|
33
|
+
- **The lane headers take at most 40 % of the schedule.** `headerWidth` is
|
|
34
|
+
now `min(headerWidth px, 40%)`, so that on a phone the plot keeps the larger
|
|
35
|
+
part.
|
|
36
|
+
- **The wheel over the lane headers scrolls the lanes**, as it does over the
|
|
37
|
+
plot; Ctrl or ⌘ there zooms around the plot's first instant.
|
|
38
|
+
- **A finger's tap may wander ten pixels** and still select; the mouse keeps
|
|
39
|
+
its three.
|
|
40
|
+
|
|
41
|
+
### Fixed
|
|
42
|
+
|
|
43
|
+
- A pinch that ends with one finger still down pans on with that finger,
|
|
44
|
+
instead of doing nothing until it is lifted; a third finger no longer breaks
|
|
45
|
+
the pinch.
|
|
46
|
+
- A pan ended by `pointercancel` gives the cursor back.
|
|
47
|
+
- A schedule unmounted during a drag stops its auto-pan and the timer of a
|
|
48
|
+
folded group it rested over; before, the auto-pan ran on and kept reporting
|
|
49
|
+
`onDomainChange`.
|
|
50
|
+
- A new `calendar` - an inline array counts, being new on every render - under
|
|
51
|
+
a view panned past the old calendar's ends no longer turns the domain into
|
|
52
|
+
NaN and the plot blank.
|
|
53
|
+
- A lane or group id containing a space no longer breaks the fold control's
|
|
54
|
+
`aria-controls`.
|
|
55
|
+
|
|
56
|
+
---
|
|
57
|
+
|
|
18
58
|
## 0.1.1 – The README catches up (Sep. 2026)
|
|
19
59
|
|
|
20
60
|
Nothing in the code changed. The README names the online demo, the design
|
package/README.md
CHANGED
|
@@ -122,8 +122,11 @@ application's hands; it is a view state, never an intent.
|
|
|
122
122
|
|
|
123
123
|
A tooltip on a hovered subtask or transport names the order, the times, setup
|
|
124
124
|
and teardown and the findings; `tooltip` replaces its content or switches it
|
|
125
|
-
off. `now` draws the present across the lanes. The wheel
|
|
126
|
-
|
|
125
|
+
off. `now` draws the present across the lanes. The wheel over the schedule,
|
|
126
|
+
lane headers included, scrolls the lanes and releases the page at their end,
|
|
127
|
+
Ctrl or ⌘ and a pinch zoom, Shift pans; on a touch screen one finger pans and a
|
|
128
|
+
tap selects. The lane headers take at most 40 % of the width, so that on a
|
|
129
|
+
phone the plot keeps the larger part;
|
|
127
130
|
`onDomainChange` reports the visible span, and a ref handle turns a client
|
|
128
131
|
point into a time and a lane and back.
|
|
129
132
|
|
package/dist/index.d.ts
CHANGED
|
@@ -258,7 +258,8 @@ export declare interface ScheduleProps {
|
|
|
258
258
|
height?: number;
|
|
259
259
|
/** Height of one lane in pixels. */
|
|
260
260
|
laneHeight?: number;
|
|
261
|
-
/** Width of the lane headers in pixels
|
|
261
|
+
/** Width of the lane headers in pixels - at most 40 % of the schedule, so
|
|
262
|
+
that on a phone the plot keeps the larger part. */
|
|
262
263
|
headerWidth?: number;
|
|
263
264
|
/** An operating calendar: the intervals in which time counts. Nights and
|
|
264
265
|
weekends outside them are cut out of the axis. Default: the wall clock. */
|
package/dist/schedule.css
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
@layer umriss.tokens,umriss.base,umriss.components;@layer umriss.base{.
|
|
1
|
+
@layer umriss.tokens,umriss.base,umriss.components;@layer umriss.base{._text_1hv7a_23{font-family:var(--u-font-sans);font-size:var(--u-text-md);line-height:var(--u-leading-normal);color:var(--u-color-text);-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility}._field_1hv7a_34{caret-color:var(--u-color-accent)}._scroll_1hv7a_40{scrollbar-width:thin;scrollbar-color:color-mix(in srgb,var(--u-color-text) 25%,transparent) transparent}._scroll_1hv7a_40::-webkit-scrollbar{width:10px;height:10px}._scroll_1hv7a_40::-webkit-scrollbar-thumb{background:color-mix(in srgb,var(--u-color-text) 22%,transparent);border-radius:var(--u-radius-full);border:3px solid transparent;background-clip:content-box}._scroll_1hv7a_40::-webkit-scrollbar-track{background:transparent}}@layer umriss.components{._ring_1hv7a_65:focus-visible{outline:none;box-shadow:var(--u-focus-ring)}@media(pointer:coarse){._field_1hv7a_34._field_1hv7a_34{font-size:16px}}._field_1hv7a_34:-webkit-autofill,._field_1hv7a_34:-webkit-autofill:hover,._field_1hv7a_34:-webkit-autofill:focus{-webkit-box-shadow:inset 0 0 0 1000px var(--u-color-surface),0 0 0 1px var(--u-edge-color-strong);-webkit-text-fill-color:var(--u-color-text);caret-color:var(--u-color-accent)}}@layer umriss.tokens,umriss.base,umriss.components;@layer umriss.components{._root_ekx9o_4,._root_ekx9o_4:before,._root_ekx9o_4:after{box-sizing:border-box}._corner_ekx9o_18,._corner_ekx9o_18:before,._corner_ekx9o_18:after{box-sizing:border-box}._dayBand_ekx9o_22,._dayBand_ekx9o_22:before,._dayBand_ekx9o_22:after{box-sizing:border-box}._tickBand_ekx9o_23,._tickBand_ekx9o_23:before,._tickBand_ekx9o_23:after{box-sizing:border-box}._day_ekx9o_22,._day_ekx9o_22:before,._day_ekx9o_22:after{box-sizing:border-box}._dayLabel_ekx9o_46,._dayLabel_ekx9o_46:before,._dayLabel_ekx9o_46:after{box-sizing:border-box}._tick_ekx9o_23,._tick_ekx9o_23:before,._tick_ekx9o_23:after{box-sizing:border-box}._tickLabel_ekx9o_64,._tickLabel_ekx9o_64:before,._tickLabel_ekx9o_64:after{box-sizing:border-box}._headers_ekx9o_72,._headers_ekx9o_72:before,._headers_ekx9o_72:after{box-sizing:border-box}._header_ekx9o_72,._header_ekx9o_72:before,._header_ekx9o_72:after{box-sizing:border-box}._headerLabel_ekx9o_90,._headerLabel_ekx9o_90:before,._headerLabel_ekx9o_90:after{box-sizing:border-box}._headerCount_ekx9o_103,._headerCount_ekx9o_103:before,._headerCount_ekx9o_103:after{box-sizing:border-box}._chevron_ekx9o_112,._chevron_ekx9o_112:before,._chevron_ekx9o_112:after{box-sizing:border-box}._plot_ekx9o_160,._plot_ekx9o_160:before,._plot_ekx9o_160:after{box-sizing:border-box}._layer_ekx9o_166,._layer_ekx9o_166:before,._layer_ekx9o_166:after{box-sizing:border-box}._grip_ekx9o_175,._grip_ekx9o_175:before,._grip_ekx9o_175:after{box-sizing:border-box}._ghostLabel_ekx9o_185,._ghostLabel_ekx9o_185:before,._ghostLabel_ekx9o_185:after{box-sizing:border-box}._finding_ekx9o_198,._finding_ekx9o_198:before,._finding_ekx9o_198:after{box-sizing:border-box}._refusal_ekx9o_206,._refusal_ekx9o_206:before,._refusal_ekx9o_206:after{box-sizing:border-box}._tooltip_ekx9o_210,._tooltip_ekx9o_210:before,._tooltip_ekx9o_210:after{box-sizing:border-box}._tooltipHead_ekx9o_228,._tooltipHead_ekx9o_228:before,._tooltipHead_ekx9o_228:after{box-sizing:border-box}._tooltipTimes_ekx9o_233,._tooltipTimes_ekx9o_233:before,._tooltipTimes_ekx9o_233:after{box-sizing:border-box}._now_ekx9o_242,._now_ekx9o_242:before,._now_ekx9o_242:after{box-sizing:border-box}._barLabel_ekx9o_256,._barLabel_ekx9o_256:before,._barLabel_ekx9o_256:after{box-sizing:border-box}._barLabelText_ekx9o_269,._barLabelText_ekx9o_269:before,._barLabelText_ekx9o_269:after{box-sizing:border-box}._root_ekx9o_4{display:grid;grid-template-rows:28px minmax(0,1fr) 28px;width:100%;font-size:var(--u-text-sm);background:var(--u-color-surface);box-shadow:var(--u-edge);border-radius:var(--u-radius-md);corner-shape:squircle;overflow:hidden;font-variant-numeric:tabular-nums;-webkit-user-select:none;user-select:none}._corner_ekx9o_18{background:var(--u-color-surface)}._dayBand_ekx9o_22,._tickBand_ekx9o_23{position:relative;overflow:hidden;color:var(--u-color-text-muted);font-size:var(--u-text-xs)}._dayBand_ekx9o_22{border-bottom:1px solid var(--u-hairline-strong)}._tickBand_ekx9o_23{border-top:1px solid var(--u-hairline-strong)}._day_ekx9o_22{position:absolute;top:0;bottom:0;border-left:1px solid var(--u-hairline-strong);overflow:hidden}._dayLabel_ekx9o_46{position:absolute;left:var(--u-space-2);top:50%;transform:translateY(-50%);white-space:nowrap;color:var(--u-color-text);font-weight:var(--u-weight-medium)}._tick_ekx9o_23{position:absolute;top:0;bottom:0;width:1px;background:var(--u-hairline)}._tickLabel_ekx9o_64{position:absolute;top:50%;left:0;transform:translate(-50%,-50%);white-space:nowrap}._headers_ekx9o_72{position:relative;overflow:hidden;border-right:1px solid var(--u-hairline-strong)}._header_ekx9o_72{display:flex;align-items:center;gap:var(--u-space-2);padding-right:var(--u-space-3);border-bottom:1px solid var(--u-hairline);overflow:hidden;white-space:nowrap}._headerLabel_ekx9o_90{min-width:0;overflow:hidden;text-overflow:ellipsis}._header_ekx9o_72[data-row=groupHead],._header_ekx9o_72[data-row=miniature]{font-weight:var(--u-weight-medium)}._headerCount_ekx9o_103{flex:none;color:var(--u-color-text-muted);font-size:var(--u-text-xs);font-variant-numeric:tabular-nums}._chevron_ekx9o_112{flex:none;display:inline-flex;align-items:center;justify-content:center;width:16px;height:16px;padding:0;border:none;border-radius:var(--u-radius-xs);corner-shape:squircle;background:transparent;color:var(--u-color-text-secondary);cursor:pointer}._chevron_ekx9o_112:hover{color:var(--u-color-text)}._chevron_ekx9o_112:focus-visible{outline:none;box-shadow:var(--u-focus-ring);color:var(--u-color-text)}._chevron_ekx9o_112 svg{box-sizing:border-box}._chevron_ekx9o_112 svg{transition:transform var(--u-duration-fast) var(--u-ease-standard)}._chevron_ekx9o_112 svg[data-open]{box-sizing:border-box}._chevron_ekx9o_112 svg[data-open]{transform:rotate(90deg)}@media(prefers-reduced-motion:reduce){._chevron_ekx9o_112 svg{transition:none}}._header_ekx9o_72[data-refused]{color:var(--u-color-text-muted)}._plot_ekx9o_160{position:relative;overflow:hidden;touch-action:none}._layer_ekx9o_166{position:absolute;top:0;right:0;bottom:0;left:0;width:100%;height:100%;display:block;pointer-events:none}._grip_ekx9o_175{position:absolute;width:9px;margin-left:-4px;border-radius:var(--u-radius-xs);corner-shape:squircle;background:var(--u-color-surface);box-shadow:inset 0 0 0 1.5px var(--u-color-text);cursor:ew-resize}._ghostLabel_ekx9o_185{position:absolute;display:inline-flex;gap:var(--u-space-2);padding:1px var(--u-space-2);border-radius:var(--u-radius-sm);corner-shape:squircle;background:var(--u-color-text);color:var(--u-color-surface);font-size:var(--u-text-xs);white-space:nowrap;pointer-events:none}._finding_ekx9o_198{font-weight:var(--u-weight-semibold);color:var(--u-color-danger-subtle)}._refusal_ekx9o_206{font-weight:var(--u-weight-semibold)}._tooltip_ekx9o_210{position:absolute;z-index:1;display:flex;flex-direction:column;gap:1px;max-width:260px;padding:var(--u-space-2) var(--u-space-3);border-radius:var(--u-radius-sm);corner-shape:squircle;background:var(--u-color-surface);box-shadow:var(--u-shadow-overlay);color:var(--u-color-text-secondary);font-size:var(--u-text-xs);line-height:var(--u-leading-tight);pointer-events:none;white-space:nowrap}._tooltipHead_ekx9o_228{color:var(--u-color-text);font-weight:var(--u-weight-semibold)}._tooltipTimes_ekx9o_233{color:var(--u-color-text)}._tooltip_ekx9o_210 ._finding_ekx9o_198{color:var(--u-color-danger)}._now_ekx9o_242{position:absolute;top:0;width:0;height:0;margin-left:-4px;border-left:5px solid transparent;border-right:5px solid transparent;border-top:6px solid var(--u-color-accent)}._barLabel_ekx9o_256{position:absolute;display:flex;align-items:center;padding:0 var(--u-space-1);overflow:hidden;font-size:var(--u-text-xs);line-height:var(--u-leading-tight);pointer-events:none}._barLabelText_ekx9o_269{min-width:0;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}._barLabel_ekx9o_256[data-on=dark]{color:var(--u-color-on-accent)}._barLabel_ekx9o_256[data-on=light]{color:var(--u-color-text)}}
|
package/dist/schedule.js
CHANGED
|
@@ -2,16 +2,16 @@ import "./schedule.css";
|
|
|
2
2
|
var He = Object.defineProperty;
|
|
3
3
|
var Ye = (n, t, e) => t in n ? He(n, t, { enumerable: !0, configurable: !0, writable: !0, value: e }) : n[t] = e;
|
|
4
4
|
var f = (n, t, e) => Ye(n, typeof t != "symbol" ? t + "" : t, e);
|
|
5
|
-
import { jsxs as
|
|
6
|
-
import { useContext as fe, createContext as pe, useRef as $, useEffect as B, forwardRef as Xe, useState as it, useId as Ke, useLayoutEffect as vt, useImperativeHandle as
|
|
7
|
-
import { toOperatingTimeClamped as
|
|
8
|
-
import { useFormats as
|
|
9
|
-
const
|
|
10
|
-
function
|
|
11
|
-
return fe(
|
|
5
|
+
import { jsxs as Y, Fragment as zt, jsx as w } from "react/jsx-runtime";
|
|
6
|
+
import { useContext as fe, createContext as pe, useRef as $, useEffect as B, forwardRef as Xe, useState as it, useId as Ke, useLayoutEffect as vt, useImperativeHandle as Ue, useSyncExternalStore as We, useMemo as z } from "react";
|
|
7
|
+
import { toOperatingTimeClamped as O, resolveColours as ze, removedIntervals as qe, localOffset as me, MINUTE as q, calendarFrom as j, toWallClock as U, DAY as st, timeStep as je, operatingTimeTicks as Ve, HOUR as Tt, LinearScale as Ze, subscribeTheme as Je } from "@umriss-ui/charts";
|
|
8
|
+
import { useFormats as ge, useWording as ke } from "@umriss-ui/core";
|
|
9
|
+
const we = pe(null), ve = pe(null);
|
|
10
|
+
function ye() {
|
|
11
|
+
return fe(ve);
|
|
12
12
|
}
|
|
13
13
|
function Qe(n) {
|
|
14
|
-
const t = fe(
|
|
14
|
+
const t = fe(we);
|
|
15
15
|
if (t === null)
|
|
16
16
|
throw new Error(`@umriss-ui/schedule: <${n}> must be used inside a <Schedule>.`);
|
|
17
17
|
return t;
|
|
@@ -30,7 +30,7 @@ function ts(n) {
|
|
|
30
30
|
function es(n) {
|
|
31
31
|
Ct("LaneGroup", n, (t, e) => t.registerGroup(e), (t, e, s) => t.updateGroup(e, s), (t, e) => t.unregisterGroup(e));
|
|
32
32
|
}
|
|
33
|
-
function
|
|
33
|
+
function be(n, t) {
|
|
34
34
|
Ct(n, t, (e, s) => e.registerLayer(s), (e, s, o) => e.updateLayer(s, o), (e, s) => e.unregisterLayer(s));
|
|
35
35
|
}
|
|
36
36
|
function ht(n) {
|
|
@@ -59,18 +59,18 @@ function qt(n) {
|
|
|
59
59
|
}
|
|
60
60
|
const l = [], d = /* @__PURE__ */ new Map();
|
|
61
61
|
let p = [], g = null, b = 0;
|
|
62
|
-
const
|
|
62
|
+
const I = (m) => (l.push({ ...m, top: b }), b += m.height, l.length - 1), _ = (m) => m.find((C) => s.has(C)), S = () => {
|
|
63
63
|
if (g === null) return;
|
|
64
64
|
const { row: m, lanes: C } = g, L = l[m], E = Math.max(L.height, C.length * ns + 2 * yt);
|
|
65
65
|
l[m] = { ...L, height: E }, b += E - L.height;
|
|
66
66
|
const F = E - 2 * yt, G = Math.max(os, Math.floor(F / C.length));
|
|
67
|
-
C.forEach((
|
|
68
|
-
const
|
|
69
|
-
d.set(
|
|
67
|
+
C.forEach((V, ot) => {
|
|
68
|
+
const W = c.get(V) ?? [];
|
|
69
|
+
d.set(V, {
|
|
70
70
|
top: L.top + yt + ot * G,
|
|
71
71
|
height: G,
|
|
72
72
|
miniature: !0,
|
|
73
|
-
group:
|
|
73
|
+
group: W[W.length - 1]
|
|
74
74
|
});
|
|
75
75
|
}), g = null;
|
|
76
76
|
};
|
|
@@ -85,7 +85,7 @@ function qt(n) {
|
|
|
85
85
|
p = p.slice(0, E);
|
|
86
86
|
for (const F of C.slice(E)) {
|
|
87
87
|
if (p.push(F), F === L) break;
|
|
88
|
-
|
|
88
|
+
I({
|
|
89
89
|
kind: "groupHead",
|
|
90
90
|
lane: void 0,
|
|
91
91
|
group: F,
|
|
@@ -96,7 +96,7 @@ function qt(n) {
|
|
|
96
96
|
});
|
|
97
97
|
}
|
|
98
98
|
if (L !== void 0) {
|
|
99
|
-
const F = C.indexOf(L), G =
|
|
99
|
+
const F = C.indexOf(L), G = I({
|
|
100
100
|
kind: "miniature",
|
|
101
101
|
lane: void 0,
|
|
102
102
|
group: L,
|
|
@@ -108,7 +108,7 @@ function qt(n) {
|
|
|
108
108
|
g = { group: L, row: G, lanes: [m.id] };
|
|
109
109
|
continue;
|
|
110
110
|
}
|
|
111
|
-
|
|
111
|
+
I({ kind: "lane", lane: m.id, group: C[C.length - 1], depth: C.length, within: C, lanes: 1, height: o }), d.set(m.id, {
|
|
112
112
|
top: l[l.length - 1].top,
|
|
113
113
|
height: o,
|
|
114
114
|
miniature: !1,
|
|
@@ -152,7 +152,7 @@ function ut(n) {
|
|
|
152
152
|
function St(n, t) {
|
|
153
153
|
return (n.leaves ?? "teardown") === "main" ? t.to : t.to + (t.teardown ?? 0);
|
|
154
154
|
}
|
|
155
|
-
function
|
|
155
|
+
function It(n, t) {
|
|
156
156
|
return (n.arrives ?? "setup") === "main" ? t.from : t.from - (t.setup ?? 0);
|
|
157
157
|
}
|
|
158
158
|
function jt(n, t) {
|
|
@@ -169,7 +169,7 @@ function jt(n, t) {
|
|
|
169
169
|
return { ...n, lane: t.lane };
|
|
170
170
|
}
|
|
171
171
|
}
|
|
172
|
-
function
|
|
172
|
+
function An(n, t) {
|
|
173
173
|
return {
|
|
174
174
|
id: t,
|
|
175
175
|
task: n.task,
|
|
@@ -180,9 +180,9 @@ function In(n, t) {
|
|
|
180
180
|
...n.teardown === void 0 ? {} : { teardown: n.teardown }
|
|
181
181
|
};
|
|
182
182
|
}
|
|
183
|
-
const as = 6,
|
|
183
|
+
const as = 6, Me = 3, et = 2, Vt = 3, Zt = 3;
|
|
184
184
|
function P(n, t) {
|
|
185
|
-
return Math.round(n.scale.toPx(
|
|
185
|
+
return Math.round(n.scale.toPx(O(t, n.calendar)));
|
|
186
186
|
}
|
|
187
187
|
function ct(n, t) {
|
|
188
188
|
const e = Lt(n.rows, t);
|
|
@@ -191,7 +191,7 @@ function ct(n, t) {
|
|
|
191
191
|
function Jt(n, t) {
|
|
192
192
|
return rs(n.rows, t + n.scrollY);
|
|
193
193
|
}
|
|
194
|
-
function
|
|
194
|
+
function Te(n, t, e, s, o) {
|
|
195
195
|
const i = s.miniature ? 0 : as, r = s.miniature ? 0 : Zt * Vt, a = Math.max(s.miniature ? 1 : 4, s.height - 2 * i - r), u = s.top - n.scrollY + Math.floor((s.height - a) / 2), c = ut(t);
|
|
196
196
|
return {
|
|
197
197
|
subtask: t,
|
|
@@ -206,7 +206,7 @@ function Me(n, t, e, s, o) {
|
|
|
206
206
|
outerTo: P(n, c.to)
|
|
207
207
|
};
|
|
208
208
|
}
|
|
209
|
-
function
|
|
209
|
+
function Ce(n, t, e) {
|
|
210
210
|
if (e < n.y || e > n.y + n.height) return null;
|
|
211
211
|
const s = Math.max(0, (6 - (n.outerTo - n.outerFrom)) / 2);
|
|
212
212
|
return t < n.outerFrom - s || t > n.outerTo + s ? null : t < n.mainFrom ? "setup" : t > n.mainTo ? "teardown" : "main";
|
|
@@ -216,13 +216,13 @@ function ls(n, t, e, s = 5) {
|
|
|
216
216
|
const o = Math.abs(t - n.mainFrom), i = Math.abs(t - n.mainTo);
|
|
217
217
|
return Math.min(o, i) > s ? null : o <= i ? "from" : "to";
|
|
218
218
|
}
|
|
219
|
-
function
|
|
219
|
+
function Le(n, t, e) {
|
|
220
220
|
return n.outerTo >= 0 && n.outerFrom <= t && n.y + n.height >= 0 && n.y <= e;
|
|
221
221
|
}
|
|
222
222
|
const hs = 64;
|
|
223
223
|
function us(n, t) {
|
|
224
224
|
if (n.miniature) return null;
|
|
225
|
-
const e = ht(n.subtask.appearance).hatched ?
|
|
225
|
+
const e = ht(n.subtask.appearance).hatched ? et + Me + 1 : 0, s = Math.max(n.mainFrom + e, 0), o = Math.min(n.mainTo - e, t) - s;
|
|
226
226
|
return o < hs ? null : { x: s, width: o, y: n.y, height: n.height };
|
|
227
227
|
}
|
|
228
228
|
const cs = 10;
|
|
@@ -231,22 +231,22 @@ function Qt(n, t, e) {
|
|
|
231
231
|
return n === "centre" || e.y === t.y ? s : Math.round(e.y > t.y ? t.y + t.height - 1 : t.y + 1);
|
|
232
232
|
}
|
|
233
233
|
function bt(n, t, e, s, o) {
|
|
234
|
-
const i = t.route ?? o.route, r = t.attach ?? o.attach, a = t.ends ?? o.ends, u = P(n, St(t, e.subtask)), c = P(n,
|
|
234
|
+
const i = t.route ?? o.route, r = t.attach ?? o.attach, a = t.ends ?? o.ends, u = P(n, St(t, e.subtask)), c = P(n, It(t, s.subtask)), l = Qt(r, e, s), d = Qt(r, s, e);
|
|
235
235
|
if (i === "straight")
|
|
236
236
|
return { transport: t, kind: i, ends: a, x1: u, y1: l, x2: c, y2: d, c1x: u, c2x: c, points: [u, l, c, d] };
|
|
237
237
|
if (i === "orthogonal") {
|
|
238
238
|
const _ = u + cs, S = l === d ? _ : Math.round((_ + c) / 2);
|
|
239
239
|
return { transport: t, kind: i, ends: a, x1: u, y1: l, x2: c, y2: d, c1x: u, c2x: c, points: l === d ? [u, l, c, d] : [u, l, S, l, S, d, c, d] };
|
|
240
240
|
}
|
|
241
|
-
const p = Math.max(14, Math.abs(c - u) / 2), g = u + p, b = c - p,
|
|
241
|
+
const p = Math.max(14, Math.abs(c - u) / 2), g = u + p, b = c - p, I = [];
|
|
242
242
|
for (let _ = 0; _ <= 16; _++) {
|
|
243
243
|
const S = _ / 16, m = 1 - S;
|
|
244
|
-
|
|
244
|
+
I.push(
|
|
245
245
|
m * m * m * u + 3 * m * m * S * g + 3 * m * S * S * b + S * S * S * c,
|
|
246
246
|
m * m * m * l + 3 * m * m * S * l + 3 * m * S * S * d + S * S * S * d
|
|
247
247
|
);
|
|
248
248
|
}
|
|
249
|
-
return { transport: t, kind: "curve", ends: a, x1: u, y1: l, x2: c, y2: d, c1x: g, c2x: b, points:
|
|
249
|
+
return { transport: t, kind: "curve", ends: a, x1: u, y1: l, x2: c, y2: d, c1x: g, c2x: b, points: I };
|
|
250
250
|
}
|
|
251
251
|
function ds(n, t, e) {
|
|
252
252
|
let s = 1 / 0;
|
|
@@ -257,7 +257,7 @@ function ds(n, t, e) {
|
|
|
257
257
|
}
|
|
258
258
|
return s;
|
|
259
259
|
}
|
|
260
|
-
function
|
|
260
|
+
function At(n) {
|
|
261
261
|
const t = [], e = /* @__PURE__ */ new Map();
|
|
262
262
|
n.forEach((s, o) => {
|
|
263
263
|
const { from: i, to: r } = ut(s);
|
|
@@ -296,13 +296,13 @@ function _t(n, t) {
|
|
|
296
296
|
for (const o of t) {
|
|
297
297
|
const i = e.get(o.from), r = e.get(o.to);
|
|
298
298
|
if (i === void 0 || r === void 0) continue;
|
|
299
|
-
const a = St(o, i), u =
|
|
299
|
+
const a = St(o, i), u = It(o, r), c = a + o.duration - u;
|
|
300
300
|
c > 0 && s.push({ transport: o.id, departure: a, arrival: u, shortBy: c });
|
|
301
301
|
}
|
|
302
302
|
return s;
|
|
303
303
|
}
|
|
304
304
|
function _n(n, t) {
|
|
305
|
-
return { overlaps:
|
|
305
|
+
return { overlaps: At(n), lateTransports: _t(n, t) };
|
|
306
306
|
}
|
|
307
307
|
class ps {
|
|
308
308
|
/** `changed` is called after every registration change. */
|
|
@@ -373,7 +373,7 @@ class ps {
|
|
|
373
373
|
for (const s of e.tasks) this.tasks.set(s.id, s);
|
|
374
374
|
} else
|
|
375
375
|
this.transports.push(...e.data);
|
|
376
|
-
return this.subtaskById = new Map(this.subtasks.map((e) => [e.id, e])), this.overlaps =
|
|
376
|
+
return this.subtaskById = new Map(this.subtasks.map((e) => [e.id, e])), this.overlaps = At(this.subtasks), this.lateById = new Map(_t(this.subtasks, this.transports).map((e) => [e.transport, e])), this.depth = fs(this.subtasks), !0;
|
|
377
377
|
}
|
|
378
378
|
/** The task a transport belongs to: its departing subtask's. */
|
|
379
379
|
taskOfTransport(t) {
|
|
@@ -460,17 +460,17 @@ function ks(n, t) {
|
|
|
460
460
|
if (i.kind === "transports")
|
|
461
461
|
for (const a of s.paths) r.has(a.transport) && Mt(n, t, a, !1);
|
|
462
462
|
else
|
|
463
|
-
for (const a of s.boxes) r.has(a.subtask) &&
|
|
463
|
+
for (const a of s.boxes) r.has(a.subtask) && Ie(n, t, a, 1);
|
|
464
464
|
}
|
|
465
465
|
for (const i of e.overlaps) Ae(n, t, o, i);
|
|
466
|
-
|
|
466
|
+
Fs(n, t, o), Ds(n, t);
|
|
467
467
|
}
|
|
468
468
|
function ws(n, t) {
|
|
469
469
|
const { view: e, hover: s } = t, o = e.viewport();
|
|
470
470
|
if (t.ghost === null) {
|
|
471
471
|
if (s.kind === "subtask") {
|
|
472
472
|
const l = e.boxById.get(s.subtask.id);
|
|
473
|
-
l !== void 0 &&
|
|
473
|
+
l !== void 0 && Es(n, t, l);
|
|
474
474
|
} else if (s.kind === "transport") {
|
|
475
475
|
const l = e.paths.find((d) => d.transport === s.transport);
|
|
476
476
|
l !== void 0 && Mt(n, t, l, !0);
|
|
@@ -479,7 +479,7 @@ function ws(n, t) {
|
|
|
479
479
|
}
|
|
480
480
|
const { ghost: i, overlaps: r, late: a } = t.ghost;
|
|
481
481
|
vs(n, t, o, t.ghost.refusedLanes);
|
|
482
|
-
const u =
|
|
482
|
+
const u = Se(o, i);
|
|
483
483
|
if (u === null) return;
|
|
484
484
|
for (const l of r) Ae(n, t, o, l);
|
|
485
485
|
const c = new Set(a.map((l) => l.transport));
|
|
@@ -490,7 +490,7 @@ function ws(n, t) {
|
|
|
490
490
|
const p = l.from === i.id ? bt(o, l, u, d, e.options) : bt(o, l, d, u, e.options);
|
|
491
491
|
Mt(n, t, p, !0, c.has(l.id));
|
|
492
492
|
}
|
|
493
|
-
|
|
493
|
+
Ie(n, t, u, 0.55), n.strokeStyle = t.colours.text, n.lineWidth = 1, n.setLineDash([3, 2]), n.strokeRect(u.outerFrom + 0.5, u.y + 0.5, Math.max(1, u.outerTo - u.outerFrom - 1), u.height - 1), n.setLineDash([]), t.ghost.tether !== null && ys(n, t, u, t.ghost.tether);
|
|
494
494
|
}
|
|
495
495
|
function vs(n, t, e, s) {
|
|
496
496
|
if (s.size === 0) return;
|
|
@@ -499,16 +499,16 @@ function vs(n, t, e, s) {
|
|
|
499
499
|
const a = ct(e, r);
|
|
500
500
|
if (a === null) continue;
|
|
501
501
|
const { top: u, height: c } = a;
|
|
502
|
-
u + c < 0 || u > i || (n.globalAlpha = 0.6, n.fillStyle = t.colours.surface, n.fillRect(0, u, o, c), n.globalAlpha = 1,
|
|
502
|
+
u + c < 0 || u > i || (n.globalAlpha = 0.6, n.fillStyle = t.colours.surface, n.fillRect(0, u, o, c), n.globalAlpha = 1, As(n, 0, u, o, c, t.colours.muted, 0.7, Ss, 1));
|
|
503
503
|
}
|
|
504
504
|
}
|
|
505
505
|
function ys(n, t, e, s) {
|
|
506
506
|
const o = Math.max(e.outerFrom, Math.min(e.outerTo, s.x)), i = Math.max(e.y, Math.min(e.y + e.height, s.y));
|
|
507
507
|
Math.hypot(s.x - o, s.y - i) < 2 || (n.strokeStyle = t.colours.text, n.lineWidth = 1, n.setLineDash([2, 3]), n.beginPath(), n.moveTo(o + 0.5, i + 0.5), n.lineTo(s.x + 0.5, s.y + 0.5), n.stroke(), n.setLineDash([]));
|
|
508
508
|
}
|
|
509
|
-
function
|
|
509
|
+
function Se(n, t) {
|
|
510
510
|
const e = Lt(n.rows, t.lane);
|
|
511
|
-
return e === null ? null :
|
|
511
|
+
return e === null ? null : Te(n, t, t.lane, e, 0);
|
|
512
512
|
}
|
|
513
513
|
function bs(n, t, e) {
|
|
514
514
|
const { view: s, colours: o, bands: i } = t, { width: r, height: a } = s;
|
|
@@ -565,40 +565,40 @@ function Cs(n, t, e) {
|
|
|
565
565
|
return `rgb(${i(0)}, ${i(1)}, ${i(2)})`;
|
|
566
566
|
}
|
|
567
567
|
const Ls = 2;
|
|
568
|
-
function
|
|
568
|
+
function Ie(n, t, e, s) {
|
|
569
569
|
const { view: o, colours: i } = t;
|
|
570
|
-
if (!
|
|
570
|
+
if (!Le(e, o.width, o.height)) return;
|
|
571
571
|
if (e.miniature) {
|
|
572
572
|
Ts(n, t, e, s);
|
|
573
573
|
return;
|
|
574
574
|
}
|
|
575
575
|
const r = ht(e.subtask.appearance), a = i.tasks.get(e.subtask.task) ?? i.muted, u = Ft(r, a, i), c = e.y, l = e.height, d = Math.max(1, e.mainTo - e.mainFrom), p = u.onDark ? i.onAccent : i.text;
|
|
576
576
|
n.lineWidth = 1, n.fillStyle = a, n.strokeStyle = a;
|
|
577
|
-
for (const [b,
|
|
577
|
+
for (const [b, I] of [
|
|
578
578
|
[e.outerFrom, e.mainFrom],
|
|
579
579
|
[e.mainTo, e.outerTo]
|
|
580
580
|
])
|
|
581
|
-
|
|
581
|
+
I <= b || (n.globalAlpha = 0.28 * s, n.fillRect(b, c, I - b, l), n.globalAlpha = s, n.strokeRect(b + 0.5, c + 0.5, I - b - 1, l - 1));
|
|
582
582
|
u.fill !== null && (n.globalAlpha = s, n.fillStyle = u.fill, n.fillRect(e.mainFrom, c, d, l));
|
|
583
583
|
const g = e.subtask.progress;
|
|
584
584
|
if (g !== void 0) {
|
|
585
|
-
const b = Math.min(4, Math.max(2, Math.round(l / 6))),
|
|
586
|
-
n.fillStyle = u.fill === null ? a : p, n.globalAlpha = 0.3 * s, n.fillRect(e.mainFrom,
|
|
585
|
+
const b = Math.min(4, Math.max(2, Math.round(l / 6))), I = c + l - b - Ls, _ = Math.round(d * Math.max(0, Math.min(1, g)));
|
|
586
|
+
n.fillStyle = u.fill === null ? a : p, n.globalAlpha = 0.3 * s, n.fillRect(e.mainFrom, I, d, b), n.globalAlpha = s, _ > 0 && n.fillRect(e.mainFrom, I, _, b);
|
|
587
587
|
}
|
|
588
588
|
if (r.hatched) {
|
|
589
|
-
const b = Math.max(1, Math.min(
|
|
590
|
-
n.globalAlpha = s, n.fillStyle = p, n.fillRect(e.mainFrom +
|
|
589
|
+
const b = Math.max(1, Math.min(Me, Math.floor((d - 2 * et) / 3))), I = d >= 4 * b ? et : 0, _ = l >= 4 * et ? et : 0;
|
|
590
|
+
n.globalAlpha = s, n.fillStyle = p, n.fillRect(e.mainFrom + I, c + _, b, l - 2 * _), n.fillRect(e.mainTo - I - b, c + _, b, l - 2 * _);
|
|
591
591
|
}
|
|
592
|
-
r.open &&
|
|
592
|
+
r.open && _s(n, e, c, l, i.surface, o.width), r.dashed && (n.globalAlpha = s, n.strokeStyle = a, n.setLineDash([4, 3]), n.strokeRect(e.mainFrom + 0.5, c + 0.5, d - 1, l - 1), n.setLineDash([])), n.globalAlpha = 1, e.depth > 0 && s === 1 && (n.strokeStyle = i.surface, n.strokeRect(e.outerFrom - 0.5, c - 0.5, e.outerTo - e.outerFrom + 1, l + 1));
|
|
593
593
|
}
|
|
594
|
-
const Ss =
|
|
595
|
-
function
|
|
594
|
+
const Ss = 6, Is = 16;
|
|
595
|
+
function As(n, t, e, s, o, i, r, a, u) {
|
|
596
596
|
n.save(), n.beginPath(), n.rect(t, e, s, o), n.clip(), n.globalAlpha = 0.5 * r, n.strokeStyle = i, n.lineWidth = u, n.beginPath();
|
|
597
597
|
for (let c = t - o; c < t + s + o; c += a)
|
|
598
598
|
n.moveTo(c, e + o), n.lineTo(c + o, e);
|
|
599
599
|
n.stroke(), n.restore();
|
|
600
600
|
}
|
|
601
|
-
function
|
|
601
|
+
function _s(n, t, e, s, o, i) {
|
|
602
602
|
const r = t.mainFrom < 0, a = t.mainTo > i, u = Math.max(1, Math.min(t.mainTo, i) - Math.max(t.mainFrom, 0)), c = Math.min(Is, u);
|
|
603
603
|
r && ne(n, 0, c, e, s, o, 1), a && ne(n, i, -c, e, s, o, 1);
|
|
604
604
|
}
|
|
@@ -623,7 +623,7 @@ function Mt(n, t, e, s, o) {
|
|
|
623
623
|
])
|
|
624
624
|
n.beginPath(), n.arc(d, p, u ? 3 : 2.5, 0, Math.PI * 2), n.fill();
|
|
625
625
|
}
|
|
626
|
-
function
|
|
626
|
+
function Fs(n, t, e) {
|
|
627
627
|
const { data: s } = t;
|
|
628
628
|
if (s.lateById.size !== 0) {
|
|
629
629
|
n.fillStyle = t.colours.alarm;
|
|
@@ -648,12 +648,12 @@ function Ae(n, t, e, s) {
|
|
|
648
648
|
a !== null && n.fillRect(i, a.top - e.scrollY + 1, r - i, 3);
|
|
649
649
|
}
|
|
650
650
|
}
|
|
651
|
-
function
|
|
651
|
+
function Es(n, t, e) {
|
|
652
652
|
const { colours: s } = t, o = ht(e.subtask.appearance), i = Ft(o, s.tasks.get(e.subtask.task) ?? s.muted, s);
|
|
653
653
|
n.globalAlpha = xs, n.fillStyle = i.onDark ? s.onAccent : s.text, n.fillRect(e.outerFrom, e.y, Math.max(1, e.outerTo - e.outerFrom), e.height), n.globalAlpha = 1;
|
|
654
654
|
}
|
|
655
655
|
const xs = 0.2;
|
|
656
|
-
function
|
|
656
|
+
function Ds(n, t) {
|
|
657
657
|
const e = t.selectedTask;
|
|
658
658
|
if (e !== null) {
|
|
659
659
|
n.strokeStyle = t.colours.text;
|
|
@@ -666,28 +666,25 @@ function Ps(n, t) {
|
|
|
666
666
|
}
|
|
667
667
|
}
|
|
668
668
|
}
|
|
669
|
-
const rt = 32,
|
|
669
|
+
const rt = 32, Ps = 18;
|
|
670
670
|
function ie(n, t) {
|
|
671
671
|
if (!(t > 2 * rt)) return 0;
|
|
672
672
|
const e = rt - n, s = n - (t - rt), o = Math.max(e, s);
|
|
673
673
|
if (o <= 0) return 0;
|
|
674
|
-
const i = Math.min(1, o / rt), r =
|
|
674
|
+
const i = Math.min(1, o / rt), r = Ps * i * i;
|
|
675
675
|
return e > 0 ? -r : r;
|
|
676
676
|
}
|
|
677
|
-
function
|
|
677
|
+
function Ns(n, t, e, s) {
|
|
678
678
|
const o = /* @__PURE__ */ new Set();
|
|
679
679
|
if (s === void 0) return o;
|
|
680
680
|
for (const i of n)
|
|
681
681
|
i !== e && (s(t, i) || o.add(i));
|
|
682
682
|
return o;
|
|
683
683
|
}
|
|
684
|
-
function
|
|
685
|
-
return new Date(n).getTimezoneOffset() * U;
|
|
686
|
-
}
|
|
687
|
-
function Rs(n, t) {
|
|
684
|
+
function Gs(n, t) {
|
|
688
685
|
const { step: e, offset: s } = typeof t == "number" ? { step: t, offset: 0 } : t;
|
|
689
686
|
if (!(e > 0) || !Number.isFinite(n)) return n;
|
|
690
|
-
const o =
|
|
687
|
+
const o = me(n) + s;
|
|
691
688
|
return o + Math.round((n - o) / e) * e;
|
|
692
689
|
}
|
|
693
690
|
const re = "\0placing", ae = /* @__PURE__ */ new Set();
|
|
@@ -703,7 +700,7 @@ function le(n) {
|
|
|
703
700
|
return "nothing";
|
|
704
701
|
}
|
|
705
702
|
}
|
|
706
|
-
const he = 3, $s = 600;
|
|
703
|
+
const he = 3, Rs = 10, $s = 600;
|
|
707
704
|
class Bs {
|
|
708
705
|
constructor(t) {
|
|
709
706
|
f(this, "gesture", { kind: "none" });
|
|
@@ -757,7 +754,7 @@ class Bs {
|
|
|
757
754
|
ghostSummary() {
|
|
758
755
|
const t = this.gesture;
|
|
759
756
|
if (t.kind !== "edit" && t.kind !== "place") return null;
|
|
760
|
-
const e =
|
|
757
|
+
const e = Se(this.host.view.viewport(), t.ghost);
|
|
761
758
|
if (e === null) return null;
|
|
762
759
|
const s = this.ghostFindings(t.ghost, this.ghostHome(t)), o = t.kind === "edit" && (t.mode === "setup" || t.mode === "teardown"), i = o ? ut(t.ghost) : t.ghost;
|
|
763
760
|
return {
|
|
@@ -788,8 +785,8 @@ class Bs {
|
|
|
788
785
|
pointerDown(t) {
|
|
789
786
|
var a, u, c, l, d;
|
|
790
787
|
const { x: e, y: s } = this.local(t.clientX, t.clientY);
|
|
791
|
-
if (t.pointerType === "touch" && (this.touches.set(t.pointerId, { x: e, y: s }), this.touches.size
|
|
792
|
-
this.cancelEdit(), this.gesture = { kind: "pinch", distance: this.touchDistance() };
|
|
788
|
+
if (t.pointerType === "touch" && (this.touches.set(t.pointerId, { x: e, y: s }), this.touches.size >= 2)) {
|
|
789
|
+
this.gesture.kind !== "pinch" && (this.cancelEdit(), this.gesture = { kind: "pinch", distance: this.touchDistance() });
|
|
793
790
|
return;
|
|
794
791
|
}
|
|
795
792
|
if (t.button !== 0) return;
|
|
@@ -841,7 +838,7 @@ class Bs {
|
|
|
841
838
|
askRefused(t, e) {
|
|
842
839
|
if (!this.host.view.options.intents.includes(e === null ? "place" : "lane")) return ae;
|
|
843
840
|
const s = this.host.data.lanes.map((o) => o.id);
|
|
844
|
-
return
|
|
841
|
+
return Ns(s, t, e, this.host.handlers().canMoveTo);
|
|
845
842
|
}
|
|
846
843
|
/** What a press at a point would start, given the intents the caller handles. */
|
|
847
844
|
modeAt(t, e) {
|
|
@@ -852,7 +849,7 @@ class Bs {
|
|
|
852
849
|
const a = ls(r, t, e);
|
|
853
850
|
if (a !== null) return { mode: a === "from" ? "stretch-from" : "stretch-to", subtask: r.subtask };
|
|
854
851
|
}
|
|
855
|
-
if (
|
|
852
|
+
if (Ce(r, t, e) !== null)
|
|
856
853
|
return o.includes("move") || o.includes("lane") ? { mode: "move", subtask: r.subtask } : { mode: "pan", subtask: r.subtask };
|
|
857
854
|
}
|
|
858
855
|
return { mode: "pan", subtask: null };
|
|
@@ -866,7 +863,7 @@ class Bs {
|
|
|
866
863
|
}
|
|
867
864
|
const o = this.gesture;
|
|
868
865
|
if (o.kind === "pending" && o.pointerId === t.pointerId) {
|
|
869
|
-
if (Math.hypot(e - o.x0, s - o.y0) < he) return;
|
|
866
|
+
if (Math.hypot(e - o.x0, s - o.y0) < (t.pointerType === "touch" ? Rs : he)) return;
|
|
870
867
|
if (o.mode === "pan" || o.subtask === null)
|
|
871
868
|
this.gesture = { kind: "pan", pointerId: o.pointerId, lastX: o.x0, lastY: o.y0 }, this.setCursor("grabbing");
|
|
872
869
|
else {
|
|
@@ -899,7 +896,8 @@ class Bs {
|
|
|
899
896
|
pointerUp(t) {
|
|
900
897
|
var i, r;
|
|
901
898
|
if (t.pointerType === "touch" && (this.touches.delete(t.pointerId), this.gesture.kind === "pinch")) {
|
|
902
|
-
|
|
899
|
+
const [a] = this.touches;
|
|
900
|
+
this.touches.size === 1 && a !== void 0 ? this.gesture = { kind: "pan", pointerId: a[0], lastX: a[1].x, lastY: a[1].y } : this.touches.size === 0 && (this.gesture = { kind: "none" });
|
|
903
901
|
return;
|
|
904
902
|
}
|
|
905
903
|
const e = this.gesture, { x: s, y: o } = this.local(t.clientX, t.clientY);
|
|
@@ -944,7 +942,7 @@ class Bs {
|
|
|
944
942
|
this.panFrame !== 0 && cancelAnimationFrame(this.panFrame), this.panFrame = 0;
|
|
945
943
|
}
|
|
946
944
|
pointerCancel(t) {
|
|
947
|
-
this.touches.delete(t.pointerId), this.closeGestureFolds(), this.cancelEdit(), this.gesture = { kind: "none" };
|
|
945
|
+
this.touches.delete(t.pointerId), this.closeGestureFolds(), this.cancelEdit(), this.gesture = { kind: "none" }, this.setCursor("default");
|
|
948
946
|
}
|
|
949
947
|
/** Reads the hover anew where the pointer already is - after the data
|
|
950
948
|
changed under it. A drop that moves a subtask changes what lies under the
|
|
@@ -974,7 +972,7 @@ class Bs {
|
|
|
974
972
|
their end; Ctrl or ⌘ zooms - a trackpad pinch arrives as a wheel with
|
|
975
973
|
Ctrl -; horizontal or Shift pans through time. */
|
|
976
974
|
wheel(t) {
|
|
977
|
-
const e = this.host.view,
|
|
975
|
+
const e = this.host.view, s = Math.max(0, Math.min(e.width, this.local(t.clientX, t.clientY).x)), o = t.deltaMode === 1 ? 16 : t.deltaMode === 2 ? e.height : 1, i = t.deltaX * o, r = t.deltaY * o;
|
|
978
976
|
if (t.ctrlKey || t.metaKey) {
|
|
979
977
|
t.preventDefault();
|
|
980
978
|
const c = Math.abs(r) < 50 ? 0.01 : 15e-4;
|
|
@@ -1109,8 +1107,8 @@ class Bs {
|
|
|
1109
1107
|
let c = i.from;
|
|
1110
1108
|
const l = o.viewport().scale, d = l.fromPx(e) - t.t0;
|
|
1111
1109
|
if (a.includes("move") && Math.abs(d * l.m) >= he) {
|
|
1112
|
-
const g =
|
|
1113
|
-
c = this.snapInside(
|
|
1110
|
+
const g = j(o.options.calendar), b = O(i.from, g) + d, I = g.intervals.length === 0 ? b : U(Math.max(0, Math.min(g.total, b)), g);
|
|
1111
|
+
c = this.snapInside(I, r);
|
|
1114
1112
|
}
|
|
1115
1113
|
let p = t.ghost.lane;
|
|
1116
1114
|
if (a.includes("lane")) {
|
|
@@ -1121,9 +1119,9 @@ class Bs {
|
|
|
1121
1119
|
return { ...i, from: c, to: c + (i.to - i.from), lane: p };
|
|
1122
1120
|
}
|
|
1123
1121
|
case "stretch-from":
|
|
1124
|
-
return { ...i, from: Math.min(u, i.to - Math.max(r.step,
|
|
1122
|
+
return { ...i, from: Math.min(u, i.to - Math.max(r.step, q)) };
|
|
1125
1123
|
case "stretch-to":
|
|
1126
|
-
return { ...i, to: Math.max(u, i.from + Math.max(r.step,
|
|
1124
|
+
return { ...i, to: Math.max(u, i.from + Math.max(r.step, q)) };
|
|
1127
1125
|
case "setup":
|
|
1128
1126
|
return { ...i, setup: Math.max(0, i.from - u) };
|
|
1129
1127
|
case "teardown":
|
|
@@ -1134,8 +1132,8 @@ class Bs {
|
|
|
1134
1132
|
on to the seam, where time counts again. An intent never asks for a time
|
|
1135
1133
|
the plant does not run. */
|
|
1136
1134
|
snapInside(t, e) {
|
|
1137
|
-
const s =
|
|
1138
|
-
return o.intervals.length === 0 ? s :
|
|
1135
|
+
const s = Gs(t, e), o = j(this.host.view.options.calendar);
|
|
1136
|
+
return o.intervals.length === 0 ? s : U(O(s, o), o);
|
|
1139
1137
|
}
|
|
1140
1138
|
intentsOf(t, e, s) {
|
|
1141
1139
|
const o = [], i = this.host.view.options.intents, r = t.id;
|
|
@@ -1156,16 +1154,16 @@ class Bs {
|
|
|
1156
1154
|
computed on every pointer movement. */
|
|
1157
1155
|
ghostFindings(t, e) {
|
|
1158
1156
|
const s = this.host.data, o = (l) => l.lane === t.lane || l.lane === e, r = [...s.subtasks.filter((l) => l.id !== t.id && o(l)), t], a = (l) => l.first === t.id || l.second === t.id, u = s.transports.filter((l) => l.from === t.id || l.to === t.id), c = t.id === re ? s.subtasks : s.subtasks.map((l) => l.id === t.id ? t : l);
|
|
1159
|
-
return { overlaps:
|
|
1157
|
+
return { overlaps: At(r).filter(a), late: _t(c, u) };
|
|
1160
1158
|
}
|
|
1161
1159
|
}
|
|
1162
1160
|
const _e = [], Os = 56;
|
|
1163
1161
|
function Hs(n, t = Os) {
|
|
1164
|
-
return n > 0 ? Math.min(st, Math.max(15 *
|
|
1162
|
+
return n > 0 ? Math.min(st, Math.max(15 * q, je(n * t, 1))) : 15 * q;
|
|
1165
1163
|
}
|
|
1166
1164
|
function Ys(n, t, e = _e) {
|
|
1167
1165
|
const [s, o] = Fe(n, e);
|
|
1168
|
-
return Ve(e, s, o, t,
|
|
1166
|
+
return Ve(e, s, o, t, me(s)).filter(
|
|
1169
1167
|
(i) => i.operatingTime >= n[0] && i.operatingTime <= n[1]
|
|
1170
1168
|
);
|
|
1171
1169
|
}
|
|
@@ -1178,8 +1176,8 @@ function Xs(n, t = _e) {
|
|
|
1178
1176
|
o.push({
|
|
1179
1177
|
start: r,
|
|
1180
1178
|
end: a,
|
|
1181
|
-
from:
|
|
1182
|
-
to:
|
|
1179
|
+
from: O(r, t),
|
|
1180
|
+
to: O(a, t)
|
|
1183
1181
|
});
|
|
1184
1182
|
}
|
|
1185
1183
|
return o;
|
|
@@ -1190,17 +1188,17 @@ function Ks(n, t, e, s) {
|
|
|
1190
1188
|
const i = Math.min(s.max, Math.max(s.min, o * e)), r = (t - n[0]) / o, a = t - r * i;
|
|
1191
1189
|
return [a, a + i];
|
|
1192
1190
|
}
|
|
1193
|
-
function
|
|
1191
|
+
function Us(n, t) {
|
|
1194
1192
|
return [n[0] + t, n[1] + t];
|
|
1195
1193
|
}
|
|
1196
1194
|
function Fe(n, t) {
|
|
1197
|
-
const e =
|
|
1195
|
+
const e = j(t);
|
|
1198
1196
|
if (e.intervals.length === 0) return [n[0], n[1]];
|
|
1199
1197
|
const s = (o) => Math.max(0, Math.min(e.total, o));
|
|
1200
|
-
return [
|
|
1198
|
+
return [U(s(n[0]), e), U(s(n[1]), e)];
|
|
1201
1199
|
}
|
|
1202
1200
|
const lt = 44;
|
|
1203
|
-
class
|
|
1201
|
+
class Ws {
|
|
1204
1202
|
constructor(t) {
|
|
1205
1203
|
f(this, "options", {
|
|
1206
1204
|
laneHeight: lt,
|
|
@@ -1235,9 +1233,14 @@ class Us {
|
|
|
1235
1233
|
there, and a new calendar keeps the wall-clock span in view. */
|
|
1236
1234
|
setOptions(t, e) {
|
|
1237
1235
|
const s = t.calendar !== this.options.calendar, o = this.options.calendar;
|
|
1238
|
-
if (this.options = t, e !== null
|
|
1239
|
-
|
|
1240
|
-
|
|
1236
|
+
if (this.options = t, e !== null)
|
|
1237
|
+
this.domain = [O(e[0], t.calendar), O(e[1], t.calendar)];
|
|
1238
|
+
else if (s) {
|
|
1239
|
+
const i = j(o), r = (a) => {
|
|
1240
|
+
const u = i.intervals.length === 0 ? a : Math.max(0, Math.min(i.total, a));
|
|
1241
|
+
return O(U(u, i), t.calendar) + (a - u);
|
|
1242
|
+
};
|
|
1243
|
+
this.domain = [r(this.domain[0]), r(this.domain[1])];
|
|
1241
1244
|
}
|
|
1242
1245
|
}
|
|
1243
1246
|
viewport() {
|
|
@@ -1274,7 +1277,7 @@ class Us {
|
|
|
1274
1277
|
for (const e of this.data.subtasks) {
|
|
1275
1278
|
const s = Lt(this.rows, e.lane);
|
|
1276
1279
|
if (s === null) continue;
|
|
1277
|
-
const o =
|
|
1280
|
+
const o = Te(t, e, e.lane, s, this.data.depth.get(e.id) ?? 0);
|
|
1278
1281
|
this.boxes.push(o), this.boxById.set(e.id, o);
|
|
1279
1282
|
}
|
|
1280
1283
|
this.paths = [];
|
|
@@ -1301,12 +1304,12 @@ class Us {
|
|
|
1301
1304
|
nowX() {
|
|
1302
1305
|
const t = this.options.now;
|
|
1303
1306
|
if (t === null || this.width <= 0) return null;
|
|
1304
|
-
const e = Math.round(this.viewport().scale.toPx(
|
|
1307
|
+
const e = Math.round(this.viewport().scale.toPx(O(t, this.options.calendar)));
|
|
1305
1308
|
return e >= 0 && e <= this.width ? e : null;
|
|
1306
1309
|
}
|
|
1307
1310
|
hitAt(t, e) {
|
|
1308
1311
|
for (let r = this.boxes.length - 1; r >= 0; r--) {
|
|
1309
|
-
const a = this.boxes[r], u =
|
|
1312
|
+
const a = this.boxes[r], u = Ce(a, t, e);
|
|
1310
1313
|
if (u !== null) return { kind: "subtask", subtask: a.subtask, part: u };
|
|
1311
1314
|
}
|
|
1312
1315
|
let s = null, o = 4;
|
|
@@ -1320,8 +1323,8 @@ class Us {
|
|
|
1320
1323
|
}
|
|
1321
1324
|
/** The wall-clock time at a plot x; within the calendar's extent. */
|
|
1322
1325
|
timeAt(t) {
|
|
1323
|
-
const e = this.viewport().scale.fromPx(t), s =
|
|
1324
|
-
return s.intervals.length === 0 ? e :
|
|
1326
|
+
const e = this.viewport().scale.fromPx(t), s = j(this.options.calendar);
|
|
1327
|
+
return s.intervals.length === 0 ? e : U(Math.max(0, Math.min(s.total, e)), s);
|
|
1325
1328
|
}
|
|
1326
1329
|
/** The lane at a y, strips included: what the pointer is ON.
|
|
1327
1330
|
|
|
@@ -1352,7 +1355,7 @@ class Us {
|
|
|
1352
1355
|
neither - a scroll through the lanes is no news about the time. */
|
|
1353
1356
|
pan(t, e) {
|
|
1354
1357
|
const s = this.domain[0], o = this.scrollY, i = this.domain[1] - s;
|
|
1355
|
-
this.width > 0 && t !== 0 && (this.domain =
|
|
1358
|
+
this.width > 0 && t !== 0 && (this.domain = Us(this.domain, t / this.width * i)), this.scrollY = Math.max(0, Math.min(this.maxScroll(), this.scrollY + e));
|
|
1356
1359
|
const r = this.domain[0] !== s;
|
|
1357
1360
|
return { moved: r || this.scrollY !== o, time: r };
|
|
1358
1361
|
}
|
|
@@ -1382,7 +1385,7 @@ const ue = {
|
|
|
1382
1385
|
class zs {
|
|
1383
1386
|
constructor() {
|
|
1384
1387
|
f(this, "data", new ps(() => this.viewChanged()));
|
|
1385
|
-
f(this, "view", new
|
|
1388
|
+
f(this, "view", new Ws(this.data));
|
|
1386
1389
|
f(this, "gestures");
|
|
1387
1390
|
f(this, "handlersNow", {});
|
|
1388
1391
|
f(this, "placing", null);
|
|
@@ -1499,7 +1502,7 @@ class zs {
|
|
|
1499
1502
|
}
|
|
1500
1503
|
unbind() {
|
|
1501
1504
|
var t;
|
|
1502
|
-
(t = this.unsubscribeTheme) == null || t.call(this), this.unsubscribeTheme = null, this.frame !== 0 && cancelAnimationFrame(this.frame), this.domainFrame !== 0 && cancelAnimationFrame(this.domainFrame), this.frame = this.domainFrame = 0, this.root = this.plot = this.dataCanvas = this.overlayCanvas = null;
|
|
1505
|
+
this.gestures.cancelEdit(), (t = this.unsubscribeTheme) == null || t.call(this), this.unsubscribeTheme = null, this.frame !== 0 && cancelAnimationFrame(this.frame), this.domainFrame !== 0 && cancelAnimationFrame(this.domainFrame), this.frame = this.domainFrame = 0, this.root = this.plot = this.dataCanvas = this.overlayCanvas = null;
|
|
1503
1506
|
}
|
|
1504
1507
|
resize(t, e) {
|
|
1505
1508
|
const s = Math.max(0, Math.round(t)), o = Math.max(0, Math.round(e));
|
|
@@ -1559,7 +1562,7 @@ class zs {
|
|
|
1559
1562
|
if (t.width <= 0) return [];
|
|
1560
1563
|
const e = this.colours;
|
|
1561
1564
|
return t.boxes.flatMap((s) => {
|
|
1562
|
-
if (!
|
|
1565
|
+
if (!Le(s, t.width, t.height)) return [];
|
|
1563
1566
|
const o = us(s, t.width);
|
|
1564
1567
|
if (o === null) return [];
|
|
1565
1568
|
const i = e === null ? void 0 : e.tasks.get(s.subtask.task), r = i === void 0 || e === null ? !0 : Ft(ht(s.subtask.appearance), i, e).onDark;
|
|
@@ -1576,7 +1579,7 @@ class zs {
|
|
|
1576
1579
|
}
|
|
1577
1580
|
/** The visible span, as two wall-clock instants. */
|
|
1578
1581
|
visibleDomain() {
|
|
1579
|
-
const t =
|
|
1582
|
+
const t = j(this.view.options.calendar), e = (s) => t.intervals.length === 0 ? s : U(Math.max(0, Math.min(t.total, s)), t);
|
|
1580
1583
|
return [e(this.view.domain[0]), e(this.view.domain[1])];
|
|
1581
1584
|
}
|
|
1582
1585
|
/** Reported once per frame, however many wheel steps a planner turns - and
|
|
@@ -1634,7 +1637,7 @@ class zs {
|
|
|
1634
1637
|
ks(s, i), ws(o, i);
|
|
1635
1638
|
}
|
|
1636
1639
|
}
|
|
1637
|
-
const qs = "_root_ekx9o_4
|
|
1640
|
+
const qs = "_root_ekx9o_4 _text_1hv7a_23", js = "_corner_ekx9o_18", Vs = "_dayBand_ekx9o_22", Zs = "_tickBand_ekx9o_23", Js = "_day_ekx9o_22", Qs = "_dayLabel_ekx9o_46", tn = "_tick_ekx9o_23", en = "_tickLabel_ekx9o_64", sn = "_headers_ekx9o_72", nn = "_header_ekx9o_72", on = "_headerLabel_ekx9o_90", rn = "_headerCount_ekx9o_103", an = "_chevron_ekx9o_112", ln = "_plot_ekx9o_160", hn = "_layer_ekx9o_166", un = "_grip_ekx9o_175", cn = "_ghostLabel_ekx9o_185", dn = "_finding_ekx9o_198", fn = "_refusal_ekx9o_206", pn = "_tooltip_ekx9o_210", mn = "_tooltipHead_ekx9o_228", gn = "_tooltipTimes_ekx9o_233", kn = "_now_ekx9o_242", wn = "_barLabel_ekx9o_256", vn = "_barLabelText_ekx9o_269", v = {
|
|
1638
1641
|
root: qs,
|
|
1639
1642
|
corner: js,
|
|
1640
1643
|
dayBand: Vs,
|
|
@@ -1662,13 +1665,13 @@ const qs = "_root_ekx9o_4 _text_18b86_23", js = "_corner_ekx9o_18", Vs = "_dayBa
|
|
|
1662
1665
|
barLabelText: vn
|
|
1663
1666
|
};
|
|
1664
1667
|
function yn({ target: n }) {
|
|
1665
|
-
const t =
|
|
1666
|
-
const d = Math.round(l /
|
|
1668
|
+
const t = ge(), e = ke(), s = (l) => t.time(new Date(l), !1), o = (l) => {
|
|
1669
|
+
const d = Math.round(l / q), p = Math.floor(d / 60), g = d % 60;
|
|
1667
1670
|
return [p > 0 ? e.hoursShort(p) : "", g > 0 || p === 0 ? e.minutesShort(g) : ""].filter(Boolean).join(" ");
|
|
1668
1671
|
};
|
|
1669
1672
|
if (n.kind === "subtask") {
|
|
1670
1673
|
const { subtask: l, task: d } = n;
|
|
1671
|
-
return /* @__PURE__ */
|
|
1674
|
+
return /* @__PURE__ */ Y(zt, { children: [
|
|
1672
1675
|
/* @__PURE__ */ w("span", { className: v.tooltipHead, children: (d == null ? void 0 : d.name) ?? l.task }),
|
|
1673
1676
|
/* @__PURE__ */ w("span", { children: l.name ?? l.id }),
|
|
1674
1677
|
/* @__PURE__ */ w("span", { className: v.tooltipTimes, children: e.scheduleGhostTimes(s(l.from), s(l.to)) }),
|
|
@@ -1679,7 +1682,7 @@ function yn({ target: n }) {
|
|
|
1679
1682
|
] });
|
|
1680
1683
|
}
|
|
1681
1684
|
const { transport: i, task: r, from: a, to: u, late: c } = n;
|
|
1682
|
-
return /* @__PURE__ */
|
|
1685
|
+
return /* @__PURE__ */ Y(zt, { children: [
|
|
1683
1686
|
/* @__PURE__ */ w("span", { className: v.tooltipHead, children: (r == null ? void 0 : r.name) ?? (r == null ? void 0 : r.id) ?? i.id }),
|
|
1684
1687
|
/* @__PURE__ */ w("span", { children: e.scheduleRoute((a == null ? void 0 : a.name) ?? i.from, (u == null ? void 0 : u.name) ?? i.to) }),
|
|
1685
1688
|
/* @__PURE__ */ w("span", { children: `${e.scheduleTransport} ${o(i.duration)}` }),
|
|
@@ -1700,7 +1703,7 @@ const bn = [], ce = { min: Tt, max: 28 * st }, Mn = [], de = 20, Fn = Xe(functio
|
|
|
1700
1703
|
onIntent: p,
|
|
1701
1704
|
canMoveTo: g,
|
|
1702
1705
|
onInteraction: b,
|
|
1703
|
-
selectedTask:
|
|
1706
|
+
selectedTask: I,
|
|
1704
1707
|
onSelectedTaskChange: _,
|
|
1705
1708
|
collapsedGroups: S,
|
|
1706
1709
|
defaultCollapsedGroups: m,
|
|
@@ -1709,29 +1712,29 @@ const bn = [], ce = { min: Tt, max: 28 * st }, Mn = [], de = 20, Fn = Xe(functio
|
|
|
1709
1712
|
placing: E,
|
|
1710
1713
|
route: F = "curve",
|
|
1711
1714
|
attach: G = "centre",
|
|
1712
|
-
ends:
|
|
1715
|
+
ends: V = "dot",
|
|
1713
1716
|
label: ot,
|
|
1714
|
-
tooltip:
|
|
1715
|
-
now:
|
|
1717
|
+
tooltip: W,
|
|
1718
|
+
now: Z,
|
|
1716
1719
|
className: Et,
|
|
1717
1720
|
style: Ee,
|
|
1718
|
-
children:
|
|
1719
|
-
} = t, [k] = it(() => new zs()),
|
|
1721
|
+
children: xe
|
|
1722
|
+
} = t, [k] = it(() => new zs()), xt = Ke(), Dt = $(null), Pt = $(null), Nt = $(null), Gt = $(null), X = ge(), K = ke(), [dt, ft] = o, Rt = (c == null ? void 0 : c.min) ?? ce.min, $t = (c == null ? void 0 : c.max) ?? ce.max, Bt = $(null), Ot = typeof l == "object" ? l.step : null, Ht = typeof l == "object" ? l.offset : null, Yt = typeof l == "object" ? null : l, [De, Pe] = it(() => Date.now());
|
|
1720
1723
|
B(() => {
|
|
1721
|
-
if (
|
|
1722
|
-
const h = setInterval(() => Pe(Date.now()),
|
|
1724
|
+
if (Z !== !0) return;
|
|
1725
|
+
const h = setInterval(() => Pe(Date.now()), q);
|
|
1723
1726
|
return () => clearInterval(h);
|
|
1724
|
-
}, [
|
|
1725
|
-
const Xt =
|
|
1727
|
+
}, [Z]);
|
|
1728
|
+
const Xt = Z === !0 ? De : typeof Z == "number" ? Z : null;
|
|
1726
1729
|
vt(() => {
|
|
1727
1730
|
const h = `${dt}|${ft}`, y = Bt.current !== h;
|
|
1728
1731
|
Bt.current = h;
|
|
1729
|
-
const
|
|
1732
|
+
const A = Yt ?? { step: Ot ?? 0, offset: Ht ?? 0 };
|
|
1730
1733
|
k.setOptions(
|
|
1731
|
-
{ laneHeight: r, calendar: u, zoomLimits: { min: Rt, max: $t }, snap:
|
|
1734
|
+
{ laneHeight: r, calendar: u, zoomLimits: { min: Rt, max: $t }, snap: A, intents: d, now: Xt, route: F, attach: G, ends: V },
|
|
1732
1735
|
y ? [dt, ft] : null
|
|
1733
1736
|
);
|
|
1734
|
-
}, [k, dt, ft, r, u, Rt, $t, Yt, Ot, Ht, d, Xt, F, G,
|
|
1737
|
+
}, [k, dt, ft, r, u, Rt, $t, Yt, Ot, Ht, d, Xt, F, G, V]), B(() => {
|
|
1735
1738
|
k.setHandlers({ onIntent: p, canMoveTo: g, onInteraction: b, onSelectedTaskChange: _, onCollapsedGroupsChange: C, onDomainChange: L });
|
|
1736
1739
|
}, [k, p, g, b, _, C, L]);
|
|
1737
1740
|
const Ne = $(m);
|
|
@@ -1740,7 +1743,7 @@ const bn = [], ce = { min: Tt, max: 28 * st }, Mn = [], de = 20, Fn = Xe(functio
|
|
|
1740
1743
|
h !== void 0 && k.setDefaultCollapsedGroups(h);
|
|
1741
1744
|
}, [k]), B(() => {
|
|
1742
1745
|
k.setCollapsedGroups(S);
|
|
1743
|
-
}, [k, S]),
|
|
1746
|
+
}, [k, S]), Ue(
|
|
1744
1747
|
e,
|
|
1745
1748
|
() => ({
|
|
1746
1749
|
positionAt: (h, y) => k.positionAt(h, y),
|
|
@@ -1749,79 +1752,79 @@ const bn = [], ce = { min: Tt, max: 28 * st }, Mn = [], de = 20, Fn = Xe(functio
|
|
|
1749
1752
|
}),
|
|
1750
1753
|
[k]
|
|
1751
1754
|
), B(() => {
|
|
1752
|
-
k.setControlledTask(
|
|
1753
|
-
}, [k,
|
|
1755
|
+
k.setControlledTask(I);
|
|
1756
|
+
}, [k, I]), B(() => {
|
|
1754
1757
|
k.setPlacing(E ?? null);
|
|
1755
1758
|
}, [k, E]), B(() => {
|
|
1756
|
-
const h =
|
|
1757
|
-
if (!h || !y || !
|
|
1758
|
-
k.bind(h, y,
|
|
1759
|
-
const
|
|
1760
|
-
k.resize(
|
|
1761
|
-
const
|
|
1762
|
-
var
|
|
1763
|
-
const
|
|
1764
|
-
|
|
1759
|
+
const h = Dt.current, y = Pt.current, A = Nt.current, R = Gt.current;
|
|
1760
|
+
if (!h || !y || !A || !R) return;
|
|
1761
|
+
k.bind(h, y, A, R);
|
|
1762
|
+
const x = y.getBoundingClientRect();
|
|
1763
|
+
k.resize(x.width, x.height);
|
|
1764
|
+
const D = new ResizeObserver((N) => {
|
|
1765
|
+
var Wt;
|
|
1766
|
+
const tt = (Wt = N[N.length - 1]) == null ? void 0 : Wt.contentRect;
|
|
1767
|
+
tt !== void 0 && k.resize(tt.width, tt.height);
|
|
1765
1768
|
});
|
|
1766
|
-
|
|
1767
|
-
const
|
|
1768
|
-
|
|
1769
|
-
const
|
|
1769
|
+
D.observe(y);
|
|
1770
|
+
const J = (N) => k.wheel(N);
|
|
1771
|
+
h.addEventListener("wheel", J, { passive: !1 });
|
|
1772
|
+
const Q = (N) => {
|
|
1770
1773
|
N.key === "Escape" && k.cancelEdit() && N.preventDefault();
|
|
1771
1774
|
};
|
|
1772
|
-
return window.addEventListener("keydown",
|
|
1773
|
-
window.removeEventListener("keydown",
|
|
1775
|
+
return window.addEventListener("keydown", Q), () => {
|
|
1776
|
+
window.removeEventListener("keydown", Q), h.removeEventListener("wheel", J), D.disconnect(), k.unbind();
|
|
1774
1777
|
};
|
|
1775
1778
|
}, [k]);
|
|
1776
|
-
const T =
|
|
1777
|
-
const
|
|
1778
|
-
return y >= 200 ?
|
|
1779
|
-
}, M = T.ghost, pt = (h) => `${
|
|
1779
|
+
const T = We(k.subscribe, k.getSnapshot, k.getServerSnapshot), Ge = (h, y) => {
|
|
1780
|
+
const A = new Date(h);
|
|
1781
|
+
return y >= 200 ? X.dateLong(A) : y >= 84 ? X.date(A) : y >= 44 ? X.dateShort(A) : "";
|
|
1782
|
+
}, M = T.ghost, pt = (h) => `${xt}-row-${encodeURIComponent(h.key)}`, Re = z(() => {
|
|
1780
1783
|
const h = /* @__PURE__ */ new Map();
|
|
1781
1784
|
for (const y of T.headers)
|
|
1782
|
-
for (const
|
|
1783
|
-
y.kind === "groupHead" &&
|
|
1785
|
+
for (const A of y.within)
|
|
1786
|
+
y.kind === "groupHead" && A === y.group || h.set(A, [...h.get(A) ?? [], pt(y)]);
|
|
1784
1787
|
return h;
|
|
1785
|
-
}, [T.headers,
|
|
1788
|
+
}, [T.headers, xt]), $e = z(() => new Set((M == null ? void 0 : M.refusedLanes) ?? []), [M == null ? void 0 : M.refusedLanes]), Kt = $(null), [mt, Be] = it({ x: 0, y: 0, at: "" }), gt = M === null ? "" : `${M.x}:${M.y}:${M.from}:${M.to}:${M.overlap}:${M.late}`;
|
|
1786
1789
|
vt(() => {
|
|
1787
1790
|
const h = Kt.current;
|
|
1788
1791
|
if (M === null || h === null) return;
|
|
1789
|
-
const y = 4,
|
|
1792
|
+
const y = 4, A = M.y - h.offsetHeight - y, R = M.y + M.height + y, x = {
|
|
1790
1793
|
x: Math.max(2, Math.min(M.x, T.width - h.offsetWidth - 2)),
|
|
1791
|
-
y:
|
|
1794
|
+
y: A >= 2 ? A : Math.min(R, T.height - h.offsetHeight - 2),
|
|
1792
1795
|
at: gt
|
|
1793
1796
|
};
|
|
1794
|
-
Be((
|
|
1797
|
+
Be((D) => D.x === x.x && D.y === x.y && D.at === x.at ? D : x);
|
|
1795
1798
|
}, [M, gt, T.width, T.height]);
|
|
1796
|
-
const
|
|
1799
|
+
const Ut = $(null), [kt, Oe] = it({ x: 0, y: 0, at: "" }), H = T.tooltip, wt = H === null ? "" : `${H.x}:${H.y}:${H.target.kind}`;
|
|
1797
1800
|
return vt(() => {
|
|
1798
|
-
const h =
|
|
1799
|
-
if (
|
|
1800
|
-
const y = 12,
|
|
1801
|
-
const
|
|
1802
|
-
return Math.max(4, Math.min(
|
|
1801
|
+
const h = Ut.current;
|
|
1802
|
+
if (H === null || h === null) return;
|
|
1803
|
+
const y = 12, A = (x, D, J) => {
|
|
1804
|
+
const Q = x + y, N = x - y - D, tt = Q + D <= J - 4 || N < 4 ? Q : N;
|
|
1805
|
+
return Math.max(4, Math.min(tt, J - D - 4));
|
|
1803
1806
|
}, R = {
|
|
1804
|
-
x:
|
|
1805
|
-
y:
|
|
1807
|
+
x: A(H.x, h.offsetWidth, T.width),
|
|
1808
|
+
y: A(H.y, h.offsetHeight, T.height),
|
|
1806
1809
|
at: wt
|
|
1807
1810
|
};
|
|
1808
|
-
Oe((
|
|
1809
|
-
}, [
|
|
1810
|
-
/* @__PURE__ */
|
|
1811
|
+
Oe((x) => x.x === R.x && x.y === R.y && x.at === R.at ? x : R);
|
|
1812
|
+
}, [H, wt, T.width, T.height]), /* @__PURE__ */ Y(we.Provider, { value: k, children: [
|
|
1813
|
+
/* @__PURE__ */ Y(
|
|
1811
1814
|
"div",
|
|
1812
1815
|
{
|
|
1813
|
-
ref:
|
|
1816
|
+
ref: Dt,
|
|
1814
1817
|
role: "figure",
|
|
1815
1818
|
"aria-label": s,
|
|
1816
1819
|
className: Et ? `${v.root} ${Et}` : v.root,
|
|
1817
|
-
style: { height: `${i}px`, gridTemplateColumns:
|
|
1820
|
+
style: { height: `${i}px`, gridTemplateColumns: `min(${a}px, 40%) minmax(0, 1fr)`, ...Ee },
|
|
1818
1821
|
children: [
|
|
1819
1822
|
/* @__PURE__ */ w("div", { className: v.corner }),
|
|
1820
1823
|
/* @__PURE__ */ w("div", { className: v.dayBand, "aria-hidden": "true", "data-schedule-days": "", "data-schedule-clip": "day band", children: T.days.map((h) => {
|
|
1821
|
-
const y = Math.max(0, -h.x),
|
|
1822
|
-
return /* @__PURE__ */ w("span", { className: v.day, style: { left: `${h.x}px`, width: `${h.width}px` }, children: /* @__PURE__ */ w("span", { className: v.dayLabel, "data-schedule-overlay": "day label", style: { marginLeft: `${y}px` }, children: Ge(h.start,
|
|
1824
|
+
const y = Math.max(0, -h.x), A = Math.min(h.x + h.width, T.width) - Math.max(h.x, 0);
|
|
1825
|
+
return /* @__PURE__ */ w("span", { className: v.day, style: { left: `${h.x}px`, width: `${h.width}px` }, children: /* @__PURE__ */ w("span", { className: v.dayLabel, "data-schedule-overlay": "day label", style: { marginLeft: `${y}px` }, children: Ge(h.start, A) }) }, h.start);
|
|
1823
1826
|
}) }),
|
|
1824
|
-
/* @__PURE__ */ w("div", { className: v.headers, "data-schedule-headers": "", children: /* @__PURE__ */ w("div", { className: v.headerRun, style: { transform: `translateY(${-T.scrollY}px)` }, children: T.headers.map((h) => /* @__PURE__ */
|
|
1827
|
+
/* @__PURE__ */ w("div", { className: v.headers, "data-schedule-headers": "", children: /* @__PURE__ */ w("div", { className: v.headerRun, style: { transform: `translateY(${-T.scrollY}px)` }, children: T.headers.map((h) => /* @__PURE__ */ Y(
|
|
1825
1828
|
"div",
|
|
1826
1829
|
{
|
|
1827
1830
|
id: pt(h),
|
|
@@ -1841,18 +1844,18 @@ const bn = [], ce = { min: Tt, max: 28 * st }, Mn = [], de = 20, Fn = Xe(functio
|
|
|
1841
1844
|
"data-schedule-overlay": "fold control",
|
|
1842
1845
|
"aria-expanded": h.collapsed === !1,
|
|
1843
1846
|
"aria-controls": (Re.get(h.group) ?? [pt(h)]).join(" "),
|
|
1844
|
-
"aria-label": `${h.collapsed === !0 ?
|
|
1847
|
+
"aria-label": `${h.collapsed === !0 ? K.scheduleUnfoldGroup : K.scheduleFoldGroup}: ${typeof h.label == "string" ? h.label : h.group}`,
|
|
1845
1848
|
onClick: () => k.toggleGroup(h.group),
|
|
1846
1849
|
children: /* @__PURE__ */ w("svg", { viewBox: "0 0 10 10", width: "9", height: "9", "aria-hidden": "true", "data-open": h.collapsed === !1 ? "" : void 0, children: /* @__PURE__ */ w("path", { d: "M3.5 1.5 7 5l-3.5 3.5", fill: "none", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round" }) })
|
|
1847
1850
|
}
|
|
1848
1851
|
),
|
|
1849
1852
|
/* @__PURE__ */ w("span", { className: v.headerLabel, "data-schedule-overlay": "header label", children: h.label }),
|
|
1850
|
-
h.kind !== "lane" && /* @__PURE__ */ w("span", { className: v.headerCount, "data-schedule-overlay": "lane count", "data-lane-count": h.lanes, children:
|
|
1853
|
+
h.kind !== "lane" && /* @__PURE__ */ w("span", { className: v.headerCount, "data-schedule-overlay": "lane count", "data-lane-count": h.lanes, children: K.scheduleLaneCount(h.lanes) })
|
|
1851
1854
|
]
|
|
1852
1855
|
},
|
|
1853
1856
|
h.key
|
|
1854
1857
|
)) }) }),
|
|
1855
|
-
/* @__PURE__ */
|
|
1858
|
+
/* @__PURE__ */ Y(
|
|
1856
1859
|
"div",
|
|
1857
1860
|
{
|
|
1858
1861
|
ref: Pt,
|
|
@@ -1899,10 +1902,10 @@ const bn = [], ce = { min: Tt, max: 28 * st }, Mn = [], de = 20, Fn = Xe(functio
|
|
|
1899
1902
|
},
|
|
1900
1903
|
h.subtask.id
|
|
1901
1904
|
)),
|
|
1902
|
-
|
|
1905
|
+
W !== !1 && T.tooltip !== null && /* @__PURE__ */ w(
|
|
1903
1906
|
"span",
|
|
1904
1907
|
{
|
|
1905
|
-
ref:
|
|
1908
|
+
ref: Ut,
|
|
1906
1909
|
role: "tooltip",
|
|
1907
1910
|
className: v.tooltip,
|
|
1908
1911
|
"data-schedule-tooltip": "",
|
|
@@ -1912,10 +1915,10 @@ const bn = [], ce = { min: Tt, max: 28 * st }, Mn = [], de = 20, Fn = Xe(functio
|
|
|
1912
1915
|
top: `${kt.y}px`,
|
|
1913
1916
|
visibility: kt.at === wt ? void 0 : "hidden"
|
|
1914
1917
|
},
|
|
1915
|
-
children: typeof
|
|
1918
|
+
children: typeof W == "function" ? W(T.tooltip.target) : /* @__PURE__ */ w(yn, { target: T.tooltip.target })
|
|
1916
1919
|
}
|
|
1917
1920
|
),
|
|
1918
|
-
M !== null && /* @__PURE__ */
|
|
1921
|
+
M !== null && /* @__PURE__ */ Y(
|
|
1919
1922
|
"span",
|
|
1920
1923
|
{
|
|
1921
1924
|
ref: Kt,
|
|
@@ -1930,10 +1933,10 @@ const bn = [], ce = { min: Tt, max: 28 * st }, Mn = [], de = 20, Fn = Xe(functio
|
|
|
1930
1933
|
visibility: mt.at === gt ? void 0 : "hidden"
|
|
1931
1934
|
},
|
|
1932
1935
|
children: [
|
|
1933
|
-
|
|
1934
|
-
M.refused && /* @__PURE__ */ w("span", { className: v.refusal, children:
|
|
1935
|
-
M.overlap && /* @__PURE__ */ w("span", { className: v.finding, children:
|
|
1936
|
-
M.late && /* @__PURE__ */ w("span", { className: v.finding, children:
|
|
1936
|
+
K.scheduleGhostTimes(X.time(new Date(M.from), !1), X.time(new Date(M.to), !1)),
|
|
1937
|
+
M.refused && /* @__PURE__ */ w("span", { className: v.refusal, children: K.scheduleLaneRefused }),
|
|
1938
|
+
M.overlap && /* @__PURE__ */ w("span", { className: v.finding, children: K.scheduleOverlap }),
|
|
1939
|
+
M.late && /* @__PURE__ */ w("span", { className: v.finding, children: K.scheduleLateTransport })
|
|
1937
1940
|
]
|
|
1938
1941
|
}
|
|
1939
1942
|
)
|
|
@@ -1941,31 +1944,31 @@ const bn = [], ce = { min: Tt, max: 28 * st }, Mn = [], de = 20, Fn = Xe(functio
|
|
|
1941
1944
|
}
|
|
1942
1945
|
),
|
|
1943
1946
|
/* @__PURE__ */ w("div", { className: v.corner }),
|
|
1944
|
-
/* @__PURE__ */
|
|
1947
|
+
/* @__PURE__ */ Y("div", { className: v.tickBand, "aria-hidden": "true", "data-schedule-ticks": "", "data-schedule-clip": "time band", children: [
|
|
1945
1948
|
T.now !== null && /* @__PURE__ */ w("span", { className: v.now, "data-now": "", "data-schedule-overlay": "now mark", style: { left: `${T.now}px` } }),
|
|
1946
|
-
T.ticks.map((h) => /* @__PURE__ */ w("span", { className: v.tick, style: { left: `${h.x}px` }, children: h.x >= de && h.x <= T.width - de && /* @__PURE__ */ w("span", { className: v.tickLabel, "data-schedule-overlay": "time label", children: T.step >= st ?
|
|
1949
|
+
T.ticks.map((h) => /* @__PURE__ */ w("span", { className: v.tick, style: { left: `${h.x}px` }, children: h.x >= de && h.x <= T.width - de && /* @__PURE__ */ w("span", { className: v.tickLabel, "data-schedule-overlay": "time label", children: T.step >= st ? X.dateShort(new Date(h.wallClock)) : X.time(new Date(h.wallClock), !1) }) }, h.wallClock))
|
|
1947
1950
|
] })
|
|
1948
1951
|
]
|
|
1949
1952
|
}
|
|
1950
1953
|
),
|
|
1951
|
-
|
|
1954
|
+
xe
|
|
1952
1955
|
] });
|
|
1953
1956
|
});
|
|
1954
1957
|
function En({ id: n, label: t }) {
|
|
1955
|
-
const e =
|
|
1958
|
+
const e = ye(), s = z(() => ({ id: n, label: t ?? n, ...e === null ? {} : { parent: e } }), [n, t, e]);
|
|
1956
1959
|
return ts(s), null;
|
|
1957
1960
|
}
|
|
1958
|
-
function
|
|
1959
|
-
const s =
|
|
1960
|
-
return es(o), /* @__PURE__ */ w(
|
|
1961
|
+
function xn({ id: n, label: t, children: e }) {
|
|
1962
|
+
const s = ye(), o = z(() => ({ id: n, label: t ?? n, ...s === null ? {} : { parent: s } }), [n, t, s]);
|
|
1963
|
+
return es(o), /* @__PURE__ */ w(ve.Provider, { value: n, children: e });
|
|
1961
1964
|
}
|
|
1962
|
-
function
|
|
1963
|
-
const e =
|
|
1964
|
-
return
|
|
1965
|
+
function Dn({ data: n, tasks: t }) {
|
|
1966
|
+
const e = z(() => ({ kind: "subtasks", data: n, tasks: t }), [n, t]);
|
|
1967
|
+
return be("Subtasks", e), null;
|
|
1965
1968
|
}
|
|
1966
1969
|
function Pn({ data: n }) {
|
|
1967
|
-
const t =
|
|
1968
|
-
return
|
|
1970
|
+
const t = z(() => ({ kind: "transports", data: n }), [n]);
|
|
1971
|
+
return be("Transports", t), null;
|
|
1969
1972
|
}
|
|
1970
1973
|
function Nn(n, t, e) {
|
|
1971
1974
|
if (e.kind === "place") return [];
|
|
@@ -1983,7 +1986,7 @@ function Nn(n, t, e) {
|
|
|
1983
1986
|
if (l.to === e.subtask) continue;
|
|
1984
1987
|
const d = s.get(l.to);
|
|
1985
1988
|
if (d === void 0) continue;
|
|
1986
|
-
const p = St(l, c) + l.duration -
|
|
1989
|
+
const p = St(l, c) + l.duration - It(l, d);
|
|
1987
1990
|
if (!(p > 0)) continue;
|
|
1988
1991
|
const g = { kind: "move", subtask: d.id, from: d.from + p, to: d.to + p };
|
|
1989
1992
|
s.set(d.id, jt(d, g)), i.set(d.id, g), r.push(d.id);
|
|
@@ -1996,20 +1999,20 @@ function Gn(n, t, e) {
|
|
|
1996
1999
|
}
|
|
1997
2000
|
export {
|
|
1998
2001
|
En as Lane,
|
|
1999
|
-
|
|
2002
|
+
xn as LaneGroup,
|
|
2000
2003
|
Fn as Schedule,
|
|
2001
|
-
|
|
2004
|
+
Dn as Subtasks,
|
|
2002
2005
|
Pn as Transports,
|
|
2003
2006
|
jt as applyIntent,
|
|
2004
|
-
|
|
2007
|
+
It as arrival,
|
|
2005
2008
|
St as departure,
|
|
2006
2009
|
_n as findings,
|
|
2007
2010
|
_t as lateTransports,
|
|
2008
2011
|
ut as occupied,
|
|
2009
|
-
|
|
2012
|
+
At as overlaps,
|
|
2010
2013
|
ht as resolveAppearance,
|
|
2011
2014
|
Nn as ripple,
|
|
2012
2015
|
Gn as shiftTask,
|
|
2013
|
-
|
|
2014
|
-
|
|
2016
|
+
Gs as snapTime,
|
|
2017
|
+
An as subtaskFromPlace
|
|
2015
2018
|
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@umriss-ui/schedule",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.3",
|
|
4
4
|
"description": "The umriss schedule - subtasks on lanes over time, with transports, findings and controlled editing.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Roman Händler",
|
|
@@ -44,8 +44,8 @@
|
|
|
44
44
|
"peerDependencies": {
|
|
45
45
|
"react": ">=18",
|
|
46
46
|
"react-dom": ">=18",
|
|
47
|
-
"@umriss-ui/charts": "^0.
|
|
48
|
-
"@umriss-ui/core": "^0.
|
|
47
|
+
"@umriss-ui/charts": "^0.4.0",
|
|
48
|
+
"@umriss-ui/core": "^0.4.0"
|
|
49
49
|
},
|
|
50
50
|
"devDependencies": {
|
|
51
51
|
"@fontsource/geist-mono": "^5.3.0",
|
|
@@ -59,9 +59,9 @@
|
|
|
59
59
|
"typescript": "^5.6.3",
|
|
60
60
|
"vite": "^6.0.0",
|
|
61
61
|
"vite-plugin-dts": "^4.3.0",
|
|
62
|
-
"@umriss-ui/charts": "0.
|
|
63
|
-
"@umriss-ui/
|
|
64
|
-
"@umriss-ui/
|
|
62
|
+
"@umriss-ui/charts": "0.4.0",
|
|
63
|
+
"@umriss-ui/core": "0.4.0",
|
|
64
|
+
"@umriss-ui/demo": "0.0.0"
|
|
65
65
|
},
|
|
66
66
|
"scripts": {
|
|
67
67
|
"props": "node --disable-warning=ExperimentalWarning --experimental-strip-types demo/props.ts",
|