@umriss-ui/schedule 0.7.1 → 0.34.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +15 -2
- package/README.md +5 -5
- package/dist/index.d.ts +22 -20
- package/dist/schedule.css +1 -1
- package/dist/schedule.js +963 -971
- package/docs/llms-full.md +62 -64
- package/package.json +7 -6
package/CHANGELOG.md
CHANGED
|
@@ -1,20 +1,33 @@
|
|
|
1
1
|
# Changes to `@umriss-ui/schedule`
|
|
2
2
|
|
|
3
3
|
This document describes what changes for **callers** of the package: exports,
|
|
4
|
-
props, behaviour.
|
|
5
|
-
repository's journal (`docs/journal.md`) and in the specs under `.scratch/`.
|
|
4
|
+
props, behaviour.
|
|
6
5
|
|
|
7
6
|
**The numbers.** The middle digit rises when something is added; the last one
|
|
8
7
|
when something is repaired. As long as the first digit is `0`, no number
|
|
9
8
|
promises compatibility — which is why whatever changes existing behaviour stands
|
|
10
9
|
under a heading "Changed" of its own, no matter which digit rose.
|
|
11
10
|
|
|
11
|
+
From 0.34.0 all five packages share one number: they are released together, and a package without a change of its own still gets a heading for it.
|
|
12
|
+
|
|
12
13
|
**Release candidates.** The package started as a release candidate under the
|
|
13
14
|
tag `next`. With `0.1.0` it is released: the tag is gone, and the interface
|
|
14
15
|
moves from here under the rule above.
|
|
15
16
|
|
|
16
17
|
---
|
|
17
18
|
|
|
19
|
+
## 0.34.0 – A view is set, not handed back (Oct. 2026)
|
|
20
|
+
|
|
21
|
+
From this version all five packages carry one number and are released
|
|
22
|
+
together. Needs `@umriss-ui/core` and `@umriss-ui/charts` 0.34; the peer ranges
|
|
23
|
+
are `^0.34.0`.
|
|
24
|
+
|
|
25
|
+
### Changed
|
|
26
|
+
|
|
27
|
+
- **`initialView` is read once, and `setView` is new.** A different `initialView` on a later render is now ignored, as React ignores a changed `defaultValue`; it used to be applied whenever its content differed from the last one handed in. To go to a view later, call the new `setView(view)` that `useSchedule` returns: it applies a whole view, and what the view leaves out goes back to its default. `setView` is not reported through `onViewChange`, which reports what the planner did, so two schedules kept in step by `onViewChange: (v) => other.setView(v)` in both directions do not answer each other. A caller that kept the reported view in state and handed it back as `initialView` writes `setView` instead: restoring a kept view is `setView(kept)`, and the state that mirrors the schedule's view becomes `view` from the hook.
|
|
28
|
+
|
|
29
|
+
---
|
|
30
|
+
|
|
18
31
|
## 0.7.1 – Core 0.33.0, charts 0.16.0 (Oct. 2026)
|
|
19
32
|
|
|
20
33
|
Needs `@umriss-ui/core` 0.33 and `@umriss-ui/charts` 0.16; the peer ranges move to `^0.33.0` and `^0.16.0`.
|
package/README.md
CHANGED
|
@@ -140,11 +140,11 @@ time and a lane and back.
|
|
|
140
140
|
## The view
|
|
141
141
|
|
|
142
142
|
The schedule holds its own view (ADR-0047): the span in view and the folded
|
|
143
|
-
groups. `useSchedule({ initialView, onViewChange })` takes a start and
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
`view`, `setDomain`, `toggleGroup`, `foldAll` and `unfoldAll` stand on what the
|
|
143
|
+
groups. `useSchedule({ initialView, onViewChange })` takes a start, read once, and
|
|
144
|
+
reports what the planner does, always the whole view; two schedules keep in
|
|
145
|
+
step by sending each other what they report through `setView`, which is not
|
|
146
|
+
reported in turn. Without a span the schedule shows the extent of its subtasks.
|
|
147
|
+
`view`, `setView`, `setDomain`, `toggleGroup`, `foldAll` and `unfoldAll` stand on what the
|
|
148
148
|
hook hands back.
|
|
149
149
|
|
|
150
150
|
## Blocked time
|
package/dist/index.d.ts
CHANGED
|
@@ -277,7 +277,7 @@ export declare interface Overlap {
|
|
|
277
277
|
export declare function overlaps(subtasks: readonly Subtask[]): Overlap[];
|
|
278
278
|
|
|
279
279
|
/** Put work on the plan that was not on it: the answer to a drag from outside
|
|
280
|
-
the schedule
|
|
280
|
+
the schedule. It carries no subtask id - there is
|
|
281
281
|
no subtask yet; the caller creates one, with its own identity, from
|
|
282
282
|
`subtaskFromPlace`. */
|
|
283
283
|
export declare interface PlaceIntent {
|
|
@@ -298,9 +298,9 @@ export declare interface PlaceIntent {
|
|
|
298
298
|
readonly leadOut?: number;
|
|
299
299
|
}
|
|
300
300
|
|
|
301
|
-
/** What the application says it is dragging in, while it drags it
|
|
302
|
-
|
|
303
|
-
the drop
|
|
301
|
+
/** What the application says it is dragging in, while it drags it: the
|
|
302
|
+
browser hands over the dragged data only on the drop, so the ghost before
|
|
303
|
+
the drop can only come from the caller. */
|
|
304
304
|
export declare interface PlacingItem {
|
|
305
305
|
/** The caller's key for the dragged item; it comes back in the intent. */
|
|
306
306
|
readonly item: string;
|
|
@@ -322,17 +322,15 @@ export declare function resolveAppearance(appearance: readonly SubtaskAppearance
|
|
|
322
322
|
|
|
323
323
|
/** What the drawing needs to know, with the contradiction already settled.
|
|
324
324
|
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
now named after a drawing they no longer use, and the channel each one
|
|
328
|
-
really owns stands beside it. */
|
|
325
|
+
Two of the field names (`dashed`, `hatched`) are older than the drawing;
|
|
326
|
+
the channel each one owns stands beside it. */
|
|
329
327
|
export declare interface ResolvedAppearance {
|
|
330
328
|
/** `provisional`: the FILL - none at all, so the surface shows through, with
|
|
331
329
|
a dashed outline in the task colour. Planned, not released. */
|
|
332
330
|
readonly dashed: boolean;
|
|
333
|
-
/** `fixed`: the ENDS - a cap at each end of the main time. Not a hatch
|
|
334
|
-
|
|
335
|
-
|
|
331
|
+
/** `fixed`: the ENDS - a cap at each end of the main time. Not a hatch: a
|
|
332
|
+
hatch says "not available" of a refused lane. The field keeps the name
|
|
333
|
+
`hatched`. */
|
|
336
334
|
readonly hatched: boolean;
|
|
337
335
|
/** `muted`: the SATURATION - the task colour mixed half into the surface,
|
|
338
336
|
opaque and at full height. Another team's, another crew's. */
|
|
@@ -404,16 +402,15 @@ export declare interface ScheduleInteraction {
|
|
|
404
402
|
/** What `useSchedule` takes: the view to start from and the handler that
|
|
405
403
|
hears every change of it. */
|
|
406
404
|
export declare interface ScheduleOptions {
|
|
407
|
-
/** The view to start from,
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
back late, is its own state coming back and not gone to. The schedule
|
|
405
|
+
/** The view to start from, read once when the hook first runs; a different
|
|
406
|
+
value on a later render is ignored, as React ignores a changed
|
|
407
|
+
`defaultValue`. To go to a view later, call `setView`. The schedule
|
|
411
408
|
remembers none: where a view is kept is the application's decision. */
|
|
412
409
|
initialView?: ScheduleView;
|
|
413
|
-
/** Every change
|
|
414
|
-
or to hand another schedule
|
|
415
|
-
|
|
416
|
-
|
|
410
|
+
/** Every change the planner makes, once, always the whole view - the one to
|
|
411
|
+
keep, or to hand another schedule's `setView`. A pan or zoom is reported
|
|
412
|
+
at most once per frame. Not called for the view the schedule starts
|
|
413
|
+
with, nor for one `setView` applies. */
|
|
417
414
|
onViewChange?: (view: ScheduleView) => void;
|
|
418
415
|
}
|
|
419
416
|
|
|
@@ -430,6 +427,11 @@ export declare interface ScheduleParts {
|
|
|
430
427
|
Milestones: typeof Milestones;
|
|
431
428
|
/** How the planner is looking at the plan: the span and the folded groups. */
|
|
432
429
|
view: ScheduleView;
|
|
430
|
+
/** Goes to a whole view; what it leaves out is shown whole again. Not
|
|
431
|
+
reported through `onViewChange`: two schedules kept in step by
|
|
432
|
+
`onViewChange: (v) => other.setView(v)` in both directions do not answer
|
|
433
|
+
each other. A view with the content already shown changes nothing. */
|
|
434
|
+
setView: (view: ScheduleView) => void;
|
|
433
435
|
/** Puts a span of two wall-clock instants in view; `null` shows the
|
|
434
436
|
subtasks' extent. */
|
|
435
437
|
setDomain: (span: readonly [number, number] | null) => void;
|
|
@@ -692,7 +694,7 @@ export declare interface Task {
|
|
|
692
694
|
|
|
693
695
|
/** Declares a schedule: hands back `Schedule` and the parts declared inside it
|
|
694
696
|
- `Lane`, `LaneGroup`, `Subtasks`, `Dependencies`, `BlockedTimes`, `Milestones` -, its
|
|
695
|
-
`view` and the setters `setDomain`, `toggleGroup`, `foldAll` and
|
|
697
|
+
`view` and the setters `setView`, `setDomain`, `toggleGroup`, `foldAll` and
|
|
696
698
|
`unfoldAll`. A ref on `Schedule` still gives the `ScheduleHandle`. */
|
|
697
699
|
export declare function useSchedule(options?: ScheduleOptions): ScheduleParts;
|
|
698
700
|
|
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_18806_22{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_18806_38{--u-control-height-sm: var(--u-control-height-xs)}}._ink_18806_49{--u-color-text: var(--u-color-bg);--u-color-text-secondary: color-mix(in srgb, var(--u-color-bg) 75%, transparent);--u-color-text-muted: color-mix(in srgb, var(--u-color-bg) 60%, transparent)}._extent_18806_75{--_chars: 20;--_extra: 0;--_tracking: 0px;--_chrome: 0px;min-inline-size:0;max-inline-size:100%;contain:inline-size;contain-intrinsic-inline-size:calc((var(--_chars) + var(--_extra)) * (1ch + var(--_tracking)) + var(--_chrome))}._field_18806_90{caret-color:var(--u-color-accent)}._scroll_18806_96{scrollbar-width:thin;scrollbar-color:color-mix(in srgb,var(--u-color-text) 25%,transparent) transparent}._scroll_18806_96::-webkit-scrollbar{width:10px;height:10px}._scroll_18806_96::-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_18806_96::-webkit-scrollbar-track{background:transparent}}@layer umriss.components{._ring_18806_125:focus-visible{outline:2px solid transparent;box-shadow:var(--u-focus-ring)}@media(pointer:coarse){._field_18806_90._field_18806_90,._fieldRoot_18806_145._fieldRoot_18806_145{font-size:16px}}._field_18806_90:-webkit-autofill,._field_18806_90:-webkit-autofill:hover,._field_18806_90:-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.components{._root_1g7hg_4,._root_1g7hg_4:before,._root_1g7hg_4:after{box-sizing:border-box}._corner_1g7hg_19,._corner_1g7hg_19:before,._corner_1g7hg_19:after{box-sizing:border-box}._dayBand_1g7hg_23,._dayBand_1g7hg_23:before,._dayBand_1g7hg_23:after{box-sizing:border-box}._tickBand_1g7hg_24,._tickBand_1g7hg_24:before,._tickBand_1g7hg_24:after{box-sizing:border-box}._day_1g7hg_23,._day_1g7hg_23:before,._day_1g7hg_23:after{box-sizing:border-box}._dayLabel_1g7hg_50,._dayLabel_1g7hg_50:before,._dayLabel_1g7hg_50:after{box-sizing:border-box}._tick_1g7hg_24,._tick_1g7hg_24:before,._tick_1g7hg_24:after{box-sizing:border-box}._tickLabel_1g7hg_71,._tickLabel_1g7hg_71:before,._tickLabel_1g7hg_71:after{box-sizing:border-box}._headers_1g7hg_79,._headers_1g7hg_79:before,._headers_1g7hg_79:after{box-sizing:border-box}._header_1g7hg_79,._header_1g7hg_79:before,._header_1g7hg_79:after{box-sizing:border-box}._headerLabel_1g7hg_97,._headerLabel_1g7hg_97:before,._headerLabel_1g7hg_97:after{box-sizing:border-box}._headerCount_1g7hg_133,._headerCount_1g7hg_133:before,._headerCount_1g7hg_133:after{box-sizing:border-box}._chevron_1g7hg_142,._chevron_1g7hg_142:before,._chevron_1g7hg_142:after{box-sizing:border-box}._plot_1g7hg_197,._plot_1g7hg_197:before,._plot_1g7hg_197:after{box-sizing:border-box}._focusRing_1g7hg_204,._focusRing_1g7hg_204:before,._focusRing_1g7hg_204:after{box-sizing:border-box}._layer_1g7hg_222,._layer_1g7hg_222:before,._layer_1g7hg_222:after{box-sizing:border-box}._grip_1g7hg_231,._grip_1g7hg_231:before,._grip_1g7hg_231:after{box-sizing:border-box}._ghostLabel_1g7hg_241,._ghostLabel_1g7hg_241:before,._ghostLabel_1g7hg_241:after{box-sizing:border-box}._finding_1g7hg_254,._finding_1g7hg_254:before,._finding_1g7hg_254:after{box-sizing:border-box}._refusal_1g7hg_262,._refusal_1g7hg_262:before,._refusal_1g7hg_262:after{box-sizing:border-box}._tooltip_1g7hg_266,._tooltip_1g7hg_266:before,._tooltip_1g7hg_266:after{box-sizing:border-box}._tooltipHead_1g7hg_285,._tooltipHead_1g7hg_285:before,._tooltipHead_1g7hg_285:after{box-sizing:border-box}._tooltipTimes_1g7hg_290,._tooltipTimes_1g7hg_290:before,._tooltipTimes_1g7hg_290:after{box-sizing:border-box}._now_1g7hg_299,._now_1g7hg_299:before,._now_1g7hg_299:after{box-sizing:border-box}._barLabel_1g7hg_313,._barLabel_1g7hg_313:before,._barLabel_1g7hg_313:after{box-sizing:border-box}._barLabelText_1g7hg_326,._barLabelText_1g7hg_326:before,._barLabelText_1g7hg_326:after{box-sizing:border-box}._root_1g7hg_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_1g7hg_19{background:var(--u-color-surface)}._dayBand_1g7hg_23,._tickBand_1g7hg_24{position:relative;overflow:hidden;color:var(--u-color-text-muted);font-size:var(--u-text-xs)}._dayBand_1g7hg_23{border-bottom:1px solid var(--u-hairline-strong)}._tickBand_1g7hg_24{border-top:1px solid var(--u-hairline-strong)}._day_1g7hg_23{position:absolute;top:0;bottom:0;border-left:1px solid var(--u-hairline-strong);overflow:hidden}._dayLabel_1g7hg_50{position:absolute;z-index:1;left:var(--u-space-1);padding:0 var(--u-space-1);background:var(--u-color-surface);top:50%;transform:translateY(-50%);white-space:nowrap;color:var(--u-color-text);font-weight:var(--u-weight-medium)}._tick_1g7hg_24{position:absolute;top:0;bottom:0;width:1px;background:var(--u-hairline)}._tickLabel_1g7hg_71{position:absolute;top:50%;left:0;transform:translate(-50%,-50%);white-space:nowrap}._headers_1g7hg_79{position:relative;overflow:hidden;border-right:1px solid var(--u-hairline-strong)}._header_1g7hg_79{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_1g7hg_97{min-width:0;overflow:hidden;text-overflow:ellipsis}._header_1g7hg_79[data-row=lane],._header_1g7hg_79[data-row=miniature]{container:lane-header / size}@container lane-header (height >= 2.5rem){._headerLabel_1g7hg_97:not(:has(*)){display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;line-clamp:2;white-space:normal;text-wrap:balance}}._header_1g7hg_79[data-row=groupHead],._header_1g7hg_79[data-row=miniature]{font-weight:var(--u-weight-medium)}._headerCount_1g7hg_133{flex:none;color:var(--u-color-text-muted);font-size:var(--u-text-xs);font-variant-numeric:tabular-nums}._chevron_1g7hg_142{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_1g7hg_142:hover{background:var(--u-color-surface-sunken);color:var(--u-color-text)}._chevron_1g7hg_142:active{background:var(--u-color-surface-pressed)}._chevron_1g7hg_142:focus-visible{outline:2px solid transparent;box-shadow:var(--u-focus-ring)}._chevron_1g7hg_142 svg{box-sizing:border-box}._chevron_1g7hg_142 svg{transition:transform var(--u-transition-path)}._chevron_1g7hg_142 svg[data-open]{box-sizing:border-box}._chevron_1g7hg_142 svg[data-open]{transform:rotate(90deg)}@media(prefers-reduced-motion:reduce){._chevron_1g7hg_142 svg{transition:none}}._header_1g7hg_79[data-refused]{color:var(--u-color-text-muted)}._plot_1g7hg_197{position:relative;overflow:hidden;touch-action:none}._plot_1g7hg_197:focus{outline:none}._focusRing_1g7hg_204{position:absolute;top:2px;right:2px;bottom:2px;left:2px;border-radius:var(--u-radius-md);corner-shape:squircle;pointer-events:none}._plot_1g7hg_197:focus-visible>._focusRing_1g7hg_204{outline:2px solid transparent;box-shadow:var(--u-focus-ring)}._layer_1g7hg_222{position:absolute;top:0;right:0;bottom:0;left:0;width:100%;height:100%;display:block;pointer-events:none}._grip_1g7hg_231{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_1g7hg_241{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_1g7hg_254{font-weight:var(--u-weight-semibold);color:var(--u-color-danger-subtle)}._refusal_1g7hg_262{font-weight:var(--u-weight-semibold)}._tooltip_1g7hg_266{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_1g7hg_285{color:var(--u-color-text);font-weight:var(--u-weight-semibold)}._tooltipTimes_1g7hg_290{color:var(--u-color-text)}._tooltip_1g7hg_266 ._finding_1g7hg_254{color:var(--u-color-danger-text)}._now_1g7hg_299{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_1g7hg_313{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_1g7hg_326{min-width:0;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}._barLabel_1g7hg_313[data-on=dark]{color:var(--u-color-on-accent)}._barLabel_1g7hg_313[data-on=light]{color:var(--u-color-text)}@media(forced-colors:active){._grip_1g7hg_231{outline:2px solid CanvasText;outline-offset:-2px}._ghostLabel_1g7hg_241{outline:1px solid CanvasText}}}
|