@umriss-ui/schedule 0.5.7 → 0.6.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/docs/llms-full.md CHANGED
@@ -1,4 +1,4 @@
1
- # @umriss-ui/schedule 0.5.7
1
+ # @umriss-ui/schedule 0.6.0
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
 
@@ -1278,7 +1278,7 @@ Under forced colours the plot paints itself in the system colours: the work in t
1278
1278
 
1279
1279
  | Prop | Type | Default | Description |
1280
1280
  |---|---|---|---|
1281
- | `height` | `number` | `400` | Height in CSS pixels, both bands included. The width is the host's.<br>Shown in: [A day of tours](#/schedule/first-schedule), [Start from an empty plan](#/schedule/no-work-yet), [Plan a day in the machine shop](#/schedule/machine-plan) and 75 more |
1281
+ | `height` | `number` | `400` | Height in CSS pixels, both bands included. The width is the host's.<br>Shown in: [A day of tours](#/schedule/first-schedule), [Start from an empty plan](#/schedule/no-work-yet), [Plan a day in the machine shop](#/schedule/machine-plan) and 77 more |
1282
1282
  | `laneHeight` | `number` | `44` | Height of one lane in pixels.<br>Shown in: [Scroll more lanes than fit (Lanes)](#/lane/many-lanes) |
1283
1283
  | `headerWidth` | `number` | `160` | Width of the lane headers in pixels - at most 40 % of the schedule, so that on a phone the plot keeps the larger part.<br>Shown in: [What a lane header says (Lanes)](#/lane/lane-headers), [Scroll more lanes than fit (Lanes)](#/lane/many-lanes), [Group lanes under a head (Lane groups)](#/lane-groups/a-group) and 1 more |
1284
1284
  | `calendar` | [`CalendarInput`](#type-CalendarInput) | `[]` | A working calendar: the intervals in which time counts. Nights and weekends outside them are cut out of the axis. Without intervals every hour counts, as on the wall clock.<br>Shown in: [Cut the nights out of the axis (Time axis and calendar)](#/time-axis/working-calendar), [Plan in office hours only (Time axis and calendar)](#/time-axis/office-hours), [Plan the sprint around leave (Scenarios)](#/scenarios/plan-the-sprint-around-leave) |
@@ -1293,9 +1293,9 @@ Under forced colours the plot paints itself in the system colours: the work in t
1293
1293
  | `attach` | [`DependencyAttachment`](#type-DependencyAttachment)<br>`"centre" \| "nearest"` | `"centre"` | Where a dependency's ends sit on their bars: the `"centre"` of both, or the `"nearest"` edge - which is the shortest line between two stops. Within one lane both mean the middle. A dependency may say otherwise for itself. It changes the picture and never a finding: whether a dependency is violated follows from its `leaves` and `arrives` alone.<br>Shown in: [Choose where a line touches its bars (Dependencies)](#/dependencies/attach), [Mark the ends with a dot (Dependencies)](#/dependencies/ends), [Draw one handover its own way (Dependencies)](#/dependencies/one-handover-drawn-its-own-way) and 3 more |
1294
1294
  | `ends` | [`DependencyEnds`](#type-DependencyEnds)<br>`"dot" \| "none"` | `"dot"` | Whether a dependency's two ends carry a dot (`"dot"`) or the line stands alone (`"none"`). The dot says where the line is anchored - a help while a plan is being read, and noise in a plan full of short moves. A dependency may say otherwise for itself.<br>Shown in: [Mark the ends with a dot (Dependencies)](#/dependencies/ends), [Draw one handover its own way (Dependencies)](#/dependencies/one-handover-drawn-its-own-way) |
1295
1295
  | `label` | `(subtask: `[`Subtask`](#/subtasks/type-Subtask)`) => string` | — | What stands written in a bar: a function from a subtask to a line of text, or nothing for bars without text. The text is cut off with an ellipsis where the bar is too narrow for it and left out where even that would say nothing; a bar that began before the view keeps its text at the view's edge.<br>Shown in: [Plan a day in the machine shop](#/schedule/machine-plan), [Plan a sprint for a team (Subtasks)](#/subtasks/a-sprint), [Write into the bars (Bar labels)](#/bar-labels/bar-labels) and 7 more |
1296
- | `tooltip` | `false \| ((target: `[`ScheduleTooltipTarget`](#/tooltip/type-ScheduleTooltipTarget)`) => ReactNode)` | — | The tooltip on a hovered subtask or dependency: its order, its times, its parts and its findings. `false` switches it off; a function receives what the pointer rests on and returns content of the application's own.<br>Shown in: [Write your own tooltip content (Tooltip)](#/tooltip/own-tooltip), [Show a detail panel instead (Tooltip)](#/tooltip/detail-panel-instead), [Say what a bar covers and a line joins (Tooltip)](#/tooltip/say-what-a-bar-covers-and-a-line-joins) |
1296
+ | `tooltip` | `false \| ((target: `[`ScheduleTooltipTarget`](#/tooltip/type-ScheduleTooltipTarget)`) => ReactNode)` | — | The tooltip on a hovered subtask or dependency: its order, its times, its parts and its findings. `false` switches it off; a function receives what the pointer rests on and returns content of the application's own.<br>Shown in: [Say what a milestone is in your own tooltip (Milestones)](#/milestones/say-what-a-milestone-is), [Write your own tooltip content (Tooltip)](#/tooltip/own-tooltip), [Show a detail panel instead (Tooltip)](#/tooltip/detail-panel-instead) and 1 more |
1297
1297
  | `now` | `boolean \| number` | `false` | A line marking the present across the lanes: `true` follows the clock by the minute, an instant fixes it there.<br>Shown in: [Plan a day in the machine shop](#/schedule/machine-plan), [Mark the present (Now line)](#/now-line/now-line), [Follow the clock (Now line)](#/now-line/follow-the-clock) and 2 more |
1298
- | `children` | `ReactNode` | — | `Lane`, `Dependencies` and `Subtasks`, in the order they are to stand and be drawn.<br>Shown in: [A day of tours](#/schedule/first-schedule), [Start from an empty plan](#/schedule/no-work-yet), [Plan a day in the machine shop](#/schedule/machine-plan) and 75 more |
1298
+ | `children` | `ReactNode` | — | `Lane`, `Dependencies` and `Subtasks`, in the order they are to stand and be drawn.<br>Shown in: [A day of tours](#/schedule/first-schedule), [Start from an empty plan](#/schedule/no-work-yet), [Plan a day in the machine shop](#/schedule/machine-plan) and 77 more |
1299
1299
 
1300
1300
  ###### Events
1301
1301
 
@@ -1308,7 +1308,7 @@ Under forced colours the plot paints itself in the system colours: the work in t
1308
1308
 
1309
1309
  | Prop | Type | Default | Description |
1310
1310
  |---|---|---|---|
1311
- | `ariaLabel` *required* | `string` | — | What the schedule shows, for a screen reader: "Plan of week 38".<br>Shown in: [A day of tours](#/schedule/first-schedule), [Start from an empty plan](#/schedule/no-work-yet), [Plan a day in the machine shop](#/schedule/machine-plan) and 75 more |
1311
+ | `ariaLabel` *required* | `string` | — | What the schedule shows, for a screen reader: "Plan of week 38".<br>Shown in: [A day of tours](#/schedule/first-schedule), [Start from an empty plan](#/schedule/no-work-yet), [Plan a day in the machine shop](#/schedule/machine-plan) and 77 more |
1312
1312
 
1313
1313
  ###### Styling
1314
1314
 
@@ -1654,8 +1654,8 @@ The keys of [First schedule](#/schedule/keyboard-schedule) apply here.
1654
1654
 
1655
1655
  | Prop | Type | Default | Description |
1656
1656
  |---|---|---|---|
1657
- | `id` *required* | `string` | — | The identity subtasks name in their `lane`.<br>Shown in: [What a lane header says](#/lane/lane-headers), [Scroll more lanes than fit](#/lane/many-lanes), [The smallest schedule (Installation)](#/installation/smallest-schedule) and 75 more |
1658
- | `label` | `ReactNode` | `id` | What the lane header says - the person, vehicle or room. Real text, read by a screen reader.<br>Shown in: [What a lane header says](#/lane/lane-headers), [Scroll more lanes than fit](#/lane/many-lanes), [The smallest schedule (Installation)](#/installation/smallest-schedule) and 75 more |
1657
+ | `id` *required* | `string` | — | The identity subtasks name in their `lane`.<br>Shown in: [What a lane header says](#/lane/lane-headers), [Scroll more lanes than fit](#/lane/many-lanes), [The smallest schedule (Installation)](#/installation/smallest-schedule) and 77 more |
1658
+ | `label` | `ReactNode` | `id` | What the lane header says - the person, vehicle or room. Real text, read by a screen reader.<br>Shown in: [What a lane header says](#/lane/lane-headers), [Scroll more lanes than fit](#/lane/many-lanes), [The smallest schedule (Installation)](#/installation/smallest-schedule) and 77 more |
1659
1659
 
1660
1660
  ### Lane groups
1661
1661
 
@@ -2167,21 +2167,21 @@ The keys of [First schedule](#/schedule/keyboard-schedule) apply here.
2167
2167
 
2168
2168
  | Prop | Type | Default | Description |
2169
2169
  |---|---|---|---|
2170
- | `data` *required* | `readonly `[`Subtask`](#type-Subtask)`[]` | — | The subtasks, as the caller holds them. The schedule never changes one.<br>Shown in: [Main time, lead-in and lead-out](#/subtasks/lead-in-and-lead-out), [Colour by what the task means](#/subtasks/task-colours), [Plan a sprint for a team](#/subtasks/a-sprint) and 75 more |
2171
- | `tasks` *required* | `readonly `[`Task`](#type-Task)`[]` | — | The tasks the subtasks belong to - their identity and their colour. A subtask whose task is not among them is drawn in a muted colour.<br>Shown in: [Main time, lead-in and lead-out](#/subtasks/lead-in-and-lead-out), [Colour by what the task means](#/subtasks/task-colours), [Plan a sprint for a team](#/subtasks/a-sprint) and 75 more |
2170
+ | `data` *required* | `readonly `[`Subtask`](#type-Subtask)`[]` | — | The subtasks, as the caller holds them. The schedule never changes one.<br>Shown in: [Main time, lead-in and lead-out](#/subtasks/lead-in-and-lead-out), [Colour by what the task means](#/subtasks/task-colours), [Plan a sprint for a team](#/subtasks/a-sprint) and 77 more |
2171
+ | `tasks` *required* | `readonly `[`Task`](#type-Task)`[]` | — | The tasks the subtasks belong to - their identity and their colour. A subtask whose task is not among them is drawn in a muted colour.<br>Shown in: [Main time, lead-in and lead-out](#/subtasks/lead-in-and-lead-out), [Colour by what the task means](#/subtasks/task-colours), [Plan a sprint for a team](#/subtasks/a-sprint) and 77 more |
2172
2172
 
2173
2173
  ##### `Subtask`
2174
2174
 
2175
2175
  | Prop | Type | Default | Description |
2176
2176
  |---|---|---|---|
2177
- | `id` *required* | `string` | — | The caller's identity of the subtask.<br>Shown in: [Main time, lead-in and lead-out](#/subtasks/lead-in-and-lead-out), [Colour by what the task means](#/subtasks/task-colours), [Plan a sprint for a team](#/subtasks/a-sprint) and 72 more |
2178
- | `task` *required* | `string` | — | The id of the task it belongs to.<br>Shown in: [Main time, lead-in and lead-out](#/subtasks/lead-in-and-lead-out), [Colour by what the task means](#/subtasks/task-colours), [The smallest schedule (Installation)](#/installation/smallest-schedule) and 68 more |
2179
- | `lane` *required* | `string` | — | The id of the lane it sits on.<br>Shown in: [Main time, lead-in and lead-out](#/subtasks/lead-in-and-lead-out), [Colour by what the task means](#/subtasks/task-colours), [The smallest schedule (Installation)](#/installation/smallest-schedule) and 68 more |
2180
- | `from` *required* | `number` | — | Start of the main time.<br>Shown in: [Main time, lead-in and lead-out](#/subtasks/lead-in-and-lead-out), [Colour by what the task means](#/subtasks/task-colours), [The smallest schedule (Installation)](#/installation/smallest-schedule) and 68 more |
2181
- | `to` *required* | `number` | — | End of the main time.<br>Shown in: [Main time, lead-in and lead-out](#/subtasks/lead-in-and-lead-out), [Colour by what the task means](#/subtasks/task-colours), [The smallest schedule (Installation)](#/installation/smallest-schedule) and 68 more |
2177
+ | `id` *required* | `string` | — | The caller's identity of the subtask.<br>Shown in: [Main time, lead-in and lead-out](#/subtasks/lead-in-and-lead-out), [Colour by what the task means](#/subtasks/task-colours), [Plan a sprint for a team](#/subtasks/a-sprint) and 74 more |
2178
+ | `task` *required* | `string` | — | The id of the task it belongs to.<br>Shown in: [Main time, lead-in and lead-out](#/subtasks/lead-in-and-lead-out), [Colour by what the task means](#/subtasks/task-colours), [The smallest schedule (Installation)](#/installation/smallest-schedule) and 70 more |
2179
+ | `lane` *required* | `string` | — | The id of the lane it sits on.<br>Shown in: [Main time, lead-in and lead-out](#/subtasks/lead-in-and-lead-out), [Colour by what the task means](#/subtasks/task-colours), [The smallest schedule (Installation)](#/installation/smallest-schedule) and 70 more |
2180
+ | `from` *required* | `number` | — | Start of the main time.<br>Shown in: [Main time, lead-in and lead-out](#/subtasks/lead-in-and-lead-out), [Colour by what the task means](#/subtasks/task-colours), [The smallest schedule (Installation)](#/installation/smallest-schedule) and 70 more |
2181
+ | `to` *required* | `number` | — | End of the main time.<br>Shown in: [Main time, lead-in and lead-out](#/subtasks/lead-in-and-lead-out), [Colour by what the task means](#/subtasks/task-colours), [The smallest schedule (Installation)](#/installation/smallest-schedule) and 70 more |
2182
2182
  | `leadIn` | `number` | — | Duration of the lead-in before the main time; none is zero.<br>Shown in: [Main time, lead-in and lead-out](#/subtasks/lead-in-and-lead-out), [The smallest schedule (Installation)](#/installation/smallest-schedule), [A day of tours (First schedule)](#/schedule/first-schedule) and 25 more |
2183
2183
  | `leadOut` | `number` | — | Duration of the lead-out after the main time; none is zero.<br>Shown in: [Main time, lead-in and lead-out](#/subtasks/lead-in-and-lead-out), [The smallest schedule (Installation)](#/installation/smallest-schedule), [A day of tours (First schedule)](#/schedule/first-schedule) and 22 more |
2184
- | `name` | `string` | — | What the subtask is called, where the schedule names it.<br>Shown in: [Plan a sprint for a team](#/subtasks/a-sprint), [Write into the bars (Bar labels)](#/bar-labels/bar-labels), [Join the stops of a tour (Dependencies)](#/dependencies/stops-of-a-tour) and 25 more |
2184
+ | `name` | `string` | — | What the subtask is called, where the schedule names it.<br>Shown in: [Plan a sprint for a team](#/subtasks/a-sprint), [Write into the bars (Bar labels)](#/bar-labels/bar-labels), [Join the stops of a tour (Dependencies)](#/dependencies/stops-of-a-tour) and 27 more |
2185
2185
  | `appearance` | `readonly `[`SubtaskAppearance`](#type-SubtaskAppearance)`[]` | — | What the bar says besides its colour: `"provisional"`, `"fixed"`, `"muted"`, `"open"`. Several hold at once; `"provisional"` and `"fixed"` contradict, and the later one in the list wins.<br>Shown in: [Plan a sprint for a team](#/subtasks/a-sprint), [Provisional (Appearances)](#/appearances/provisional), [Fixed (Appearances)](#/appearances/fixed) and 3 more |
2186
2186
  | `progress` | `number` | — | The share of the work that is done, from 0 to 1, drawn as a filled part of the bar. Without it nothing is claimed - an empty bar and a bar at zero per cent are two different statements.<br>Shown in: [Progress (Appearances)](#/appearances/progress), [Several at once (Appearances)](#/appearances/combinations) |
2187
2187
 
@@ -2189,9 +2189,9 @@ The keys of [First schedule](#/schedule/keyboard-schedule) apply here.
2189
2189
 
2190
2190
  | Prop | Type | Default | Description |
2191
2191
  |---|---|---|---|
2192
- | `id` *required* | `string` | — | The caller's identity of the task.<br>Shown in: [Main time, lead-in and lead-out](#/subtasks/lead-in-and-lead-out), [Colour by what the task means](#/subtasks/task-colours), [The smallest schedule (Installation)](#/installation/smallest-schedule) and 67 more |
2193
- | `color` *required* | `string` | — | Any CSS colour - a literal, a token, `light-dark(…)`. The colour means what the caller's domain needs it to mean.<br>Shown in: [Main time, lead-in and lead-out](#/subtasks/lead-in-and-lead-out), [Colour by what the task means](#/subtasks/task-colours), [The smallest schedule (Installation)](#/installation/smallest-schedule) and 67 more |
2194
- | `name` | `string` | — | What the task is called, where the schedule names it.<br>Shown in: [Main time, lead-in and lead-out](#/subtasks/lead-in-and-lead-out), [Colour by what the task means](#/subtasks/task-colours), [The smallest schedule (Installation)](#/installation/smallest-schedule) and 67 more |
2192
+ | `id` *required* | `string` | — | The caller's identity of the task.<br>Shown in: [Main time, lead-in and lead-out](#/subtasks/lead-in-and-lead-out), [Colour by what the task means](#/subtasks/task-colours), [The smallest schedule (Installation)](#/installation/smallest-schedule) and 69 more |
2193
+ | `color` *required* | `string` | — | Any CSS colour - a literal, a token, `light-dark(…)`. The colour means what the caller's domain needs it to mean.<br>Shown in: [Main time, lead-in and lead-out](#/subtasks/lead-in-and-lead-out), [Colour by what the task means](#/subtasks/task-colours), [The smallest schedule (Installation)](#/installation/smallest-schedule) and 69 more |
2194
+ | `name` | `string` | — | What the task is called, where the schedule names it.<br>Shown in: [Main time, lead-in and lead-out](#/subtasks/lead-in-and-lead-out), [Colour by what the task means](#/subtasks/task-colours), [The smallest schedule (Installation)](#/installation/smallest-schedule) and 69 more |
2195
2195
 
2196
2196
  ##### Types on this page
2197
2197
 
@@ -4126,6 +4126,152 @@ The keys of [First schedule](#/schedule/keyboard-schedule) apply here.
4126
4126
  | `to` *required* | `number` | — | Where it ends.<br>Shown in: [Block out leave and maintenance](#/blocked-time/leave), [Plan work around someone's leave](#/blocked-time/drag-around), [Check a sprint against the leave calendar](#/blocked-time/team-leave) and 5 more |
4127
4127
  | `label` | `string` | — | Why the lane is blocked - "Leave", "Maintenance" -, where the schedule names it.<br>Shown in: [Block out leave and maintenance](#/blocked-time/leave), [Plan work around someone's leave](#/blocked-time/drag-around), [Check a sprint against the leave calendar](#/blocked-time/team-leave) and 5 more |
4128
4128
 
4129
+ ### Milestones
4130
+
4131
+ A point in time on a lane - a handover, a release, a deadline - drawn as a diamond above the work, reached by the keys and named in the tooltip.
4132
+
4133
+ ```ts
4134
+ import { useSchedule } from "@umriss-ui/schedule";
4135
+ ```
4136
+
4137
+ Demo page: https://romanhaendler.github.io/umriss-ui/schedule/milestones/
4138
+
4139
+ A milestone is data beside the work: one list, each point naming its lane and the instant it stands at (`{ id, lane, at, label? }`). It has no duration, no task and no tone; it is not dragged and reports no intent, and work beside it is never a finding.
4140
+
4141
+ The keys walk to it in time order among the subtasks of its lane, the tooltip names it by its label and time, and the live region reads its lane, label and time. It is named by its label, or its id without one.
4142
+
4143
+ #### Examples
4144
+
4145
+ ##### Mark a handover and a release
4146
+
4147
+ A point in time on a lane is a mark, not a bar: `Milestones` draws a diamond at `at`, above the work.
4148
+
4149
+ ```tsx
4150
+ import { Stack } from "@umriss-ui/core";
4151
+ import { useSchedule } from "@umriss-ui/schedule";
4152
+ import type { Milestone, Subtask, Task } from "@umriss-ui/schedule";
4153
+
4154
+ /* A milestone is data beside the work: one list, each point naming its lane
4155
+ and the instant it stands at, as a release calendar holds it. It is drawn
4156
+ above the bars - the design handover below stands on the end of the design
4157
+ bar and is still seen - and it has no duration, no task and no colour of
4158
+ its own.
4159
+
4160
+ Hover it and the tooltip names it and says when; the keys reach it as they
4161
+ reach the work, with the arrows in time order along the lane, and the live
4162
+ region reads its lane, its label and its time. It is not dragged and
4163
+ reports no intent. */
4164
+
4165
+ const day = (d: number, hours = 0) => new Date(2026, 2, 16 + d, hours).getTime();
4166
+
4167
+ const PROJECTS: readonly Task[] = [
4168
+ { id: "portal", name: "Customer portal", color: "light-dark(#2563eb, #6b9bff)" },
4169
+ { id: "billing", name: "Billing rework", color: "light-dark(#0d9488, #3cc7b8)" },
4170
+ ];
4171
+
4172
+ const WORK: readonly Subtask[] = [
4173
+ { id: "portal-design", task: "portal", lane: "anna", from: day(0, 9), to: day(1, 17), name: "Design" },
4174
+ { id: "portal-front", task: "portal", lane: "chloe", from: day(1, 9), to: day(3, 17), name: "Front end" },
4175
+ { id: "billing-api", task: "billing", lane: "ben", from: day(0, 9), to: day(2, 17), name: "Invoice API" },
4176
+ ];
4177
+
4178
+ const MILESTONES: readonly Milestone[] = [
4179
+ { id: "design-handover", lane: "anna", at: day(1, 17), label: "Design handover" },
4180
+ { id: "api-freeze", lane: "ben", at: day(2, 17), label: "API freeze" },
4181
+ { id: "release", lane: "chloe", at: day(4, 12), label: "Release 2.0" },
4182
+ ];
4183
+
4184
+ export default function HandoversAndReleases() {
4185
+ const { Schedule, Lane, Subtasks, Milestones } = useSchedule({ initialView: { domain: [day(0, 6), day(5, 0)] } });
4186
+ return (
4187
+ <Stack gap={3}>
4188
+ <Schedule ariaLabel="Portal and billing plan, week of 16 March" height={188}>
4189
+ <Lane id="anna" label="Anna Berg" />
4190
+ <Lane id="ben" label="Ben Ortiz" />
4191
+ <Lane id="chloe" label="Chloe Lind" />
4192
+ <Subtasks data={WORK} tasks={PROJECTS} />
4193
+ <Milestones data={MILESTONES} />
4194
+ </Schedule>
4195
+ </Stack>
4196
+ );
4197
+ }
4198
+ ```
4199
+
4200
+ ##### Say what a milestone is in your own tooltip
4201
+
4202
+ Over a milestone the target is `milestone`: the point itself, with its `label` and `at`, for a tooltip of your own.
4203
+
4204
+ ```tsx
4205
+ import { Stack, Text } from "@umriss-ui/core";
4206
+ import { useSchedule } from "@umriss-ui/schedule";
4207
+ import type { Milestone, ScheduleTooltipTarget, Subtask, Task } from "@umriss-ui/schedule";
4208
+
4209
+ const at = (hours: number, minutes = 0) => new Date(2026, 2, 17, hours, minutes).getTime();
4210
+
4211
+ const PROJECTS: readonly Task[] = [{ id: "portal", name: "Member portal", color: "light-dark(#2563eb, #6b9bff)" }];
4212
+
4213
+ const WORK: readonly Subtask[] = [
4214
+ { id: "build", task: "portal", lane: "arjun", from: at(7), to: at(12), name: "Build" },
4215
+ { id: "test", task: "portal", lane: "eva", from: at(12, 30), to: at(15), name: "Test" },
4216
+ ];
4217
+
4218
+ const MILESTONES: readonly Milestone[] = [{ id: "code-freeze", lane: "arjun", at: at(12), label: "Code freeze" }];
4219
+
4220
+ const time = (instant: number) => new Date(instant).toLocaleTimeString("en-GB", { hour: "2-digit", minute: "2-digit" });
4221
+
4222
+ function Own({ target }: { target: ScheduleTooltipTarget }) {
4223
+ if (target.kind === "dependency") return null;
4224
+ if (target.kind === "subtask") return <Text size="sm">{target.subtask.name}</Text>;
4225
+ return (
4226
+ <Stack gap={1}>
4227
+ <Text size="sm" weight="semibold">
4228
+ {target.milestone.label ?? target.milestone.id}
4229
+ </Text>
4230
+ <Text size="xs" tone="secondary">
4231
+ Test may begin from {time(target.milestone.at)}
4232
+ </Text>
4233
+ </Stack>
4234
+ );
4235
+ }
4236
+
4237
+ export default function SayWhatAMilestoneIs() {
4238
+ const { Schedule, Lane, Subtasks, Milestones } = useSchedule({ initialView: { domain: [at(6, 30), at(15, 30)] } });
4239
+ return (
4240
+ <Schedule ariaLabel="Build and test around the code freeze" height={150} tooltip={(target) => <Own target={target} />}>
4241
+ <Lane id="arjun" label="Arjun Mehta" />
4242
+ <Lane id="eva" label="Eva Novak" />
4243
+ <Subtasks data={WORK} tasks={PROJECTS} />
4244
+ <Milestones data={MILESTONES} />
4245
+ </Schedule>
4246
+ );
4247
+ }
4248
+ ```
4249
+
4250
+ #### When to use something else
4251
+
4252
+ - Time a lane is not available, as a span → Blocked time
4253
+
4254
+ #### Keyboard
4255
+
4256
+ The keys of [First schedule](#/schedule/keyboard-schedule) apply here.
4257
+
4258
+ #### API
4259
+
4260
+ ##### `MilestonesProps`
4261
+
4262
+ | Prop | Type | Default | Description |
4263
+ |---|---|---|---|
4264
+ | `data` *required* | `readonly `[`Milestone`](#type-Milestone)`[]` | — | The milestones of the lanes, as the caller holds them: one list, each naming its lane and the instant it stands at.<br>Shown in: [Mark a handover and a release](#/milestones/handovers-and-releases), [Say what a milestone is in your own tooltip](#/milestones/say-what-a-milestone-is) |
4265
+
4266
+ ##### `Milestone`
4267
+
4268
+ | Prop | Type | Default | Description |
4269
+ |---|---|---|---|
4270
+ | `id` *required* | `string` | — | The caller's identity of the milestone.<br>Shown in: [Mark a handover and a release](#/milestones/handovers-and-releases), [Say what a milestone is in your own tooltip](#/milestones/say-what-a-milestone-is) |
4271
+ | `lane` *required* | `string` | — | The id of the lane it stands on.<br>Shown in: [Mark a handover and a release](#/milestones/handovers-and-releases), [Say what a milestone is in your own tooltip](#/milestones/say-what-a-milestone-is) |
4272
+ | `at` *required* | `number` | — | The instant it stands at.<br>Shown in: [Mark a handover and a release](#/milestones/handovers-and-releases), [Say what a milestone is in your own tooltip](#/milestones/say-what-a-milestone-is) |
4273
+ | `label` | `string` | — | What it is called, where the schedule names it; without it, its id.<br>Shown in: [Mark a handover and a release](#/milestones/handovers-and-releases), [Say what a milestone is in your own tooltip](#/milestones/say-what-a-milestone-is) |
4274
+
4129
4275
  ### Now line
4130
4276
 
4131
4277
  A line across the lanes at the present moment, so that whatever should have happened by now stands to its left. It follows the clock, or stays at a fixed instant for a replay.
@@ -5013,6 +5159,7 @@ What a pointer is on.
5013
5159
  type ScheduleHit =
5014
5160
  | { readonly kind: "subtask"; readonly subtask: Subtask; readonly part: "leadIn" | "main" | "leadOut" }
5015
5161
  | { readonly kind: "dependency"; readonly dependency: Dependency }
5162
+ | { readonly kind: "milestone"; readonly milestone: Milestone }
5016
5163
  | { readonly kind: "lane"; readonly lane: string }
5017
5164
  | { readonly kind: "nothing" };
5018
5165
  ```
@@ -5125,8 +5272,9 @@ const LOADS: Record<string, string> = {
5125
5272
  };
5126
5273
 
5127
5274
  function LoadTooltip({ target }: { target: ScheduleTooltipTarget }) {
5128
- const task = target.task;
5129
- const found = target.kind === "subtask" ? target.overlapping.length + target.violatedDependencies.length : target.violated ? 1 : 0;
5275
+ const task = target.kind === "milestone" ? undefined : target.task;
5276
+ const found =
5277
+ target.kind === "subtask" ? target.overlapping.length + target.violatedDependencies.length : target.kind === "dependency" && target.violated ? 1 : 0;
5130
5278
  return (
5131
5279
  <Stack gap={1}>
5132
5280
  <Text size="sm" weight="semibold">
@@ -5343,6 +5491,7 @@ function Covers({ target }: { target: ScheduleTooltipTarget }) {
5343
5491
  </Stack>
5344
5492
  );
5345
5493
  }
5494
+ if (target.kind === "milestone") return null;
5346
5495
  return (
5347
5496
  <Stack gap={1}>
5348
5497
  <Text size="sm" weight="semibold">
@@ -5385,12 +5534,13 @@ The keys of [First schedule](#/schedule/keyboard-schedule) apply here.
5385
5534
 
5386
5535
  | Prop | Type | Default | Description |
5387
5536
  |---|---|---|---|
5388
- | `kind` *required* | `"subtask" \| "dependency"` | — | A subtask is hovered. A dependency is hovered.<br>Shown in: [Write your own tooltip content](#/tooltip/own-tooltip), [Say what a bar covers and a line joins](#/tooltip/say-what-a-bar-covers-and-a-line-joins) |
5389
- | `subtask` | [`Subtask`](#/subtasks/type-Subtask) | — | The hovered subtask.<br>Shown in: [Say what a bar covers and a line joins](#/tooltip/say-what-a-bar-covers-and-a-line-joins) |
5390
- | `task` *required* | [`Task`](#/subtasks/type-Task)` \| undefined` | — | Its task, where the tasks name it.<br>Shown in: [Write your own tooltip content](#/tooltip/own-tooltip) |
5537
+ | `kind` *required* | `"subtask" \| "milestone" \| "dependency"` | — | A subtask is hovered. A milestone is hovered. A dependency is hovered.<br>Shown in: [Write your own tooltip content](#/tooltip/own-tooltip), [Say what a bar covers and a line joins](#/tooltip/say-what-a-bar-covers-and-a-line-joins), [Say what a milestone is in your own tooltip (Milestones)](#/milestones/say-what-a-milestone-is) |
5538
+ | `subtask` | [`Subtask`](#/subtasks/type-Subtask) | — | The hovered subtask.<br>Shown in: [Say what a bar covers and a line joins](#/tooltip/say-what-a-bar-covers-and-a-line-joins), [Say what a milestone is in your own tooltip (Milestones)](#/milestones/say-what-a-milestone-is) |
5539
+ | `task` | [`Task`](#/subtasks/type-Task)` \| undefined` | — | Its task, where the tasks name it.<br>Shown in: [Write your own tooltip content](#/tooltip/own-tooltip) |
5391
5540
  | `overlapping` | `readonly `[`Subtask`](#/subtasks/type-Subtask)`[]` | — | The subtasks it overlaps with on its lane.<br>Shown in: [Write your own tooltip content](#/tooltip/own-tooltip) |
5392
5541
  | `violatedDependencies` | `readonly `[`ViolatedDependency`](#/findings/type-ViolatedDependency)`[]` | — | The violated dependencies leaving or reaching it.<br>Shown in: [Write your own tooltip content](#/tooltip/own-tooltip) |
5393
5542
  | `blocked` | `readonly `[`BlockedTime`](#/blocked-time/type-BlockedTime)`[]` | — | The blocked time it covers on its lane.<br>Shown in: [Say what a bar covers and a line joins](#/tooltip/say-what-a-bar-covers-and-a-line-joins) |
5543
+ | `milestone` | [`Milestone`](#/milestones/type-Milestone) | — | The hovered milestone.<br>Shown in: [Say what a milestone is in your own tooltip (Milestones)](#/milestones/say-what-a-milestone-is) |
5394
5544
  | `dependency` | [`Dependency`](#/dependencies/type-Dependency) | — | The hovered dependency.<br>Shown in: [Say what a bar covers and a line joins](#/tooltip/say-what-a-bar-covers-and-a-line-joins) |
5395
5545
  | `from` | [`Subtask`](#/subtasks/type-Subtask)` \| undefined` | — | The subtask it leaves.<br>Shown in: [Say what a bar covers and a line joins](#/tooltip/say-what-a-bar-covers-and-a-line-joins) |
5396
5546
  | `to` | [`Subtask`](#/subtasks/type-Subtask)` \| undefined` | — | The subtask it reaches.<br>Shown in: [Say what a bar covers and a line joins](#/tooltip/say-what-a-bar-covers-and-a-line-joins) |
@@ -5527,7 +5677,7 @@ The keys of [First schedule](#/schedule/keyboard-schedule) apply here.
5527
5677
 
5528
5678
  | Prop | Type | Default | Description |
5529
5679
  |---|---|---|---|
5530
- | `initialView` | [`ScheduleView`](#type-ScheduleView) | — | The view to start from, and to go to whenever one differing in content from the last is handed in - the same view again changes nothing, and what it leaves out is reset; one the schedule reported itself, handed back late, is its own state coming back and not gone to. The schedule remembers none: where a view is kept is the application's decision.<br>Shown in: [Keep and restore a view](#/view/keep-and-restore), [The smallest schedule (Installation)](#/installation/smallest-schedule), [A day of tours (First schedule)](#/schedule/first-schedule) and 75 more |
5680
+ | `initialView` | [`ScheduleView`](#type-ScheduleView) | — | The view to start from, and to go to whenever one differing in content from the last is handed in - the same view again changes nothing, and what it leaves out is reset; one the schedule reported itself, handed back late, is its own state coming back and not gone to. The schedule remembers none: where a view is kept is the application's decision.<br>Shown in: [Keep and restore a view](#/view/keep-and-restore), [The smallest schedule (Installation)](#/installation/smallest-schedule), [A day of tours (First schedule)](#/schedule/first-schedule) and 77 more |
5531
5681
 
5532
5682
  ###### Events
5533
5683
 
@@ -5539,7 +5689,7 @@ The keys of [First schedule](#/schedule/keyboard-schedule) apply here.
5539
5689
 
5540
5690
  | Prop | Type | Default | Description |
5541
5691
  |---|---|---|---|
5542
- | `domain` | `readonly [number, number]` | — | The span in view, as two wall-clock instants. Absent, the schedule shows the extent of its subtasks, within `zoomLimits`.<br>Shown in: [Keep and restore a view](#/view/keep-and-restore), [The smallest schedule (Installation)](#/installation/smallest-schedule), [A day of tours (First schedule)](#/schedule/first-schedule) and 75 more |
5692
+ | `domain` | `readonly [number, number]` | — | The span in view, as two wall-clock instants. Absent, the schedule shows the extent of its subtasks, within `zoomLimits`.<br>Shown in: [Keep and restore a view](#/view/keep-and-restore), [The smallest schedule (Installation)](#/installation/smallest-schedule), [A day of tours (First schedule)](#/schedule/first-schedule) and 77 more |
5543
5693
  | `folded` | `readonly string[]` | — | The **Lane group**s that are folded, by id. An id no group carries falls out. A folded outer group hides the inner ones without their ids leaving the list, so unfolding it gives back the view that was there.<br>Shown in: [Fold groups from outside (Lane groups)](#/lane-groups/fold-from-outside), [Read a folded group (Lane groups)](#/lane-groups/the-miniature), [Start with groups folded (Lane groups)](#/lane-groups/start-with-groups-folded) |
5544
5694
 
5545
5695
  ### Linked schedules
@@ -7996,7 +8146,7 @@ Demo page: https://romanhaendler.github.io/umriss-ui/schedule/api/
7996
8146
  ##### `useSchedule`
7997
8147
 
7998
8148
  Declares a schedule: hands back `Schedule` and the parts declared inside it
7999
- - `Lane`, `LaneGroup`, `Subtasks`, `Dependencies`, `BlockedTimes` -, its
8149
+ - `Lane`, `LaneGroup`, `Subtasks`, `Dependencies`, `BlockedTimes`, `Milestones` -, its
8000
8150
  `view` and the setters `setDomain`, `toggleGroup`, `foldAll` and
8001
8151
  `unfoldAll`. A ref on `Schedule` still gives the `ScheduleHandle`.
8002
8152
 
@@ -8004,7 +8154,7 @@ Declares a schedule: hands back `Schedule` and the parts declared inside it
8004
8154
  function useSchedule(options?: ScheduleOptions): ScheduleParts;
8005
8155
  ```
8006
8156
 
8007
- Used on [Scenarios](#/), [Installation](#/installation), [First schedule](#/schedule), [Lanes](#/lane), [Lane groups](#/lane-groups), [Subtasks](#/subtasks), [Bar labels](#/bar-labels), [Appearances](#/appearances), [Overlap](#/overlap), [Dependencies](#/dependencies), [Routes](#/routes), [Time axis and calendar](#/time-axis), [Blocked time](#/blocked-time), [Now line](#/now-line), [Pan and zoom](#/pan-and-zoom), [Selection](#/selection), [Interactions](#/interactions), [Tooltip](#/tooltip), [View](#/view), [Linked schedules](#/linked-schedules), [The handle](#/handle), [Findings as data](#/findings), [Move and lane](#/move-and-lane), [Stretch, lead-in, lead-out](#/stretch), [Snapping](#/snapping), [Placing from outside](#/placing), [Where a subtask may go](#/where-it-may-go) and [Ripple](#/ripple).
8157
+ Used on [Scenarios](#/), [Installation](#/installation), [First schedule](#/schedule), [Lanes](#/lane), [Lane groups](#/lane-groups), [Subtasks](#/subtasks), [Bar labels](#/bar-labels), [Appearances](#/appearances), [Overlap](#/overlap), [Dependencies](#/dependencies), [Routes](#/routes), [Time axis and calendar](#/time-axis), [Blocked time](#/blocked-time), [Milestones](#/milestones), [Now line](#/now-line), [Pan and zoom](#/pan-and-zoom), [Selection](#/selection), [Interactions](#/interactions), [Tooltip](#/tooltip), [View](#/view), [Linked schedules](#/linked-schedules), [The handle](#/handle), [Findings as data](#/findings), [Move and lane](#/move-and-lane), [Stretch, lead-in, lead-out](#/stretch), [Snapping](#/snapping), [Placing from outside](#/placing), [Where a subtask may go](#/where-it-may-go) and [Ripple](#/ripple).
8008
8158
 
8009
8159
  #### Functions
8010
8160
 
@@ -8295,6 +8445,16 @@ Change the lead-out on its own.
8295
8445
  | `subtask` *required* | `string` | — | The id of the subtask.<br>Shown in: [Read a folded group (Lane groups)](#/lane-groups/the-miniature), [Plan work around someone's leave (Blocked time)](#/blocked-time/drag-around), [Refuse a move that double-books someone (Move and lane)](#/move-and-lane/refuse-a-double-booking) and 4 more |
8296
8446
  | `leadOut` *required* | `number` | — | The new duration of the lead-out. |
8297
8447
 
8448
+ ##### `Milestone`
8449
+
8450
+ Its table stands on [Milestones](#/milestones/type-Milestone).
8451
+
8452
+ Used on [Milestones](#/milestones).
8453
+
8454
+ ##### `MilestonesProps`
8455
+
8456
+ Its table stands on [Milestones](#/milestones/type-MilestonesProps).
8457
+
8298
8458
  ##### `MoveIntent`
8299
8459
 
8300
8460
  Move the subtask in time: the main time keeps its length.
@@ -8383,6 +8543,7 @@ What a pointer is on.
8383
8543
  type ScheduleHit =
8384
8544
  | { readonly kind: "subtask"; readonly subtask: Subtask; readonly part: "leadIn" | "main" | "leadOut" }
8385
8545
  | { readonly kind: "dependency"; readonly dependency: Dependency }
8546
+ | { readonly kind: "milestone"; readonly milestone: Milestone }
8386
8547
  | { readonly kind: "lane"; readonly lane: string }
8387
8548
  | { readonly kind: "nothing" };
8388
8549
  ```
@@ -8404,12 +8565,13 @@ it, its view and the setters that change it.
8404
8565
 
8405
8566
  | Prop | Type | Default | Description |
8406
8567
  |---|---|---|---|
8407
- | `Schedule` *required* | `ForwardRefExoticComponent<`[`ScheduleProps`](#/schedule/type-ScheduleProps)` & RefAttributes<`[`ScheduleHandle`](#type-ScheduleHandle)`>>` | — | The schedule. One per `useSchedule`: a second schedule is a second call.<br>Shown in: [The smallest schedule (Installation)](#/installation/smallest-schedule), [A day of tours (First schedule)](#/schedule/first-schedule), [Start from an empty plan (First schedule)](#/schedule/no-work-yet) and 75 more |
8408
- | `Lane` *required* | `typeof Lane` | — | <br>Shown in: [The smallest schedule (Installation)](#/installation/smallest-schedule), [A day of tours (First schedule)](#/schedule/first-schedule), [Start from an empty plan (First schedule)](#/schedule/no-work-yet) and 75 more |
8568
+ | `Schedule` *required* | `ForwardRefExoticComponent<`[`ScheduleProps`](#/schedule/type-ScheduleProps)` & RefAttributes<`[`ScheduleHandle`](#type-ScheduleHandle)`>>` | — | The schedule. One per `useSchedule`: a second schedule is a second call.<br>Shown in: [The smallest schedule (Installation)](#/installation/smallest-schedule), [A day of tours (First schedule)](#/schedule/first-schedule), [Start from an empty plan (First schedule)](#/schedule/no-work-yet) and 77 more |
8569
+ | `Lane` *required* | `typeof Lane` | — | <br>Shown in: [The smallest schedule (Installation)](#/installation/smallest-schedule), [A day of tours (First schedule)](#/schedule/first-schedule), [Start from an empty plan (First schedule)](#/schedule/no-work-yet) and 77 more |
8409
8570
  | `LaneGroup` *required* | `typeof LaneGroup` | — | <br>Shown in: [Group lanes under a head (Lane groups)](#/lane-groups/a-group), [Nest groups to any depth (Lane groups)](#/lane-groups/nesting), [Fold groups from outside (Lane groups)](#/lane-groups/fold-from-outside) and 5 more |
8410
- | `Subtasks` *required* | `typeof Subtasks` | — | <br>Shown in: [The smallest schedule (Installation)](#/installation/smallest-schedule), [A day of tours (First schedule)](#/schedule/first-schedule), [Start from an empty plan (First schedule)](#/schedule/no-work-yet) and 75 more |
8571
+ | `Subtasks` *required* | `typeof Subtasks` | — | <br>Shown in: [The smallest schedule (Installation)](#/installation/smallest-schedule), [A day of tours (First schedule)](#/schedule/first-schedule), [Start from an empty plan (First schedule)](#/schedule/no-work-yet) and 77 more |
8411
8572
  | `Dependencies` *required* | `typeof Dependencies` | — | <br>Shown in: [The smallest schedule (Installation)](#/installation/smallest-schedule), [A day of tours (First schedule)](#/schedule/first-schedule), [Plan a day in the machine shop (First schedule)](#/schedule/machine-plan) and 27 more |
8412
8573
  | `BlockedTimes` *required* | `typeof BlockedTimes` | — | <br>Shown in: [Block out leave and maintenance (Blocked time)](#/blocked-time/leave), [Plan work around someone's leave (Blocked time)](#/blocked-time/drag-around), [Check a sprint against the leave calendar (Blocked time)](#/blocked-time/team-leave) and 5 more |
8574
+ | `Milestones` *required* | `typeof Milestones` | — | <br>Shown in: [Mark a handover and a release (Milestones)](#/milestones/handovers-and-releases), [Say what a milestone is in your own tooltip (Milestones)](#/milestones/say-what-a-milestone-is) |
8413
8575
  | `view` *required* | [`ScheduleView`](#/view/type-ScheduleView) | — | How the planner is looking at the plan: the span and the folded groups.<br>Shown in: [Fold groups from outside (Lane groups)](#/lane-groups/fold-from-outside), [Place a mark of your own (The handle)](#/handle/place-a-mark) |
8414
8576
  | `setDomain` *required* | `(span: readonly [number, number] \| null) => void` | — | Puts a span of two wall-clock instants in view; `null` shows the subtasks' extent.<br>Shown in: [Keep and restore a view (View)](#/view/keep-and-restore) |
8415
8577
  | `toggleGroup` *required* | `(id: string) => void` | — | Folds or unfolds one **Lane group**. |
@@ -8424,7 +8586,7 @@ Its table stands on [First schedule](#/schedule/type-ScheduleProps).
8424
8586
 
8425
8587
  Its table stands on [Tooltip](#/tooltip/type-ScheduleTooltipTarget).
8426
8588
 
8427
- Used on [Tooltip](#/tooltip).
8589
+ Used on [Milestones](#/milestones) and [Tooltip](#/tooltip).
8428
8590
 
8429
8591
  ##### `ScheduleView`
8430
8592
 
@@ -8458,7 +8620,7 @@ Stretch the main time at one or both of its edges.
8458
8620
 
8459
8621
  Its table stands on [Subtasks](#/subtasks/type-Subtask).
8460
8622
 
8461
- Used on [Scenarios](#/), [Installation](#/installation), [First schedule](#/schedule), [Lanes](#/lane), [Lane groups](#/lane-groups), [Subtasks](#/subtasks), [Bar labels](#/bar-labels), [Appearances](#/appearances), [Overlap](#/overlap), [Dependencies](#/dependencies), [Routes](#/routes), [Time axis and calendar](#/time-axis), [Blocked time](#/blocked-time), [Now line](#/now-line), [Pan and zoom](#/pan-and-zoom), [Selection](#/selection), [Interactions](#/interactions), [Tooltip](#/tooltip), [View](#/view), [Linked schedules](#/linked-schedules), [The handle](#/handle), [Findings as data](#/findings), [Move and lane](#/move-and-lane), [Stretch, lead-in, lead-out](#/stretch), [Snapping](#/snapping), [Placing from outside](#/placing), [Where a subtask may go](#/where-it-may-go) and [Ripple](#/ripple).
8623
+ Used on [Scenarios](#/), [Installation](#/installation), [First schedule](#/schedule), [Lanes](#/lane), [Lane groups](#/lane-groups), [Subtasks](#/subtasks), [Bar labels](#/bar-labels), [Appearances](#/appearances), [Overlap](#/overlap), [Dependencies](#/dependencies), [Routes](#/routes), [Time axis and calendar](#/time-axis), [Blocked time](#/blocked-time), [Milestones](#/milestones), [Now line](#/now-line), [Pan and zoom](#/pan-and-zoom), [Selection](#/selection), [Interactions](#/interactions), [Tooltip](#/tooltip), [View](#/view), [Linked schedules](#/linked-schedules), [The handle](#/handle), [Findings as data](#/findings), [Move and lane](#/move-and-lane), [Stretch, lead-in, lead-out](#/stretch), [Snapping](#/snapping), [Placing from outside](#/placing), [Where a subtask may go](#/where-it-may-go) and [Ripple](#/ripple).
8462
8624
 
8463
8625
  ##### `SubtaskAppearance`
8464
8626
 
@@ -8476,7 +8638,7 @@ Its table stands on [Subtasks](#/subtasks/type-SubtasksProps).
8476
8638
 
8477
8639
  Its table stands on [Subtasks](#/subtasks/type-Task).
8478
8640
 
8479
- Used on [Scenarios](#/), [Installation](#/installation), [First schedule](#/schedule), [Lanes](#/lane), [Lane groups](#/lane-groups), [Subtasks](#/subtasks), [Bar labels](#/bar-labels), [Appearances](#/appearances), [Overlap](#/overlap), [Dependencies](#/dependencies), [Routes](#/routes), [Time axis and calendar](#/time-axis), [Blocked time](#/blocked-time), [Now line](#/now-line), [Pan and zoom](#/pan-and-zoom), [Selection](#/selection), [Interactions](#/interactions), [Tooltip](#/tooltip), [View](#/view), [Linked schedules](#/linked-schedules), [The handle](#/handle), [Findings as data](#/findings), [Move and lane](#/move-and-lane), [Stretch, lead-in, lead-out](#/stretch), [Snapping](#/snapping), [Placing from outside](#/placing), [Where a subtask may go](#/where-it-may-go) and [Ripple](#/ripple).
8641
+ Used on [Scenarios](#/), [Installation](#/installation), [First schedule](#/schedule), [Lanes](#/lane), [Lane groups](#/lane-groups), [Subtasks](#/subtasks), [Bar labels](#/bar-labels), [Appearances](#/appearances), [Overlap](#/overlap), [Dependencies](#/dependencies), [Routes](#/routes), [Time axis and calendar](#/time-axis), [Blocked time](#/blocked-time), [Milestones](#/milestones), [Now line](#/now-line), [Pan and zoom](#/pan-and-zoom), [Selection](#/selection), [Interactions](#/interactions), [Tooltip](#/tooltip), [View](#/view), [Linked schedules](#/linked-schedules), [The handle](#/handle), [Findings as data](#/findings), [Move and lane](#/move-and-lane), [Stretch, lead-in, lead-out](#/stretch), [Snapping](#/snapping), [Placing from outside](#/placing), [Where a subtask may go](#/where-it-may-go) and [Ripple](#/ripple).
8480
8642
 
8481
8643
  ##### `ViolatedDependency`
8482
8644
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@umriss-ui/schedule",
3
- "version": "0.5.7",
3
+ "version": "0.6.0",
4
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",
@@ -50,8 +50,8 @@
50
50
  "peerDependencies": {
51
51
  "react": ">=18",
52
52
  "react-dom": ">=18",
53
- "@umriss-ui/charts": "^0.14.0",
54
- "@umriss-ui/core": "^0.30.0"
53
+ "@umriss-ui/charts": "^0.15.0",
54
+ "@umriss-ui/core": "^0.31.0"
55
55
  },
56
56
  "devDependencies": {
57
57
  "@fontsource/geist-mono": "^5.3.0",
@@ -65,9 +65,9 @@
65
65
  "typescript": "^5.6.3",
66
66
  "vite": "^6.0.0",
67
67
  "vite-plugin-dts": "^4.3.0",
68
- "@umriss-ui/charts": "0.14.0",
68
+ "@umriss-ui/charts": "0.15.0",
69
69
  "@umriss-ui/demo": "0.0.0",
70
- "@umriss-ui/core": "0.30.0"
70
+ "@umriss-ui/core": "0.31.0"
71
71
  },
72
72
  "scripts": {
73
73
  "props": "node --disable-warning=ExperimentalWarning --experimental-strip-types demo/props.ts",