# API index

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

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

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

## Components

### `ControlChart`

[ControlChart](https://romanhaendler.github.io/umriss-ui/charts/controlchart/) – Centre line, control limits and the rule violations of a process (an SPC or Shewhart chart). Reach for it to see a process drift before it leaves its specification.

Used on [Scenarios](https://romanhaendler.github.io/umriss-ui/charts/) and [ControlChart](https://romanhaendler.github.io/umriss-ui/charts/controlchart/).

### `DataTable`

The chart's values as a table, on demand: a key - in the legend where
there is one - opens a table of what the chart shows, one column per
visible series, in the tooltip's format. For a reader who wants every value
at once. Place it inside a `Chart`.

```ts
function DataTable(): ReactNode;
```

Used on [Chart](https://romanhaendler.github.io/umriss-ui/charts/chart/), [BoxPlot](https://romanhaendler.github.io/umriss-ui/charts/boxplot/) and [Tooltip](https://romanhaendler.github.io/umriss-ui/charts/tooltip/).

### `Legend`

[Legend](https://romanhaendler.github.io/umriss-ui/charts/legend/) – What the colours mean (a key), and a switch for every series: a click hides it and shows it again, a double click shows only it (a solo).

Used on [Scenarios](https://romanhaendler.github.io/umriss-ui/charts/), [Chart](https://romanhaendler.github.io/umriss-ui/charts/chart/), [Axis](https://romanhaendler.github.io/umriss-ui/charts/axis/), [View](https://romanhaendler.github.io/umriss-ui/charts/view/), [Line](https://romanhaendler.github.io/umriss-ui/charts/line/), [Area](https://romanhaendler.github.io/umriss-ui/charts/area/), [Bar](https://romanhaendler.github.io/umriss-ui/charts/bar/), [Scatter](https://romanhaendler.github.io/umriss-ui/charts/scatter/), [BoxPlot](https://romanhaendler.github.io/umriss-ui/charts/boxplot/), [StateBand](https://romanhaendler.github.io/umriss-ui/charts/stateband/), [LimitLine](https://romanhaendler.github.io/umriss-ui/charts/limitline/), [Pareto](https://romanhaendler.github.io/umriss-ui/charts/pareto/), [Tooltip](https://romanhaendler.github.io/umriss-ui/charts/tooltip/), [Legend](https://romanhaendler.github.io/umriss-ui/charts/legend/) and [Benchmark](https://romanhaendler.github.io/umriss-ui/charts/benchmark/).

### `LimitBand`

[LimitLine](https://romanhaendler.github.io/umriss-ui/charts/limitline/) – A limit drawn as a band between two values of an axis - a tolerance or a
zone. Otherwise a `LimitLine`.

Used on [Scenarios](https://romanhaendler.github.io/umriss-ui/charts/), [Chart](https://romanhaendler.github.io/umriss-ui/charts/chart/), [LimitLine](https://romanhaendler.github.io/umriss-ui/charts/limitline/) and [Tooltip](https://romanhaendler.github.io/umriss-ui/charts/tooltip/).

### `LimitLine`

[LimitLine](https://romanhaendler.github.io/umriss-ui/charts/limitline/) – The limits a course is read against (a threshold, a reference line): a line above the series, a band beneath them. Reach for it for objectives, budgets and alert levels.

Used on [Scenarios](https://romanhaendler.github.io/umriss-ui/charts/), [Chart](https://romanhaendler.github.io/umriss-ui/charts/chart/), [Scatter](https://romanhaendler.github.io/umriss-ui/charts/scatter/), [BoxPlot](https://romanhaendler.github.io/umriss-ui/charts/boxplot/), [LimitLine](https://romanhaendler.github.io/umriss-ui/charts/limitline/), [ControlChart](https://romanhaendler.github.io/umriss-ui/charts/controlchart/), [Pareto](https://romanhaendler.github.io/umriss-ui/charts/pareto/) and [Tooltip](https://romanhaendler.github.io/umriss-ui/charts/tooltip/).

### `Tooltip`

[Tooltip](https://romanhaendler.github.io/umriss-ui/charts/tooltip/) – What a hover reports (a hover card), and the values as a table for a reader who wants them all at once.

Used on [Scenarios](https://romanhaendler.github.io/umriss-ui/charts/), [Installation](https://romanhaendler.github.io/umriss-ui/charts/installation/), [Chart](https://romanhaendler.github.io/umriss-ui/charts/chart/), [Axis](https://romanhaendler.github.io/umriss-ui/charts/axis/), [Zoom and pan](https://romanhaendler.github.io/umriss-ui/charts/zoom-and-pan/), [View](https://romanhaendler.github.io/umriss-ui/charts/view/), [Line](https://romanhaendler.github.io/umriss-ui/charts/line/), [Area](https://romanhaendler.github.io/umriss-ui/charts/area/), [Bar](https://romanhaendler.github.io/umriss-ui/charts/bar/), [Scatter](https://romanhaendler.github.io/umriss-ui/charts/scatter/), [BoxPlot](https://romanhaendler.github.io/umriss-ui/charts/boxplot/), [StateBand](https://romanhaendler.github.io/umriss-ui/charts/stateband/), [Matrix](https://romanhaendler.github.io/umriss-ui/charts/matrix/), [LimitLine](https://romanhaendler.github.io/umriss-ui/charts/limitline/), [ControlChart](https://romanhaendler.github.io/umriss-ui/charts/controlchart/), [Pareto](https://romanhaendler.github.io/umriss-ui/charts/pareto/), [Tooltip](https://romanhaendler.github.io/umriss-ui/charts/tooltip/), [Legend](https://romanhaendler.github.io/umriss-ui/charts/legend/) and [Benchmark](https://romanhaendler.github.io/umriss-ui/charts/benchmark/).

## Hooks

### `useChart`

A chart over your rows: the parts it returns are typed at your row, so
that a field name in `value` is checked by the compiler.

- `rows` – The rows every series reads that brings no `data` of its own.
- `options` – The view to start from and the handler of its changes.
- Returns `Chart`, `XAxis`, `YAxis` and every series kind - each keeps its
identity over the renders -, the `view`, its `domains` and `hidden`, and
the setters that change them.

```ts
function useChart<Z>(rows: readonly Z[], options?: ChartOptions<Z>): ChartParts<Z>;
```

Used on [Scenarios](https://romanhaendler.github.io/umriss-ui/charts/), [Installation](https://romanhaendler.github.io/umriss-ui/charts/installation/), [Chart](https://romanhaendler.github.io/umriss-ui/charts/chart/), [Axis](https://romanhaendler.github.io/umriss-ui/charts/axis/), [Zoom and pan](https://romanhaendler.github.io/umriss-ui/charts/zoom-and-pan/), [View](https://romanhaendler.github.io/umriss-ui/charts/view/), [Line](https://romanhaendler.github.io/umriss-ui/charts/line/), [Area](https://romanhaendler.github.io/umriss-ui/charts/area/), [Bar](https://romanhaendler.github.io/umriss-ui/charts/bar/), [Scatter](https://romanhaendler.github.io/umriss-ui/charts/scatter/), [BoxPlot](https://romanhaendler.github.io/umriss-ui/charts/boxplot/), [StateBand](https://romanhaendler.github.io/umriss-ui/charts/stateband/), [Matrix](https://romanhaendler.github.io/umriss-ui/charts/matrix/), [LimitLine](https://romanhaendler.github.io/umriss-ui/charts/limitline/), [ControlChart](https://romanhaendler.github.io/umriss-ui/charts/controlchart/), [Pareto](https://romanhaendler.github.io/umriss-ui/charts/pareto/), [Tooltip](https://romanhaendler.github.io/umriss-ui/charts/tooltip/), [Legend](https://romanhaendler.github.io/umriss-ui/charts/legend/) and [Benchmark](https://romanhaendler.github.io/umriss-ui/charts/benchmark/).

## Functions

### `assess`

What the value is, given the limit set. A pure function of the two.

A missing or non-finite value yields `unknown` - and nothing else: the
deviation of a value nobody has is unknown to everybody too.

A bound is violated when the value lies beyond it, not when it lies on it. A
value exactly on the upper bound is in order. That is decided once here
([ADR-0006](https://github.com/romanhaendler/umriss-ui/blob/main/docs/adr/0006-the-limit-model-lives-in-both-packages.md)), so that two building blocks on the same screen do not disagree
about the edge.

Where several bounds are violated the most severe wins; among equally severe
ones the one the value lies furthest beyond. Under a tie in both, the one
named first.

No hysteresis: that would need the previous state, and a function of one
value has none. Exactly that is the property which makes this module safe to
duplicate.

```ts
function assess(value: number | null | undefined, set?: LimitSet): Assessment;
```

### `bin`

Counts values into bins of equal width.

A value on an edge belongs to the bin that edge starts - `[from, to)` - but
the last bin is closed, so the greatest value of a domain is counted and not
lost. Values that are not finite (`NaN`, ±Infinity, `null`, `undefined`)
are skipped, as a gap is on a chart. Without values there are no bins; with
values there is at least one, even when they are all equal.

```ts
function bin(values: readonly (number | null | undefined)[], options?: BinOptions): Bin[];
function bin<T>(rows: readonly T[], value: (row: T) => number | null | undefined, options?: BinOptions): Bin[];
```

Used on [Bar](https://romanhaendler.github.io/umriss-ui/charts/bar/).

### `breaks`

The breaks in working time that lie within the extent [from, to] - what the
axis must mark, in domain units.

```ts
function breaks(input: CalendarInput, from: number, to: number): number[];
```

### `calendarFrom`

Calendar from an input - a built calendar is passed straight through, a raw
list is built once and remembered.

```ts
function calendarFrom(input: CalendarInput): WorkingCalendar;
```

### `controlLimits`

Centre line and control limits. Either given or calculated from exactly the
named reference window - never from the whole series and never from the
visible excerpt. Gaps (NaN) count neither in the centre line nor in the
moving range. A window without values yields NaN limits, not an error: the
chart then draws no line instead of bursting.

```ts
function controlLimits(values: readonly number[], origin: ControlLimitOrigin): ControlLimits;
```

Used on [Scenarios](https://romanhaendler.github.io/umriss-ui/charts/), [LimitLine](https://romanhaendler.github.io/umriss-ui/charts/limitline/) and [ControlChart](https://romanhaendler.github.io/umriss-ui/charts/controlchart/).

### `invalidateTheme`

Explicit invalidation: devalue the cache, every living chart reads anew and
redraws.

```ts
function invalidateTheme(): void;
```

### `localOffset`

The local offset at an instant, as the shift of a grid that is to lie on
local time: `wallClock = offset + k · step`. Taken at one instant, it holds
for a grid up to the next clock change.

```ts
function localOffset(instant: number): number;
```

### `pareto`

Sorts descending, accumulates, collects the tail and finds the cutoff
crossing.

Ties keep the input order - explicitly through the input index, not in
reliance on a stable sort - so that two reasons with the same count do not
swap places between two frames.

The remainder stands last, independently of its value. Two hundred small
reasons regularly yield a remainder larger than the third real bar; sorted
into place, the chart would claim there is a fault reason called "other"
which is the third biggest problem.

```ts
function pareto(items: readonly ParetoItem[], options?: ParetoSettings): ParetoResult;
```

Used on [Pareto](https://romanhaendler.github.io/umriss-ui/charts/pareto/).

### `removedIntervals`

The removed spans between the working intervals, for the mark in the axis
band. A chart that takes a weekend out and does not say so claims a
continuity it does not have. Before the first and after the last interval
there is nothing to mark: that lies outside the axis' extent.

```ts
function removedIntervals(input: CalendarInput): RemovedSpan[];
```

### `resolveColours`

Any number of CSS colours - a token, `light-dark(…)`, `var(--…)`, a
literal - resolved to values a canvas can draw, in the scheme that applies
at `root`. The same probe `resolveTheme` uses, for a canvas of a
neighbouring package ([ADR-0022](https://github.com/romanhaendler/umriss-ui/blob/main/docs/adr/0022-the-schedule-is-a-package-that-depends-on-core-and-charts.md)): the schedule draws its subtasks with the
colours of

```ts
function resolveColours<K extends string>(root: Element, colours: Readonly<Record<K, string>>): Record<K, string>;
```

### `subscribeTheme`

Subscribe to theme invalidations - a switch of `color-scheme` on the
document, the system's preference, or `invalidateTheme()`. The scenes of
the charts use it, and so does any canvas that resolved its colours with
[`resolveColours`](https://romanhaendler.github.io/umriss-ui/charts/api/#resolveColours). Returns the unsubscribe.

```ts
function subscribeTheme(notify: () => void): () => void;
```

### `timeStep`

Step for tick candidates in wall clock time, at an intended count. Rounded up
to the next readable step, so that no more ticks arise than wanted. Above the
day steps it continues in whole days.

```ts
function timeStep(span: number, count: number): number;
```

### `toWallClock`

Working time → wall clock time; outside [0, total] there is none.

At a seam - the end of an interval which is at the same time the beginning of
the next - the beginning of the next comes out: from there time counts again,
and a pointer aiming there aims at the coming interval. Only the end of the last
interval has no next and comes back as itself.

```ts
function toWallClock(workingTime: number, input: CalendarInput): number;
```

### `toWorkingTimeClamped`

Wall clock time → working time, but without NaN: whatever lies in removed
time falls onto the seam that this span collapses onto anyway; whatever lies
before the first or after the last interval onto 0 or onto the whole
working time respectively.

The materialised x values must stay ascending: binary search assumes it, and
a search over NaN silently lands on the wrong point. The clamped value is a POSITION, not a statement: the point
itself is carried as a gap and is never drawn and never hit.

```ts
function toWorkingTimeClamped(wallClock: number, input: CalendarInput): number;
```

### `verdictWeight`

How heavily a verdict weighs, as a number - for sorting and comparing, as
when a matrix is to bring its worst cell to the top. It stands here so that
the order is not reinvented at every call site.

```ts
function verdictWeight(verdict: Verdict): number;
```

### `violatedIndices`

All violated indices, ascending and free of duplicates - the scatter drawn
beside the line.

```ts
function violatedIndices(found: readonly Violation[]): number[];
```

### `violations`

The rules switched on, each with its indices. Rules without hits do not
appear in the list. The indices are data, not merely marks: they can be
listed beside the chart as well as marked on it.

```ts
function violations(values: readonly number[], limits: ControlLimits, options?: Partial<RuleOptions>): Violation[];
```

Used on [Scenarios](https://romanhaendler.github.io/umriss-ui/charts/) and [ControlChart](https://romanhaendler.github.io/umriss-ui/charts/controlchart/).

### `workingCalendar`

Builds a calendar: sorts, merges overlapping and abutting intervals and
throws away empty, reversed and non-finite ones. Merging is not a courtesy
but a precondition: only over separated intervals is the reverse mapping
unambiguous.

```ts
function workingCalendar(intervals: readonly WorkingInterval[]): WorkingCalendar;
```

Used on [Axis](https://romanhaendler.github.io/umriss-ui/charts/axis/).

### `workingTimeTicks`

Ticks for a working time axis, from an extent in WALL CLOCK TIME.

The candidates arise in wall clock time on multiples of the step - hours,
interval changes, days - whatever lies in removed time falls away, the rest is
mapped. Never the other way round: ticks generated in working time land in
the middle of an interval and yield an axis labelled 14.5 and 29.0 which nobody
can read.

The offset shifts the grid; with it a local time hits its own midnight without
this module having to know about time zones.

If two candidates fall on the same working time - the end of one interval and
the beginning of the next - the earlier one stays: two labels on the same
pixel would be one too many.

Both times come back, because the axis needs both: the working time to
place the tick, the wall clock time to label it.

```ts
function workingTimeTicks(input: CalendarInput, from: number, to: number, step: number, offset?: number): WorkingTimeTick[];
```

### `zones`

The faintly drawn zone lines. Rule 4 is about the two-sigma zone, and a
reader cannot check it against a chart that does not show it.

```ts
function zones(limits: ControlLimits, multiples?: readonly number[]): Zone[];
```

Used on [ControlChart](https://romanhaendler.github.io/umriss-ui/charts/controlchart/).

## Constants

### `DAY`

One day of 24 hours in milliseconds; across a clock change a calendar day
is an hour longer or shorter.

```ts
const DAY: number;
```

Used on [Scenarios](https://romanhaendler.github.io/umriss-ui/charts/), [Chart](https://romanhaendler.github.io/umriss-ui/charts/chart/), [Axis](https://romanhaendler.github.io/umriss-ui/charts/axis/), [Zoom and pan](https://romanhaendler.github.io/umriss-ui/charts/zoom-and-pan/), [StateBand](https://romanhaendler.github.io/umriss-ui/charts/stateband/), [Tooltip](https://romanhaendler.github.io/umriss-ui/charts/tooltip/) and [Benchmark](https://romanhaendler.github.io/umriss-ui/charts/benchmark/).

### `DEFAULT_CHARTS_WORDING`

The instance shipped by default. English; German is
`GERMAN_CHARTS_WORDING` in `@umriss-ui/charts/wording/de`. A chart takes
its own through `wording`.

Every entry, with its value, stands in the table [Charts wording](https://romanhaendler.github.io/umriss-ui/core/language/#charts-wording) on core's Language page.

```ts
const DEFAULT_CHARTS_WORDING: ChartsWording;
```

### `DEFAULT_GRADIENT`

Default gradient: a sequential set, light to dark, so that it stays readable
as an order of lightness even without colour. It is a default, not a
restriction - whoever has a scale of their own names it.

```ts
const DEFAULT_GRADIENT: readonly string[];
```

Used on [Matrix](https://romanhaendler.github.io/umriss-ui/charts/matrix/).

### `HOUR`

One hour in milliseconds.

```ts
const HOUR: number;
```

Used on [Chart](https://romanhaendler.github.io/umriss-ui/charts/chart/), [Axis](https://romanhaendler.github.io/umriss-ui/charts/axis/), [Zoom and pan](https://romanhaendler.github.io/umriss-ui/charts/zoom-and-pan/), [Area](https://romanhaendler.github.io/umriss-ui/charts/area/), [BoxPlot](https://romanhaendler.github.io/umriss-ui/charts/boxplot/), [Tooltip](https://romanhaendler.github.io/umriss-ui/charts/tooltip/) and [Benchmark](https://romanhaendler.github.io/umriss-ui/charts/benchmark/).

### `LinearScale`

The affine mapping from a domain onto a pixel range, and back; the scale
every axis of the library uses.

```ts
class LinearScale implements Scale {
    readonly domain: readonly [number, number];
    readonly range: readonly [number, number];
    /** Pre-computed line equation px = v·m + b - the draw loop uses it directly. */
    readonly m: number;
    readonly b: number;
    constructor(domain: readonly [number, number], range: readonly [number, number]);
    toPx(v: number): number;
    fromPx(px: number): number;
    ticks(n: number): number[];
}
```

### `MINUTE`

One minute in milliseconds.

```ts
const MINUTE: number;
```

Used on [Scenarios](https://romanhaendler.github.io/umriss-ui/charts/), [Installation](https://romanhaendler.github.io/umriss-ui/charts/installation/), [Chart](https://romanhaendler.github.io/umriss-ui/charts/chart/), [Axis](https://romanhaendler.github.io/umriss-ui/charts/axis/), [Zoom and pan](https://romanhaendler.github.io/umriss-ui/charts/zoom-and-pan/), [View](https://romanhaendler.github.io/umriss-ui/charts/view/), [Line](https://romanhaendler.github.io/umriss-ui/charts/line/), [Area](https://romanhaendler.github.io/umriss-ui/charts/area/), [Scatter](https://romanhaendler.github.io/umriss-ui/charts/scatter/), [BoxPlot](https://romanhaendler.github.io/umriss-ui/charts/boxplot/), [StateBand](https://romanhaendler.github.io/umriss-ui/charts/stateband/), [LimitLine](https://romanhaendler.github.io/umriss-ui/charts/limitline/), [Tooltip](https://romanhaendler.github.io/umriss-ui/charts/tooltip/), [Legend](https://romanhaendler.github.io/umriss-ui/charts/legend/) and [Benchmark](https://romanhaendler.github.io/umriss-ui/charts/benchmark/).

### `SECOND`

One second in milliseconds, the unit of a time axis.

```ts
const SECOND = 1000;
```

## Types

### `AreaProps`

Its table stands on [Area](https://romanhaendler.github.io/umriss-ui/charts/area/#type-AreaProps).

### `AreaSeriesConfig<T = unknown>`

An `Area` as the chart holds it once registered.

| Prop | Type | Default | Description |
|---|---|---|---|
| `kind` *required* | `"area"` | — |  |
| `baseline` | [`ValueFunction`](https://romanhaendler.github.io/umriss-ui/charts/api/#type-ValueFunction)`<T>` | — | Lower edge; without a value the fixed baseline 0. |
| `fillOpacity` *required* | `number` | — | Opacity of the fill; the outline stays fully opaque. |
| `strokeWidth` *required* | `number` | — |  |
| `dash` | `readonly number[]` | — | Dash pattern of the outline. |
| `accessor` *required* | [`ValueFunction`](https://romanhaendler.github.io/umriss-ui/charts/api/#type-ValueFunction)`<T>` | — | Y value; null/undefined/NaN/±Infinity means a gap. From `SeriesBase`. |
| `data` | `readonly T[]` | — | Series-own data; overrides the container data. From `SeriesBase`. |
| `xAxisId` *required* | `string` | — |  From `SeriesBase`. |
| `yAxisId` *required* | `string` | — |  From `SeriesBase`. |
| `name` | `string` | — |  From `SeriesBase`. |
| `format` | `(value: number) => string` | — | The value in the tooltip; before the y axis' `tickFormat`. Compared by its source text, as an accessor is. From `SeriesBase`. |
| `color` | `string` | — |  From `SeriesBase`. |
| `tone` | `"ok" \| "warning" \| "alarm"` | — | A role instead of a colour value: the theme resolves it, in both themes. For series that mean something rather than just being the next one - the violating points of a control chart, say. `color` beats it. From `SeriesBase`. |
| `stack` | `string` | — | The stack this series stands in: series with the same id, on the same x and y axis, stack in registration order. From `Stackable`. |
| `normalize` | `boolean` | — | On any member, the whole stack sums to 100 at every x. From `Stackable`. |

### `Assessment`

The verdict and what led to it.

| Prop | Type | Default | Description |
|---|---|---|---|
| `verdict` *required* | [`Verdict`](https://romanhaendler.github.io/umriss-ui/charts/api/#type-Verdict)<br>`"ok" \| "unknown" \| "warning" \| "alarm"` | — |  |
| `limit` | [`Limit`](https://romanhaendler.github.io/umriss-ui/charts/api/#type-Limit) | — | The violated limit - the same object the caller passed in, so that it can be recognised against the caller's own data. Absent where none is violated. |
| `excess` | `number` | — | The amount beyond the bound, always positive. Absent where none is violated. |
| `deviation` | `number` | — | The signed distance from the target. Absent where none is set - a missing target yields no deviation of zero. Two fields and not one: excess and deviation are two numbers, and a single field meaning the one thing when a bound is violated and the other otherwise reads well and is wrong at three in the morning. |

### `AxisConfig<T = unknown>`

An `XAxis` or `YAxis` as the chart holds it once registered.

| Prop | Type | Default | Description |
|---|---|---|---|
| `id` *required* | `string` | — |  |
| `orientation` *required* | [`AxisOrientation`](https://romanhaendler.github.io/umriss-ui/charts/api/#type-AxisOrientation)<br>`"x" \| "y"` | — |  |
| `position` *required* | [`AxisPosition`](https://romanhaendler.github.io/umriss-ui/charts/api/#type-AxisPosition)<br>`"bottom" \| "top" \| "left" \| "right"` | — |  |
| `accessor` | `(d: T, index: number) => `[`AxisValue`](https://romanhaendler.github.io/umriss-ui/charts/api/#type-AxisValue) | — | Where a row lies along the axis; an x axis' only - along y the series place their rows. A number is a position or an instant, a string a category, a `Date` an instant ([ADR-0052](https://github.com/romanhaendler/umriss-ui/blob/main/docs/adr/0052-a-chart-reads-its-rows-as-they-come.md)). |
| `label` | `string` | — |  |
| `tickCount` | `number` | — |  |
| `tickFormat` | `(v: number) => string` | — |  |
| `domain` *required* | `"nice" \| "data" \| "visible" \| readonly [number, number]` | — | "visible" is a y axis' only: the extent of what its series show inside their x axis' domain. |
| `grid` | `boolean` | only the first registered axis per orientation | Whether the axis draws its grid lines. |
| `ticks` | `readonly number[]` | — | Fixed tick values instead of the 1-2-5 algorithm, on a numeric axis: an hour axis' named hours, a lane grid. |
| `categories` | `readonly string[]` | — | The categories of the axis, in their order: the list is the order and the extent, and makes the axis a category axis ([ADR-0052](https://github.com/romanhaendler/umriss-ui/blob/main/docs/adr/0052-a-chart-reads-its-rows-as-they-come.md)). |
| `categoryLabel` | `(category: string) => string` | — | What is written for a category, wherever it is written. |
| `time` | `boolean` | — | The values are instants - milliseconds, and where this is said ISO 8601 strings as well: ticks on local boundaries, labels by level. A calendar implies it, and so do rows that bring a `Date` ([ADR-0052](https://github.com/romanhaendler/umriss-ui/blob/main/docs/adr/0052-a-chart-reads-its-rows-as-they-come.md)). |
| `calendar` | `readonly `[`WorkingInterval`](https://romanhaendler.github.io/umriss-ui/charts/api/#type-WorkingInterval)`[]` | — | Working calendar: the intervals in which time counts. With it, materialisation maps wall clock time onto working time before the scale calculates - the scale stays affine ([ADR-0001](https://github.com/romanhaendler/umriss-ui/blob/main/docs/adr/0001-affine-scale-contract.md)). |
| `alignTicks` | `boolean` | — | y axes only: this axis' ticks on the first y axis' grid. |
| `zoomable` | `boolean` | — | x axes only: wheel, drag, pinch, double click and the zoom keys move the span the chart's view holds for this axis ([ADR-0047](https://github.com/romanhaendler/umriss-ui/blob/main/docs/adr/0047-a-component-holds-its-own-view.md)). |
| `zoomLimits` | [`ZoomLimits`](https://romanhaendler.github.io/umriss-ui/charts/api/#type-ZoomLimits) | at most the data's extent, at least three data steps | x axes only: the narrowest and the widest span zoom may reach. |

### `AxisField<T, V = AxisValue>`

The fields of a row an axis can read - or, with `V`, those that hold only
some of what an axis reads: a matrix' row is a position or a category,
never an instant.

```ts
type AxisField<T, V = AxisValue> = NoInfer<
  {
    [K in keyof T & string]-?: T[K] extends V ? K : never;
  }[keyof T & string]
>;
```

### `AxisOrientation`

Whether an axis or a limit runs along x or along y.

```ts
type AxisOrientation = "x" | "y";
```

### `AxisPosition`

The edge of the plot an axis stands at: `bottom` or `top` for x, `left` or
`right` for y.

```ts
type AxisPosition = "bottom" | "top" | "left" | "right";
```

### `AxisSpans`

The span each zoomable x axis shows, by axis `id`, in the axis' units.

```ts
type AxisSpans = Readonly<Record<string, readonly [number, number]>>;
```

### `AxisValue`

What an axis reads from a row ([ADR-0052](https://github.com/romanhaendler/umriss-ui/blob/main/docs/adr/0052-a-chart-reads-its-rows-as-they-come.md)): a number - a position, or an
instant on a time axis -, a string, which is a category, or a `Date`,
which is an instant. The type of the value decides what kind the axis is,
never its content: `"2024"` is a category, `2024` a number. On an axis
that says `time` a string is an ISO 8601 instant. null/undefined is no
place.

```ts
type AxisValue = number | string | Date | null | undefined;
```

### `BarProps`

Its table stands on [Bar](https://romanhaendler.github.io/umriss-ui/charts/bar/#type-BarProps).

### `BarSeriesConfig<T = unknown>`

A `Bar` as the chart holds it once registered.

| Prop | Type | Default | Description |
|---|---|---|---|
| `kind` *required* | `"bar"` | — |  |
| `barWidth` *required* | `number` | — | Width as a fraction of the step; the group shares this fraction. |
| `accessor` *required* | [`ValueFunction`](https://romanhaendler.github.io/umriss-ui/charts/api/#type-ValueFunction)`<T>` | — | Y value; null/undefined/NaN/±Infinity means a gap. From `SeriesBase`. |
| `data` | `readonly T[]` | — | Series-own data; overrides the container data. From `SeriesBase`. |
| `xAxisId` *required* | `string` | — |  From `SeriesBase`. |
| `yAxisId` *required* | `string` | — |  From `SeriesBase`. |
| `name` | `string` | — |  From `SeriesBase`. |
| `format` | `(value: number) => string` | — | The value in the tooltip; before the y axis' `tickFormat`. Compared by its source text, as an accessor is. From `SeriesBase`. |
| `color` | `string` | — |  From `SeriesBase`. |
| `tone` | `"ok" \| "warning" \| "alarm"` | — | A role instead of a colour value: the theme resolves it, in both themes. For series that mean something rather than just being the next one - the violating points of a control chart, say. `color` beats it. From `SeriesBase`. |
| `stack` | `string` | — | The stack this series stands in: series with the same id, on the same x and y axis, stack in registration order. From `Stackable`. |
| `normalize` | `boolean` | — | On any member, the whole stack sums to 100 at every x. From `Stackable`. |

### `Bin`

A bin, the way it is drawn.

| Prop | Type | Default | Description |
|---|---|---|---|
| `from` *required* | `number` | — | Lower edge; the bin holds it. |
| `to` *required* | `number` | — | Upper edge; the bin holds it only if it is the last one. |
| `x` *required* | `number` | — | The middle, `(from + to) / 2` - the bar's x. |
| `count` *required* | `number` | — | How many values fall in it. |

### `BinOptions`

The settings of `bin`.

| Prop | Type | Default | Description |
|---|---|---|---|
| `width` | `number` | — | The width of a bin. Wins over `count`. Without a `domain` the edges are multiples of it.<br>Shown in: [Count readings into a histogram (Bar)](https://romanhaendler.github.io/umriss-ui/charts/bar/#histogram) |
| `count` | `number` | `10` | About how many bins: the width becomes the next 1-2-5 step, so the number comes out near it and not exactly - with a `domain`, exactly. |
| `domain` | `readonly [number, number]` | — | The span the bins cover, the first edge on its start and the last on its end. Values outside it are left out, not clamped into the end bins. |

### `BoxChannels`

The named channels of a box: one number per point, NaN where the median
is a gap; and its outliers ([ADR-0040](https://github.com/romanhaendler/umriss-ui/blob/main/docs/adr/0040-a-box-carries-its-outliers.md)).

| Prop | Type | Default | Description |
|---|---|---|---|
| `outliers` *required* | `Float64Array \| null` | — | Every box's outliers, flat, box after box; null without `outliers`. |
| `outlierOffsets` *required* | `Uint32Array \| null` | — | Where each box's outliers begin, and one past the last: box i's stand from outlierOffsets[i] to outlierOffsets[i + 1]. null without `outliers`. |
| `mean` *required* | `Float64Array \| null` | — | The optional numbers, each null where not given. |
| `notchLower` *required* | `Float64Array \| null` | — |  |
| `notchUpper` *required* | `Float64Array \| null` | — |  |
| `count` *required* | `Float64Array \| null` | — |  |
| `lowerQuartile` *required* | `Float64Array` | — |  From `BoxNumbers`. |
| `upperQuartile` *required* | `Float64Array` | — |  From `BoxNumbers`. |
| `lowerWhisker` *required* | `Float64Array` | — |  From `BoxNumbers`. |
| `upperWhisker` *required* | `Float64Array` | — |  From `BoxNumbers`. |

### `BoxExtras<V = number>`

The optional numbers of a box by name.

| Prop | Type | Default | Description |
|---|---|---|---|
| `mean` *required* | `V` | — |  |
| `notchLower` *required* | `V` | — |  |
| `notchUpper` *required* | `V` | — |  |
| `count` *required* | `V` | — |  |

### `BoxNumbers<V = number>`

A box's further numbers beside its median, by name.

| Prop | Type | Default | Description |
|---|---|---|---|
| `lowerQuartile` *required* | `V` | — |  |
| `upperQuartile` *required* | `V` | — |  |
| `lowerWhisker` *required* | `V` | — |  |
| `upperWhisker` *required* | `V` | — |  |

### `BoxPlotProps`

Its table stands on [BoxPlot](https://romanhaendler.github.io/umriss-ui/charts/boxplot/#type-BoxPlotProps).

### `BoxSeriesConfig<T = unknown>`

A box plot (CONTEXT.md: Box). The base accessor is the median; the four
further numbers are the caller's, computed by whatever method the caller
chose - the library draws them and computes none.

| Prop | Type | Default | Description |
|---|---|---|---|
| `kind` *required* | `"box"` | — |  |
| `lowerQuartile` *required* | [`ValueFunction`](https://romanhaendler.github.io/umriss-ui/charts/api/#type-ValueFunction)`<T>` | — |  |
| `upperQuartile` *required* | [`ValueFunction`](https://romanhaendler.github.io/umriss-ui/charts/api/#type-ValueFunction)`<T>` | — |  |
| `lowerWhisker` *required* | [`ValueFunction`](https://romanhaendler.github.io/umriss-ui/charts/api/#type-ValueFunction)`<T>` | — |  |
| `upperWhisker` *required* | [`ValueFunction`](https://romanhaendler.github.io/umriss-ui/charts/api/#type-ValueFunction)`<T>` | — |  |
| `outliers` | [`ListFunction`](https://romanhaendler.github.io/umriss-ui/charts/api/#type-ListFunction)`<T>` | — | The values beyond the whiskers, per box ([ADR-0040](https://github.com/romanhaendler/umriss-ui/blob/main/docs/adr/0040-a-box-carries-its-outliers.md)). |
| `mean` | [`ValueFunction`](https://romanhaendler.github.io/umriss-ui/charts/api/#type-ValueFunction)`<T>` | — |  |
| `notchLower` | [`ValueFunction`](https://romanhaendler.github.io/umriss-ui/charts/api/#type-ValueFunction)`<T>` | — | Both bounds or neither (CONTEXT.md: Notch). |
| `notchUpper` | [`ValueFunction`](https://romanhaendler.github.io/umriss-ui/charts/api/#type-ValueFunction)`<T>` | — |  |
| `count` | [`ValueFunction`](https://romanhaendler.github.io/umriss-ui/charts/api/#type-ValueFunction)`<T>` | — | How many values stand behind the box; no y value. |
| `boxWidth` *required* | `number` | — | Width as a fraction of the step; boxes and bars on one x axis share it. |
| `accessor` *required* | [`ValueFunction`](https://romanhaendler.github.io/umriss-ui/charts/api/#type-ValueFunction)`<T>` | — | Y value; null/undefined/NaN/±Infinity means a gap. From `SeriesBase`. |
| `data` | `readonly T[]` | — | Series-own data; overrides the container data. From `SeriesBase`. |
| `xAxisId` *required* | `string` | — |  From `SeriesBase`. |
| `yAxisId` *required* | `string` | — |  From `SeriesBase`. |
| `name` | `string` | — |  From `SeriesBase`. |
| `format` | `(value: number) => string` | — | The value in the tooltip; before the y axis' `tickFormat`. Compared by its source text, as an accessor is. From `SeriesBase`. |
| `color` | `string` | — |  From `SeriesBase`. |
| `tone` | `"ok" \| "warning" \| "alarm"` | — | A role instead of a colour value: the theme resolves it, in both themes. For series that mean something rather than just being the next one - the violating points of a control chart, say. `color` beats it. From `SeriesBase`. |

### `CalendarInput`

Every function of this module takes either: the raw list as it stands on the
axis, or the calendar built from it.

```ts
type CalendarInput = WorkingCalendar | readonly WorkingInterval[];
```

### `ChartOptions`

Its table stands on [Zoom and pan](https://romanhaendler.github.io/umriss-ui/charts/zoom-and-pan/#type-ChartOptions).

### `ChartParts<Z>`

What `useChart` hands back: the chart and its parts, typed at the row `Z`,
its view and the setters that change it. A series given `data` of its own
is typed by that `data` instead.

| Prop | Type | Default | Description |
|---|---|---|---|
| `Chart` *required* | `(props: `[`ChartProps`](https://romanhaendler.github.io/umriss-ui/charts/chart/#type-ChartProps)`) => ReactNode` | — | The chart over the hook's rows. One per `useChart`: it holds the view, and a second chart is a second call.<br>Shown in: [Draw a first chart (Installation)](https://romanhaendler.github.io/umriss-ui/charts/installation/#first-chart), [Size a chart by its container (Installation)](https://romanhaendler.github.io/umriss-ui/charts/installation/#in-its-container), [Mix series kinds (Chart)](https://romanhaendler.github.io/umriss-ui/charts/chart/#mixed) and 74 more |
| `XAxis` *required* | `<T = Z>(props: `[`XAxisProps`](https://romanhaendler.github.io/umriss-ui/charts/axis/#type-XAxisProps)`<T>) => null` | — | An x axis reads the rows of every series bound to it: the hook's, or with `<XAxis<Row>>` those the series bring as their own `data`.<br>Shown in: [Draw a first chart (Installation)](https://romanhaendler.github.io/umriss-ui/charts/installation/#first-chart), [Size a chart by its container (Installation)](https://romanhaendler.github.io/umriss-ui/charts/installation/#in-its-container), [Mix series kinds (Chart)](https://romanhaendler.github.io/umriss-ui/charts/chart/#mixed) and 74 more |
| `YAxis` *required* | `(props: `[`YAxisProps`](https://romanhaendler.github.io/umriss-ui/charts/axis/#type-YAxisProps)`) => null` | — | <br>Shown in: [Draw a first chart (Installation)](https://romanhaendler.github.io/umriss-ui/charts/installation/#first-chart), [Size a chart by its container (Installation)](https://romanhaendler.github.io/umriss-ui/charts/installation/#in-its-container), [Mix series kinds (Chart)](https://romanhaendler.github.io/umriss-ui/charts/chart/#mixed) and 74 more |
| `Line` *required* | `<T = Z>(props: `[`LineProps`](https://romanhaendler.github.io/umriss-ui/charts/line/#type-LineProps)`<T>) => null` | — | <br>Shown in: [Draw a first chart (Installation)](https://romanhaendler.github.io/umriss-ui/charts/installation/#first-chart), [Size a chart by its container (Installation)](https://romanhaendler.github.io/umriss-ui/charts/installation/#in-its-container), [Mix series kinds (Chart)](https://romanhaendler.github.io/umriss-ui/charts/chart/#mixed) and 47 more |
| `Area` *required* | `<T = Z>(props: `[`AreaProps`](https://romanhaendler.github.io/umriss-ui/charts/area/#type-AreaProps)`<T>) => null` | — | <br>Shown in: [Mix series kinds (Chart)](https://romanhaendler.github.io/umriss-ui/charts/chart/#mixed), [Mark every kind (Chart)](https://romanhaendler.github.io/umriss-ui/charts/chart/#marks-on-every-kind), [Bind every kind of series to a second axis (Axis)](https://romanhaendler.github.io/umriss-ui/charts/axis/#every-kind-on-a-second-axis) and 5 more |
| `Bar` *required* | `<T = Z>(props: `[`BarProps`](https://romanhaendler.github.io/umriss-ui/charts/bar/#type-BarProps)`<T>) => null` | — | <br>Shown in: [Mix series kinds (Chart)](https://romanhaendler.github.io/umriss-ui/charts/chart/#mixed), [Mark every kind (Chart)](https://romanhaendler.github.io/umriss-ui/charts/chart/#marks-on-every-kind), [Bind every kind of series to a second axis (Axis)](https://romanhaendler.github.io/umriss-ui/charts/axis/#every-kind-on-a-second-axis) and 13 more |
| `Scatter` *required* | `<T = Z>(props: `[`ScatterProps`](https://romanhaendler.github.io/umriss-ui/charts/scatter/#type-ScatterProps)`<T>) => null` | — | <br>Shown in: [Mix series kinds (Chart)](https://romanhaendler.github.io/umriss-ui/charts/chart/#mixed), [Mark every kind (Chart)](https://romanhaendler.github.io/umriss-ui/charts/chart/#marks-on-every-kind), [Bind every kind of series to a second axis (Axis)](https://romanhaendler.github.io/umriss-ui/charts/axis/#every-kind-on-a-second-axis) and 3 more |
| `StateBand` *required* | `<T = Z>(props: `[`StateBandProps`](https://romanhaendler.github.io/umriss-ui/charts/stateband/#type-StateBandProps)`<T> & `[`OneLane`](https://romanhaendler.github.io/umriss-ui/charts/api/#type-OneLane)`) => null` | — | <br>Shown in: [Mark bands, limits and cells (Chart)](https://romanhaendler.github.io/umriss-ui/charts/chart/#bands-limits-and-cells), [One vehicle through the day (StateBand)](https://romanhaendler.github.io/umriss-ui/charts/stateband/#one-vehicle), [Lay a state under a course (StateBand)](https://romanhaendler.github.io/umriss-ui/charts/stateband/#under-a-course) and 4 more |
| `Matrix` *required* | `<T = Z>(props: `[`MatrixProps`](https://romanhaendler.github.io/umriss-ui/charts/matrix/#type-MatrixProps)`<T>) => null` | — | <br>Shown in: [Mark bands, limits and cells (Chart)](https://romanhaendler.github.io/umriss-ui/charts/chart/#bands-limits-and-cells), [Colour cells by their limits (Matrix)](https://romanhaendler.github.io/umriss-ui/charts/matrix/#by-limits), [Colour cells along a gradient (Matrix)](https://romanhaendler.github.io/umriss-ui/charts/matrix/#gradient) and 1 more |
| `BoxPlot` *required* | `<T = Z>(props: `[`BoxPlotProps`](https://romanhaendler.github.io/umriss-ui/charts/boxplot/#type-BoxPlotProps)`<T>) => null` | — | <br>Shown in: [One box per service (BoxPlot)](https://romanhaendler.github.io/umriss-ui/charts/boxplot/#minimal), [A box per hour on a time axis (BoxPlot)](https://romanhaendler.github.io/umriss-ui/charts/boxplot/#over-time), [With outliers (BoxPlot)](https://romanhaendler.github.io/umriss-ui/charts/boxplot/#outliers) and 4 more |
| `view` *required* | [`ChartView`](https://romanhaendler.github.io/umriss-ui/charts/view/#type-ChartView) | — | How the reader is looking at the chart.<br>Shown in: [Keep and restore a view (View)](https://romanhaendler.github.io/umriss-ui/charts/view/#keep-and-restore) |
| `domains` *required* | [`AxisSpans`](https://romanhaendler.github.io/umriss-ui/charts/api/#type-AxisSpans) | — | The span each zoomable x axis shows, by axis `id`; an axis absent shows its own `domain`. |
| `setView` *required* | `(view: `[`ChartView`](https://romanhaendler.github.io/umriss-ui/charts/view/#type-ChartView)`) => void` | — | Goes to a whole view; what it leaves out is shown whole again. Not reported through `onViewChange`: two charts 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: [Read it by keyboard and screen reader (Chart)](https://romanhaendler.github.io/umriss-ui/charts/chart/#keyboard-and-screen-reader), [Keep charts in step (Zoom and pan)](https://romanhaendler.github.io/umriss-ui/charts/zoom-and-pan/#cursor-sync), [Keep and restore a view (View)](https://romanhaendler.github.io/umriss-ui/charts/view/#keep-and-restore) |
| `setDomain` *required* | `(axisId: string, span: readonly [number, number] \| null) => void` | — | Puts a span in view on a zoomable x axis - a lone one is `"x"`; `null` shows the axis' own `domain` again.<br>Shown in: [Measure a million points (Benchmark)](https://romanhaendler.github.io/umriss-ui/charts/benchmark/#benchmark) |
| `hidden` *required* | `readonly string[]` | — | The hidden series, by `name`. |
| `toggleSeries` *required* | `(name: string) => void` | — | Hides the series `name`, or shows it where it is hidden - as a click on its legend entry does. Hiding the last series visible shows all. |
| `showOnly` *required* | `(name: string) => void` | — | Hides every series but `name`; all are shown where none carries it.<br>Shown in: [Hide a series from the legend (Legend)](https://romanhaendler.github.io/umriss-ui/charts/legend/#hide-a-series) |
| `showAllSeries` *required* | `() => void` | — | Shows every series again.<br>Shown in: [Hide a series from the legend (Legend)](https://romanhaendler.github.io/umriss-ui/charts/legend/#hide-a-series) |

Used on [Chart](https://romanhaendler.github.io/umriss-ui/charts/chart/).

### `ChartPerf`

Measurements of the instrumentation for the benchmark page.

| Prop | Type | Default | Description |
|---|---|---|---|
| `materializeMs` *required* | `number` | — | <br>Shown in: [Measure a million points (Benchmark)](https://romanhaendler.github.io/umriss-ui/charts/benchmark/#benchmark) |
| `seriesDrawMs` *required* | `number` | — | <br>Shown in: [Measure a million points (Benchmark)](https://romanhaendler.github.io/umriss-ui/charts/benchmark/#benchmark), [Draw a week of seconds (Benchmark)](https://romanhaendler.github.io/umriss-ui/charts/benchmark/#a-week-of-seconds) |
| `points` *required* | `number` | — | <br>Shown in: [Measure a million points (Benchmark)](https://romanhaendler.github.io/umriss-ui/charts/benchmark/#benchmark) |

Used on [Benchmark](https://romanhaendler.github.io/umriss-ui/charts/benchmark/).

### `ChartProps`

Its table stands on [Chart](https://romanhaendler.github.io/umriss-ui/charts/chart/#type-ChartProps).

### `ChartsWording`

Everything the charts put out as text.

| Prop | Type | Default | Description |
|---|---|---|---|
| `locale` *required* | `string` | — | The BCP 47 tag every number and every date or time label of the chart is formatted in (`en-GB`, `de-DE`). The one input for the locale: the browser's language is not read. The clock stays 24-hour in both. |
| `roleDescription` *required* | `string` | — | What a screen reader calls the plot area that takes the keys (`aria-roledescription`). |
| `empty` *required* | `string` | — | Shown in the plot area when no visible series has a point to show. |
| `seriesList` *required* | `(names: readonly string[]) => string` | — | The summary's visible series, by name. |
| `visibleRange` *required* | `(from: string, to: string) => string` | — | The summary's visible stretch of the x axis, both ends formatted. |
| `seriesExtent` *required* | `(name: string, min: string, max: string) => string` | — | The summary's lowest and highest value of one series in that stretch. |
| `limitList` *required* | `(limits: readonly { name: string; value: string }[]) => string` | — | The summary's labelled limits, each with its value in its axis' format (a band's two edges as one value). |
| `readout` *required* | `(x: string, rows: readonly { name: string; value: string; x: string }[]) => string` | — | What is read after a key: the position, then each series with its value (and its own x where it stands on another x axis), the emphasised one first. |
| `stackTotal` *required* | `string` | — | The last row of a stack in the tooltip and the readout: the sum of its members at the point. |
| `percent` *required* | `(value: string) => string` | — | A share in a normalised stack, its number already formatted. |
| `walkHelp` *required* | `string` | — | The keys that walk the chart. |
| `selectHelp` *required* | `string` | — | The key that reports the Active point - only where `onSelect` is given. |
| `zoomHelp` *required* | `string` | — | The keys that zoom and pan it - only where the chart can be zoomed. |
| `legendHelp` *required* | `string` | — | The keys of the legend's entries - only where it has one to press. |
| `allShown` *required* | `string` | — | Read out where hiding would leave nothing to see, and every series is shown instead. |
| `showAll` *required* | `string` | — | The control over a zoomed plot that brings every zoomed axis back to its own domain (component-view 04). |
| `showData` *required* | `string` | — | The data table's disclosure key, closed and open. |
| `hideData` *required* | `string` | — |  |
| `positionColumn` *required* | `string` | — | The heading of the table's x column where its axis has no `label`, and of a matrix' row column where its y axis has none. |
| `rowColumn` *required* | `string` | — |  |
| `tableCaption` *required* | `(from: string, to: string) => string` | — | The table's caption: the visible stretch it lists, both ends formatted. |
| `upperWhisker` *required* | `string` | — | A box's numbers, top to bottom as drawn: the tooltip's rows, the readout's parts and the data table's columns (box-plot B9). |
| `upperQuartile` *required* | `string` | — |  |
| `median` *required* | `string` | — |  |
| `lowerQuartile` *required* | `string` | — |  |
| `lowerWhisker` *required* | `string` | — |  |
| `outliers` *required* | `string` | — | A box's outliers: the row's name, and the row's value - their count and the first few values, the rest counted (box-plot B9). |
| `mean` *required* | `string` | — | A box's optional readings: its mean, its notch's two bounds as one row, and how many values stand behind it. |
| `notch` *required* | `string` | — |  |
| `count` *required* | `string` | — |  |
| `outlierList` *required* | `(values: readonly string[], more: number) => string` | — |  |
| `downsampled` *required* | `(readings: number) => string` | — | Added to the caption where the table shows the downsampled course: how many readings its rows stand for. |

### `ChartView`

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

Used on [Zoom and pan](https://romanhaendler.github.io/umriss-ui/charts/zoom-and-pan/) and [View](https://romanhaendler.github.io/umriss-ui/charts/view/).

### `ControlChartProps`

Its table stands on [ControlChart](https://romanhaendler.github.io/umriss-ui/charts/controlchart/#type-ControlChartProps).

### `ControlLimitOrigin`

Where the limits come from. There are exactly these two possibilities.

```ts
type ControlLimitOrigin =
  /** From a baseline the caller has fixed. Taken as it is - even where the
      series would yield something else out of itself. */
  | { readonly kind: "given"; readonly center: number; readonly sigma: number }
  /** From exactly this index range of the series, half-open [from, to). */
  | { readonly kind: "referenceWindow"; readonly from: number; readonly to: number };
```

### `ControlLimits`

Centre line, estimated spread and the control limits at three sigma.

| Prop | Type | Default | Description |
|---|---|---|---|
| `center` *required* | `number` | — | <br>Shown in: [Set specification and control limits side by side (LimitLine)](https://romanhaendler.github.io/umriss-ui/charts/limitline/#specification-and-control) |
| `sigma` *required* | `number` | — | Estimated spread of a single value, not the distance to the limit. |
| `upper` *required* | `number` | — | <br>Shown in: [Set specification and control limits side by side (LimitLine)](https://romanhaendler.github.io/umriss-ui/charts/limitline/#specification-and-control) |
| `lower` *required* | `number` | — | <br>Shown in: [Set specification and control limits side by side (LimitLine)](https://romanhaendler.github.io/umriss-ui/charts/limitline/#specification-and-control) |

### `DataTableGroup`

One table of the data table: the series of one x axis, or one matrix. Every
cell is text already, in the format the tooltip writes.

| Prop | Type | Default | Description |
|---|---|---|---|
| `key` *required* | `string` | — |  |
| `caption` *required* | `string` | — |  |
| `columns` *required* | `readonly string[]` | — |  |
| `rows` *required* | `readonly (readonly string[])[]` | — | The first cell of each row is its x - the row's heading. |

### `LegendConfig`

A `Legend` as the chart holds it once registered.

| Prop | Type | Default | Description |
|---|---|---|---|
| `placement` *required* | `"top" \| "bottom"` | — |  |

### `LegendProps`

Its table stands on [Legend](https://romanhaendler.github.io/umriss-ui/charts/legend/#type-LegendProps).

### `Limit`

A bound: a value, a side and a severity. No more - a tolerance band is
derived and never an input (two limits of equal severity on opposite sides
enclose one). That keeps the one-sided case, which is the more common one,
free of a `null` on the other edge.

| Prop | Type | Default | Description |
|---|---|---|---|
| `value` *required* | `number` | — | <br>Shown in: [Mark bands, limits and cells (Chart)](https://romanhaendler.github.io/umriss-ui/charts/chart/#bands-limits-and-cells), [Colour cells by their limits (Matrix)](https://romanhaendler.github.io/umriss-ui/charts/matrix/#by-limits) |
| `side` *required* | [`Side`](https://romanhaendler.github.io/umriss-ui/charts/api/#type-Side)<br>`"upper" \| "lower"` | — | <br>Shown in: [Mark bands, limits and cells (Chart)](https://romanhaendler.github.io/umriss-ui/charts/chart/#bands-limits-and-cells), [Colour cells by their limits (Matrix)](https://romanhaendler.github.io/umriss-ui/charts/matrix/#by-limits) |
| `severity` *required* | [`Severity`](https://romanhaendler.github.io/umriss-ui/charts/api/#type-Severity)<br>`"warning" \| "alarm"` | — | <br>Shown in: [Mark bands, limits and cells (Chart)](https://romanhaendler.github.io/umriss-ui/charts/chart/#bands-limits-and-cells), [Colour cells by their limits (Matrix)](https://romanhaendler.github.io/umriss-ui/charts/matrix/#by-limits) |

### `LimitBandConfig`

A `LimitBand` as the chart holds it once registered: the range from `from`
to `to`.

| Prop | Type | Default | Description |
|---|---|---|---|
| `kind` *required* | `"band"` | — |  |
| `from` *required* | `number` | — |  |
| `to` *required* | `number` | — |  |
| `axisId` | `string` | — | Axis on which the value lies; without one, the first axis of its orientation. From `LimitBase`. |
| `orientation` *required* | [`AxisOrientation`](https://romanhaendler.github.io/umriss-ui/charts/api/#type-AxisOrientation)<br>`"x" \| "y"` | — |  From `LimitBase`. |
| `severity` *required* | [`Severity`](https://romanhaendler.github.io/umriss-ui/charts/api/#type-Severity)<br>`"warning" \| "alarm"` | — |  From `LimitBase`. |
| `label` | `string` | — |  From `LimitBase`. |
| `color` | `string` | — | A colour of its own; without one, that of the role or of the severity out of the theme. From `LimitBase`. |
| `inExtent` *required* | `boolean` | — | Pulls the extent of the axis along. Default true: an excluded limit yields a chart that looks right and does not show its most important line - and that nobody notices. A squashed plot is noticed at once. From `LimitBase`. |

#### Accessibility

| Prop | Type | Default | Description |
|---|---|---|---|
| `role` *required* | [`LimitRole`](https://romanhaendler.github.io/umriss-ui/charts/api/#type-LimitRole)<br>`"specification" \| "control" \| "zone"` | — |  From `LimitBase`. |

### `LimitBandProps`

Its table stands on [LimitLine](https://romanhaendler.github.io/umriss-ui/charts/limitline/#type-LimitBandProps).

### `LimitConfig`

Any registered limit, a line or a band, told apart by `kind`.

```ts
type LimitConfig = LimitLineConfig | LimitBandConfig;
```

### `LimitLineConfig`

A `LimitLine` as the chart holds it once registered.

| Prop | Type | Default | Description |
|---|---|---|---|
| `kind` *required* | `"line"` | — |  |
| `value` *required* | `number` | — |  |
| `axisId` | `string` | — | Axis on which the value lies; without one, the first axis of its orientation. From `LimitBase`. |
| `orientation` *required* | [`AxisOrientation`](https://romanhaendler.github.io/umriss-ui/charts/api/#type-AxisOrientation)<br>`"x" \| "y"` | — |  From `LimitBase`. |
| `severity` *required* | [`Severity`](https://romanhaendler.github.io/umriss-ui/charts/api/#type-Severity)<br>`"warning" \| "alarm"` | — |  From `LimitBase`. |
| `label` | `string` | — |  From `LimitBase`. |
| `color` | `string` | — | A colour of its own; without one, that of the role or of the severity out of the theme. From `LimitBase`. |
| `inExtent` *required* | `boolean` | — | Pulls the extent of the axis along. Default true: an excluded limit yields a chart that looks right and does not show its most important line - and that nobody notices. A squashed plot is noticed at once. From `LimitBase`. |

#### Accessibility

| Prop | Type | Default | Description |
|---|---|---|---|
| `role` *required* | [`LimitRole`](https://romanhaendler.github.io/umriss-ui/charts/api/#type-LimitRole)<br>`"specification" \| "control" \| "zone"` | — |  From `LimitBase`. |

### `LimitLineProps`

Its table stands on [LimitLine](https://romanhaendler.github.io/umriss-ui/charts/limitline/#type-LimitLineProps).

### `LimitRole`

What a limit stands for. The difference is not cosmetic: a specification
limit is chosen (what the customer assumes), a control limit is calculated
(what the process normally does). A process can be in control and outside the
specification and the other way round, and each of the four cases calls for
something different - which is why the two lines have to look
distinguishable ([ADR-0008](https://github.com/romanhaendler/umriss-ui/blob/main/docs/adr/0008-control-limits-are-not-specification-limits.md)).

```ts
type LimitRole = "specification" | "control" | "zone";
```

### `LimitSet`

The set a value is read against: its bounds and, where there is one, its
target.

The target is not a limit. It is missed, never violated, and it is never the
edge of a region. Conflating the two is how a tile turns red for being above
target.

| Prop | Type | Default | Description |
|---|---|---|---|
| `limits` | `readonly `[`Limit`](https://romanhaendler.github.io/umriss-ui/charts/api/#type-Limit)`[]` | — | In any order; none, one or several.<br>Shown in: [Mark bands, limits and cells (Chart)](https://romanhaendler.github.io/umriss-ui/charts/chart/#bands-limits-and-cells), [Colour cells by their limits (Matrix)](https://romanhaendler.github.io/umriss-ui/charts/matrix/#by-limits) |
| `target` | `number` | — |  |

Used on [Scenarios](https://romanhaendler.github.io/umriss-ui/charts/).

### `LineProps`

Its table stands on [Line](https://romanhaendler.github.io/umriss-ui/charts/line/#type-LineProps).

### `LineSeriesConfig<T = unknown>`

A `Line` as the chart holds it once registered.

| Prop | Type | Default | Description |
|---|---|---|---|
| `kind` *required* | `"line"` | — |  |
| `strokeWidth` *required* | `number` | — |  |
| `dash` | `readonly number[]` | — |  |
| `markers` *required* | `"auto" \| "always" \| "never"` | — |  |
| `step` | `boolean` | — | Sample-and-hold: each value holds until the next sample. |
| `accessor` *required* | [`ValueFunction`](https://romanhaendler.github.io/umriss-ui/charts/api/#type-ValueFunction)`<T>` | — | Y value; null/undefined/NaN/±Infinity means a gap. From `SeriesBase`. |
| `data` | `readonly T[]` | — | Series-own data; overrides the container data. From `SeriesBase`. |
| `xAxisId` *required* | `string` | — |  From `SeriesBase`. |
| `yAxisId` *required* | `string` | — |  From `SeriesBase`. |
| `name` | `string` | — |  From `SeriesBase`. |
| `format` | `(value: number) => string` | — | The value in the tooltip; before the y axis' `tickFormat`. Compared by its source text, as an accessor is. From `SeriesBase`. |
| `color` | `string` | — |  From `SeriesBase`. |
| `tone` | `"ok" \| "warning" \| "alarm"` | — | A role instead of a colour value: the theme resolves it, in both themes. For series that mean something rather than just being the next one - the violating points of a control chart, say. `color` beats it. From `SeriesBase`. |

### `ListField<T>`

The fields of a row whose value is a list of numbers, or absent.

```ts
type ListField<T> = NoInfer<
  {
    [K in keyof T & string]-?: T[K] extends readonly number[] | null | undefined ? K : never;
  }[keyof T & string]
>;
```

### `ListFunction<T>`

A list computed from the row - a box's outliers ([ADR-0040](https://github.com/romanhaendler/umriss-ui/blob/main/docs/adr/0040-a-box-carries-its-outliers.md)), the
function form of `ListValue`. null/undefined or an
empty array is none; a value that is not finite is left out.

```ts
type ListFunction<T> = (d: T, index: number) => readonly number[] | null | undefined;
```

### `ListValue<T>`

A list read from the row: the name of a list field or a function.

```ts
type ListValue<T> = ListField<T> | ListFunction<T>;
```

### `MaterializedSeries`

Materialised series: the draw loop works only on this.
Gaps (null/undefined/NaN/±Infinity out of the accessor) are encoded as NaN.

| Prop | Type | Default | Description |
|---|---|---|---|
| `x` *required* | `Float64Array` | — |  |
| `y` *required* | `Float64Array` | — |  |
| `y0` *required* | `Float64Array \| null` | — | Lower edge, where the baseline is an accessor of its own; otherwise null. A fixed baseline needs no channel - it is a number. |
| `w` *required* | `Float64Array \| null` | — | Level channel: the third value per point, which today only the matrix needs. Named rather than overloading y0 - a property that only some kinds carry does not belong in the shared type with a comment ([ADR-0011](https://github.com/romanhaendler/umriss-ui/blob/main/docs/adr/0011-named-channels-never-overloaded.md)). null for every kind that does not use it. |
| `box` *required* | [`BoxChannels`](https://romanhaendler.github.io/umriss-ui/charts/api/#type-BoxChannels)` \| null` | — | A box's further numbers beside its median in y; null for every other kind ([ADR-0011](https://github.com/romanhaendler/umriss-ui/blob/main/docs/adr/0011-named-channels-never-overloaded.md)). |
| `length` *required* | `number` | — |  |

### `MatrixColoring`

How a matrix colours its cells. Discretely by assessment - the same limits
that colour a tile - or across a gradient.

```ts
type MatrixColoring =
  | { kind: "assessment"; limits: LimitSet }
  | {
      kind: "gradient";
      /** Colour stops from small to large; at least two. The stops ARE the
          steps - the library does not interpolate between them, because that
          would mean a colour parser for arbitrary CSS colour values, which this
          package does not have and is not to get (ADR-0011). Whoever wants a
          finer gradation names more colours. */
      stops: readonly string[];
      /** Value range of the gradient.
          @default the range of the data */
      range?: readonly [number, number];
    };
```

### `MatrixProps`

Its table stands on [Matrix](https://romanhaendler.github.io/umriss-ui/charts/matrix/#type-MatrixProps).

### `MatrixSeriesConfig<T = unknown>`

A `Matrix` as the chart holds it once registered: its base accessor is the
row, `level` the colour. The row may be named: where the accessor yields a
string, materialisation gives it its category's place ([ADR-0052](https://github.com/romanhaendler/umriss-ui/blob/main/docs/adr/0052-a-chart-reads-its-rows-as-they-come.md)) - the one
series kind whose base accessor reads more than a number.

| Prop | Type | Default | Description |
|---|---|---|---|
| `kind` *required* | `"matrix"` | — |  |
| `level` *required* | [`ValueFunction`](https://romanhaendler.github.io/umriss-ui/charts/api/#type-ValueFunction)`<T>` | — | The level that decides the colour - the third channel ([ADR-0011](https://github.com/romanhaendler/umriss-ui/blob/main/docs/adr/0011-named-channels-never-overloaded.md)). The base accessor yields the row position, not this level. |
| `coloring` *required* | [`MatrixColoring`](https://romanhaendler.github.io/umriss-ui/charts/api/#type-MatrixColoring) | — |  |
| `accessor` *required* | [`ValueFunction`](https://romanhaendler.github.io/umriss-ui/charts/api/#type-ValueFunction)`<T>` | — | Y value; null/undefined/NaN/±Infinity means a gap. From `SeriesBase`. |
| `data` | `readonly T[]` | — | Series-own data; overrides the container data. From `SeriesBase`. |
| `xAxisId` *required* | `string` | — |  From `SeriesBase`. |
| `yAxisId` *required* | `string` | — |  From `SeriesBase`. |
| `name` | `string` | — |  From `SeriesBase`. |
| `format` | `(value: number) => string` | — | The value in the tooltip; before the y axis' `tickFormat`. Compared by its source text, as an accessor is. From `SeriesBase`. |
| `color` | `string` | — |  From `SeriesBase`. |
| `tone` | `"ok" \| "warning" \| "alarm"` | — | A role instead of a colour value: the theme resolves it, in both themes. For series that mean something rather than just being the next one - the violating points of a control chart, say. `color` beats it. From `SeriesBase`. |

### `NumberField<T>`

The fields of a row whose value is a number, or absent.

```ts
type NumberField<T> = NoInfer<
  {
    [K in keyof T & string]-?: T[K] extends number | null | undefined ? K : never;
  }[keyof T & string]
>;
```

### `OneLane`

A lane is named or given by its edges: the compiler refuses both at once.
Beside the props and not in them, so that `StateBandProps` stays an
interface another can extend.

```ts
type OneLane = { lane: string; laneFrom?: undefined; laneTo?: undefined } | { lane?: undefined };
```

### `Padding`

Space in CSS pixels on each side of a rectangle.

| Prop | Type | Default | Description |
|---|---|---|---|
| `top` *required* | `number` | — | <br>Shown in: [Fix the domain and name the ticks (Axis)](https://romanhaendler.github.io/umriss-ui/charts/axis/#configuration) |
| `right` *required* | `number` | — | <br>Shown in: [Fix the domain and name the ticks (Axis)](https://romanhaendler.github.io/umriss-ui/charts/axis/#configuration) |
| `bottom` *required* | `number` | — | <br>Shown in: [Fix the domain and name the ticks (Axis)](https://romanhaendler.github.io/umriss-ui/charts/axis/#configuration) |
| `left` *required* | `number` | — | <br>Shown in: [Fix the domain and name the ticks (Axis)](https://romanhaendler.github.io/umriss-ui/charts/axis/#configuration) |

### `ParetoEntry`

An item, the way it is drawn.

| Prop | Type | Default | Description |
|---|---|---|---|
| `name` *required* | `string` | — |  |
| `value` *required* | `number` | — |  |
| `index` *required* | `number` | — | The entry's rank from 0, in the order drawn - its place on an x axis that reads `name`, and an x value for one that reads numbers. |
| `share` *required* | `number` | — | Share of the total, 0…1. |
| `cumulative` *required* | `number` | — | Cumulative share up to and including this entry, 0…1. Exactly 1 at the last entry.<br>Shown in: [Sort causes and collect the tail (Pareto)](https://romanhaendler.github.io/umriss-ui/charts/pareto/#pareto) |
| `remainder` *required* | `boolean` | — | The collected tail. Exactly one entry can be this, and it always stands last. |

### `ParetoItem`

An item, the way the caller counts it.

| Prop | Type | Default | Description |
|---|---|---|---|
| `name` *required* | `string` | — |  |
| `value` *required* | `number` | — |  |

### `ParetoOptions`

The settings of `pareto`, complete; a call gives `ParetoSettings`.

| Prop | Type | Default | Description |
|---|---|---|---|
| `cutoff` *required* | `number` | `0.8` | The share whose crossing is sought. Whoever lands exactly on it counts as the crossing: the question is "which reasons make up eighty per cent", and whoever reaches eighty exactly belongs to them. |
| `collectRank` *required* | `number` | `Infinity` | How many items stay on their own. Everything behind that becomes a single entry. Beyond the number of items no remainder arises at all - not an empty one. |
| `remainderName` | `string` | none - the caller names it | Name of the collected remainder. The helper has no default wording for it. |

### `ParetoResult`

What `pareto` returns: the entries as they are drawn, their total and
where the cutoff is crossed.

| Prop | Type | Default | Description |
|---|---|---|---|
| `entries` *required* | `readonly `[`ParetoEntry`](https://romanhaendler.github.io/umriss-ui/charts/api/#type-ParetoEntry)`[]` | — | <br>Shown in: [Sort causes and collect the tail (Pareto)](https://romanhaendler.github.io/umriss-ui/charts/pareto/#pareto) |
| `total` *required* | `number` | — | Total of the drawn entries - after collecting, the same as before. |
| `cutoffIndex` *required* | `number` | — | Index of the first entry whose cumulative share reaches the cutoff; -1 when it is never reached. |

### `ParetoSettings`

What a call may specify: a collect rank only together with the name of the
remainder it creates.

```ts
type ParetoSettings = { readonly cutoff?: number } & (
  | { readonly collectRank?: undefined; readonly remainderName?: undefined }
  | { readonly collectRank: number; readonly remainderName: string }
);
```

### `Rect`

A rectangle in CSS pixels, from its top left corner.

| Prop | Type | Default | Description |
|---|---|---|---|
| `x` *required* | `number` | — |  |
| `y` *required* | `number` | — |  |
| `width` *required* | `number` | — |  |
| `height` *required* | `number` | — |  |

### `RemovedSpan`

A removed span and the place it collapses onto.

| Prop | Type | Default | Description |
|---|---|---|---|
| `from` *required* | `number` | — |  |
| `to` *required* | `number` | — |  |
| `workingTime` *required* | `number` | — | Working time on which the whole span lies - a point, not a stretch. |

### `ResolvedTheme`

A chart's colours and fonts, resolved from the `--uc-*` tokens where the
chart stands.

| Prop | Type | Default | Description |
|---|---|---|---|
| `colorAxis` *required* | `string` | — |  |
| `colorGrid` *required* | `string` | — |  |
| `colorText` *required* | `string` | — |  |
| `colorBg` *required* | `string` | — |  |
| `colorWarning` *required* | `string` | — | Colours of the two limit severities. A limit carries the colour of its severity, not that of its series - it belongs to none. |
| `colorAlarm` *required* | `string` | — |  |
| `colorOk` *required* | `string` | — | The third outcome of an assessment. "unknown" deliberately has no colour: a missing value becomes a hole like every gap in this library, and a hole carries no colour, because a colour would be a claim. |
| `font` *required* | `string` | — |  |
| `fontMono` *required* | `string` | — |  |
| `series` *required* | `readonly string[]` | — |  |
| `forced` *required* | `boolean` | — | The page is in forced colours: every colour above is a system colour, and the chart encodes by marks whatever its `encoding`. |

### `RuleName`

Name of a rule, the way it is switched on and off in `violations`.

```ts
type RuleName = "outlier" | "run" | "trend" | "twoOfThree";
```

Used on [Scenarios](https://romanhaendler.github.io/umriss-ui/charts/) and [ControlChart](https://romanhaendler.github.io/umriss-ui/charts/controlchart/).

### `RuleOptions`

Which rules run, and with which run lengths.

| Prop | Type | Default | Description |
|---|---|---|---|
| `outlier` *required* | `boolean` | — |  |
| `run` *required* | `boolean` | — |  |
| `trend` *required* | `boolean` | — |  |
| `twoOfThree` *required* | `boolean` | — |  |
| `runLength` *required* | `number` | — | Points on one side of the centre line from which rule 2 fires. |
| `trendLength` *required* | `number` | — | Points in succession from which rule 3 fires. |

### `Scale`

The mapping of an axis' values onto pixels and back, with its ticks. Every
scale of the library is affine; `LinearScale` implements it.

```ts
interface Scale {
  domain: readonly [number, number];
  range: readonly [number, number];
  /** Affine coefficients of the mapping px = v·m + b.

      They stand in the interface because the drawing code reads them and
      computes inline in the point loop instead of calling toPx() per point -
      that is what carries 60 fps at millions of points. Every scale of this
      library is affine; see docs/adr/0001-affine-scale-contract.md, which also
      says what a later log scale would cost. */
  readonly m: number;
  readonly b: number;
  toPx(v: number): number;
  fromPx(px: number): number;
  ticks(n: number): number[];
}
```

### `ScatterProps`

Its table stands on [Scatter](https://romanhaendler.github.io/umriss-ui/charts/scatter/#type-ScatterProps).

### `ScatterSeriesConfig<T = unknown>`

A `Scatter` as the chart holds it once registered.

| Prop | Type | Default | Description |
|---|---|---|---|
| `kind` *required* | `"scatter"` | — |  |
| `radius` *required* | `number` | — | Point radius in CSS pixels. |
| `accessor` *required* | [`ValueFunction`](https://romanhaendler.github.io/umriss-ui/charts/api/#type-ValueFunction)`<T>` | — | Y value; null/undefined/NaN/±Infinity means a gap. From `SeriesBase`. |
| `data` | `readonly T[]` | — | Series-own data; overrides the container data. From `SeriesBase`. |
| `xAxisId` *required* | `string` | — |  From `SeriesBase`. |
| `yAxisId` *required* | `string` | — |  From `SeriesBase`. |
| `name` | `string` | — |  From `SeriesBase`. |
| `format` | `(value: number) => string` | — | The value in the tooltip; before the y axis' `tickFormat`. Compared by its source text, as an accessor is. From `SeriesBase`. |
| `color` | `string` | — |  From `SeriesBase`. |
| `tone` | `"ok" \| "warning" \| "alarm"` | — | A role instead of a colour value: the theme resolves it, in both themes. For series that mean something rather than just being the next one - the violating points of a control chart, say. `color` beats it. From `SeriesBase`. |

### `SeriesBase<T = unknown>`

What every series registers, whatever its kind: where its values come from,
which axes it stands on, and how it is named and coloured.

| Prop | Type | Default | Description |
|---|---|---|---|
| `accessor` *required* | [`ValueFunction`](https://romanhaendler.github.io/umriss-ui/charts/api/#type-ValueFunction)`<T>` | — | Y value; null/undefined/NaN/±Infinity means a gap. |
| `data` | `readonly T[]` | — | Series-own data; overrides the container data. |
| `xAxisId` *required* | `string` | — |  |
| `yAxisId` *required* | `string` | — |  |
| `name` | `string` | — |  |
| `format` | `(value: number) => string` | — | The value in the tooltip; before the y axis' `tickFormat`. Compared by its source text, as an accessor is. |
| `color` | `string` | — |  |
| `tone` | `"ok" \| "warning" \| "alarm"` | — | A role instead of a colour value: the theme resolves it, in both themes. For series that mean something rather than just being the next one - the violating points of a control chart, say. `color` beats it. |

### `SeriesConfig<T = unknown>`

Any registered series, told apart by `kind`.

```ts
type SeriesConfig<T = unknown> =
  | LineSeriesConfig<T>
  | AreaSeriesConfig<T>
  | BarSeriesConfig<T>
  | BoxSeriesConfig<T>
  | ScatterSeriesConfig<T>
  | StateSeriesConfig<T>
  | MatrixSeriesConfig<T>;
```

### `SeriesKind`

The kinds of series a chart draws: `line`, `area`, `bar`, `box`, `scatter`,
`state` and `matrix`. The set is closed.

```ts
type SeriesKind = SeriesConfig["kind"];
```

### `Severity`

How seriously a violation weighs. Exactly two: one severity that advises and
one that calls for action. Five severities would be five colours, and five
colours on a dense screen are noise. Whoever needs a third
distinction sets a second limit.

```ts
type Severity = "warning" | "alarm";
```

### `Side`

Whether a limit is an upper or a lower bound.

```ts
type Side = "upper" | "lower";
```

### `StateBandProps`

Its table stands on [StateBand](https://romanhaendler.github.io/umriss-ui/charts/stateband/#type-StateBandProps).

### `StateEntry`

One state of the closed set a state series knows.

| Prop | Type | Default | Description |
|---|---|---|---|
| `label` *required* | `string` | — |  |
| `color` *required* | `string` | — |  |

### `StateSeriesConfig<T = unknown>`

A `StateBand` as the chart holds it once registered: its accessor yields
an index into `states`.

| Prop | Type | Default | Description |
|---|---|---|---|
| `kind` *required* | `"state"` | — |  |
| `states` *required* | `readonly `[`StateEntry`](https://romanhaendler.github.io/umriss-ui/charts/api/#type-StateEntry)`[]` | — | The closed set of states. The accessor yields the index into it - a number, not a key ([ADR-0007](https://github.com/romanhaendler/umriss-ui/blob/main/docs/adr/0007-a-state-is-a-number.md)). |
| `lane` | `string` | — | The lane by its name: a category of the y axis, whose place the band takes ([ADR-0052](https://github.com/romanhaendler/umriss-ui/blob/main/docs/adr/0052-a-chart-reads-its-rows-as-they-come.md)). |
| `laneFrom` | `number` | — | Lower edge of the lane in domain units of the y axis; without a value the beginning of the axis domain. |
| `laneTo` | `number` | — | Upper edge of the lane; without a value the end of the axis domain. |
| `accessor` *required* | [`ValueFunction`](https://romanhaendler.github.io/umriss-ui/charts/api/#type-ValueFunction)`<T>` | — | Y value; null/undefined/NaN/±Infinity means a gap. From `SeriesBase`. |
| `data` | `readonly T[]` | — | Series-own data; overrides the container data. From `SeriesBase`. |
| `xAxisId` *required* | `string` | — |  From `SeriesBase`. |
| `yAxisId` *required* | `string` | — |  From `SeriesBase`. |
| `name` | `string` | — |  From `SeriesBase`. |
| `format` | `(value: number) => string` | — | The value in the tooltip; before the y axis' `tickFormat`. Compared by its source text, as an accessor is. From `SeriesBase`. |
| `color` | `string` | — |  From `SeriesBase`. |
| `tone` | `"ok" \| "warning" \| "alarm"` | — | A role instead of a colour value: the theme resolves it, in both themes. For series that mean something rather than just being the next one - the violating points of a control chart, say. `color` beats it. From `SeriesBase`. |

### `TooltipConfig<T = unknown>`

A `Tooltip` as the chart holds it once registered.

| Prop | Type | Default | Description |
|---|---|---|---|
| `mode` *required* | `"x" \| "nearest"` | — |  |
| `limits` | `boolean` | — |  |
| `render` | `(hit: `[`TooltipHit`](https://romanhaendler.github.io/umriss-ui/charts/api/#type-TooltipHit)`<T>) => ReactNode` | — |  |

### `TooltipHit<T = unknown>`

What the pointer hit: the x value under it and one point per series there.
A custom tooltip's `render` receives it.

| Prop | Type | Default | Description |
|---|---|---|---|
| `xValue` *required* | `number` | — | <br>Shown in: [Fix the domain and name the ticks (Axis)](https://romanhaendler.github.io/umriss-ui/charts/axis/#configuration), [Write the tooltip yourself (Tooltip)](https://romanhaendler.github.io/umriss-ui/charts/tooltip/#own-content), [Choose a hit (Tooltip)](https://romanhaendler.github.io/umriss-ui/charts/tooltip/#choose-a-hit) |
| `points` *required* | `readonly `[`TooltipPoint`](https://romanhaendler.github.io/umriss-ui/charts/api/#type-TooltipPoint)`<T>[]` | — | <br>Shown in: [Fix the domain and name the ticks (Axis)](https://romanhaendler.github.io/umriss-ui/charts/axis/#configuration), [Write the tooltip yourself (Tooltip)](https://romanhaendler.github.io/umriss-ui/charts/tooltip/#own-content), [Choose a hit (Tooltip)](https://romanhaendler.github.io/umriss-ui/charts/tooltip/#choose-a-hit) |
| `xPx` *required* | `number` | — | Pixel position of the crosshair (snapped to the data point). |
| `yPx` *required* | `number` | — | Pixel position of the primary hit. |

Used on [Axis](https://romanhaendler.github.io/umriss-ui/charts/axis/) and [Tooltip](https://romanhaendler.github.io/umriss-ui/charts/tooltip/).

### `TooltipPoint<T = unknown>`

One hit per series in the tooltip.

| Prop | Type | Default | Description |
|---|---|---|---|
| `seriesName` *required* | `string` | — | <br>Shown in: [Fix the domain and name the ticks (Axis)](https://romanhaendler.github.io/umriss-ui/charts/axis/#configuration), [Write the tooltip yourself (Tooltip)](https://romanhaendler.github.io/umriss-ui/charts/tooltip/#own-content), [Choose a hit (Tooltip)](https://romanhaendler.github.io/umriss-ui/charts/tooltip/#choose-a-hit) |
| `color` *required* | `string` | — |  |
| `xValue` *required* | `number` | — | The point's x value on its own x axis - with several x axes it can differ from the hit's. |
| `yValue` *required* | `number` | — | The point's y value; in a stack its own value, not its top - in a normalised stack its share in percent.<br>Shown in: [Fix the domain and name the ticks (Axis)](https://romanhaendler.github.io/umriss-ui/charts/axis/#configuration), [Choose a hit (Tooltip)](https://romanhaendler.github.io/umriss-ui/charts/tooltip/#choose-a-hit) |
| `datum` *required* | `T` | — | <br>Shown in: [Write the tooltip yourself (Tooltip)](https://romanhaendler.github.io/umriss-ui/charts/tooltip/#own-content) |
| `index` *required* | `number` | — |  |
| `level` | `number` | — | Only for the matrix: its level, out of the level channel. It stands here and not in yValue, because yValue is the position on the y axis - for a matrix therefore the row. Putting both into one field would be exactly the overloading [ADR-0011](https://github.com/romanhaendler/umriss-ui/blob/main/docs/adr/0011-named-channels-never-overloaded.md) is written against. |
| `segment` | `{ from: number; to: number; label: string }` | — | Only for state series: the section being pointed at. A duration does not stand here - it is the difference of two numbers the entry already carries, and formatting it would presuppose knowing what the x axis means. The caller knows that, not this library. |
| `box` | [`BoxNumbers`](https://romanhaendler.github.io/umriss-ui/charts/api/#type-BoxNumbers)` & Partial<`[`BoxExtras`](https://romanhaendler.github.io/umriss-ui/charts/api/#type-BoxExtras)`` > & { /** As the caller gave them; only where the series has `outliers`. */ outliers?: readonly number[]; } `` | — | Only for a box: its further numbers; yValue is its median. Fields of their own for the reason `level` has one ([ADR-0011](https://github.com/romanhaendler/umriss-ui/blob/main/docs/adr/0011-named-channels-never-overloaded.md)). |

### `TooltipProps`

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

### `Value<T>`

A value read from the row ([ADR-0048](https://github.com/romanhaendler/umriss-ui/blob/main/docs/adr/0048-charts-are-bound-to-their-rows-by-the-hook.md)): the name of a number field, compared
by its name, or a function, compared by its source text (`ValueFunction`).

```ts
type Value<T> = NumberField<T> | ValueFunction<T>;
```

### `ValueFunction<T>`

A **value** computed from the row - the function form of `Value`.
Compared by its source text, not its identity - an inline function is new
on every render. Known limit: one that reads a
changed closure variable under the same text is not run again; pass a new
data reference then. A native or bound function is compared by identity.

```ts
type ValueFunction<T> = (d: T, index: number) => number | null | undefined;
```

### `Verdict`

What a value is. Four outcomes, not three.

`unknown` is an outcome of its own and not a `null` return: a `null`
invites `?? "ok"` at the call site, and that very expression is the defect
this module exists to prevent. A value nobody has is a reason to look and
not a reason to relax.

```ts
type Verdict = "ok" | "unknown" | "warning" | "alarm";
```

### `Violation`

A rule and the indices it violates.

| Prop | Type | Default | Description |
|---|---|---|---|
| `rule` *required* | [`RuleName`](https://romanhaendler.github.io/umriss-ui/charts/api/#type-RuleName)<br>`"outlier" \| "run" \| "trend" \| "twoOfThree"` | — | <br>Shown in: [List the rule violations (ControlChart)](https://romanhaendler.github.io/umriss-ui/charts/controlchart/#list-the-violations), [Choose the rules (ControlChart)](https://romanhaendler.github.io/umriss-ui/charts/controlchart/#choose-the-rules), [Hold the tile length in control (Scenarios)](https://romanhaendler.github.io/umriss-ui/charts/#hold-the-tile-length-in-control) |
| `indices` *required* | `readonly number[]` | — | <br>Shown in: [List the rule violations (ControlChart)](https://romanhaendler.github.io/umriss-ui/charts/controlchart/#list-the-violations), [Choose the rules (ControlChart)](https://romanhaendler.github.io/umriss-ui/charts/controlchart/#choose-the-rules), [Hold the tile length in control (Scenarios)](https://romanhaendler.github.io/umriss-ui/charts/#hold-the-tile-length-in-control) |

Used on [ControlChart](https://romanhaendler.github.io/umriss-ui/charts/controlchart/).

### `WorkingCalendar`

A working calendar: sorted, merged intervals with the working time
accumulated before each one begins. An empty calendar is no calendar: it maps
unchanged.

Build once, then pass around: the mapping runs once per point, and were it to
sort and accumulate every time, the calendar would be the most expensive
thing about the frame.

| Prop | Type | Default | Description |
|---|---|---|---|
| `intervals` *required* | `readonly `[`WorkingInterval`](https://romanhaendler.github.io/umriss-ui/charts/api/#type-WorkingInterval)`[]` | — |  |
| `offsets` *required* | `readonly number[]` | — | Working time accumulated before the respective interval begins. |
| `total` *required* | `number` | — | The whole working time - the axis' extent is [0, total]. |

### `WorkingInterval`

An interval in which time counts; thought of as half-open, but mappable from
both sides at its edges: both `from` and `to` have a working time.

| Prop | Type | Default | Description |
|---|---|---|---|
| `from` *required* | `number` | — |  |
| `to` *required* | `number` | — |  |

### `WorkingTimeTick`

A tick: where it stands on the clock and where it lies on the axis.

| Prop | Type | Default | Description |
|---|---|---|---|
| `wallClock` *required* | `number` | — |  |
| `workingTime` *required* | `number` | — |  |

### `XAxisProps`

Its table stands on [Axis](https://romanhaendler.github.io/umriss-ui/charts/axis/#type-XAxisProps).

### `YAxisProps`

Its table stands on [Axis](https://romanhaendler.github.io/umriss-ui/charts/axis/#type-YAxisProps).

### `Zone`

A zone line: k times sigma above and below the centre line.

| Prop | Type | Default | Description |
|---|---|---|---|
| `k` *required* | `number` | — |  |
| `upper` *required* | `number` | — |  |
| `lower` *required* | `number` | — |  |

Used on [Scenarios](https://romanhaendler.github.io/umriss-ui/charts/), [Axis](https://romanhaendler.github.io/umriss-ui/charts/axis/), [LimitLine](https://romanhaendler.github.io/umriss-ui/charts/limitline/) and [ControlChart](https://romanhaendler.github.io/umriss-ui/charts/controlchart/).

### `ZoomLimits`

The narrowest and the widest span zoom may reach, in the axis' units - the
schedule's shape.

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

Used on [Zoom and pan](https://romanhaendler.github.io/umriss-ui/charts/zoom-and-pan/).

## @umriss-ui/charts/wording/de

### `GERMAN_CHARTS_WORDING`

The German instance, for a chart's `wording`. Complete, because it is
typed `ChartsWording`.

Every entry, with its value, stands in the table [Charts wording](https://romanhaendler.github.io/umriss-ui/core/language/#charts-wording) on core's Language page.

```ts
const GERMAN_CHARTS_WORDING: ChartsWording;
```

Used on [Installation](https://romanhaendler.github.io/umriss-ui/charts/installation/) and [Chart](https://romanhaendler.github.io/umriss-ui/charts/chart/).
