@umriss-ui/schedule 0.3.4 → 0.3.6
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 +18 -0
- package/README.md +1 -1
- package/dist/schedule.css +1 -1
- package/dist/schedule.js +29 -29
- package/docs/llms-full.md +28 -28
- package/package.json +15 -10
package/CHANGELOG.md
CHANGED
|
@@ -15,6 +15,24 @@ moves from here under the rule above.
|
|
|
15
15
|
|
|
16
16
|
---
|
|
17
17
|
|
|
18
|
+
## 0.3.6 – Core 0.15.0 (Sep. 2026)
|
|
19
|
+
|
|
20
|
+
Needs `@umriss-ui/core` 0.15; the peer range moves to `^0.15.0`. Nothing else changes for a caller.
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
## 0.3.5 – Found by search (Sep. 2026)
|
|
25
|
+
|
|
26
|
+
### Fixed
|
|
27
|
+
|
|
28
|
+
- **The package's description and keywords say what it is in the words a
|
|
29
|
+
search uses**, and the demo it links to addresses every page by a path
|
|
30
|
+
(`…/schedule/<page>/`) instead of a hash, with the page's text readable before
|
|
31
|
+
the demo starts. Old `#/<page>` links still land. Nothing in the package's
|
|
32
|
+
code changed.
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
18
36
|
## 0.3.4 – Core 0.14.0 (Sep. 2026)
|
|
19
37
|
|
|
20
38
|
Needs `@umriss-ui/core` 0.14; the peer range moves to `^0.14.0`. Nothing else changes for a caller.
|
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# @umriss-ui/schedule
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
A React Gantt-style schedule for data-dense applications — work planned over time: **subtasks** on **lanes** — people, vehicles, rooms or
|
|
4
4
|
machines. One task runs across several lanes in a fixed order, each stop has a
|
|
5
5
|
main time with a lead-in before it and a lead-out after it, between the stops
|
|
6
6
|
lie **dependencies** with lags of their own, and a lane can be **blocked** for
|
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_ocaqi_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}@media(pointer:fine){._dense_ocaqi_39{--u-control-height-sm: var(--u-control-height-xs)}}._field_ocaqi_46{caret-color:var(--u-color-accent)}._scroll_ocaqi_52{scrollbar-width:thin;scrollbar-color:color-mix(in srgb,var(--u-color-text) 25%,transparent) transparent}._scroll_ocaqi_52::-webkit-scrollbar{width:10px;height:10px}._scroll_ocaqi_52::-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_ocaqi_52::-webkit-scrollbar-track{background:transparent}}@layer umriss.components{._ring_ocaqi_81:focus-visible{outline:2px solid transparent;box-shadow:var(--u-focus-ring)}@media(pointer:coarse){._field_ocaqi_46._field_ocaqi_46{font-size:16px}}._field_ocaqi_46:-webkit-autofill,._field_ocaqi_46:-webkit-autofill:hover,._field_ocaqi_46:-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_19uyg_4,._root_19uyg_4:before,._root_19uyg_4:after{box-sizing:border-box}._corner_19uyg_19,._corner_19uyg_19:before,._corner_19uyg_19:after{box-sizing:border-box}._dayBand_19uyg_23,._dayBand_19uyg_23:before,._dayBand_19uyg_23:after{box-sizing:border-box}._tickBand_19uyg_24,._tickBand_19uyg_24:before,._tickBand_19uyg_24:after{box-sizing:border-box}._day_19uyg_23,._day_19uyg_23:before,._day_19uyg_23:after{box-sizing:border-box}._dayLabel_19uyg_47,._dayLabel_19uyg_47:before,._dayLabel_19uyg_47:after{box-sizing:border-box}._tick_19uyg_24,._tick_19uyg_24:before,._tick_19uyg_24:after{box-sizing:border-box}._tickLabel_19uyg_65,._tickLabel_19uyg_65:before,._tickLabel_19uyg_65:after{box-sizing:border-box}._headers_19uyg_73,._headers_19uyg_73:before,._headers_19uyg_73:after{box-sizing:border-box}._header_19uyg_73,._header_19uyg_73:before,._header_19uyg_73:after{box-sizing:border-box}._headerLabel_19uyg_91,._headerLabel_19uyg_91:before,._headerLabel_19uyg_91:after{box-sizing:border-box}._headerCount_19uyg_104,._headerCount_19uyg_104:before,._headerCount_19uyg_104:after{box-sizing:border-box}._chevron_19uyg_113,._chevron_19uyg_113:before,._chevron_19uyg_113:after{box-sizing:border-box}._plot_19uyg_171,._plot_19uyg_171:before,._plot_19uyg_171:after{box-sizing:border-box}._focusRing_19uyg_178,._focusRing_19uyg_178:before,._focusRing_19uyg_178:after{box-sizing:border-box}._layer_19uyg_196,._layer_19uyg_196:before,._layer_19uyg_196:after{box-sizing:border-box}._grip_19uyg_205,._grip_19uyg_205:before,._grip_19uyg_205:after{box-sizing:border-box}._ghostLabel_19uyg_215,._ghostLabel_19uyg_215:before,._ghostLabel_19uyg_215:after{box-sizing:border-box}._finding_19uyg_228,._finding_19uyg_228:before,._finding_19uyg_228:after{box-sizing:border-box}._refusal_19uyg_236,._refusal_19uyg_236:before,._refusal_19uyg_236:after{box-sizing:border-box}._tooltip_19uyg_240,._tooltip_19uyg_240:before,._tooltip_19uyg_240:after{box-sizing:border-box}._tooltipHead_19uyg_259,._tooltipHead_19uyg_259:before,._tooltipHead_19uyg_259:after{box-sizing:border-box}._tooltipTimes_19uyg_264,._tooltipTimes_19uyg_264:before,._tooltipTimes_19uyg_264:after{box-sizing:border-box}._now_19uyg_273,._now_19uyg_273:before,._now_19uyg_273:after{box-sizing:border-box}._barLabel_19uyg_287,._barLabel_19uyg_287:before,._barLabel_19uyg_287:after{box-sizing:border-box}._barLabelText_19uyg_300,._barLabelText_19uyg_300:before,._barLabelText_19uyg_300:after{box-sizing:border-box}._root_19uyg_4{display:grid;grid-template-rows:28px minmax(0,1fr) 28px;width:100%;font-size:var(--u-text-sm);background:var(--u-color-surface);outline:1px solid transparent;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_19uyg_19{background:var(--u-color-surface)}._dayBand_19uyg_23,._tickBand_19uyg_24{position:relative;overflow:hidden;color:var(--u-color-text-muted);font-size:var(--u-text-xs)}._dayBand_19uyg_23{border-bottom:1px solid var(--u-hairline-strong)}._tickBand_19uyg_24{border-top:1px solid var(--u-hairline-strong)}._day_19uyg_23{position:absolute;top:0;bottom:0;border-left:1px solid var(--u-hairline-strong);overflow:hidden}._dayLabel_19uyg_47{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_19uyg_24{position:absolute;top:0;bottom:0;width:1px;background:var(--u-hairline)}._tickLabel_19uyg_65{position:absolute;top:50%;left:0;transform:translate(-50%,-50%);white-space:nowrap}._headers_19uyg_73{position:relative;overflow:hidden;border-right:1px solid var(--u-hairline-strong)}._header_19uyg_73{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_19uyg_91{min-width:0;overflow:hidden;text-overflow:ellipsis}._header_19uyg_73[data-row=groupHead],._header_19uyg_73[data-row=miniature]{font-weight:var(--u-weight-medium)}._headerCount_19uyg_104{flex:none;color:var(--u-color-text-muted);font-size:var(--u-text-xs);font-variant-numeric:tabular-nums}._chevron_19uyg_113{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;transition:background-color var(--u-transition),color var(--u-transition)}._chevron_19uyg_113:hover{background:var(--u-color-surface-sunken);color:var(--u-color-text)}._chevron_19uyg_113:active{background:var(--u-color-surface-pressed)}._chevron_19uyg_113:focus-visible{outline:2px solid transparent;box-shadow:var(--u-focus-ring)}._chevron_19uyg_113 svg{box-sizing:border-box}._chevron_19uyg_113 svg{transition:transform var(--u-transition-path)}._chevron_19uyg_113 svg[data-open]{box-sizing:border-box}._chevron_19uyg_113 svg[data-open]{transform:rotate(90deg)}@media(prefers-reduced-motion:reduce){._chevron_19uyg_113 svg{transition:none}}._header_19uyg_73[data-refused]{color:var(--u-color-text-muted)}._plot_19uyg_171{position:relative;overflow:hidden;touch-action:none}._plot_19uyg_171:focus{outline:none}._focusRing_19uyg_178{position:absolute;top:2px;right:2px;bottom:2px;left:2px;border-radius:var(--u-radius-md);corner-shape:squircle;pointer-events:none}._plot_19uyg_171:focus-visible>._focusRing_19uyg_178{outline:2px solid transparent;box-shadow:var(--u-focus-ring)}._layer_19uyg_196{position:absolute;top:0;right:0;bottom:0;left:0;width:100%;height:100%;display:block;pointer-events:none}._grip_19uyg_205{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_19uyg_215{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_19uyg_228{font-weight:var(--u-weight-semibold);color:var(--u-color-danger-subtle)}._refusal_19uyg_236{font-weight:var(--u-weight-semibold)}._tooltip_19uyg_240{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);outline:1px solid transparent;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_19uyg_259{color:var(--u-color-text);font-weight:var(--u-weight-semibold)}._tooltipTimes_19uyg_264{color:var(--u-color-text)}._tooltip_19uyg_240 ._finding_19uyg_228{color:var(--u-color-danger-text)}._now_19uyg_273{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_19uyg_287{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_19uyg_300{min-width:0;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}._barLabel_19uyg_287[data-on=dark]{color:var(--u-color-on-accent)}._barLabel_19uyg_287[data-on=light]{color:var(--u-color-text)}@media(forced-colors:active){._grip_19uyg_205{outline:2px solid CanvasText;outline-offset:-2px}._ghostLabel_19uyg_215{outline:1px solid CanvasText}}}
|
package/dist/schedule.js
CHANGED
|
@@ -4,7 +4,7 @@ var rs = (o, t, e) => t in o ? is(o, t, { enumerable: !0, configurable: !0, writ
|
|
|
4
4
|
var f = (o, t, e) => rs(o, typeof t != "symbol" ? t + "" : t, e);
|
|
5
5
|
import { jsxs as Y, Fragment as At, jsx as k } from "react/jsx-runtime";
|
|
6
6
|
import { useContext as _e, createContext as De, useRef as x, useEffect as H, forwardRef as as, useState as ut, useId as ls, useLayoutEffect as Ct, useImperativeHandle as ds, useSyncExternalStore as hs, useMemo as X } from "react";
|
|
7
|
-
import { toWorkingTimeClamped as K, resolveColours as us, removedIntervals as cs, localOffset as Fe, MINUTE as W, calendarFrom as
|
|
7
|
+
import { toWorkingTimeClamped as K, resolveColours as us, removedIntervals as cs, localOffset as Fe, MINUTE as W, calendarFrom as j, toWallClock as z, DAY as rt, timeStep as fs, workingTimeTicks as ps, HOUR as Rt, LinearScale as ms, subscribeTheme as gs } from "@umriss-ui/charts";
|
|
8
8
|
import { useFormats as Bt, useWording as pt, AngleGlyph as ks, VisuallyHidden as le } from "@umriss-ui/core";
|
|
9
9
|
const Oe = De(null), Ee = De(null);
|
|
10
10
|
function Re() {
|
|
@@ -489,7 +489,7 @@ function ke(o, t, e) {
|
|
|
489
489
|
function $s(o, t) {
|
|
490
490
|
const { data: e, view: n } = t, s = n.viewport();
|
|
491
491
|
Ys(o, t, s);
|
|
492
|
-
for (const i of e.blocked)
|
|
492
|
+
for (const i of e.blocked) js(o, t, s, i);
|
|
493
493
|
Ks(o, t);
|
|
494
494
|
for (const i of e.layers) {
|
|
495
495
|
if (i.kind === "blocked") continue;
|
|
@@ -501,7 +501,7 @@ function $s(o, t) {
|
|
|
501
501
|
}
|
|
502
502
|
for (const i of e.overlaps) Et(o, t, s, i);
|
|
503
503
|
for (const i of e.inBlocked) Et(o, t, s, i);
|
|
504
|
-
|
|
504
|
+
qs(o, t, s), Qs(o, t);
|
|
505
505
|
}
|
|
506
506
|
function Gs(o, t) {
|
|
507
507
|
const { view: e, hover: n } = t, s = e.viewport();
|
|
@@ -674,7 +674,7 @@ function Ft(o, t, e, n, s) {
|
|
|
674
674
|
])
|
|
675
675
|
o.beginPath(), o.arc(u, p, l ? 3 : 2.5, 0, Math.PI * 2), o.fill();
|
|
676
676
|
}
|
|
677
|
-
function
|
|
677
|
+
function qs(o, t, e) {
|
|
678
678
|
const { data: n } = t;
|
|
679
679
|
if (n.violatedById.size !== 0)
|
|
680
680
|
for (const s of n.violatedById.values()) {
|
|
@@ -695,7 +695,7 @@ function Ot(o, t, e, n, s, i) {
|
|
|
695
695
|
}
|
|
696
696
|
o.strokeStyle = t.colours.alarm, o.lineWidth = i, o.setLineDash([4, 3]), o.beginPath(), o.moveTo(e, s + i / 2), o.lineTo(n, s + i / 2), o.stroke(), o.setLineDash([]);
|
|
697
697
|
}
|
|
698
|
-
function
|
|
698
|
+
function js(o, t, e, n) {
|
|
699
699
|
const s = lt(e, n.lane);
|
|
700
700
|
if (s === null || s.top + s.height < 0 || s.top > t.view.height) return;
|
|
701
701
|
const i = Math.max(0, E(e, n.from)), r = Math.min(t.view.width, E(e, n.to));
|
|
@@ -1229,14 +1229,14 @@ class rn {
|
|
|
1229
1229
|
a start this way, and a key by one step of the raster - one arithmetic,
|
|
1230
1230
|
so a key proposes exactly what a drag of that length would. */
|
|
1231
1231
|
shifted(t, e, n) {
|
|
1232
|
-
const s =
|
|
1232
|
+
const s = j(this.host.view.options.calendar), i = K(t, s) + e, r = s.intervals.length === 0 ? i : z(Math.max(0, Math.min(s.total, i)), s);
|
|
1233
1233
|
return this.snapInside(r, n);
|
|
1234
1234
|
}
|
|
1235
1235
|
/** Snapped - and, where the raster lands in time the calendar removes, moved
|
|
1236
1236
|
on to the seam, where time counts again. An intent never asks for a time
|
|
1237
1237
|
nobody works. */
|
|
1238
1238
|
snapInside(t, e) {
|
|
1239
|
-
const n = sn(t, e), s =
|
|
1239
|
+
const n = sn(t, e), s = j(this.host.view.options.calendar);
|
|
1240
1240
|
return s.intervals.length === 0 ? n : z(K(n, s), s);
|
|
1241
1241
|
}
|
|
1242
1242
|
intentsOf(t, e, n) {
|
|
@@ -1521,7 +1521,7 @@ function yn(o, t) {
|
|
|
1521
1521
|
return [o[0] + t, o[1] + t];
|
|
1522
1522
|
}
|
|
1523
1523
|
function ze(o, t) {
|
|
1524
|
-
const e =
|
|
1524
|
+
const e = j(t);
|
|
1525
1525
|
if (e.intervals.length === 0) return [o[0], o[1]];
|
|
1526
1526
|
const n = (s) => Math.max(0, Math.min(e.total, s));
|
|
1527
1527
|
return [z(n(o[0]), e), z(n(o[1]), e)];
|
|
@@ -1565,7 +1565,7 @@ class vn {
|
|
|
1565
1565
|
if (this.options = t, e !== null)
|
|
1566
1566
|
this.domain = [K(e[0], t.calendar), K(e[1], t.calendar)];
|
|
1567
1567
|
else if (n) {
|
|
1568
|
-
const i =
|
|
1568
|
+
const i = j(s), r = (a) => {
|
|
1569
1569
|
const l = i.intervals.length === 0 ? a : Math.max(0, Math.min(i.total, a));
|
|
1570
1570
|
return K(z(l, i), t.calendar) + (a - l);
|
|
1571
1571
|
};
|
|
@@ -1652,7 +1652,7 @@ class vn {
|
|
|
1652
1652
|
}
|
|
1653
1653
|
/** The wall-clock time at a plot x; within the calendar's extent. */
|
|
1654
1654
|
timeAt(t) {
|
|
1655
|
-
const e = this.viewport().scale.fromPx(t), n =
|
|
1655
|
+
const e = this.viewport().scale.fromPx(t), n = j(this.options.calendar);
|
|
1656
1656
|
return n.intervals.length === 0 ? e : z(Math.max(0, Math.min(n.total, e)), n);
|
|
1657
1657
|
}
|
|
1658
1658
|
/** The lane at a y, strips included: what the pointer is ON.
|
|
@@ -1952,7 +1952,7 @@ class wn {
|
|
|
1952
1952
|
}
|
|
1953
1953
|
/** The visible span, as two wall-clock instants. */
|
|
1954
1954
|
visibleDomain() {
|
|
1955
|
-
const t =
|
|
1955
|
+
const t = j(this.view.options.calendar), e = (n) => t.intervals.length === 0 ? n : z(Math.max(0, Math.min(t.total, n)), t);
|
|
1956
1956
|
return [e(this.view.domain[0]), e(this.view.domain[1])];
|
|
1957
1957
|
}
|
|
1958
1958
|
/** Reported once per frame, however many wheel steps a planner turns - and
|
|
@@ -2010,7 +2010,7 @@ class wn {
|
|
|
2010
2010
|
$s(n, i), Gs(s, i);
|
|
2011
2011
|
}
|
|
2012
2012
|
}
|
|
2013
|
-
const bn = "_root_19uyg_4
|
|
2013
|
+
const bn = "_root_19uyg_4 _text_ocaqi_23", Mn = "_corner_19uyg_19", Tn = "_dayBand_19uyg_23", In = "_tickBand_19uyg_24", Cn = "_day_19uyg_23", Sn = "_dayLabel_19uyg_47", Ln = "_tick_19uyg_24", An = "_tickLabel_19uyg_65", _n = "_headers_19uyg_73", Dn = "_header_19uyg_73", Fn = "_headerLabel_19uyg_91", On = "_headerCount_19uyg_104", En = "_chevron_19uyg_113", Rn = "_plot_19uyg_171", Bn = "_focusRing_19uyg_178", Pn = "_layer_19uyg_196", Nn = "_grip_19uyg_205", $n = "_ghostLabel_19uyg_215", Gn = "_finding_19uyg_228", xn = "_refusal_19uyg_236", Hn = "_tooltip_19uyg_240", Yn = "_tooltipHead_19uyg_259", Kn = "_tooltipTimes_19uyg_264", Un = "_now_19uyg_273", Xn = "_barLabel_19uyg_287", Wn = "_barLabelText_19uyg_300", w = {
|
|
2014
2014
|
root: bn,
|
|
2015
2015
|
corner: Mn,
|
|
2016
2016
|
dayBand: Tn,
|
|
@@ -2092,7 +2092,7 @@ function Vn({ target: o }) {
|
|
|
2092
2092
|
h !== void 0 && /* @__PURE__ */ k("span", { className: w.finding, children: e.scheduleViolatedBy(s(h.shortBy)) })
|
|
2093
2093
|
] });
|
|
2094
2094
|
}
|
|
2095
|
-
const
|
|
2095
|
+
const qn = [], Le = { min: Rt, max: 28 * rt }, jn = [], Ae = 20, io = as(function(t, e) {
|
|
2096
2096
|
var re;
|
|
2097
2097
|
const {
|
|
2098
2098
|
ariaLabel: n,
|
|
@@ -2100,10 +2100,10 @@ const jn = [], Le = { min: Rt, max: 28 * rt }, qn = [], Ae = 20, io = as(functio
|
|
|
2100
2100
|
height: i = 400,
|
|
2101
2101
|
laneHeight: r = ft,
|
|
2102
2102
|
headerWidth: a = 160,
|
|
2103
|
-
calendar: l =
|
|
2103
|
+
calendar: l = jn,
|
|
2104
2104
|
zoomLimits: h,
|
|
2105
2105
|
snap: d = "ticks",
|
|
2106
|
-
intents: u =
|
|
2106
|
+
intents: u = qn,
|
|
2107
2107
|
onIntent: p,
|
|
2108
2108
|
canMoveTo: m,
|
|
2109
2109
|
onInteraction: y,
|
|
@@ -2121,9 +2121,9 @@ const jn = [], Le = { min: Rt, max: 28 * rt }, qn = [], Ae = 20, io = as(functio
|
|
|
2121
2121
|
tooltip: V,
|
|
2122
2122
|
now: tt,
|
|
2123
2123
|
className: Ut,
|
|
2124
|
-
style:
|
|
2125
|
-
children:
|
|
2126
|
-
} = t, [v] = ut(() => new wn()), gt = ls(), Xt = `${gt}-summary`, Wt = x(null), zt = x(null), Vt = x(null),
|
|
2124
|
+
style: qe,
|
|
2125
|
+
children: je
|
|
2126
|
+
} = t, [v] = ut(() => new wn()), gt = ls(), Xt = `${gt}-summary`, Wt = x(null), zt = x(null), Vt = x(null), qt = x(null), $ = Bt(), R = pt(), [kt, yt] = s, jt = (h == null ? void 0 : h.min) ?? Le.min, Zt = (h == null ? void 0 : h.max) ?? Le.max, Jt = x(null), Qt = typeof d == "object" ? d.step : null, te = typeof d == "object" ? d.offset : null, ee = typeof d == "object" ? null : d, [Ze, Je] = ut(() => Date.now());
|
|
2127
2127
|
H(() => {
|
|
2128
2128
|
if (tt !== !0) return;
|
|
2129
2129
|
const c = setInterval(() => Je(Date.now()), W);
|
|
@@ -2135,10 +2135,10 @@ const jn = [], Le = { min: Rt, max: 28 * rt }, qn = [], Ae = 20, io = as(functio
|
|
|
2135
2135
|
Jt.current = c;
|
|
2136
2136
|
const _ = ee ?? { step: Qt ?? 0, offset: te ?? 0 };
|
|
2137
2137
|
v.setOptions(
|
|
2138
|
-
{ laneHeight: r, calendar: l, zoomLimits: { min:
|
|
2138
|
+
{ laneHeight: r, calendar: l, zoomLimits: { min: jt, max: Zt }, snap: _, intents: u, now: se, route: D, attach: N, ends: Q },
|
|
2139
2139
|
M ? [kt, yt] : null
|
|
2140
2140
|
);
|
|
2141
|
-
}, [v, kt, yt, r, l,
|
|
2141
|
+
}, [v, kt, yt, r, l, jt, Zt, ee, Qt, te, u, se, D, N, Q]), H(() => {
|
|
2142
2142
|
v.setHandlers({ onIntent: p, canMoveTo: m, onInteraction: y, onSelectedTaskChange: L, onCollapsedGroupsChange: I, onDomainChange: S });
|
|
2143
2143
|
}, [v, p, m, y, L, I, S]);
|
|
2144
2144
|
const Qe = x(g);
|
|
@@ -2160,7 +2160,7 @@ const jn = [], Le = { min: Rt, max: 28 * rt }, qn = [], Ae = 20, io = as(functio
|
|
|
2160
2160
|
}, [v, C]), H(() => {
|
|
2161
2161
|
v.setPlacing(F ?? null);
|
|
2162
2162
|
}, [v, F]), H(() => {
|
|
2163
|
-
const c = Wt.current, M = zt.current, _ = Vt.current, G =
|
|
2163
|
+
const c = Wt.current, M = zt.current, _ = Vt.current, G = qt.current;
|
|
2164
2164
|
if (!c || !M || !_ || !G) return;
|
|
2165
2165
|
v.bind(c, M, _, G);
|
|
2166
2166
|
const O = M.getBoundingClientRect();
|
|
@@ -2183,7 +2183,7 @@ const jn = [], Le = { min: Rt, max: 28 * rt }, qn = [], Ae = 20, io = as(functio
|
|
|
2183
2183
|
const T = hs(v.subscribe, v.getSnapshot, v.getServerSnapshot), ts = (c, M) => {
|
|
2184
2184
|
const _ = new Date(c);
|
|
2185
2185
|
return M >= 200 ? $.dateLong(_) : M >= 84 ? $.date(_) : M >= 44 ? $.dateShort(_) : "";
|
|
2186
|
-
}, b = T.ghost,
|
|
2186
|
+
}, b = T.ghost, q = T.spoken, vt = T.summary, ne = (c) => `${$.dateShort(new Date(c))} ${$.time(new Date(c), !1)}`, wt = (c) => `${gt}-row-${encodeURIComponent(c.key)}`, es = X(() => {
|
|
2187
2187
|
const c = /* @__PURE__ */ new Map();
|
|
2188
2188
|
for (const M of T.headers)
|
|
2189
2189
|
for (const _ of M.within)
|
|
@@ -2221,7 +2221,7 @@ const jn = [], Le = { min: Rt, max: 28 * rt }, qn = [], Ae = 20, io = as(functio
|
|
|
2221
2221
|
role: "figure",
|
|
2222
2222
|
"aria-label": n,
|
|
2223
2223
|
className: Ut ? `${w.root} ${Ut}` : w.root,
|
|
2224
|
-
style: { height: `${i}px`, gridTemplateColumns: `min(${a}px, 40%) minmax(0, 1fr)`, ...
|
|
2224
|
+
style: { height: `${i}px`, gridTemplateColumns: `min(${a}px, 40%) minmax(0, 1fr)`, ...qe },
|
|
2225
2225
|
children: [
|
|
2226
2226
|
/* @__PURE__ */ k("div", { className: w.corner }),
|
|
2227
2227
|
/* @__PURE__ */ k("div", { className: w.dayBand, "aria-hidden": "true", "data-schedule-days": "", "data-schedule-clip": "day band", children: T.days.map((c) => {
|
|
@@ -2291,7 +2291,7 @@ const jn = [], Le = { min: Rt, max: 28 * rt }, qn = [], Ae = 20, io = as(functio
|
|
|
2291
2291
|
},
|
|
2292
2292
|
children: [
|
|
2293
2293
|
/* @__PURE__ */ k("canvas", { ref: Vt, className: w.layer, "aria-hidden": "true" }),
|
|
2294
|
-
/* @__PURE__ */ k("canvas", { ref:
|
|
2294
|
+
/* @__PURE__ */ k("canvas", { ref: qt, className: w.layer, "aria-hidden": "true" }),
|
|
2295
2295
|
T.grips.map((c) => /* @__PURE__ */ k(
|
|
2296
2296
|
"span",
|
|
2297
2297
|
{
|
|
@@ -2365,19 +2365,19 @@ const jn = [], Le = { min: Rt, max: 28 * rt }, qn = [], Ae = 20, io = as(functio
|
|
|
2365
2365
|
T.now !== null && /* @__PURE__ */ k("span", { className: w.now, "data-now": "", "data-schedule-overlay": "now mark", style: { left: `${T.now}px` } }),
|
|
2366
2366
|
T.ticks.map((c) => /* @__PURE__ */ k("span", { className: w.tick, style: { left: `${c.x}px` }, children: c.x >= Ae && c.x <= T.width - Ae && /* @__PURE__ */ k("span", { className: w.tickLabel, "data-schedule-overlay": "time label", children: T.step >= rt ? $.dateShort(new Date(c.wallClock)) : $.time(new Date(c.wallClock), !1) }) }, c.wallClock))
|
|
2367
2367
|
] }),
|
|
2368
|
-
/* @__PURE__ */ k(le, { "aria-live": "polite", children:
|
|
2368
|
+
/* @__PURE__ */ k(le, { "aria-live": "polite", children: q !== null && /* @__PURE__ */ k(
|
|
2369
2369
|
zn,
|
|
2370
2370
|
{
|
|
2371
|
-
target:
|
|
2372
|
-
lane:
|
|
2371
|
+
target: q.target,
|
|
2372
|
+
lane: q.lane === null ? null : ((re = v.data.lanes.find((c) => c.id === q.lane)) == null ? void 0 : re.label) ?? q.lane
|
|
2373
2373
|
},
|
|
2374
|
-
|
|
2374
|
+
q.count
|
|
2375
2375
|
) }),
|
|
2376
2376
|
/* @__PURE__ */ k(le, { id: Xt, children: `${R.scheduleSummary({ ...vt, from: ne(vt.from), to: ne(vt.to) })} ${R.scheduleKeyHelp}` })
|
|
2377
2377
|
]
|
|
2378
2378
|
}
|
|
2379
2379
|
),
|
|
2380
|
-
|
|
2380
|
+
je
|
|
2381
2381
|
] });
|
|
2382
2382
|
});
|
|
2383
2383
|
function Zn(o) {
|
package/docs/llms-full.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
# @umriss-ui/schedule 0.3.
|
|
1
|
+
# @umriss-ui/schedule 0.3.6
|
|
2
2
|
|
|
3
|
-
>
|
|
3
|
+
> React Gantt-style schedule for data-dense applications - work on lanes over time, with dependencies, blocked time, findings and controlled editing.
|
|
4
4
|
|
|
5
5
|
Install with `pnpm add @umriss-ui/schedule`. This text is generated from the package's demo (https://romanhaendler.github.io/umriss-ui/schedule/): every page with its import line, its examples - the source exactly as it runs, with the package name where the demo imports its own source - its props tables generated from the code, and what it deliberately does not do. The pages index stands in https://romanhaendler.github.io/umriss-ui/schedule/llms.txt.
|
|
6
6
|
|
|
@@ -560,7 +560,7 @@ Install the schedule with its two peers and hand it plain data: lanes, tasks, su
|
|
|
560
560
|
import { Schedule, Lane, Subtasks, Dependencies } from "@umriss-ui/schedule";
|
|
561
561
|
```
|
|
562
562
|
|
|
563
|
-
Demo page: https://romanhaendler.github.io/umriss-ui/schedule
|
|
563
|
+
Demo page: https://romanhaendler.github.io/umriss-ui/schedule/installation/
|
|
564
564
|
|
|
565
565
|
Install it with its peers: `pnpm add @umriss-ui/schedule @umriss-ui/core @umriss-ui/charts`, with React 18 or 19. The stylesheets load themselves - each package's script imports its own, so there is nothing to import by hand; `@umriss-ui/schedule/styles.css` stays exported for setups that link stylesheets themselves.
|
|
566
566
|
|
|
@@ -614,7 +614,7 @@ Work on lanes over time, with a day band above and time ticks that follow the zo
|
|
|
614
614
|
import { Schedule, Lane, Subtasks, Dependencies } from "@umriss-ui/schedule";
|
|
615
615
|
```
|
|
616
616
|
|
|
617
|
-
Demo page: https://romanhaendler.github.io/umriss-ui/schedule
|
|
617
|
+
Demo page: https://romanhaendler.github.io/umriss-ui/schedule/schedule/
|
|
618
618
|
|
|
619
619
|
Lanes stand in the order they are declared; a subtask on a lane that is not declared is not drawn. Declare `Dependencies` before `Subtasks` and its lines run beneath the bars.
|
|
620
620
|
|
|
@@ -815,7 +815,7 @@ One row per person, vehicle or room, named by its header and kept in the order i
|
|
|
815
815
|
import { Lane } from "@umriss-ui/schedule";
|
|
816
816
|
```
|
|
817
817
|
|
|
818
|
-
Demo page: https://romanhaendler.github.io/umriss-ui/schedule
|
|
818
|
+
Demo page: https://romanhaendler.github.io/umriss-ui/schedule/lane/
|
|
819
819
|
|
|
820
820
|
A lane is declared by its id, the one subtasks name, and a label. The label is content, not a string: a name with a plate number, a status beside it. It is real text, read by a screen reader, and it stays at the left edge while the plot pans.
|
|
821
821
|
|
|
@@ -942,7 +942,7 @@ Teams, depots or regions over the lanes, to any depth, folded into one row when
|
|
|
942
942
|
import { LaneGroup, Lane } from "@umriss-ui/schedule";
|
|
943
943
|
```
|
|
944
944
|
|
|
945
|
-
Demo page: https://romanhaendler.github.io/umriss-ui/schedule
|
|
945
|
+
Demo page: https://romanhaendler.github.io/umriss-ui/schedule/lane-groups/
|
|
946
946
|
|
|
947
947
|
A group is structure, never a lane: nothing sits on it, no finding is reported for it and no intent names it (ADR-0025). The lanes keep the order they were declared in, whatever group they are in.
|
|
948
948
|
|
|
@@ -1211,7 +1211,7 @@ The bars: a main time with an optional lead-in before it and lead-out after it,
|
|
|
1211
1211
|
import { Subtasks } from "@umriss-ui/schedule";
|
|
1212
1212
|
```
|
|
1213
1213
|
|
|
1214
|
-
Demo page: https://romanhaendler.github.io/umriss-ui/schedule
|
|
1214
|
+
Demo page: https://romanhaendler.github.io/umriss-ui/schedule/subtasks/
|
|
1215
1215
|
|
|
1216
1216
|
Lead-in and lead-out are durations beside the main time, not times of their own: moving the subtask takes them along. They are drawn faint in the task's colour, so preparation reads as belonging to the work and as not being it, and they occupy the lane as the main time does.
|
|
1217
1217
|
|
|
@@ -1355,7 +1355,7 @@ A line of text inside each bar: cut off where the bar is too narrow, left out wh
|
|
|
1355
1355
|
import { Schedule } from "@umriss-ui/schedule";
|
|
1356
1356
|
```
|
|
1357
1357
|
|
|
1358
|
-
Demo page: https://romanhaendler.github.io/umriss-ui/schedule
|
|
1358
|
+
Demo page: https://romanhaendler.github.io/umriss-ui/schedule/bar-labels/
|
|
1359
1359
|
|
|
1360
1360
|
The text lies on the main time, not on the lead-in. Its colour follows the bar: light text on a dark bar, dark text on a pale one, measured by contrast in either theme.
|
|
1361
1361
|
|
|
@@ -1421,7 +1421,7 @@ What a bar says besides its colour: provisional, fixed, muted, running on past t
|
|
|
1421
1421
|
import { Subtasks, resolveAppearance } from "@umriss-ui/schedule";
|
|
1422
1422
|
```
|
|
1423
1423
|
|
|
1424
|
-
Demo page: https://romanhaendler.github.io/umriss-ui/schedule
|
|
1424
|
+
Demo page: https://romanhaendler.github.io/umriss-ui/schedule/appearances/
|
|
1425
1425
|
|
|
1426
1426
|
`"provisional"` owns the fill (none at all), `"fixed"` the ends (a cap inside each), `"muted"` the saturation, `"open"` a fade at the edge of the view, and `progress` a rail inside the main time. The faint, outlined fill belongs to a lead-in and a lead-out and to nothing else.
|
|
1427
1427
|
|
|
@@ -1664,7 +1664,7 @@ Two subtasks claiming one lane at the same time (also called a double booking or
|
|
|
1664
1664
|
import { Subtasks } from "@umriss-ui/schedule";
|
|
1665
1665
|
```
|
|
1666
1666
|
|
|
1667
|
-
Demo page: https://romanhaendler.github.io/umriss-ui/schedule
|
|
1667
|
+
Demo page: https://romanhaendler.github.io/umriss-ui/schedule/overlap/
|
|
1668
1668
|
|
|
1669
1669
|
The later bar is offset a few pixels and edged, and the shared time is marked across the lane. Lead-in and lead-out occupy the lane too, so a lead-out meeting the next lead-in is an overlap. The offset stops at three levels and never leaks into the lane below.
|
|
1670
1670
|
|
|
@@ -1785,7 +1785,7 @@ Lines from one subtask's end to the next one's start within a task, with the lag
|
|
|
1785
1785
|
import { Dependencies } from "@umriss-ui/schedule";
|
|
1786
1786
|
```
|
|
1787
1787
|
|
|
1788
|
-
Demo page: https://romanhaendler.github.io/umriss-ui/schedule
|
|
1788
|
+
Demo page: https://romanhaendler.github.io/umriss-ui/schedule/dependencies/
|
|
1789
1789
|
|
|
1790
1790
|
`leaves` and `arrives` say what a dependency connects - the main time, or the outer edge of the lead-out and the lead-in - and so decide whether it is violated. `attach`, `ends` and `route` only change how the line is drawn.
|
|
1791
1791
|
|
|
@@ -2066,7 +2066,7 @@ The shape of a dependency's line: a curve that leaves and arrives forwards, a st
|
|
|
2066
2066
|
import { Dependencies } from "@umriss-ui/schedule";
|
|
2067
2067
|
```
|
|
2068
2068
|
|
|
2069
|
-
Demo page: https://romanhaendler.github.io/umriss-ui/schedule
|
|
2069
|
+
Demo page: https://romanhaendler.github.io/umriss-ui/schedule/routes/
|
|
2070
2070
|
|
|
2071
2071
|
#### Examples
|
|
2072
2072
|
|
|
@@ -2239,7 +2239,7 @@ A day band that names the days and a time band whose ticks follow the zoom, from
|
|
|
2239
2239
|
import { Schedule } from "@umriss-ui/schedule";
|
|
2240
2240
|
```
|
|
2241
2241
|
|
|
2242
|
-
Demo page: https://romanhaendler.github.io/umriss-ui/schedule
|
|
2242
|
+
Demo page: https://romanhaendler.github.io/umriss-ui/schedule/time-axis/
|
|
2243
2243
|
|
|
2244
2244
|
The calendar is a list of intervals in which time counts, nothing more; deriving it from opening hours and holidays is the application's business. A dotted line marks each seam, and a drag that would end in removed time stops at the seam where time counts again.
|
|
2245
2245
|
|
|
@@ -2375,7 +2375,7 @@ Leave, maintenance and other time a lane is not available: hatched behind the wo
|
|
|
2375
2375
|
import { BlockedTimes, findings } from "@umriss-ui/schedule";
|
|
2376
2376
|
```
|
|
2377
2377
|
|
|
2378
|
-
Demo page: https://romanhaendler.github.io/umriss-ui/schedule
|
|
2378
|
+
Demo page: https://romanhaendler.github.io/umriss-ui/schedule/blocked-time/
|
|
2379
2379
|
|
|
2380
2380
|
Blocked time is data beside the work: one list, each interval naming its lane, as a leave table or a maintenance plan holds it. `findings` takes the same list as its third argument.
|
|
2381
2381
|
|
|
@@ -2591,7 +2591,7 @@ A line across the lanes at the present moment, so that whatever should have happ
|
|
|
2591
2591
|
import { Schedule } from "@umriss-ui/schedule";
|
|
2592
2592
|
```
|
|
2593
2593
|
|
|
2594
|
-
Demo page: https://romanhaendler.github.io/umriss-ui/schedule
|
|
2594
|
+
Demo page: https://romanhaendler.github.io/umriss-ui/schedule/now-line/
|
|
2595
2595
|
|
|
2596
2596
|
#### Examples
|
|
2597
2597
|
|
|
@@ -2683,7 +2683,7 @@ Moving through a plan with the gestures of any scrolling surface: drag, wheel, C
|
|
|
2683
2683
|
import { Schedule } from "@umriss-ui/schedule";
|
|
2684
2684
|
```
|
|
2685
2685
|
|
|
2686
|
-
Demo page: https://romanhaendler.github.io/umriss-ui/schedule
|
|
2686
|
+
Demo page: https://romanhaendler.github.io/umriss-ui/schedule/pan-and-zoom/
|
|
2687
2687
|
|
|
2688
2688
|
Dragging the background pans through time and through the lanes. The wheel scrolls the lanes and hands the scroll back to the page at their end; Shift with the wheel pans through time; Ctrl or ⌘ with the wheel, or a pinch, zooms around the pointer.
|
|
2689
2689
|
|
|
@@ -2752,7 +2752,7 @@ A click on a bar selects its whole task on every lane, so a planner sees every p
|
|
|
2752
2752
|
import { Schedule } from "@umriss-ui/schedule";
|
|
2753
2753
|
```
|
|
2754
2754
|
|
|
2755
|
-
Demo page: https://romanhaendler.github.io/umriss-ui/schedule
|
|
2755
|
+
Demo page: https://romanhaendler.github.io/umriss-ui/schedule/selection/
|
|
2756
2756
|
|
|
2757
2757
|
The schedule keeps the selection itself unless you pass `selectedTask`; then your state holds it and every change is reported. The report also names the subtask that was clicked, the one the editing grips belong to.
|
|
2758
2758
|
|
|
@@ -2908,7 +2908,7 @@ Reports what the pointer does on the plan - hover, click, right-click - with wha
|
|
|
2908
2908
|
import { Schedule } from "@umriss-ui/schedule";
|
|
2909
2909
|
```
|
|
2910
2910
|
|
|
2911
|
-
Demo page: https://romanhaendler.github.io/umriss-ui/schedule
|
|
2911
|
+
Demo page: https://romanhaendler.github.io/umriss-ui/schedule/interactions/
|
|
2912
2912
|
|
|
2913
2913
|
A hit names a subtask together with the part of it (lead-in, main time, lead-out), a dependency, a lane, or nothing.
|
|
2914
2914
|
|
|
@@ -3084,7 +3084,7 @@ Names what the pointer rests on - a subtask with its times and findings, a depen
|
|
|
3084
3084
|
import { Schedule } from "@umriss-ui/schedule";
|
|
3085
3085
|
```
|
|
3086
3086
|
|
|
3087
|
-
Demo page: https://romanhaendler.github.io/umriss-ui/schedule
|
|
3087
|
+
Demo page: https://romanhaendler.github.io/umriss-ui/schedule/tooltip/
|
|
3088
3088
|
|
|
3089
3089
|
Its words come from the wording of @umriss-ui/core and its numbers from its formats, so a provider switches it with everything else. It steps aside while a drag is in flight and is placed where it has room.
|
|
3090
3090
|
|
|
@@ -3308,7 +3308,7 @@ Keeps two schedules on the same hours: pan or zoom one and the other follows (al
|
|
|
3308
3308
|
import { Schedule } from "@umriss-ui/schedule";
|
|
3309
3309
|
```
|
|
3310
3310
|
|
|
3311
|
-
Demo page: https://romanhaendler.github.io/umriss-ui/schedule
|
|
3311
|
+
Demo page: https://romanhaendler.github.io/umriss-ui/schedule/linked-schedules/
|
|
3312
3312
|
|
|
3313
3313
|
`onDomainChange` reports the visible span after a pan or zoom, at most once per frame. A span handed in as `initialDomain` is not reported back, so two schedules never feed each other.
|
|
3314
3314
|
|
|
@@ -3470,7 +3470,7 @@ Converts between a point on the screen and a time on a lane, so marks of your ow
|
|
|
3470
3470
|
import { Schedule } from "@umriss-ui/schedule";
|
|
3471
3471
|
```
|
|
3472
3472
|
|
|
3473
|
-
Demo page: https://romanhaendler.github.io/umriss-ui/schedule
|
|
3473
|
+
Demo page: https://romanhaendler.github.io/umriss-ui/schedule/handle/
|
|
3474
3474
|
|
|
3475
3475
|
The handle holds three functions and nothing else: `clientPointOf(time, lane?)`, `positionAt(clientX, clientY)` and `visibleDomain()`. Everything else the schedule does is props.
|
|
3476
3476
|
|
|
@@ -3579,7 +3579,7 @@ Drag a bar to a new time or onto another lane (also called drag-and-drop resched
|
|
|
3579
3579
|
import { Schedule, applyIntent } from "@umriss-ui/schedule";
|
|
3580
3580
|
```
|
|
3581
3581
|
|
|
3582
|
-
Demo page: https://romanhaendler.github.io/umriss-ui/schedule
|
|
3582
|
+
Demo page: https://romanhaendler.github.io/umriss-ui/schedule/move-and-lane/
|
|
3583
3583
|
|
|
3584
3584
|
Each name in `intents` enables one gesture. Without `intents` the schedule is read-only, and pressing a bar pans the plot.
|
|
3585
3585
|
|
|
@@ -3786,7 +3786,7 @@ Change how long work takes, or how long its preparation and its wrap-up take, by
|
|
|
3786
3786
|
import { Schedule, applyIntent } from "@umriss-ui/schedule";
|
|
3787
3787
|
```
|
|
3788
3788
|
|
|
3789
|
-
Demo page: https://romanhaendler.github.io/umriss-ui/schedule
|
|
3789
|
+
Demo page: https://romanhaendler.github.io/umriss-ui/schedule/stretch/
|
|
3790
3790
|
|
|
3791
3791
|
`stretch` enables the two edges of the main time. `leadIn` and `leadOut` add a grip at the outer edge of each; the grips show on the selected subtask only, so click a bar first.
|
|
3792
3792
|
|
|
@@ -3889,7 +3889,7 @@ Makes a drag land on a raster - the axis' own step, a fixed duration, or a patte
|
|
|
3889
3889
|
import { Schedule, snapTime } from "@umriss-ui/schedule";
|
|
3890
3890
|
```
|
|
3891
3891
|
|
|
3892
|
-
Demo page: https://romanhaendler.github.io/umriss-ui/schedule
|
|
3892
|
+
Demo page: https://romanhaendler.github.io/umriss-ui/schedule/snapping/
|
|
3893
3893
|
|
|
3894
3894
|
Without `snap` a drag lands on the fine band's step, which follows the zoom. A number is a step in milliseconds; `{ step, offset }` counts from local midnight; `false` places to the minute.
|
|
3895
3895
|
|
|
@@ -4045,7 +4045,7 @@ Drag work that is not on the plan yet - from a backlog or a list of unassigned j
|
|
|
4045
4045
|
import { Schedule, subtaskFromPlace } from "@umriss-ui/schedule";
|
|
4046
4046
|
```
|
|
4047
4047
|
|
|
4048
|
-
Demo page: https://romanhaendler.github.io/umriss-ui/schedule
|
|
4048
|
+
Demo page: https://romanhaendler.github.io/umriss-ui/schedule/placing/
|
|
4049
4049
|
|
|
4050
4050
|
The browser hands over dragged data only on the drop, so declare what is being dragged in `placing` on your `dragstart` and clear it on `dragend`. The schedule then shows the ghost at the snapped time, with the findings the drop would create.
|
|
4051
4051
|
|
|
@@ -4168,7 +4168,7 @@ Marks the lanes and times a piece of work may not go to as soon as a drag begins
|
|
|
4168
4168
|
import { Schedule, BlockedTimes } from "@umriss-ui/schedule";
|
|
4169
4169
|
```
|
|
4170
4170
|
|
|
4171
|
-
Demo page: https://romanhaendler.github.io/umriss-ui/schedule
|
|
4171
|
+
Demo page: https://romanhaendler.github.io/umriss-ui/schedule/where-it-may-go/
|
|
4172
4172
|
|
|
4173
4173
|
`canMoveTo(subtask, lane)` is asked once per lane when a drag takes hold, and again at the drop. Refused lanes are drawn back and hatched; over one, the ghost stays on the last lane allowed, tied to the pointer by a line.
|
|
4174
4174
|
|
|
@@ -4406,7 +4406,7 @@ Works out which later work has to move when one piece moves: every successor who
|
|
|
4406
4406
|
import { ripple, shiftTask, applyIntent } from "@umriss-ui/schedule";
|
|
4407
4407
|
```
|
|
4408
4408
|
|
|
4409
|
-
Demo page: https://romanhaendler.github.io/umriss-ui/schedule
|
|
4409
|
+
Demo page: https://romanhaendler.github.io/umriss-ui/schedule/ripple/
|
|
4410
4410
|
|
|
4411
4411
|
`ripple(subtasks, dependencies, intent)` returns move intents down the whole chain, in the order they were pushed. A successor keeps its length and is never pulled earlier: room that opens up is the planner's.
|
|
4412
4412
|
|
|
@@ -4612,7 +4612,7 @@ Lists what is wrong with a plan - double bookings on a lane, dependencies that d
|
|
|
4612
4612
|
import { findings, overlaps, violatedDependencies, inBlockedTime } from "@umriss-ui/schedule";
|
|
4613
4613
|
```
|
|
4614
4614
|
|
|
4615
|
-
Demo page: https://romanhaendler.github.io/umriss-ui/schedule
|
|
4615
|
+
Demo page: https://romanhaendler.github.io/umriss-ui/schedule/findings/
|
|
4616
4616
|
|
|
4617
4617
|
`findings(subtasks, dependencies, blocked)` returns all three kinds; `overlaps`, `violatedDependencies` and `inBlockedTime` return one each. They are pure functions: run them wherever the data changes, with or without a schedule on screen.
|
|
4618
4618
|
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@umriss-ui/schedule",
|
|
3
|
-
"version": "0.3.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "0.3.6",
|
|
4
|
+
"description": "React Gantt-style schedule for data-dense applications - work on lanes over time, with dependencies, blocked time, findings and controlled editing.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Roman Händler",
|
|
7
7
|
"homepage": "https://romanhaendler.github.io/umriss-ui/schedule/",
|
|
@@ -15,11 +15,16 @@
|
|
|
15
15
|
},
|
|
16
16
|
"keywords": [
|
|
17
17
|
"react",
|
|
18
|
-
"
|
|
19
|
-
"
|
|
20
|
-
"
|
|
18
|
+
"gantt",
|
|
19
|
+
"gantt-chart",
|
|
20
|
+
"scheduler",
|
|
21
21
|
"schedule",
|
|
22
|
-
"
|
|
22
|
+
"timeline",
|
|
23
|
+
"planning",
|
|
24
|
+
"resource-planning",
|
|
25
|
+
"canvas",
|
|
26
|
+
"typescript",
|
|
27
|
+
"umriss"
|
|
23
28
|
],
|
|
24
29
|
"type": "module",
|
|
25
30
|
"files": [
|
|
@@ -45,8 +50,8 @@
|
|
|
45
50
|
"peerDependencies": {
|
|
46
51
|
"react": ">=18",
|
|
47
52
|
"react-dom": ">=18",
|
|
48
|
-
"@umriss-ui/
|
|
49
|
-
"@umriss-ui/
|
|
53
|
+
"@umriss-ui/charts": "^0.8.1",
|
|
54
|
+
"@umriss-ui/core": "^0.15.0"
|
|
50
55
|
},
|
|
51
56
|
"devDependencies": {
|
|
52
57
|
"@fontsource/geist-mono": "^5.3.0",
|
|
@@ -60,8 +65,8 @@
|
|
|
60
65
|
"typescript": "^5.6.3",
|
|
61
66
|
"vite": "^6.0.0",
|
|
62
67
|
"vite-plugin-dts": "^4.3.0",
|
|
63
|
-
"@umriss-ui/charts": "0.8.
|
|
64
|
-
"@umriss-ui/core": "0.
|
|
68
|
+
"@umriss-ui/charts": "0.8.1",
|
|
69
|
+
"@umriss-ui/core": "0.15.0",
|
|
65
70
|
"@umriss-ui/demo": "0.0.0"
|
|
66
71
|
},
|
|
67
72
|
"scripts": {
|