# API index

> Package `@umriss-ui/schedule`, version 0.40.0. Demo page: <https://romanhaendler.github.io/umriss-ui/schedule/api/>. Every page in one line: [llms.txt](https://romanhaendler.github.io/umriss-ui/schedule/llms.txt); every page in full: [llms-full.txt](https://romanhaendler.github.io/umriss-ui/schedule/llms-full.txt).

Everything `@umriss-ui/schedule` exports, with its signature. A component's props stand on its own page.

Demo page: https://romanhaendler.github.io/umriss-ui/schedule/api/

## Hooks

### `useSchedule`

Declares a schedule: hands back `Schedule` and the parts declared inside it
- `Lane`, `LaneGroup`, `Subtasks`, `Dependencies`, `BlockedTimes`, `Milestones` -, its
`view` and the setters `setView`, `setDomain`, `toggleGroup`, `foldAll` and
`unfoldAll`. A ref on `Schedule` still gives the `ScheduleHandle`.

```ts
function useSchedule(options?: ScheduleOptions): ScheduleParts;
```

Used on [Scenarios](https://romanhaendler.github.io/umriss-ui/schedule/), [Installation](https://romanhaendler.github.io/umriss-ui/schedule/installation/), [First schedule](https://romanhaendler.github.io/umriss-ui/schedule/schedule/), [Lanes](https://romanhaendler.github.io/umriss-ui/schedule/lane/), [Lane groups](https://romanhaendler.github.io/umriss-ui/schedule/lane-groups/), [Subtasks](https://romanhaendler.github.io/umriss-ui/schedule/subtasks/), [Bar labels](https://romanhaendler.github.io/umriss-ui/schedule/bar-labels/), [Appearances](https://romanhaendler.github.io/umriss-ui/schedule/appearances/), [Overlap](https://romanhaendler.github.io/umriss-ui/schedule/overlap/), [Dependencies](https://romanhaendler.github.io/umriss-ui/schedule/dependencies/), [Routes](https://romanhaendler.github.io/umriss-ui/schedule/routes/), [Time axis and calendar](https://romanhaendler.github.io/umriss-ui/schedule/time-axis/), [Blocked time](https://romanhaendler.github.io/umriss-ui/schedule/blocked-time/), [Milestones](https://romanhaendler.github.io/umriss-ui/schedule/milestones/), [Now line](https://romanhaendler.github.io/umriss-ui/schedule/now-line/), [Pan and zoom](https://romanhaendler.github.io/umriss-ui/schedule/pan-and-zoom/), [Selection](https://romanhaendler.github.io/umriss-ui/schedule/selection/), [Interactions](https://romanhaendler.github.io/umriss-ui/schedule/interactions/), [Tooltip](https://romanhaendler.github.io/umriss-ui/schedule/tooltip/), [View](https://romanhaendler.github.io/umriss-ui/schedule/view/), [Linked schedules](https://romanhaendler.github.io/umriss-ui/schedule/linked-schedules/), [The handle](https://romanhaendler.github.io/umriss-ui/schedule/handle/), [Findings as data](https://romanhaendler.github.io/umriss-ui/schedule/findings/), [Move and lane](https://romanhaendler.github.io/umriss-ui/schedule/move-and-lane/), [Stretch, lead-in, lead-out](https://romanhaendler.github.io/umriss-ui/schedule/stretch/), [Snapping](https://romanhaendler.github.io/umriss-ui/schedule/snapping/), [Placing from outside](https://romanhaendler.github.io/umriss-ui/schedule/placing/), [Where a subtask may go](https://romanhaendler.github.io/umriss-ui/schedule/where-it-may-go/), [Ripple](https://romanhaendler.github.io/umriss-ui/schedule/ripple/) and [Benchmark](https://romanhaendler.github.io/umriss-ui/schedule/benchmark/).

## Functions

### `applyIntent`

The subtask as the intent asks for it. An intent for another subtask leaves
it as it is.

```ts
function applyIntent<S extends Subtask>(subtask: S, intent: Intent): S;
```

Used on [Scenarios](https://romanhaendler.github.io/umriss-ui/schedule/), [Lane groups](https://romanhaendler.github.io/umriss-ui/schedule/lane-groups/), [Time axis and calendar](https://romanhaendler.github.io/umriss-ui/schedule/time-axis/), [Blocked time](https://romanhaendler.github.io/umriss-ui/schedule/blocked-time/), [Interactions](https://romanhaendler.github.io/umriss-ui/schedule/interactions/), [Move and lane](https://romanhaendler.github.io/umriss-ui/schedule/move-and-lane/), [Stretch, lead-in, lead-out](https://romanhaendler.github.io/umriss-ui/schedule/stretch/), [Snapping](https://romanhaendler.github.io/umriss-ui/schedule/snapping/), [Placing from outside](https://romanhaendler.github.io/umriss-ui/schedule/placing/), [Where a subtask may go](https://romanhaendler.github.io/umriss-ui/schedule/where-it-may-go/) and [Ripple](https://romanhaendler.github.io/umriss-ui/schedule/ripple/).

### `arrival`

When a dependency has to have arrived at its subtask, by its anchor.

```ts
function arrival(dependency: Dependency, to: Subtask): number;
```

Used on [Scenarios](https://romanhaendler.github.io/umriss-ui/schedule/), [Now line](https://romanhaendler.github.io/umriss-ui/schedule/now-line/) and [Findings as data](https://romanhaendler.github.io/umriss-ui/schedule/findings/).

### `departure`

When a dependency leaves its subtask, by its anchor.

```ts
function departure(dependency: Dependency, from: Subtask): number;
```

Used on [Findings as data](https://romanhaendler.github.io/umriss-ui/schedule/findings/).

### `findings`

Every finding at once. Without blocked time there is none in it.

```ts
function findings(subtasks: readonly Subtask[], dependencies: readonly Dependency[], blocked?: readonly BlockedTime[]): Findings;
```

Used on [Scenarios](https://romanhaendler.github.io/umriss-ui/schedule/), [First schedule](https://romanhaendler.github.io/umriss-ui/schedule/schedule/), [Lane groups](https://romanhaendler.github.io/umriss-ui/schedule/lane-groups/), [Blocked time](https://romanhaendler.github.io/umriss-ui/schedule/blocked-time/), [Tooltip](https://romanhaendler.github.io/umriss-ui/schedule/tooltip/) and [Findings as data](https://romanhaendler.github.io/umriss-ui/schedule/findings/).

### `inBlockedTime`

Every subtask that covers blocked time on its lane, lead-in and lead-out
included - once per blocked interval it covers, in the order of the
subtasks. Touching at a shared edge is not covering.

```ts
function inBlockedTime(subtasks: readonly Subtask[], blocked: readonly BlockedTime[]): InBlockedTime[];
```

Used on [Scenarios](https://romanhaendler.github.io/umriss-ui/schedule/), [Blocked time](https://romanhaendler.github.io/umriss-ui/schedule/blocked-time/) and [Findings as data](https://romanhaendler.github.io/umriss-ui/schedule/findings/).

### `occupied`

The interval a subtask occupies on its lane: lead-in and lead-out included.

```ts
function occupied(subtask: Subtask): {
    from: number;
    to: number;
};
```

### `overlaps`

Every pair of subtasks that cover each other on a lane. Touching at a
shared edge is not covering, and a subtask that covers no time covers
nothing.

```ts
function overlaps(subtasks: readonly Subtask[]): Overlap[];
```

Used on [Scenarios](https://romanhaendler.github.io/umriss-ui/schedule/), [Lane groups](https://romanhaendler.github.io/umriss-ui/schedule/lane-groups/), [Findings as data](https://romanhaendler.github.io/umriss-ui/schedule/findings/) and [Move and lane](https://romanhaendler.github.io/umriss-ui/schedule/move-and-lane/).

### `resolveAppearance`

Settles a subtask's appearances into what is drawn. `provisional` and
`fixed` contradict each other; the later one in the list wins.

- `appearance` – The subtask's `appearance`, in the order it was given.
- Returns Which of the four channels are on.

```ts
function resolveAppearance(appearance: readonly SubtaskAppearance[] | undefined): ResolvedAppearance;
```

Used on [Appearances](https://romanhaendler.github.io/umriss-ui/schedule/appearances/).

### `ripple`

The moves that push every successor whose dependency no longer fits after
`intent` - transitively, in the order they were first pushed. The subtask the
intent is about is never moved, and a cycle among the successors ends after a
bounded number of pushes instead of running on.

```ts
function ripple(subtasks: readonly Subtask[], dependencies: readonly Dependency[], intent: Intent): MoveIntent[];
```

Used on [Scenarios](https://romanhaendler.github.io/umriss-ui/schedule/), [Dependencies](https://romanhaendler.github.io/umriss-ui/schedule/dependencies/) and [Ripple](https://romanhaendler.github.io/umriss-ui/schedule/ripple/).

### `shiftTask`

The moves that carry a whole task in time - every subtask of it by the same
amount, so that its lengths and the distances between its stops stay as
they were. The schedule never runs it: apply the moves like any other
intent, or run [`ripple`](https://romanhaendler.github.io/umriss-ui/schedule/api/#ripple) over them first.

- `subtasks` – All subtasks; only those of `task` are moved.
- `task` – The id of the task, as its subtasks name it in `task`.
- `by` – How far, in milliseconds; negative is earlier.
- Returns One move intent per subtask of the task - none where `by` is zero
or not finite.

```ts
function shiftTask(subtasks: readonly Subtask[], task: string, by: number): MoveIntent[];
```

Used on [Scenarios](https://romanhaendler.github.io/umriss-ui/schedule/) and [Ripple](https://romanhaendler.github.io/umriss-ui/schedule/ripple/).

### `snapTime`

`time` onto the nearest line of the raster in local time - a step alone
starts at local midnight. A step of zero or less is no raster: the time
stays as it is.

```ts
function snapTime(time: number, raster: number | SnapRaster): number;
```

Used on [Snapping](https://romanhaendler.github.io/umriss-ui/schedule/snapping/).

### `subtaskFromPlace`

The subtask a place intent asks for, under an id the caller chooses.

```ts
function subtaskFromPlace(intent: PlaceIntent, id: string): Subtask;
```

Used on [Placing from outside](https://romanhaendler.github.io/umriss-ui/schedule/placing/) and [Where a subtask may go](https://romanhaendler.github.io/umriss-ui/schedule/where-it-may-go/).

### `violatedDependencies`

Every dependency whose successor is to be reached before the predecessor's
departure plus the dependency's lag. A dependency naming a subtask that
is not in the data is passed over: there is nothing to judge.

```ts
function violatedDependencies(subtasks: readonly Subtask[], dependencies: readonly Dependency[]): ViolatedDependency[];
```

Used on [Scenarios](https://romanhaendler.github.io/umriss-ui/schedule/), [Lane groups](https://romanhaendler.github.io/umriss-ui/schedule/lane-groups/), [Tooltip](https://romanhaendler.github.io/umriss-ui/schedule/tooltip/) and [Findings as data](https://romanhaendler.github.io/umriss-ui/schedule/findings/).

## Types

### `BlockedTime`

Its table stands on [Blocked time](https://romanhaendler.github.io/umriss-ui/schedule/blocked-time/#type-BlockedTime).

Used on [Scenarios](https://romanhaendler.github.io/umriss-ui/schedule/), [Blocked time](https://romanhaendler.github.io/umriss-ui/schedule/blocked-time/), [Tooltip](https://romanhaendler.github.io/umriss-ui/schedule/tooltip/), [Findings as data](https://romanhaendler.github.io/umriss-ui/schedule/findings/) and [Where a subtask may go](https://romanhaendler.github.io/umriss-ui/schedule/where-it-may-go/).

### `BlockedTimesProps`

Its table stands on [Blocked time](https://romanhaendler.github.io/umriss-ui/schedule/blocked-time/#type-BlockedTimesProps).

### `DependenciesProps`

Its table stands on [Dependencies](https://romanhaendler.github.io/umriss-ui/schedule/dependencies/#type-DependenciesProps).

### `Dependency`

Its table stands on [Dependencies](https://romanhaendler.github.io/umriss-ui/schedule/dependencies/#type-Dependency).

Used on [Scenarios](https://romanhaendler.github.io/umriss-ui/schedule/), [Installation](https://romanhaendler.github.io/umriss-ui/schedule/installation/), [First schedule](https://romanhaendler.github.io/umriss-ui/schedule/schedule/), [Lane groups](https://romanhaendler.github.io/umriss-ui/schedule/lane-groups/), [Dependencies](https://romanhaendler.github.io/umriss-ui/schedule/dependencies/), [Routes](https://romanhaendler.github.io/umriss-ui/schedule/routes/), [Time axis and calendar](https://romanhaendler.github.io/umriss-ui/schedule/time-axis/), [Selection](https://romanhaendler.github.io/umriss-ui/schedule/selection/), [Interactions](https://romanhaendler.github.io/umriss-ui/schedule/interactions/), [Tooltip](https://romanhaendler.github.io/umriss-ui/schedule/tooltip/), [Findings as data](https://romanhaendler.github.io/umriss-ui/schedule/findings/), [Move and lane](https://romanhaendler.github.io/umriss-ui/schedule/move-and-lane/), [Placing from outside](https://romanhaendler.github.io/umriss-ui/schedule/placing/), [Ripple](https://romanhaendler.github.io/umriss-ui/schedule/ripple/) and [Benchmark](https://romanhaendler.github.io/umriss-ui/schedule/benchmark/).

### `DependencyAttachment`

Where on its bars a dependency's line attaches: the middle of both, or the
edge that faces the other stop - which is the shortest line between them.

Deliberately not called an anchor: a dependency already HAS two anchors
(`leaves`, `arrives`), and those decide what it connects and therefore
whether it is violated. This decides where the line touches, and nothing else.
The tree has an **Anchor** of its own as well (CONTEXT.md).

```ts
type DependencyAttachment = "centre" | "nearest";
```

Used on [Dependencies](https://romanhaendler.github.io/umriss-ui/schedule/dependencies/).

### `DependencyEnds`

Whether a dependency's two ends carry a dot. The dot says where the line is
anchored, which is worth saying while a plan is being read and is noise in a
plan full of short moves - so it is the caller's choice.

```ts
type DependencyEnds = "dot" | "none";
```

Used on [Dependencies](https://romanhaendler.github.io/umriss-ui/schedule/dependencies/).

### `DependencyRoute`

How a dependency is drawn between its two ends: a curve that leaves and
arrives forwards, a straight line, or axis-parallel segments.

```ts
type DependencyRoute = "curve" | "straight" | "orthogonal";
```

### `Findings`

Every kind of finding over the same data.

| Prop | Type | Default | Description |
|---|---|---|---|
| `overlaps` *required* | `readonly `[`Overlap`](https://romanhaendler.github.io/umriss-ui/schedule/findings/#type-Overlap)`[]` | — | <br>Shown in: [Read a folded group (Lane groups)](https://romanhaendler.github.io/umriss-ui/schedule/lane-groups/#the-miniature), [List the findings (Findings as data)](https://romanhaendler.github.io/umriss-ui/schedule/findings/#list-the-findings), [Say when there is nothing to fix (Findings as data)](https://romanhaendler.github.io/umriss-ui/schedule/findings/#nothing-to-fix) and 1 more |
| `violatedDependencies` *required* | `readonly `[`ViolatedDependency`](https://romanhaendler.github.io/umriss-ui/schedule/findings/#type-ViolatedDependency)`[]` | — | <br>Shown in: [Read a folded group (Lane groups)](https://romanhaendler.github.io/umriss-ui/schedule/lane-groups/#the-miniature), [List the findings (Findings as data)](https://romanhaendler.github.io/umriss-ui/schedule/findings/#list-the-findings), [Say when there is nothing to fix (Findings as data)](https://romanhaendler.github.io/umriss-ui/schedule/findings/#nothing-to-fix) and 1 more |
| `inBlockedTime` *required* | `readonly `[`InBlockedTime`](https://romanhaendler.github.io/umriss-ui/schedule/findings/#type-InBlockedTime)`[]` | — | <br>Shown in: [Block out leave and maintenance (Blocked time)](https://romanhaendler.github.io/umriss-ui/schedule/blocked-time/#leave), [Check a sprint against the leave calendar (Blocked time)](https://romanhaendler.github.io/umriss-ui/schedule/blocked-time/#team-leave), [List the findings (Findings as data)](https://romanhaendler.github.io/umriss-ui/schedule/findings/#list-the-findings) and 3 more |

### `InBlockedTime`

Its table stands on [Findings as data](https://romanhaendler.github.io/umriss-ui/schedule/findings/#type-InBlockedTime).

### `Intent`

What the schedule reports when an interaction asks for a change. Every
intent carries the values it asks for, not a difference: two intents of one
drop - a move and a lane - give the same data in either order.

```ts
type Intent = MoveIntent | StretchIntent | LeadInIntent | LeadOutIntent | LaneIntent | PlaceIntent;
```

Used on [Scenarios](https://romanhaendler.github.io/umriss-ui/schedule/), [Blocked time](https://romanhaendler.github.io/umriss-ui/schedule/blocked-time/), [Move and lane](https://romanhaendler.github.io/umriss-ui/schedule/move-and-lane/), [Placing from outside](https://romanhaendler.github.io/umriss-ui/schedule/placing/), [Where a subtask may go](https://romanhaendler.github.io/umriss-ui/schedule/where-it-may-go/) and [Ripple](https://romanhaendler.github.io/umriss-ui/schedule/ripple/).

### `IntentKind`

The names of the intents - the editing API of the schedule.

```ts
type IntentKind = Intent["kind"];
```

### `LaneGroupProps`

Its table stands on [Lane groups](https://romanhaendler.github.io/umriss-ui/schedule/lane-groups/#type-LaneGroupProps).

### `LaneIntent`

Put the subtask on another lane.

| Prop | Type | Default | Description |
|---|---|---|---|
| `kind` *required* | `"lane"` | — | <br>Shown in: [Read a folded group (Lane groups)](https://romanhaendler.github.io/umriss-ui/schedule/lane-groups/#the-miniature), [Plan work around someone's leave (Blocked time)](https://romanhaendler.github.io/umriss-ui/schedule/blocked-time/#drag-around), [Refuse a move that double-books someone (Move and lane)](https://romanhaendler.github.io/umriss-ui/schedule/move-and-lane/#refuse-a-double-booking) and 7 more |
| `subtask` *required* | `string` | — | The id of the subtask.<br>Shown in: [Read a folded group (Lane groups)](https://romanhaendler.github.io/umriss-ui/schedule/lane-groups/#the-miniature), [Plan work around someone's leave (Blocked time)](https://romanhaendler.github.io/umriss-ui/schedule/blocked-time/#drag-around), [Refuse a move that double-books someone (Move and lane)](https://romanhaendler.github.io/umriss-ui/schedule/move-and-lane/#refuse-a-double-booking) and 4 more |
| `lane` *required* | `string` | — | The id of the new lane. |

### `LaneProps`

Its table stands on [Lanes](https://romanhaendler.github.io/umriss-ui/schedule/lane/#type-LaneProps).

### `LeadInIntent`

Change the lead-in on its own.

| Prop | Type | Default | Description |
|---|---|---|---|
| `kind` *required* | `"leadIn"` | — | <br>Shown in: [Read a folded group (Lane groups)](https://romanhaendler.github.io/umriss-ui/schedule/lane-groups/#the-miniature), [Plan work around someone's leave (Blocked time)](https://romanhaendler.github.io/umriss-ui/schedule/blocked-time/#drag-around), [Refuse a move that double-books someone (Move and lane)](https://romanhaendler.github.io/umriss-ui/schedule/move-and-lane/#refuse-a-double-booking) and 7 more |
| `subtask` *required* | `string` | — | The id of the subtask.<br>Shown in: [Read a folded group (Lane groups)](https://romanhaendler.github.io/umriss-ui/schedule/lane-groups/#the-miniature), [Plan work around someone's leave (Blocked time)](https://romanhaendler.github.io/umriss-ui/schedule/blocked-time/#drag-around), [Refuse a move that double-books someone (Move and lane)](https://romanhaendler.github.io/umriss-ui/schedule/move-and-lane/#refuse-a-double-booking) and 4 more |
| `leadIn` *required* | `number` | — | The new duration of the lead-in.<br>Shown in: [Replan the day on the line (Scenarios)](https://romanhaendler.github.io/umriss-ui/schedule/#replan-the-day-on-the-line) |

### `LeadOutIntent`

Change the lead-out on its own.

| Prop | Type | Default | Description |
|---|---|---|---|
| `kind` *required* | `"leadOut"` | — | <br>Shown in: [Read a folded group (Lane groups)](https://romanhaendler.github.io/umriss-ui/schedule/lane-groups/#the-miniature), [Plan work around someone's leave (Blocked time)](https://romanhaendler.github.io/umriss-ui/schedule/blocked-time/#drag-around), [Refuse a move that double-books someone (Move and lane)](https://romanhaendler.github.io/umriss-ui/schedule/move-and-lane/#refuse-a-double-booking) and 7 more |
| `subtask` *required* | `string` | — | The id of the subtask.<br>Shown in: [Read a folded group (Lane groups)](https://romanhaendler.github.io/umriss-ui/schedule/lane-groups/#the-miniature), [Plan work around someone's leave (Blocked time)](https://romanhaendler.github.io/umriss-ui/schedule/blocked-time/#drag-around), [Refuse a move that double-books someone (Move and lane)](https://romanhaendler.github.io/umriss-ui/schedule/move-and-lane/#refuse-a-double-booking) and 4 more |
| `leadOut` *required* | `number` | — | The new duration of the lead-out. |

### `Milestone`

Its table stands on [Milestones](https://romanhaendler.github.io/umriss-ui/schedule/milestones/#type-Milestone).

Used on [Milestones](https://romanhaendler.github.io/umriss-ui/schedule/milestones/).

### `MilestonesProps`

Its table stands on [Milestones](https://romanhaendler.github.io/umriss-ui/schedule/milestones/#type-MilestonesProps).

### `MoveIntent`

Move the subtask in time: the main time keeps its length.

| Prop | Type | Default | Description |
|---|---|---|---|
| `kind` *required* | `"move"` | — | <br>Shown in: [Read a folded group (Lane groups)](https://romanhaendler.github.io/umriss-ui/schedule/lane-groups/#the-miniature), [Plan work around someone's leave (Blocked time)](https://romanhaendler.github.io/umriss-ui/schedule/blocked-time/#drag-around), [Refuse a move that double-books someone (Move and lane)](https://romanhaendler.github.io/umriss-ui/schedule/move-and-lane/#refuse-a-double-booking) and 8 more |
| `subtask` *required* | `string` | — | The id of the subtask.<br>Shown in: [Read a folded group (Lane groups)](https://romanhaendler.github.io/umriss-ui/schedule/lane-groups/#the-miniature), [Plan work around someone's leave (Blocked time)](https://romanhaendler.github.io/umriss-ui/schedule/blocked-time/#drag-around), [Refuse a move that double-books someone (Move and lane)](https://romanhaendler.github.io/umriss-ui/schedule/move-and-lane/#refuse-a-double-booking) and 5 more |
| `from` *required* | `number` | — | The new start of the main time.<br>Shown in: [Push the later stops of a tour (Ripple)](https://romanhaendler.github.io/umriss-ui/schedule/ripple/#push-the-later-stops), [Replan the day on the line (Scenarios)](https://romanhaendler.github.io/umriss-ui/schedule/#replan-the-day-on-the-line) |
| `to` *required* | `number` | — | The new end of the main time.<br>Shown in: [Push the later stops of a tour (Ripple)](https://romanhaendler.github.io/umriss-ui/schedule/ripple/#push-the-later-stops), [Replan the day on the line (Scenarios)](https://romanhaendler.github.io/umriss-ui/schedule/#replan-the-day-on-the-line) |

Used on [Ripple](https://romanhaendler.github.io/umriss-ui/schedule/ripple/).

### `Overlap`

Its table stands on [Findings as data](https://romanhaendler.github.io/umriss-ui/schedule/findings/#type-Overlap).

### `PlaceIntent`

Put work on the plan that was not on it: the answer to a drag from outside
the schedule. It carries no subtask id - there is
no subtask yet; the caller creates one, with its own identity, from
`subtaskFromPlace`.

| Prop | Type | Default | Description |
|---|---|---|---|
| `kind` *required* | `"place"` | — | <br>Shown in: [Read a folded group (Lane groups)](https://romanhaendler.github.io/umriss-ui/schedule/lane-groups/#the-miniature), [Plan work around someone's leave (Blocked time)](https://romanhaendler.github.io/umriss-ui/schedule/blocked-time/#drag-around), [Refuse a move that double-books someone (Move and lane)](https://romanhaendler.github.io/umriss-ui/schedule/move-and-lane/#refuse-a-double-booking) and 7 more |
| `item` *required* | `string` | — | The caller's key for the dragged item, as it declared it while dragging.<br>Shown in: [Drag work in from the backlog (Placing from outside)](https://romanhaendler.github.io/umriss-ui/schedule/placing/#drag-from-the-backlog), [Apply the same rule to work dragged in (Where a subtask may go)](https://romanhaendler.github.io/umriss-ui/schedule/where-it-may-go/#dragged-in), [Replan the day on the line (Scenarios)](https://romanhaendler.github.io/umriss-ui/schedule/#replan-the-day-on-the-line) |
| `task` *required* | `string` | — | The task the work belongs to. |
| `lane` *required* | `string` | — | The lane it was dropped on.<br>Shown in: [Drag work in from the backlog (Placing from outside)](https://romanhaendler.github.io/umriss-ui/schedule/placing/#drag-from-the-backlog), [Apply the same rule to work dragged in (Where a subtask may go)](https://romanhaendler.github.io/umriss-ui/schedule/where-it-may-go/#dragged-in) |
| `from` *required* | `number` | — | Where its main time would start. |
| `to` *required* | `number` | — | Where its main time would end. |
| `leadIn` | `number` | — | The lead-in it was declared with. |
| `leadOut` | `number` | — | The lead-out it was declared with. |

### `PlacingItem`

What the application says it is dragging in, while it drags it: the
browser hands over the dragged data only on the drop, so the ghost before
the drop can only come from the caller.

| Prop | Type | Default | Description |
|---|---|---|---|
| `item` *required* | `string` | — | The caller's key for the dragged item; it comes back in the intent.<br>Shown in: [Drag work in from the backlog (Placing from outside)](https://romanhaendler.github.io/umriss-ui/schedule/placing/#drag-from-the-backlog), [Apply the same rule to work dragged in (Where a subtask may go)](https://romanhaendler.github.io/umriss-ui/schedule/where-it-may-go/#dragged-in) |
| `task` *required* | `string` | — | The task the work belongs to.<br>Shown in: [Drag work in from the backlog (Placing from outside)](https://romanhaendler.github.io/umriss-ui/schedule/placing/#drag-from-the-backlog), [Apply the same rule to work dragged in (Where a subtask may go)](https://romanhaendler.github.io/umriss-ui/schedule/where-it-may-go/#dragged-in) |
| `duration` *required* | `number` | — | How long its main time is.<br>Shown in: [Drag work in from the backlog (Placing from outside)](https://romanhaendler.github.io/umriss-ui/schedule/placing/#drag-from-the-backlog), [Apply the same rule to work dragged in (Where a subtask may go)](https://romanhaendler.github.io/umriss-ui/schedule/where-it-may-go/#dragged-in) |
| `leadIn` | `number` | — | The lead-in it brings. |
| `leadOut` | `number` | — | The lead-out it brings. |

Used on [Placing from outside](https://romanhaendler.github.io/umriss-ui/schedule/placing/) and [Where a subtask may go](https://romanhaendler.github.io/umriss-ui/schedule/where-it-may-go/).

### `ResolvedAppearance`

What the drawing needs to know, with the contradiction already settled.

Two of the field names (`dashed`, `hatched`) are older than the drawing;
the channel each one owns stands beside it.

| Prop | Type | Default | Description |
|---|---|---|---|
| `dashed` *required* | `boolean` | — | `provisional`: the FILL - none at all, so the surface shows through, with a dashed outline in the task colour. Planned, not released. |
| `hatched` *required* | `boolean` | — | `fixed`: the ENDS - a cap at each end of the main time. Not a hatch: a hatch says "not available" of a refused lane. The field keeps the name `hatched`. |
| `muted` *required* | `boolean` | — | `muted`: the SATURATION - the task colour mixed half into the surface, opaque and at full height. Another team's, another crew's. |
| `open` *required* | `boolean` | — | `open`: the FADE, where the bar passes the edge of the view. It goes on past what is drawn. |

### `ScheduleHandle`

What a schedule offers a caller imperatively: the arithmetic between a
point on the screen and a time on a lane. Everything else is props.

| Prop | Type | Default | Description |
|---|---|---|---|
| `positionAt` *required* | `(clientX: number, clientY: number) => { time: number; lane: string \| null } \| null` | — | The time and the lane at a client point, or null outside the plot.<br>Shown in: [Place a mark of your own (The handle)](https://romanhaendler.github.io/umriss-ui/schedule/handle/#place-a-mark) |
| `clientPointOf` *required* | `(time: number, lane?: string) => { x: number; y: number } \| null` | — | The client point of a time - on the middle of a lane where one is named - or null while the schedule is not on screen.<br>Shown in: [Place a mark of your own (The handle)](https://romanhaendler.github.io/umriss-ui/schedule/handle/#place-a-mark) |
| `visibleDomain` *required* | `() => readonly [number, number]` | — | The visible span, as two wall-clock instants. |

Used on [The handle](https://romanhaendler.github.io/umriss-ui/schedule/handle/).

### `ScheduleHit`

What a pointer is on.

```ts
type ScheduleHit =
  | { readonly kind: "subtask"; readonly subtask: Subtask; readonly part: "leadIn" | "main" | "leadOut" }
  | { readonly kind: "dependency"; readonly dependency: Dependency }
  | { readonly kind: "milestone"; readonly milestone: Milestone }
  | { readonly kind: "lane"; readonly lane: string }
  | { readonly kind: "nothing" };
```

### `ScheduleInteraction`

Its table stands on [Interactions](https://romanhaendler.github.io/umriss-ui/schedule/interactions/#type-ScheduleInteraction).

Used on [Scenarios](https://romanhaendler.github.io/umriss-ui/schedule/), [Interactions](https://romanhaendler.github.io/umriss-ui/schedule/interactions/), [Tooltip](https://romanhaendler.github.io/umriss-ui/schedule/tooltip/) and [Benchmark](https://romanhaendler.github.io/umriss-ui/schedule/benchmark/).

### `ScheduleOptions`

Its table stands on [View](https://romanhaendler.github.io/umriss-ui/schedule/view/#type-ScheduleOptions).

### `ScheduleParts`

What `useSchedule` hands back: the schedule and what is declared inside
it, its view and the setters that change it.

| Prop | Type | Default | Description |
|---|---|---|---|
| `Schedule` *required* | `(props: `[`ScheduleProps`](https://romanhaendler.github.io/umriss-ui/schedule/schedule/#type-ScheduleProps)`) => ReactNode` | — | The schedule. One per `useSchedule`: a second schedule is a second call.<br>Shown in: [The smallest schedule (Installation)](https://romanhaendler.github.io/umriss-ui/schedule/installation/#smallest-schedule), [A day of tours (First schedule)](https://romanhaendler.github.io/umriss-ui/schedule/schedule/#first-schedule), [Start from an empty plan (First schedule)](https://romanhaendler.github.io/umriss-ui/schedule/schedule/#no-work-yet) and 78 more |
| `Lane` *required* | `typeof Lane` | — | <br>Shown in: [The smallest schedule (Installation)](https://romanhaendler.github.io/umriss-ui/schedule/installation/#smallest-schedule), [A day of tours (First schedule)](https://romanhaendler.github.io/umriss-ui/schedule/schedule/#first-schedule), [Start from an empty plan (First schedule)](https://romanhaendler.github.io/umriss-ui/schedule/schedule/#no-work-yet) and 78 more |
| `LaneGroup` *required* | `typeof LaneGroup` | — | <br>Shown in: [Group lanes under a head (Lane groups)](https://romanhaendler.github.io/umriss-ui/schedule/lane-groups/#a-group), [Nest groups to any depth (Lane groups)](https://romanhaendler.github.io/umriss-ui/schedule/lane-groups/#nesting), [Fold groups from outside (Lane groups)](https://romanhaendler.github.io/umriss-ui/schedule/lane-groups/#fold-from-outside) and 5 more |
| `Subtasks` *required* | `typeof Subtasks` | — | <br>Shown in: [The smallest schedule (Installation)](https://romanhaendler.github.io/umriss-ui/schedule/installation/#smallest-schedule), [A day of tours (First schedule)](https://romanhaendler.github.io/umriss-ui/schedule/schedule/#first-schedule), [Start from an empty plan (First schedule)](https://romanhaendler.github.io/umriss-ui/schedule/schedule/#no-work-yet) and 78 more |
| `Dependencies` *required* | `typeof Dependencies` | — | <br>Shown in: [The smallest schedule (Installation)](https://romanhaendler.github.io/umriss-ui/schedule/installation/#smallest-schedule), [A day of tours (First schedule)](https://romanhaendler.github.io/umriss-ui/schedule/schedule/#first-schedule), [Plan a day in the machine shop (First schedule)](https://romanhaendler.github.io/umriss-ui/schedule/schedule/#machine-plan) and 28 more |
| `BlockedTimes` *required* | `typeof BlockedTimes` | — | <br>Shown in: [Block out leave and maintenance (Blocked time)](https://romanhaendler.github.io/umriss-ui/schedule/blocked-time/#leave), [Plan work around someone's leave (Blocked time)](https://romanhaendler.github.io/umriss-ui/schedule/blocked-time/#drag-around), [Check a sprint against the leave calendar (Blocked time)](https://romanhaendler.github.io/umriss-ui/schedule/blocked-time/#team-leave) and 5 more |
| `Milestones` *required* | `typeof Milestones` | — | <br>Shown in: [Mark a handover and a release (Milestones)](https://romanhaendler.github.io/umriss-ui/schedule/milestones/#handovers-and-releases), [Say what a milestone is in your own tooltip (Milestones)](https://romanhaendler.github.io/umriss-ui/schedule/milestones/#say-what-a-milestone-is) |
| `view` *required* | [`ScheduleView`](https://romanhaendler.github.io/umriss-ui/schedule/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)](https://romanhaendler.github.io/umriss-ui/schedule/lane-groups/#fold-from-outside), [Keep and restore a view (View)](https://romanhaendler.github.io/umriss-ui/schedule/view/#keep-and-restore), [Keep two schedules in step (Linked schedules)](https://romanhaendler.github.io/umriss-ui/schedule/linked-schedules/#in-step) and 1 more |
| `setView` *required* | `(view: `[`ScheduleView`](https://romanhaendler.github.io/umriss-ui/schedule/view/#type-ScheduleView)`) => void` | — | Goes to a whole view; what it leaves out is shown whole again. Not reported through `onViewChange`: two schedules kept in step by `onViewChange: (v) => other.setView(v)` in both directions do not answer each other. A view with the content already shown changes nothing.<br>Shown in: [Keep and restore a view (View)](https://romanhaendler.github.io/umriss-ui/schedule/view/#keep-and-restore), [Keep two schedules in step (Linked schedules)](https://romanhaendler.github.io/umriss-ui/schedule/linked-schedules/#in-step), [Read a rota beside the incidents (Linked schedules)](https://romanhaendler.github.io/umriss-ui/schedule/linked-schedules/#rota-beside-incidents) |
| `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)](https://romanhaendler.github.io/umriss-ui/schedule/view/#keep-and-restore) |
| `toggleGroup` *required* | `(id: string) => void` | — | Folds or unfolds one **Lane group**. |
| `foldAll` *required* | `() => void` | — | Folds every group.<br>Shown in: [Fold groups from outside (Lane groups)](https://romanhaendler.github.io/umriss-ui/schedule/lane-groups/#fold-from-outside) |
| `unfoldAll` *required* | `() => void` | — | Unfolds every group.<br>Shown in: [Fold groups from outside (Lane groups)](https://romanhaendler.github.io/umriss-ui/schedule/lane-groups/#fold-from-outside) |

Used on [Linked schedules](https://romanhaendler.github.io/umriss-ui/schedule/linked-schedules/).

### `ScheduleProps`

Its table stands on [First schedule](https://romanhaendler.github.io/umriss-ui/schedule/schedule/#type-ScheduleProps).

### `ScheduleTooltipTarget`

Its table stands on [Tooltip](https://romanhaendler.github.io/umriss-ui/schedule/tooltip/#type-ScheduleTooltipTarget).

Used on [Milestones](https://romanhaendler.github.io/umriss-ui/schedule/milestones/) and [Tooltip](https://romanhaendler.github.io/umriss-ui/schedule/tooltip/).

### `ScheduleView`

Its table stands on [View](https://romanhaendler.github.io/umriss-ui/schedule/view/#type-ScheduleView).

Used on [View](https://romanhaendler.github.io/umriss-ui/schedule/view/).

### `SnapRaster`

A raster: a step, and where it starts after local midnight.

| Prop | Type | Default | Description |
|---|---|---|---|
| `step` *required* | `number` | — | The distance between two lines of the raster, in milliseconds.<br>Shown in: [Snap to handover times (Snapping)](https://romanhaendler.github.io/umriss-ui/schedule/snapping/#snap-to-handovers) |
| `offset` *required* | `number` | — | Where the raster starts after local midnight, in milliseconds: six hours for handovers at 06:00, 14:00 and 22:00.<br>Shown in: [Snap to handover times (Snapping)](https://romanhaendler.github.io/umriss-ui/schedule/snapping/#snap-to-handovers) |

Used on [Snapping](https://romanhaendler.github.io/umriss-ui/schedule/snapping/).

### `StretchIntent`

Stretch the main time at one or both of its edges.

| Prop | Type | Default | Description |
|---|---|---|---|
| `kind` *required* | `"stretch"` | — | <br>Shown in: [Read a folded group (Lane groups)](https://romanhaendler.github.io/umriss-ui/schedule/lane-groups/#the-miniature), [Plan work around someone's leave (Blocked time)](https://romanhaendler.github.io/umriss-ui/schedule/blocked-time/#drag-around), [Refuse a move that double-books someone (Move and lane)](https://romanhaendler.github.io/umriss-ui/schedule/move-and-lane/#refuse-a-double-booking) and 7 more |
| `subtask` *required* | `string` | — | The id of the subtask.<br>Shown in: [Read a folded group (Lane groups)](https://romanhaendler.github.io/umriss-ui/schedule/lane-groups/#the-miniature), [Plan work around someone's leave (Blocked time)](https://romanhaendler.github.io/umriss-ui/schedule/blocked-time/#drag-around), [Refuse a move that double-books someone (Move and lane)](https://romanhaendler.github.io/umriss-ui/schedule/move-and-lane/#refuse-a-double-booking) and 4 more |
| `from` *required* | `number` | — | The new start of the main time. |
| `to` *required* | `number` | — | The new end of the main time. |

### `Subtask`

Its table stands on [Subtasks](https://romanhaendler.github.io/umriss-ui/schedule/subtasks/#type-Subtask).

Used on [Scenarios](https://romanhaendler.github.io/umriss-ui/schedule/), [Installation](https://romanhaendler.github.io/umriss-ui/schedule/installation/), [First schedule](https://romanhaendler.github.io/umriss-ui/schedule/schedule/), [Lanes](https://romanhaendler.github.io/umriss-ui/schedule/lane/), [Lane groups](https://romanhaendler.github.io/umriss-ui/schedule/lane-groups/), [Subtasks](https://romanhaendler.github.io/umriss-ui/schedule/subtasks/), [Bar labels](https://romanhaendler.github.io/umriss-ui/schedule/bar-labels/), [Appearances](https://romanhaendler.github.io/umriss-ui/schedule/appearances/), [Overlap](https://romanhaendler.github.io/umriss-ui/schedule/overlap/), [Dependencies](https://romanhaendler.github.io/umriss-ui/schedule/dependencies/), [Routes](https://romanhaendler.github.io/umriss-ui/schedule/routes/), [Time axis and calendar](https://romanhaendler.github.io/umriss-ui/schedule/time-axis/), [Blocked time](https://romanhaendler.github.io/umriss-ui/schedule/blocked-time/), [Milestones](https://romanhaendler.github.io/umriss-ui/schedule/milestones/), [Now line](https://romanhaendler.github.io/umriss-ui/schedule/now-line/), [Pan and zoom](https://romanhaendler.github.io/umriss-ui/schedule/pan-and-zoom/), [Selection](https://romanhaendler.github.io/umriss-ui/schedule/selection/), [Interactions](https://romanhaendler.github.io/umriss-ui/schedule/interactions/), [Tooltip](https://romanhaendler.github.io/umriss-ui/schedule/tooltip/), [View](https://romanhaendler.github.io/umriss-ui/schedule/view/), [Linked schedules](https://romanhaendler.github.io/umriss-ui/schedule/linked-schedules/), [The handle](https://romanhaendler.github.io/umriss-ui/schedule/handle/), [Findings as data](https://romanhaendler.github.io/umriss-ui/schedule/findings/), [Move and lane](https://romanhaendler.github.io/umriss-ui/schedule/move-and-lane/), [Stretch, lead-in, lead-out](https://romanhaendler.github.io/umriss-ui/schedule/stretch/), [Snapping](https://romanhaendler.github.io/umriss-ui/schedule/snapping/), [Placing from outside](https://romanhaendler.github.io/umriss-ui/schedule/placing/), [Where a subtask may go](https://romanhaendler.github.io/umriss-ui/schedule/where-it-may-go/), [Ripple](https://romanhaendler.github.io/umriss-ui/schedule/ripple/) and [Benchmark](https://romanhaendler.github.io/umriss-ui/schedule/benchmark/).

### `SubtaskAppearance`

The appearances a caller may give a subtask.

```ts
type SubtaskAppearance = "provisional" | "fixed" | "muted" | "open";
```

### `SubtasksProps`

Its table stands on [Subtasks](https://romanhaendler.github.io/umriss-ui/schedule/subtasks/#type-SubtasksProps).

### `Task`

Its table stands on [Subtasks](https://romanhaendler.github.io/umriss-ui/schedule/subtasks/#type-Task).

Used on [Scenarios](https://romanhaendler.github.io/umriss-ui/schedule/), [Installation](https://romanhaendler.github.io/umriss-ui/schedule/installation/), [First schedule](https://romanhaendler.github.io/umriss-ui/schedule/schedule/), [Lanes](https://romanhaendler.github.io/umriss-ui/schedule/lane/), [Lane groups](https://romanhaendler.github.io/umriss-ui/schedule/lane-groups/), [Subtasks](https://romanhaendler.github.io/umriss-ui/schedule/subtasks/), [Bar labels](https://romanhaendler.github.io/umriss-ui/schedule/bar-labels/), [Appearances](https://romanhaendler.github.io/umriss-ui/schedule/appearances/), [Overlap](https://romanhaendler.github.io/umriss-ui/schedule/overlap/), [Dependencies](https://romanhaendler.github.io/umriss-ui/schedule/dependencies/), [Routes](https://romanhaendler.github.io/umriss-ui/schedule/routes/), [Time axis and calendar](https://romanhaendler.github.io/umriss-ui/schedule/time-axis/), [Blocked time](https://romanhaendler.github.io/umriss-ui/schedule/blocked-time/), [Milestones](https://romanhaendler.github.io/umriss-ui/schedule/milestones/), [Now line](https://romanhaendler.github.io/umriss-ui/schedule/now-line/), [Pan and zoom](https://romanhaendler.github.io/umriss-ui/schedule/pan-and-zoom/), [Selection](https://romanhaendler.github.io/umriss-ui/schedule/selection/), [Interactions](https://romanhaendler.github.io/umriss-ui/schedule/interactions/), [Tooltip](https://romanhaendler.github.io/umriss-ui/schedule/tooltip/), [View](https://romanhaendler.github.io/umriss-ui/schedule/view/), [Linked schedules](https://romanhaendler.github.io/umriss-ui/schedule/linked-schedules/), [The handle](https://romanhaendler.github.io/umriss-ui/schedule/handle/), [Findings as data](https://romanhaendler.github.io/umriss-ui/schedule/findings/), [Move and lane](https://romanhaendler.github.io/umriss-ui/schedule/move-and-lane/), [Stretch, lead-in, lead-out](https://romanhaendler.github.io/umriss-ui/schedule/stretch/), [Snapping](https://romanhaendler.github.io/umriss-ui/schedule/snapping/), [Placing from outside](https://romanhaendler.github.io/umriss-ui/schedule/placing/), [Where a subtask may go](https://romanhaendler.github.io/umriss-ui/schedule/where-it-may-go/), [Ripple](https://romanhaendler.github.io/umriss-ui/schedule/ripple/) and [Benchmark](https://romanhaendler.github.io/umriss-ui/schedule/benchmark/).

### `ViolatedDependency`

Its table stands on [Findings as data](https://romanhaendler.github.io/umriss-ui/schedule/findings/#type-ViolatedDependency).

Used on [Dependencies](https://romanhaendler.github.io/umriss-ui/schedule/dependencies/).

### `ZoomLimits`

The narrowest and the widest span zoom may reach.

| Prop | Type | Default | Description |
|---|---|---|---|
| `min` *required* | `number` | — | <br>Shown in: [Move through the plan (Pan and zoom)](https://romanhaendler.github.io/umriss-ui/schedule/pan-and-zoom/#pan-and-zoom) |
| `max` *required* | `number` | — | <br>Shown in: [Move through the plan (Pan and zoom)](https://romanhaendler.github.io/umriss-ui/schedule/pan-and-zoom/#pan-and-zoom) |
