@umriss-ui/schedule 0.3.15 → 0.4.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 CHANGED
@@ -15,6 +15,72 @@ moves from here under the rule above.
15
15
 
16
16
  ---
17
17
 
18
+ ## 0.4.0 – Every export explained, and lane counts in every language (Oct. 2026)
19
+
20
+ The package explains itself where it is used: every export carries a comment,
21
+ every default a `@default` tag, and the demo lists all of it in an API index
22
+ (ADR-0044). A group's lane count is fitted anew when the language changes.
23
+ Needs `@umriss-ui/core` 0.25 and `@umriss-ui/charts` 0.10; the peer ranges move
24
+ to `^0.25.0` and `^0.10.0`.
25
+
26
+ ### Added
27
+
28
+ - **The First schedule page says what a screen reader meets**: a section
29
+ Accessibility after Keyboard names the plot's role, name and summary, the
30
+ readout after a key, the label to pass and what forced colours and reduced
31
+ motion change. Every other page with a schedule in its examples has a
32
+ Keyboard section linking First schedule's keys; Dependencies and Pan and
33
+ zoom also list the keys of their own feature there. In the demo, the
34
+ Markdown twins and `docs/llms-full.md`; the schedule is unchanged.
35
+ - **Every export carries a comment**: what a component, a function or a type is
36
+ for, and for a function `@param` and `@returns` where its type alone does not
37
+ say it. The editor shows it on hover, from the package's `.d.ts`. Nothing
38
+ else changes.
39
+ - **A prop's default stands in a `@default` tag** where its comment used to say
40
+ it in words: the editor shows it on hover, and the props table in its Default
41
+ column. Nothing else changes.
42
+ - **`docs/llms-full.md` defines every type a props table names**: a type
43
+ without a table of its own (`Intent`, the charts' `WorkingCalendar`) stands
44
+ under "Types on this page" of each page that names it, with its comment and
45
+ its members or its declaration.
46
+ - **The demo has an API index**: `/schedule/api/`, the last entry of the
47
+ sidebar, lists every export of `@umriss-ui/schedule`, grouped as components,
48
+ functions, constants and types, alphabetical - each value with its comment
49
+ and its declaration, each type with a link to its table or its definition,
50
+ and the pages that use it. A hook or a function a page names, in its text or
51
+ its import line, leads to its entry. `docs/llms-full.md` ends with the same
52
+ index, in place of the appendix "The rest of the API". The library is
53
+ unchanged.
54
+ - **Every prop of a props table is shown, or named as an exception**: new
55
+ examples for groups that start folded (`defaultCollapsedGroups`), one
56
+ handover drawn its own way (a dependency's `attach` and `ends`) and a
57
+ tooltip that says what a bar covers and a line joins (`subtask`, `blocked`,
58
+ `dependency`, `from`, `to`); the list of findings now writes `departure`
59
+ and `arrival`, and "Report the pointer" names the lane, as its lead
60
+ promised. The two props left without an example, `className` and `style`,
61
+ are pass-throughs; the demo's list says so. The schedule is unchanged.
62
+
63
+ ### Fixed
64
+
65
+ - **A group's lane count is measured anew when the language changes**: a
66
+ wording switched under a mounted schedule (English to German, say) left the
67
+ counts as the old wording had fitted them, so "2 Bahnen" stood beside a cut
68
+ name. Now the name wins over the count in every language, as it already did
69
+ after a reload - measured anew whenever the header column changes size or
70
+ anything it shows changes, a custom label's content included.
71
+ - **`docs/llms-full.md` names the peers in its install line**:
72
+ `npm install @umriss-ui/schedule @umriss-ui/core @umriss-ui/charts`, read
73
+ from the manifest. It had named the schedule alone, and an install after it
74
+ lacked core and charts.
75
+
76
+ ---
77
+
78
+ ## 0.3.16 – Core 0.24.0 (Oct. 2026)
79
+
80
+ Needs `@umriss-ui/core` 0.24; the peer range moves to `^0.24.0`. Nothing else changes for a caller.
81
+
82
+ ---
83
+
18
84
  ## 0.3.15 – Core 0.23.0 (Oct. 2026)
19
85
 
20
86
  Needs `@umriss-ui/core` 0.23; the peer range moves to `^0.23.0`. Nothing else changes for a caller.
package/README.md CHANGED
@@ -155,12 +155,16 @@ Done from this list: **blocked time** per lane.
155
155
 
156
156
  * The demo: <https://romanhaendler.github.io/umriss-ui/schedule/>, or locally
157
157
  `pnpm dev:schedule` (port 4176). It is the documentation — every page shows
158
- running examples with their source and the props table generated from `src/`.
158
+ running examples with their source and the props table generated from `src/`,
159
+ each prop linked to the examples that show it. An API index lists every
160
+ export, one search finds across all five packages, and the header switches
161
+ the examples to German.
159
162
  * [`CHANGELOG.md`](CHANGELOG.md) — what changes for a caller.
160
163
  * **For a coding agent**: `docs/llms-full.md` inside the installed package —
161
164
  the demo as one Markdown file, pinned to the installed version: every page
162
165
  with its examples' source, its props tables and why it is built as it is,
163
- and the declaration of every other export. Online, for the latest version:
166
+ and an index of every export with its comment and its declaration. Each
167
+ page also has a Markdown twin online; for the latest version:
164
168
  <https://romanhaendler.github.io/umriss-ui/schedule/llms.txt>.
165
169
  * The vocabulary — **Task**, **Subtask**, **Lead-in**, **Lead-out**,
166
170
  **Dependency**, **Violated dependency**, **Blocked time**, **Lane header**, **Lane group**,
package/dist/index.d.ts CHANGED
@@ -37,6 +37,7 @@ export declare interface BlockedTime {
37
37
  subtask and dependency: it is a property of the lane, not something on it. */
38
38
  export declare function BlockedTimes({ data }: BlockedTimesProps): null;
39
39
 
40
+ /** The props of `BlockedTimes`. */
40
41
  export declare interface BlockedTimesProps {
41
42
  /** The blocked time of the lanes - leave, maintenance, unavailability -, as
42
43
  the caller holds it: one list, each interval naming its lane. */
@@ -50,6 +51,7 @@ export declare function departure(dependency: Dependency, from: Subtask): number
50
51
  bars; after them, above. */
51
52
  export declare function Dependencies({ data }: DependenciesProps): null;
52
53
 
54
+ /** The props of `Dependencies`. */
53
55
  export declare interface DependenciesProps {
54
56
  /** The dependencies, as the caller holds them. */
55
57
  data: readonly Dependency[];
@@ -68,11 +70,12 @@ export declare interface Dependency {
68
70
  begin as soon as the predecessor ends. */
69
71
  readonly lag: number;
70
72
  /** Where it leaves: at the end of the main time, or after the lead-out.
71
- Default `"leadOut"` - the predecessor counts as ended once its lead-out is. */
73
+ The predecessor counts as ended once its lead-out is.
74
+ @default "leadOut" */
72
75
  readonly leaves?: "main" | "leadOut";
73
76
  /** Where it arrives: at the start of the main time, or before the lead-in.
74
- Default `"leadIn"` - the lag must have run out before the successor's
75
- lead-in begins. */
77
+ The lag must have run out before the successor's lead-in begins.
78
+ @default "leadIn" */
76
79
  readonly arrives?: "main" | "leadIn";
77
80
  /** How this one is drawn, where it is not drawn like the rest. It changes
78
81
  the picture and never the finding: whether a dependency is violated follows
@@ -156,13 +159,15 @@ export declare function Lane({ id, label }: LaneProps): null;
156
159
  `Schedule` - a view state, never an **Intent**. */
157
160
  export declare function LaneGroup({ id, label, children }: LaneGroupProps): ReactNode;
158
161
 
162
+ /** The props of `LaneGroup`. */
159
163
  export declare interface LaneGroupProps {
160
164
  /** The group's identity - what `collapsedGroups` names. It is never a lane:
161
165
  no subtask sits on it, no finding is reported for it, and no intent names
162
166
  it (ADR-0025). */
163
167
  id: string;
164
168
  /** What the group's header says - the team, the depot, the region.
165
- Real text, read by a screen reader; without one the header shows the id. */
169
+ Real text, read by a screen reader.
170
+ @default id */
166
171
  label?: ReactNode;
167
172
  /** `Lane`s and further `LaneGroup`s, to any depth. */
168
173
  children?: ReactNode;
@@ -177,11 +182,13 @@ export declare interface LaneIntent {
177
182
  readonly lane: string;
178
183
  }
179
184
 
185
+ /** The props of `Lane`. */
180
186
  export declare interface LaneProps {
181
187
  /** The identity subtasks name in their `lane`. */
182
188
  id: string;
183
189
  /** What the lane header says - the person, vehicle or room. Real text, read by a
184
- screen reader; without one the header shows the id. */
190
+ screen reader.
191
+ @default id */
185
192
  label?: ReactNode;
186
193
  }
187
194
 
@@ -278,6 +285,10 @@ export declare interface PlacingItem {
278
285
  readonly leadOut?: number;
279
286
  }
280
287
 
288
+ /** Settles a subtask's appearances into what is drawn. `provisional` and
289
+ `fixed` contradict each other; the later one in the list wins.
290
+ @param appearance The subtask's `appearance`, in the order it was given.
291
+ @returns Which of the four channels are on. */
281
292
  export declare function resolveAppearance(appearance: readonly SubtaskAppearance[] | undefined): ResolvedAppearance;
282
293
 
283
294
  /** What the drawing needs to know, with the contradiction already settled.
@@ -285,8 +296,7 @@ export declare function resolveAppearance(appearance: readonly SubtaskAppearance
285
296
  The four names are the ones this module was born with, and they are kept so
286
297
  that a caller's code does not change because a picture did. Two of them are
287
298
  now named after a drawing they no longer use, and the channel each one
288
- really owns stands beside it (`sceneDraw.ts`, "ONE CHANNEL PER
289
- STATEMENT"). */
299
+ really owns stands beside it. */
290
300
  export declare interface ResolvedAppearance {
291
301
  /** `provisional`: the FILL - none at all, so the surface shows through, with
292
302
  a dashed outline in the task colour. Planned, not released. */
@@ -309,6 +319,12 @@ export declare interface ResolvedAppearance {
309
319
  bounded number of pushes instead of running on. */
310
320
  export declare function ripple(subtasks: readonly Subtask[], dependencies: readonly Dependency[], intent: Intent): MoveIntent[];
311
321
 
322
+ /** A plan of subtasks on lanes over time - people, vehicles, rooms - with
323
+ dependencies between them. The contents are declared as children (`Lane`,
324
+ `LaneGroup`, `Subtasks`, `Dependencies`, `BlockedTimes`); the planner pans,
325
+ zooms and drags, and every drag ends as an **Intent** through `onIntent`.
326
+ The data changes only where the caller applies it; without `intents` the
327
+ schedule is read-only. A ref gives the `ScheduleHandle`. */
312
328
  export declare const Schedule: ForwardRefExoticComponent<ScheduleProps & RefAttributes<ScheduleHandle>>;
313
329
 
314
330
  /** What a schedule offers a caller imperatively: the arithmetic between a
@@ -361,35 +377,43 @@ export declare interface ScheduleInteraction {
361
377
  readonly lane: string | null;
362
378
  }
363
379
 
380
+ /** The props of `Schedule`. */
364
381
  export declare interface ScheduleProps {
365
382
  /** What the schedule shows, for a screen reader: "Plan of week 38". */
366
383
  ariaLabel: string;
367
384
  /** The time in view when the schedule mounts, as two wall-clock instants.
368
385
  Pan and zoom take it from there; a new pair of values puts it back. */
369
386
  initialDomain: readonly [number, number];
370
- /** Height in CSS pixels, both bands included. The width is the host's. */
387
+ /** Height in CSS pixels, both bands included. The width is the host's.
388
+ @default 400 */
371
389
  height?: number;
372
- /** Height of one lane in pixels. */
390
+ /** Height of one lane in pixels.
391
+ @default 44 */
373
392
  laneHeight?: number;
374
393
  /** Width of the lane headers in pixels - at most 40 % of the schedule, so
375
- that on a phone the plot keeps the larger part. */
394
+ that on a phone the plot keeps the larger part.
395
+ @default 160 */
376
396
  headerWidth?: number;
377
397
  /** A working calendar: the intervals in which time counts. Nights and
378
- weekends outside them are cut out of the axis. Default: the wall clock. */
398
+ weekends outside them are cut out of the axis. Without intervals every
399
+ hour counts, as on the wall clock.
400
+ @default [] */
379
401
  calendar?: CalendarInput;
380
402
  /** The narrowest and widest time span zoom may reach, in milliseconds.
381
- Default: one hour to 28 days. */
403
+ @default one hour to 28 days */
382
404
  zoomLimits?: ZoomLimits;
383
405
  /** The raster a drag lands on: `"ticks"` - the fine band's current step -, a
384
406
  step in milliseconds from local midnight, a step with an offset (shifts at
385
407
  06:00, 14:00 and 22:00 are eight hours offset by six), or `false` for none.
386
- It shapes the ghost and the intent, never the data. */
408
+ It shapes the ghost and the intent, never the data.
409
+ @default "ticks" */
387
410
  snap?: "ticks" | number | SnapRaster | false;
388
411
  /** The intents the caller handles. Each one enables its interaction; none
389
- leaves a read-only schedule (ADR-0023). */
412
+ leaves a read-only schedule (ADR-0023).
413
+ @default [] */
390
414
  intents?: readonly IntentKind[];
391
- /** Whether a subtask may go to a lane. Without it every lane is open; it
392
- narrows `"lane"`, it does not enable it.
415
+ /** Whether a subtask may go to a lane. It narrows `"lane"`, it does not
416
+ enable it.
393
417
 
394
418
  Asked once per lane when a drag takes hold, and asked again at the drop.
395
419
  The lanes it turns down are marked from the first frame of the drag - a
@@ -399,7 +423,8 @@ export declare interface ScheduleProps {
399
423
  nothing else: a drop after it still reports the move in time.
400
424
 
401
425
  It is asked for work dragged in from outside as well, with the key and
402
- task the application declared in `placing`. */
426
+ task the application declared in `placing`.
427
+ @default every lane is open */
403
428
  canMoveTo?: (subtask: Subtask, lane: string) => boolean;
404
429
  /** Called once per intent when a drag ends. The data changes only if the
405
430
  caller changes it. */
@@ -441,19 +466,22 @@ export declare interface ScheduleProps {
441
466
  placing?: PlacingItem | null;
442
467
  /** How the dependencies are drawn: a `"curve"` that leaves and arrives
443
468
  forwards, a `"straight"` line, or `"orthogonal"` segments. A dependency may
444
- say otherwise for itself. */
469
+ say otherwise for itself.
470
+ @default "curve" */
445
471
  route?: DependencyRoute;
446
472
  /** Where a dependency's ends sit on their bars: the `"centre"` of both, or the
447
473
  `"nearest"` edge - which is the shortest line between two stops. Within
448
474
  one lane both mean the middle. A dependency may say otherwise for itself.
449
475
 
450
476
  It changes the picture and never a finding: whether a dependency is violated
451
- follows from its `leaves` and `arrives` alone. */
477
+ follows from its `leaves` and `arrives` alone.
478
+ @default "centre" */
452
479
  attach?: DependencyAttachment;
453
- /** Whether a dependency's two ends carry a dot (`"dot"`, the default) or the
454
- line stands alone (`"none"`). The dot says where the line is anchored - a
480
+ /** Whether a dependency's two ends carry a dot (`"dot"`) or the line
481
+ stands alone (`"none"`). The dot says where the line is anchored - a
455
482
  help while a plan is being read, and noise in a plan full of short moves.
456
- A dependency may say otherwise for itself. */
483
+ A dependency may say otherwise for itself.
484
+ @default "dot" */
457
485
  ends?: DependencyEnds;
458
486
  /** What stands written in a bar: a function from a subtask to a line of
459
487
  text, or nothing for bars without text. The text is cut off with an
@@ -466,7 +494,8 @@ export declare interface ScheduleProps {
466
494
  what the pointer rests on and returns content of the application's own. */
467
495
  tooltip?: false | ((target: ScheduleTooltipTarget) => ReactNode);
468
496
  /** A line marking the present across the lanes: `true` follows the clock by
469
- the minute, an instant fixes it there. Off by default. */
497
+ the minute, an instant fixes it there.
498
+ @default false */
470
499
  now?: boolean | number;
471
500
  /** Goes to the root element. */
472
501
  className?: string;
@@ -507,6 +536,15 @@ export declare type ScheduleTooltipTarget = {
507
536
  readonly violated: ViolatedDependency | undefined;
508
537
  };
509
538
 
539
+ /** The moves that carry a whole task in time - every subtask of it by the same
540
+ amount, so that its lengths and the distances between its stops stay as
541
+ they were. The schedule never runs it: apply the moves like any other
542
+ intent, or run `ripple` over them first.
543
+ @param subtasks All subtasks; only those of `task` are moved.
544
+ @param task The id of the task, as its subtasks name it in `task`.
545
+ @param by How far, in milliseconds; negative is earlier.
546
+ @returns One move intent per subtask of the task - none where `by` is zero
547
+ or not finite. */
510
548
  export declare function shiftTask(subtasks: readonly Subtask[], task: string, by: number): MoveIntent[];
511
549
 
512
550
  /** A raster: a step, and where it starts after local midnight. */
@@ -572,6 +610,7 @@ export declare function subtaskFromPlace(intent: PlaceIntent, id: string): Subta
572
610
  /** A layer of subtasks. Several layers draw in the order they are declared. */
573
611
  export declare function Subtasks({ data, tasks }: SubtasksProps): null;
574
612
 
613
+ /** The props of `Subtasks`. */
575
614
  export declare interface SubtasksProps {
576
615
  /** The subtasks, as the caller holds them. The schedule never changes one. */
577
616
  data: readonly Subtask[];