@umriss-ui/charts 0.34.0 → 0.36.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/docs/llms-full.md CHANGED
@@ -1,4 +1,4 @@
1
- # @umriss-ui/charts 0.34.0
1
+ # @umriss-ui/charts 0.36.0
2
2
 
3
3
  > React canvas chart library for data-dense dashboards - line, area, bar, box plot, scatter, control and Pareto charts. Few chart kinds, drawn well, fast.
4
4
 
@@ -1057,7 +1057,7 @@ npm install @umriss-ui/charts
1057
1057
 
1058
1058
  Demo page: https://romanhaendler.github.io/umriss-ui/charts/installation/
1059
1059
 
1060
- The command installs the package alone: React 18 or 19 is its only peer and stays the application's own, and the package depends on nothing else. The stylesheet comes with the JavaScript, so there is nothing to import - `@umriss-ui/charts/styles.css` is there for setups that link stylesheets by hand. Its colours, type and sizes are `--uc-` tokens that fall back onto core's; [core's Theming page](https://romanhaendler.github.io/umriss-ui/core/theming/#charts-tokens) lists them all.
1060
+ The command installs the package alone: React 19 or newer is its only peer and stays the application's own, and the package depends on nothing else. The stylesheet comes with the JavaScript, so there is nothing to import - `@umriss-ui/charts/styles.css` is there for setups that link stylesheets by hand. Its colours, type and sizes are `--uc-` tokens that fall back onto core's; [core's Theming page](https://romanhaendler.github.io/umriss-ui/core/theming/#charts-tokens) lists them all.
1061
1061
 
1062
1062
  A chart takes its container's width and follows it; give it a `height` (300 px without one). `useChart(rows)` hands out `Chart`, its axes and its series, typed at the row; each reads its value from a row through `value`, a field name or a function - a value that is `null`, `undefined` or not finite is a gap, never a zero.
1063
1063
 
@@ -2948,11 +2948,11 @@ The keys of [Chart](#/chart/keyboard-chart) apply here.
2948
2948
  | Prop | Type | Default | Description |
2949
2949
  |---|---|---|---|
2950
2950
  | `value` *required* | [`AxisField`](#type-AxisField)`<T> \| ((d: T, index: number) => `[`AxisValue`](#type-AxisValue)`)` | — | Where a row lies on this axis: a field of the row, compared by its name, or a function of it, compared by its source text as a series' is (`ValueFunction`) - with the same closure limit. A number is a position, a `Date` an instant, a string a category: every distinct one gets a place of its own, in the order the rows bring them, a tick and its name as the label ([ADR-0052](https://github.com/romanhaendler/umriss-ui/blob/main/docs/adr/0052-a-chart-reads-its-rows-as-they-come.md)). The type decides, never the content - `"2024"` is a category, `2024` a number - and a row without a value has no place. The axis reads the rows of every series bound to it; where those bring their own `data`, name their row: `<XAxis<HourCount> value="hour" />`.<br>Shown in: [Fix the domain and name the ticks](#/axis/configuration), [Add axes for other magnitudes](#/axis/axes), [Leave out the hours nobody works](#/axis/working-time) and 74 more |
2951
- | `domain` | `"nice" \| "data" \| readonly [number, number] \| readonly [Date, Date]` | `"nice"` | `"nice"` widens the data's extent to ticks - to named `ticks` where there are any, on a time axis to whole units of a step of hours or longer -, `"data"` keeps it, a pair is fixed: numbers, on a time axis milliseconds or two `Date`s, on a category axis places. On a `zoomable` axis it is the start: what the axis shows while the chart's view names no span for it.<br>Shown in: [Bind every kind of series to a second axis](#/axis/every-kind-on-a-second-axis), [Read it by keyboard and screen reader (Chart)](#/chart/keyboard-and-screen-reader), [Gestures and keys (Zoom and pan)](#/zoom-and-pan/gestures-and-keys) and 10 more |
2951
+ | `domain` | `"nice" \| "data" \| readonly [number, number] \| readonly [Date, Date]` | `"nice"` | `"nice"` widens the data's extent to ticks - to named `ticks` where there are any, on a time axis to whole units of a step of hours or longer -, `"data"` keeps it, a pair is fixed: numbers, on a time axis milliseconds or two `Date`s, on a category axis places. On a `zoomable` axis it is the start: what the axis shows while the chart's view names no span for it.<br>Shown in: [Bind every kind of series to a second axis](#/axis/every-kind-on-a-second-axis), [Read it by keyboard and screen reader (Chart)](#/chart/keyboard-and-screen-reader), [Gestures and keys (Zoom and pan)](#/zoom-and-pan/gestures-and-keys) and 11 more |
2952
2952
  | `position` | `"bottom" \| "top"` | `"bottom"` | Which edge the axis stands at. A second x axis on the opposite edge is how a series counts in a unit of its own.<br>Shown in: [Add axes for other magnitudes](#/axis/axes), [Bind every kind of series to a second axis](#/axis/every-kind-on-a-second-axis) |
2953
2953
  | `time` | `boolean` | — | The values are instants: milliseconds since the epoch, or with `time` said ISO 8601 strings as an API sends them, read by the platform's rule - a date with a time and no offset is local time, a date alone is UTC; a string that is none is not drawn. Rows that hold a `Date` put the axis in time without `time`. Ticks on local boundaries from the minute to the month, labels by level in en-GB with a 24-hour clock - `15:00`, `17 Mar`, `Mar 2026` - and the date on the first tick and on the first of a new day (`17 Mar 00:00`); a day tick there carries the year. The tooltip's x value carries the seconds where the readings lie less than a minute apart. Another language is a `tickFormat`, which is handed the instant in milliseconds. `calendar` implies it.<br>Shown in: [Align a second axis to the grid](#/axis/aligned-ticks), [Draw a first chart (Installation)](#/installation/first-chart), [Size a chart by its container (Installation)](#/installation/in-its-container) and 36 more |
2954
2954
  | `calendar` | `readonly `[`WorkingInterval`](#type-WorkingInterval)`[]` | — | Working calendar: the intervals in which time counts. With it the axis stands in working time - nights and weekends are out, and every removed span gets a break mark. The scale stays affine; the mapping happens in materialisation ([ADR-0001](https://github.com/romanhaendler/umriss-ui/blob/main/docs/adr/0001-affine-scale-contract.md)).<br>Shown in: [Leave out the hours nobody works](#/axis/working-time) |
2955
- | `zoomable` | `boolean` | `false` | Zoom and pan: Ctrl or ⌘ with the wheel - and a pinch - zoom around the pointer, a drag, a horizontal wheel or Shift with the wheel pan, a double click goes back to `domain`; with the focus on the chart, + and − zoom, Shift with ← or → pans and 0 goes back. The span shown is part of the chart's view, by this axis' `id` (`useChart`'s `initialView`, `onViewChange`, `setView`, `setDomain`). The plain wheel always scrolls the page.<br>Shown in: [Read it by keyboard and screen reader (Chart)](#/chart/keyboard-and-screen-reader), [Gestures and keys (Zoom and pan)](#/zoom-and-pan/gestures-and-keys), [Limit the zoom (Zoom and pan)](#/zoom-and-pan/zoom-limits) and 5 more |
2955
+ | `zoomable` | `boolean` | `false` | Zoom and pan: Ctrl or ⌘ with the wheel - and a pinch - zoom around the pointer, a drag, a horizontal wheel or Shift with the wheel pan, a double click goes back to `domain`; with the focus on the chart, + and − zoom, Shift with ← or → pans and 0 goes back. The span shown is part of the chart's view, by this axis' `id` (`useChart`'s `initialView`, `onViewChange`, `setView`, `setDomain`). The plain wheel always scrolls the page.<br>Shown in: [Read it by keyboard and screen reader (Chart)](#/chart/keyboard-and-screen-reader), [Gestures and keys (Zoom and pan)](#/zoom-and-pan/gestures-and-keys), [Limit the zoom (Zoom and pan)](#/zoom-and-pan/zoom-limits) and 6 more |
2956
2956
  | `zoomLimits` | [`ZoomLimits`](#type-ZoomLimits) | at most the data's extent or this axis' own `domain`, whichever is wider, at least three data steps | The narrowest and the widest span zoom may reach, in the axis' units - milliseconds on a time axis.<br>Shown in: [Limit the zoom (Zoom and pan)](#/zoom-and-pan/zoom-limits) |
2957
2957
  | `id` | `string` | `"x"` | Axis id, through which series bind themselves.<br>Shown in: [Add axes for other magnitudes](#/axis/axes), [Align a second axis to the grid](#/axis/aligned-ticks), [Bind every kind of series to a second axis](#/axis/every-kind-on-a-second-axis) and 7 more |
2958
2958
  | `label` | `string` | — | Axis title.<br>Shown in: [Fix the domain and name the ticks](#/axis/configuration), [Add axes for other magnitudes](#/axis/axes), [Leave out the hours nobody works](#/axis/working-time) and 66 more |
@@ -2967,7 +2967,7 @@ The keys of [Chart](#/chart/keyboard-chart) apply here.
2967
2967
 
2968
2968
  | Prop | Type | Default | Description |
2969
2969
  |---|---|---|---|
2970
- | `domain` | `"nice" \| "data" \| "visible" \| readonly [number, number]` | `"nice"` | As on the x axis, and `"visible"`: what the series show inside their x axis' domain - a zoomed hour gets the hour's range, not the week's -, widened to ticks as `"nice"` is. Where the x domain is not fixed that is every point.<br>Shown in: [Fix the domain and name the ticks](#/axis/configuration), [Bind every kind of series to a second axis](#/axis/every-kind-on-a-second-axis), [Mark bands, limits and cells (Chart)](#/chart/bands-limits-and-cells) and 10 more |
2970
+ | `domain` | `"nice" \| "data" \| "visible" \| readonly [number, number]` | `"nice"` | As on the x axis, and `"visible"`: what the series show inside their x axis' domain - a zoomed hour gets the hour's range, not the week's -, widened to ticks as `"nice"` is. Where the x domain is not fixed that is every point.<br>Shown in: [Fix the domain and name the ticks](#/axis/configuration), [Bind every kind of series to a second axis](#/axis/every-kind-on-a-second-axis), [Mark bands, limits and cells (Chart)](#/chart/bands-limits-and-cells) and 11 more |
2971
2971
  | `alignTicks` | `boolean` | — | On a further y axis: take the first y axis' tick count and widen this axis' domain until its ticks fall on that one's grid lines, the steps still 1-2-5 - one grid serves both. `tickCount` then does not apply; on the first y axis it changes nothing.<br>Shown in: [Align a second axis to the grid](#/axis/aligned-ticks) |
2972
2972
  | `position` | `"left" \| "right"` | `"left"` | Which edge the axis stands at. Several y axes per side are stacked outwards, so that extents of clearly different magnitude stay readable.<br>Shown in: [Add axes for other magnitudes](#/axis/axes), [Align a second axis to the grid](#/axis/aligned-ticks), [Bind every kind of series to a second axis](#/axis/every-kind-on-a-second-axis) and 7 more |
2973
2973
  | `id` | `string` | `"y"` | Axis id, through which series bind themselves.<br>Shown in: [Add axes for other magnitudes](#/axis/axes), [Align a second axis to the grid](#/axis/aligned-ticks), [Bind every kind of series to a second axis](#/axis/every-kind-on-a-second-axis) and 7 more |
@@ -3574,11 +3574,11 @@ The keys of [Chart](#/chart/keyboard-chart) apply here.
3574
3574
  | Prop | Type | Default | Description |
3575
3575
  |---|---|---|---|
3576
3576
  | `value` *required* | [`AxisField`](#type-AxisField)`<T> \| ((d: T, index: number) => `[`AxisValue`](#type-AxisValue)`)` | — | Where a row lies on this axis: a field of the row, compared by its name, or a function of it, compared by its source text as a series' is (`ValueFunction`) - with the same closure limit. A number is a position, a `Date` an instant, a string a category: every distinct one gets a place of its own, in the order the rows bring them, a tick and its name as the label ([ADR-0052](https://github.com/romanhaendler/umriss-ui/blob/main/docs/adr/0052-a-chart-reads-its-rows-as-they-come.md)). The type decides, never the content - `"2024"` is a category, `2024` a number - and a row without a value has no place. The axis reads the rows of every series bound to it; where those bring their own `data`, name their row: `<XAxis<HourCount> value="hour" />`.<br>Shown in: [Gestures and keys](#/zoom-and-pan/gestures-and-keys), [Limit the zoom](#/zoom-and-pan/zoom-limits), [Fit the y axis to what is visible](#/zoom-and-pan/visible-domain) and 74 more |
3577
- | `domain` | `"nice" \| "data" \| readonly [number, number] \| readonly [Date, Date]` | `"nice"` | `"nice"` widens the data's extent to ticks - to named `ticks` where there are any, on a time axis to whole units of a step of hours or longer -, `"data"` keeps it, a pair is fixed: numbers, on a time axis milliseconds or two `Date`s, on a category axis places. On a `zoomable` axis it is the start: what the axis shows while the chart's view names no span for it.<br>Shown in: [Gestures and keys](#/zoom-and-pan/gestures-and-keys), [Limit the zoom](#/zoom-and-pan/zoom-limits), [Fit the y axis to what is visible](#/zoom-and-pan/visible-domain) and 10 more |
3577
+ | `domain` | `"nice" \| "data" \| readonly [number, number] \| readonly [Date, Date]` | `"nice"` | `"nice"` widens the data's extent to ticks - to named `ticks` where there are any, on a time axis to whole units of a step of hours or longer -, `"data"` keeps it, a pair is fixed: numbers, on a time axis milliseconds or two `Date`s, on a category axis places. On a `zoomable` axis it is the start: what the axis shows while the chart's view names no span for it.<br>Shown in: [Gestures and keys](#/zoom-and-pan/gestures-and-keys), [Limit the zoom](#/zoom-and-pan/zoom-limits), [Fit the y axis to what is visible](#/zoom-and-pan/visible-domain) and 11 more |
3578
3578
  | `position` | `"bottom" \| "top"` | `"bottom"` | Which edge the axis stands at. A second x axis on the opposite edge is how a series counts in a unit of its own.<br>Shown in: [Add axes for other magnitudes (Axis)](#/axis/axes), [Bind every kind of series to a second axis (Axis)](#/axis/every-kind-on-a-second-axis) |
3579
3579
  | `time` | `boolean` | — | The values are instants: milliseconds since the epoch, or with `time` said ISO 8601 strings as an API sends them, read by the platform's rule - a date with a time and no offset is local time, a date alone is UTC; a string that is none is not drawn. Rows that hold a `Date` put the axis in time without `time`. Ticks on local boundaries from the minute to the month, labels by level in en-GB with a 24-hour clock - `15:00`, `17 Mar`, `Mar 2026` - and the date on the first tick and on the first of a new day (`17 Mar 00:00`); a day tick there carries the year. The tooltip's x value carries the seconds where the readings lie less than a minute apart. Another language is a `tickFormat`, which is handed the instant in milliseconds. `calendar` implies it.<br>Shown in: [Gestures and keys](#/zoom-and-pan/gestures-and-keys), [Limit the zoom](#/zoom-and-pan/zoom-limits), [Fit the y axis to what is visible](#/zoom-and-pan/visible-domain) and 36 more |
3580
3580
  | `calendar` | `readonly `[`WorkingInterval`](#type-WorkingInterval)`[]` | — | Working calendar: the intervals in which time counts. With it the axis stands in working time - nights and weekends are out, and every removed span gets a break mark. The scale stays affine; the mapping happens in materialisation ([ADR-0001](https://github.com/romanhaendler/umriss-ui/blob/main/docs/adr/0001-affine-scale-contract.md)).<br>Shown in: [Leave out the hours nobody works (Axis)](#/axis/working-time) |
3581
- | `zoomable` | `boolean` | `false` | Zoom and pan: Ctrl or ⌘ with the wheel - and a pinch - zoom around the pointer, a drag, a horizontal wheel or Shift with the wheel pan, a double click goes back to `domain`; with the focus on the chart, + and − zoom, Shift with ← or → pans and 0 goes back. The span shown is part of the chart's view, by this axis' `id` (`useChart`'s `initialView`, `onViewChange`, `setView`, `setDomain`). The plain wheel always scrolls the page.<br>Shown in: [Gestures and keys](#/zoom-and-pan/gestures-and-keys), [Limit the zoom](#/zoom-and-pan/zoom-limits), [Fit the y axis to what is visible](#/zoom-and-pan/visible-domain) and 5 more |
3581
+ | `zoomable` | `boolean` | `false` | Zoom and pan: Ctrl or ⌘ with the wheel - and a pinch - zoom around the pointer, a drag, a horizontal wheel or Shift with the wheel pan, a double click goes back to `domain`; with the focus on the chart, + and − zoom, Shift with ← or → pans and 0 goes back. The span shown is part of the chart's view, by this axis' `id` (`useChart`'s `initialView`, `onViewChange`, `setView`, `setDomain`). The plain wheel always scrolls the page.<br>Shown in: [Gestures and keys](#/zoom-and-pan/gestures-and-keys), [Limit the zoom](#/zoom-and-pan/zoom-limits), [Fit the y axis to what is visible](#/zoom-and-pan/visible-domain) and 6 more |
3582
3582
  | `zoomLimits` | [`ZoomLimits`](#type-ZoomLimits) | at most the data's extent or this axis' own `domain`, whichever is wider, at least three data steps | The narrowest and the widest span zoom may reach, in the axis' units - milliseconds on a time axis.<br>Shown in: [Limit the zoom](#/zoom-and-pan/zoom-limits) |
3583
3583
  | `id` | `string` | `"x"` | Axis id, through which series bind themselves.<br>Shown in: [Add axes for other magnitudes (Axis)](#/axis/axes), [Align a second axis to the grid (Axis)](#/axis/aligned-ticks), [Bind every kind of series to a second axis (Axis)](#/axis/every-kind-on-a-second-axis) and 7 more |
3584
3584
  | `label` | `string` | — | Axis title.<br>Shown in: [Gestures and keys](#/zoom-and-pan/gestures-and-keys), [Limit the zoom](#/zoom-and-pan/zoom-limits), [Fit the y axis to what is visible](#/zoom-and-pan/visible-domain) and 66 more |
@@ -5507,11 +5507,11 @@ The keys of [Chart](#/chart/keyboard-chart) apply here.
5507
5507
 
5508
5508
  | Prop | Type | Default | Description |
5509
5509
  |---|---|---|---|
5510
- | `value` *required* | [`Value`](#type-Value)`<T>` | — | Y value - a number field of the row or a function of it; null/undefined/NaN/±Infinity means a gap.<br>Shown in: [Plot single measurements](#/scatter/arrivals), [Mark samples that miss a target](#/scatter/against-a-target), [Mix series kinds (Chart)](#/chart/mixed) and 2 more |
5510
+ | `value` *required* | [`Value`](#type-Value)`<T>` | — | Y value - a number field of the row or a function of it; null/undefined/NaN/±Infinity means a gap.<br>Shown in: [Plot single measurements](#/scatter/arrivals), [Mark samples that miss a target](#/scatter/against-a-target), [Mix series kinds (Chart)](#/chart/mixed) and 3 more |
5511
5511
  | `xAxisId` | `string` | `"x"` | Binding to an x axis.<br>Shown in: [Bind every kind of series to a second axis (Axis)](#/axis/every-kind-on-a-second-axis) |
5512
5512
  | `yAxisId` | `string` | `"y"` | Binding to a y axis.<br>Shown in: [Bind every kind of series to a second axis (Axis)](#/axis/every-kind-on-a-second-axis) |
5513
5513
  | `data` | `readonly T[]` | — | Series-own data; overrides the container data.<br>Shown in: [Bind every kind of series to a second axis (Axis)](#/axis/every-kind-on-a-second-axis) |
5514
- | `name` | `string` | "Series n", after its place in the chart | The name in legend and tooltip. Without one a warning stands in DEV - an unnamed series is a colour nobody can look up.<br>Shown in: [Plot single measurements](#/scatter/arrivals), [Mark samples that miss a target](#/scatter/against-a-target), [Mix series kinds (Chart)](#/chart/mixed) and 2 more |
5514
+ | `name` | `string` | "Series n", after its place in the chart | The name in legend and tooltip. Without one a warning stands in DEV - an unnamed series is a colour nobody can look up.<br>Shown in: [Plot single measurements](#/scatter/arrivals), [Mark samples that miss a target](#/scatter/against-a-target), [Mix series kinds (Chart)](#/chart/mixed) and 3 more |
5515
5515
  | `format` | `(value: number) => string` | the y axis' `tickFormat`, else the built-in number format | The value as the tooltip writes it. |
5516
5516
  | `color` | `string` | the palette's `--uc-series-N` | Any CSS colour value. |
5517
5517
  | `tone` | `"ok" \| "warning" \| "alarm"` | — | A role instead of a colour value; the theme resolves it.<br>Shown in: [Mark samples that miss a target](#/scatter/against-a-target) |
@@ -6709,12 +6709,12 @@ The keys of [Chart](#/chart/keyboard-chart) apply here.
6709
6709
 
6710
6710
  | Prop | Type | Default | Description |
6711
6711
  |---|---|---|---|
6712
- | `value` *required* | [`Value`](#type-Value)`<T>` | — | Index of the state in `states` - a number field of the row or a function of it; null/undefined/NaN/±Infinity is a gap - and a gap stays a hole, it gets no colour for "unknown". A colour would be a claim about the interval.<br>Shown in: [One vehicle through the day](#/stateband/one-vehicle), [Lay a state under a course](#/stateband/under-a-course), [Give each one a lane](#/stateband/one-lane-each) and 3 more |
6713
- | `states` *required* | `readonly `[`StateEntry`](#type-StateEntry)`[]` | — | The closed set of states, in the order of their codes.<br>Shown in: [One vehicle through the day](#/stateband/one-vehicle), [Lay a state under a course](#/stateband/under-a-course), [Give each one a lane](#/stateband/one-lane-each) and 3 more |
6712
+ | `value` *required* | [`Value`](#type-Value)`<T>` | — | Index of the state in `states` - a number field of the row or a function of it; null/undefined/NaN/±Infinity is a gap - and a gap stays a hole, it gets no colour for "unknown". A colour would be a claim about the interval.<br>Shown in: [One vehicle through the day](#/stateband/one-vehicle), [Lay a state under a course](#/stateband/under-a-course), [Give each one a lane](#/stateband/one-lane-each) and 4 more |
6713
+ | `states` *required* | `readonly `[`StateEntry`](#type-StateEntry)`[]` | — | The closed set of states, in the order of their codes.<br>Shown in: [One vehicle through the day](#/stateband/one-vehicle), [Lay a state under a course](#/stateband/under-a-course), [Give each one a lane](#/stateband/one-lane-each) and 4 more |
6714
6714
  | `xAxisId` | `string` | — | Binding to an x axis. |
6715
6715
  | `yAxisId` | `string` | — | Binding to a y axis.<br>Shown in: [Lay a state under a course](#/stateband/under-a-course), [Mark bands, limits and cells (Chart)](#/chart/bands-limits-and-cells), [Read limits above the states (LimitLine)](#/limitline/limits-and-state) |
6716
6716
  | `data` | `readonly T[]` | — | Series-own data; overrides the container data.<br>Shown in: [Lay a state under a course](#/stateband/under-a-course), [Give each one a lane](#/stateband/one-lane-each), [Mark bands, limits and cells (Chart)](#/chart/bands-limits-and-cells) and 2 more |
6717
- | `name` | `string` | "Series n", after its place in the chart | The name in legend and tooltip. Without one a warning stands in DEV - an unnamed series is a colour nobody can look up.<br>Shown in: [One vehicle through the day](#/stateband/one-vehicle), [Lay a state under a course](#/stateband/under-a-course), [Give each one a lane](#/stateband/one-lane-each) and 3 more |
6717
+ | `name` | `string` | "Series n", after its place in the chart | The name in legend and tooltip. Without one a warning stands in DEV - an unnamed series is a colour nobody can look up.<br>Shown in: [One vehicle through the day](#/stateband/one-vehicle), [Lay a state under a course](#/stateband/under-a-course), [Give each one a lane](#/stateband/one-lane-each) and 4 more |
6718
6718
  | `lane` | `string` | — | The lane by its name: a category of the y axis, whose place the band takes, as wide as a bar is. The y axis then lists a lane per name, the first at the top, in the bands' order or its own `categories` ([ADR-0052](https://github.com/romanhaendler/umriss-ui/blob/main/docs/adr/0052-a-chart-reads-its-rows-as-they-come.md)). Not together with `laneFrom` or `laneTo`.<br>Shown in: [Give each one a lane](#/stateband/one-lane-each), [Mark bands, limits and cells (Chart)](#/chart/bands-limits-and-cells), [Read limits above the states (LimitLine)](#/limitline/limits-and-state) and 1 more |
6719
6719
  | `laneFrom` | `number` | the beginning of the axis' domain | Lower edge of the lane in domain units of a numeric y axis.<br>Shown in: [Lay a state under a course](#/stateband/under-a-course) |
6720
6720
  | `laneTo` | `number` | the end of the axis' domain | Upper edge of the lane in domain units of a numeric y axis.<br>Shown in: [Lay a state under a course](#/stateband/under-a-course) |
@@ -6959,13 +6959,13 @@ The keys of [Chart](#/chart/keyboard-chart) apply here.
6959
6959
 
6960
6960
  | Prop | Type | Default | Description |
6961
6961
  |---|---|---|---|
6962
- | `value` *required* | [`AxisField`](#type-AxisField)`<T, number \| string \| null \| undefined> \| ((d: T, index: number) => number \| string \| null \| undefined)` | — | The row on the y axis - a field of the data's row or a function of it. A number is a position, as every series' y is; a string is a category: the y axis then has a named row per distinct one, the first at the top, in the order the data bring them or the y axis' `categories` ([ADR-0052](https://github.com/romanhaendler/umriss-ui/blob/main/docs/adr/0052-a-chart-reads-its-rows-as-they-come.md)). Never an instant: a `Date` is refused.<br>Shown in: [Colour cells by their limits](#/matrix/by-limits), [Colour cells along a gradient](#/matrix/gradient), [Mark bands, limits and cells (Chart)](#/chart/bands-limits-and-cells) |
6963
- | `level` *required* | [`Value`](#type-Value)`<T>` | — | The level that decides the colour - a number field of the row or a function of it. A missing level is a hole, not a zero.<br>Shown in: [Colour cells by their limits](#/matrix/by-limits), [Colour cells along a gradient](#/matrix/gradient), [Mark bands, limits and cells (Chart)](#/chart/bands-limits-and-cells) |
6962
+ | `value` *required* | [`AxisField`](#type-AxisField)`<T, number \| string \| null \| undefined> \| ((d: T, index: number) => number \| string \| null \| undefined)` | — | The row on the y axis - a field of the data's row or a function of it. A number is a position, as every series' y is; a string is a category: the y axis then has a named row per distinct one, the first at the top, in the order the data bring them or the y axis' `categories` ([ADR-0052](https://github.com/romanhaendler/umriss-ui/blob/main/docs/adr/0052-a-chart-reads-its-rows-as-they-come.md)). Never an instant: a `Date` is refused.<br>Shown in: [Colour cells by their limits](#/matrix/by-limits), [Colour cells along a gradient](#/matrix/gradient), [Mark bands, limits and cells (Chart)](#/chart/bands-limits-and-cells) and 1 more |
6963
+ | `level` *required* | [`Value`](#type-Value)`<T>` | — | The level that decides the colour - a number field of the row or a function of it. A missing level is a hole, not a zero.<br>Shown in: [Colour cells by their limits](#/matrix/by-limits), [Colour cells along a gradient](#/matrix/gradient), [Mark bands, limits and cells (Chart)](#/chart/bands-limits-and-cells) and 1 more |
6964
6964
  | `coloring` | [`MatrixColoring`](#type-MatrixColoring) | `{ kind: "gradient", stops: DEFAULT_GRADIENT }` | How the level colours a cell: by assessment against limits, or across a gradient.<br>Shown in: [Colour cells by their limits](#/matrix/by-limits), [Mark bands, limits and cells (Chart)](#/chart/bands-limits-and-cells) |
6965
6965
  | `xAxisId` | `string` | `"x"` | Binding to an x axis. |
6966
6966
  | `yAxisId` | `string` | `"y"` | Binding to a y axis. |
6967
6967
  | `data` | `readonly T[]` | — | Series-own data; overrides the container data. |
6968
- | `name` | `string` | "Series n", after its place in the chart | The name in legend and tooltip. Without one a warning stands in DEV - an unnamed series is a colour nobody can look up.<br>Shown in: [Colour cells by their limits](#/matrix/by-limits), [Colour cells along a gradient](#/matrix/gradient), [Mark bands, limits and cells (Chart)](#/chart/bands-limits-and-cells) |
6968
+ | `name` | `string` | "Series n", after its place in the chart | The name in legend and tooltip. Without one a warning stands in DEV - an unnamed series is a colour nobody can look up.<br>Shown in: [Colour cells by their limits](#/matrix/by-limits), [Colour cells along a gradient](#/matrix/gradient), [Mark bands, limits and cells (Chart)](#/chart/bands-limits-and-cells) and 1 more |
6969
6969
  | `format` | `(value: number) => string` | the built-in number format | The level as the tooltip writes it. The y axis' `tickFormat` writes the row, not the level.<br>Shown in: [Colour cells by their limits](#/matrix/by-limits) |
6970
6970
 
6971
6971
  ##### Types on this page
@@ -9956,20 +9956,39 @@ interface LoadPoint {
9956
9956
  s1: number;
9957
9957
  s2: number;
9958
9958
  s3: number;
9959
- }
9959
+ /** A state code 0..3 that holds for a run of about ten points. */
9960
+ st: number;
9961
+ /** Column, row and level of the same points laid out as a grid 200 rows high. */
9962
+ c: number;
9963
+ r: number;
9964
+ lvl: number;
9965
+ }
9966
+
9967
+ const STATES = [
9968
+ { label: "A", color: "#2f6fb4" },
9969
+ { label: "B", color: "#c08a2e" },
9970
+ { label: "C", color: "#8a8f98" },
9971
+ { label: "D", color: "#6b8e5a" },
9972
+ ] as const;
9973
+ const ROWS = 200;
9960
9974
 
9961
- /** Three random walks of any length. */
9975
+ /** Three random walks of any length, with a state, and a grid laid over them. */
9962
9976
  function load(seed: number, n: number): LoadPoint[] {
9963
9977
  const r = random(seed);
9964
9978
  const points = new Array<LoadPoint>(n);
9965
9979
  let s1 = 100;
9966
9980
  let s2 = 60;
9967
9981
  let s3 = 140;
9982
+ let st = 0;
9983
+ const columns = Math.max(1, Math.ceil(n / ROWS));
9968
9984
  for (let i = 0; i < n; i++) {
9969
9985
  s1 += r() - 0.5;
9970
9986
  s2 += (r() - 0.5) * 0.8;
9971
9987
  s3 += (r() - 0.5) * 1.2;
9972
- points[i] = { t: i, s1, s2, s3 };
9988
+ if (r() < 0.1) st = Math.floor(r() * 4);
9989
+ const c = i % columns;
9990
+ const row = Math.floor(i / columns);
9991
+ points[i] = { t: i, s1, s2, s3, st, c, r: row, lvl: 0.5 + 0.5 * Math.sin(c / 40) * Math.cos(row / 15) + (r() - 0.5) * 0.2 };
9973
9992
  }
9974
9993
  return points;
9975
9994
  }
@@ -9980,11 +9999,15 @@ const WINDOW = 400;
9980
9999
  /** Series kinds of the measuring run. A filled mark and a rectangle per point are
9981
10000
  different work from a stroked path - the measurements in the capability record
9982
10001
  must not hold for lines only. */
9983
- type Mode = "lines" | "mixed";
10002
+ type Mode = "lines" | "mixed" | "bars" | "scatter" | "state" | "matrix";
10003
+ const MODES: readonly Mode[] = ["lines", "mixed", "bars", "scatter", "state", "matrix"];
10004
+
10005
+ /** How many points along x (columns for the matrix) a zoom shows. */
10006
+ const ZOOMED = 400;
9984
10007
 
9985
10008
  export default function Benchmark() {
9986
10009
  const [data, setData] = useState<readonly LoadPoint[]>(() => load(5, 1_000));
9987
- const { Chart, XAxis, YAxis, Line, Bar, Area } = useChart(data);
10010
+ const { Chart, XAxis, YAxis, Line, Bar, Area, Scatter, StateBand, Matrix, setDomain } = useChart(data);
9988
10011
  const [perf, setPerf] = useState<ChartPerf>({
9989
10012
  materializeMs: 0,
9990
10013
  seriesDrawMs: 0,
@@ -9993,6 +10016,14 @@ export default function Benchmark() {
9993
10016
  const [fps, setFps] = useState<number | null>(null);
9994
10017
  const [live, setLive] = useState(false);
9995
10018
  const [mode, setMode] = useState<Mode>("lines");
10019
+ /* The time the chart's handlers take for one pointer move, the mean of the
10020
+ last twenty: the hit test of the matrix is in it. */
10021
+ const [hoverMs, setHoverMs] = useState<number | null>(null);
10022
+ const moves = useRef<number[]>([]);
10023
+ const moveStart = useRef(0);
10024
+ const matrix = mode === "matrix";
10025
+ const columns = matrix ? Math.max(1, Math.ceil(data.length / ROWS)) : data.length;
10026
+ const course = mode === "lines" || mode === "mixed";
9996
10027
 
9997
10028
  const onPerf = useCallback((p: ChartPerf) => setPerf(p), []);
9998
10029
 
@@ -10036,6 +10067,10 @@ export default function Benchmark() {
10036
10067
  s1: last.s1 + (r() - 0.5) * 3,
10037
10068
  s2: last.s2 + (r() - 0.5) * 2.4,
10038
10069
  s3: last.s3 + (r() - 0.5) * 3.6,
10070
+ st: r() < 0.1 ? Math.floor(r() * 4) : last.st,
10071
+ c: last.c + 1,
10072
+ r: last.r,
10073
+ lvl: last.lvl,
10039
10074
  };
10040
10075
  const grown = [...previous, next];
10041
10076
  return grown.length > WINDOW ? grown.slice(grown.length - WINDOW) : grown;
@@ -10047,62 +10082,90 @@ export default function Benchmark() {
10047
10082
  const loadPoints = (n: number) => {
10048
10083
  setLive(false);
10049
10084
  setData(load(5, n));
10085
+ setDomain("x", null);
10086
+ moves.current = [];
10087
+ };
10088
+ const pick = (m: Mode) => {
10089
+ setMode(m);
10090
+ setDomain("x", null);
10091
+ moves.current = [];
10092
+ };
10093
+ /* A span in the middle of the data: a small part of the volume is in view. */
10094
+ const zoom = () => {
10095
+ const from = Math.floor(columns / 2);
10096
+ setDomain("x", [from, from + ZOOMED]);
10050
10097
  };
10051
10098
 
10052
10099
  return (
10053
10100
  <>
10054
10101
  <div className="demo-actions">
10055
10102
  {SIZES.map((n) => (
10056
- <button key={n} className="demo-button" onClick={() => loadPoints(n)}>
10103
+ <button key={n} className="demo-button" data-role={`points-${n}`} onClick={() => loadPoints(n)}>
10057
10104
  {n.toLocaleString("en-US")} points
10058
10105
  </button>
10059
10106
  ))}
10060
10107
  <button className="demo-button" onClick={() => setLive((v) => !v)}>{live ? "Stop live" : "Live"}</button>
10061
- <button
10062
- className="demo-button"
10063
- data-role="mode"
10064
- onClick={() => setMode((m) => (m === "lines" ? "mixed" : "lines"))}
10065
- >
10066
- {mode === "lines" ? "Mixed" : "Lines only"}
10108
+ {MODES.map((m) => (
10109
+ <button key={m} className="demo-button" data-role={`kind-${m}`} aria-pressed={mode === m} onClick={() => pick(m)}>
10110
+ {m}
10111
+ </button>
10112
+ ))}
10113
+ <button className="demo-button" data-role="zoom" onClick={zoom}>
10114
+ Zoom in
10115
+ </button>
10116
+ <button className="demo-button" data-role="unzoom" onClick={() => setDomain("x", null)}>
10117
+ Whole
10067
10118
  </button>
10068
10119
  </div>
10069
10120
  <dl className="metrics">
10070
10121
  <div>
10071
10122
  <dt>Points</dt>
10072
- <dd>{perf.points.toLocaleString("en-US")}</dd>
10123
+ <dd data-role="points">{perf.points.toLocaleString("en-US")}</dd>
10073
10124
  </div>
10074
10125
  <div>
10075
10126
  <dt>Materialisation</dt>
10076
- <dd>{perf.materializeMs.toFixed(1)} ms</dd>
10127
+ <dd data-role="materialize-ms">{perf.materializeMs.toFixed(1)} ms</dd>
10077
10128
  </div>
10078
10129
  <div>
10079
10130
  <dt>Series draw</dt>
10080
- <dd>{perf.seriesDrawMs.toFixed(1)} ms</dd>
10131
+ <dd data-role="series-draw-ms">{perf.seriesDrawMs.toFixed(1)} ms</dd>
10081
10132
  </div>
10082
10133
  <div>
10083
10134
  <dt>FPS (hover)</dt>
10084
10135
  <dd>{fps === null ? "–" : fps}</dd>
10085
10136
  </div>
10137
+ <div>
10138
+ <dt>Pointer move</dt>
10139
+ <dd data-role="hover-ms">{hoverMs === null ? "–" : `${hoverMs.toFixed(2)} ms`}</dd>
10140
+ </div>
10086
10141
  </dl>
10087
- <div onPointerEnter={startMeasuring} onPointerLeave={stopMeasuring}>
10142
+ <div
10143
+ data-role="plot"
10144
+ onPointerEnter={startMeasuring}
10145
+ onPointerLeave={stopMeasuring}
10146
+ onPointerMoveCapture={() => {
10147
+ moveStart.current = performance.now();
10148
+ }}
10149
+ onPointerMove={() => {
10150
+ moves.current.push(performance.now() - moveStart.current);
10151
+ if (moves.current.length > 20) moves.current.shift();
10152
+ setHoverMs(moves.current.reduce((a, b) => a + b, 0) / moves.current.length);
10153
+ }}
10154
+ >
10088
10155
  <Chart
10089
10156
  height={320}
10090
10157
  ariaLabel="Benchmark with three series"
10091
10158
  onPerf={onPerf}
10092
10159
  >
10093
- <XAxis value="t" label="Index" />
10094
- <YAxis />
10095
- {mode === "lines" ? (
10096
- <Line value="s1" name="S1" />
10097
- ) : (
10098
- <Bar value="s1" name="S1" />
10099
- )}
10100
- {mode === "lines" ? (
10101
- <Line value="s2" name="S2" />
10102
- ) : (
10103
- <Area value="s2" name="S2" />
10104
- )}
10105
- <Line value="s3" name="S3" />
10160
+ <XAxis value={matrix ? "c" : "t"} label="Index" domain="data" zoomable />
10161
+ <YAxis domain={mode === "state" ? [0, 1] : undefined} />
10162
+ {mode === "scatter" ? <Scatter value="s1" name="S1" /> : null}
10163
+ {mode === "state" ? <StateBand value="st" states={STATES} name="State" /> : null}
10164
+ {matrix ? <Matrix value="r" level="lvl" name="Level" /> : null}
10165
+ {mode === "bars" ? <Bar value="s1" name="S1" /> : null}
10166
+ {course ? mode === "lines" ? <Line value="s1" name="S1" /> : <Bar value="s1" name="S1" /> : null}
10167
+ {course ? mode === "lines" ? <Line value="s2" name="S2" /> : <Area value="s2" name="S2" /> : null}
10168
+ {course ? <Line value="s3" name="S3" /> : null}
10106
10169
  <Legend placement="top" />
10107
10170
  <Tooltip mode="x" />
10108
10171
  </Chart>
@@ -10319,6 +10382,29 @@ From `BarProps` — the full table stands on [Bar](#/bar/type-BarProps).
10319
10382
  | [`value`](#/bar/BarProps-value) *required* | [`Value`](#/bar/type-Value)`<T>` | — | Height - a number field of the row or a function of it; null/undefined/NaN/±Infinity means a gap. |
10320
10383
  | [`name`](#/bar/BarProps-name) | `string` | "Series n", after its place in the chart | The name in legend and tooltip. Without one a warning stands in DEV - an unnamed series is a colour nobody can look up. |
10321
10384
 
10385
+ From `ScatterProps` — the full table stands on [Scatter](#/scatter/type-ScatterProps).
10386
+
10387
+ | Prop | Type | Default | Description |
10388
+ |---|---|---|---|
10389
+ | [`value`](#/scatter/ScatterProps-value) *required* | [`Value`](#/scatter/type-Value)`<T>` | — | Y value - a number field of the row or a function of it; null/undefined/NaN/±Infinity means a gap. |
10390
+ | [`name`](#/scatter/ScatterProps-name) | `string` | "Series n", after its place in the chart | The name in legend and tooltip. Without one a warning stands in DEV - an unnamed series is a colour nobody can look up. |
10391
+
10392
+ From `StateBandProps` — the full table stands on [StateBand](#/stateband/type-StateBandProps).
10393
+
10394
+ | Prop | Type | Default | Description |
10395
+ |---|---|---|---|
10396
+ | [`value`](#/stateband/StateBandProps-value) *required* | [`Value`](#/stateband/type-Value)`<T>` | — | Index of the state in `states` - a number field of the row or a function of it; null/undefined/NaN/±Infinity is a gap - and a gap stays a hole, it gets no colour for "unknown". A colour would be a claim about the interval. |
10397
+ | [`states`](#/stateband/StateBandProps-states) *required* | `readonly `[`StateEntry`](#/stateband/type-StateEntry)`[]` | — | The closed set of states, in the order of their codes. |
10398
+ | [`name`](#/stateband/StateBandProps-name) | `string` | "Series n", after its place in the chart | The name in legend and tooltip. Without one a warning stands in DEV - an unnamed series is a colour nobody can look up. |
10399
+
10400
+ From `MatrixProps` — the full table stands on [Matrix](#/matrix/type-MatrixProps).
10401
+
10402
+ | Prop | Type | Default | Description |
10403
+ |---|---|---|---|
10404
+ | [`value`](#/matrix/MatrixProps-value) *required* | [`AxisField`](#/matrix/type-AxisField)`<T, number \| string \| null \| undefined> \| ((d: T, index: number) => number \| string \| null \| undefined)` | — | The row on the y axis - a field of the data's row or a function of it. A number is a position, as every series' y is; a string is a category: the y axis then has a named row per distinct one, the first at the top, in the order the data bring them or the y axis' `categories` ([ADR-0052](https://github.com/romanhaendler/umriss-ui/blob/main/docs/adr/0052-a-chart-reads-its-rows-as-they-come.md)). Never an instant: a `Date` is refused. |
10405
+ | [`level`](#/matrix/MatrixProps-level) *required* | [`Value`](#/matrix/type-Value)`<T>` | — | The level that decides the colour - a number field of the row or a function of it. A missing level is a hole, not a zero. |
10406
+ | [`name`](#/matrix/MatrixProps-name) | `string` | "Series n", after its place in the chart | The name in legend and tooltip. Without one a warning stands in DEV - an unnamed series is a colour nobody can look up. |
10407
+
10322
10408
  From `TooltipProps` — the full table stands on [Tooltip](#/tooltip/type-TooltipProps).
10323
10409
 
10324
10410
  | Prop | Type | Default | Description |
@@ -11013,14 +11099,14 @@ is typed by that `data` instead.
11013
11099
  | `Line` *required* | `<T = Z>(props: `[`LineProps`](#/line/type-LineProps)`<T>) => null` | — | <br>Shown in: [Draw a first chart (Installation)](#/installation/first-chart), [Size a chart by its container (Installation)](#/installation/in-its-container), [Mix series kinds (Chart)](#/chart/mixed) and 47 more |
11014
11100
  | `Area` *required* | `<T = Z>(props: `[`AreaProps`](#/area/type-AreaProps)`<T>) => null` | — | <br>Shown in: [Mix series kinds (Chart)](#/chart/mixed), [Mark every kind (Chart)](#/chart/marks-on-every-kind), [Bind every kind of series to a second axis (Axis)](#/axis/every-kind-on-a-second-axis) and 5 more |
11015
11101
  | `Bar` *required* | `<T = Z>(props: `[`BarProps`](#/bar/type-BarProps)`<T>) => null` | — | <br>Shown in: [Mix series kinds (Chart)](#/chart/mixed), [Mark every kind (Chart)](#/chart/marks-on-every-kind), [Bind every kind of series to a second axis (Axis)](#/axis/every-kind-on-a-second-axis) and 13 more |
11016
- | `Scatter` *required* | `<T = Z>(props: `[`ScatterProps`](#/scatter/type-ScatterProps)`<T>) => null` | — | <br>Shown in: [Mix series kinds (Chart)](#/chart/mixed), [Mark every kind (Chart)](#/chart/marks-on-every-kind), [Bind every kind of series to a second axis (Axis)](#/axis/every-kind-on-a-second-axis) and 2 more |
11017
- | `StateBand` *required* | `<T = Z>(props: `[`StateBandProps`](#/stateband/type-StateBandProps)`<T> & `[`OneLane`](#type-OneLane)`) => null` | — | <br>Shown in: [Mark bands, limits and cells (Chart)](#/chart/bands-limits-and-cells), [One vehicle through the day (StateBand)](#/stateband/one-vehicle), [Lay a state under a course (StateBand)](#/stateband/under-a-course) and 3 more |
11018
- | `Matrix` *required* | `<T = Z>(props: `[`MatrixProps`](#/matrix/type-MatrixProps)`<T>) => null` | — | <br>Shown in: [Mark bands, limits and cells (Chart)](#/chart/bands-limits-and-cells), [Colour cells by their limits (Matrix)](#/matrix/by-limits), [Colour cells along a gradient (Matrix)](#/matrix/gradient) |
11102
+ | `Scatter` *required* | `<T = Z>(props: `[`ScatterProps`](#/scatter/type-ScatterProps)`<T>) => null` | — | <br>Shown in: [Mix series kinds (Chart)](#/chart/mixed), [Mark every kind (Chart)](#/chart/marks-on-every-kind), [Bind every kind of series to a second axis (Axis)](#/axis/every-kind-on-a-second-axis) and 3 more |
11103
+ | `StateBand` *required* | `<T = Z>(props: `[`StateBandProps`](#/stateband/type-StateBandProps)`<T> & `[`OneLane`](#type-OneLane)`) => null` | — | <br>Shown in: [Mark bands, limits and cells (Chart)](#/chart/bands-limits-and-cells), [One vehicle through the day (StateBand)](#/stateband/one-vehicle), [Lay a state under a course (StateBand)](#/stateband/under-a-course) and 4 more |
11104
+ | `Matrix` *required* | `<T = Z>(props: `[`MatrixProps`](#/matrix/type-MatrixProps)`<T>) => null` | — | <br>Shown in: [Mark bands, limits and cells (Chart)](#/chart/bands-limits-and-cells), [Colour cells by their limits (Matrix)](#/matrix/by-limits), [Colour cells along a gradient (Matrix)](#/matrix/gradient) and 1 more |
11019
11105
  | `BoxPlot` *required* | `<T = Z>(props: `[`BoxPlotProps`](#/boxplot/type-BoxPlotProps)`<T>) => null` | — | <br>Shown in: [One box per service (BoxPlot)](#/boxplot/minimal), [A box per hour on a time axis (BoxPlot)](#/boxplot/over-time), [With outliers (BoxPlot)](#/boxplot/outliers) and 4 more |
11020
11106
  | `view` *required* | [`ChartView`](#/view/type-ChartView) | — | How the reader is looking at the chart.<br>Shown in: [Keep and restore a view (View)](#/view/keep-and-restore) |
11021
11107
  | `domains` *required* | [`AxisSpans`](#type-AxisSpans) | — | The span each zoomable x axis shows, by axis `id`; an axis absent shows its own `domain`. |
11022
11108
  | `setView` *required* | `(view: `[`ChartView`](#/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)](#/chart/keyboard-and-screen-reader), [Keep charts in step (Zoom and pan)](#/zoom-and-pan/cursor-sync), [Keep and restore a view (View)](#/view/keep-and-restore) |
11023
- | `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. |
11109
+ | `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)](#/benchmark/benchmark) |
11024
11110
  | `hidden` *required* | `readonly string[]` | — | The hidden series, by `name`. |
11025
11111
  | `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. |
11026
11112
  | `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)](#/legend/hide-a-series) |
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@umriss-ui/charts",
3
- "version": "0.34.0",
3
+ "version": "0.36.0",
4
4
  "description": "React canvas chart library for data-dense dashboards - line, area, bar, box plot, scatter, control and Pareto charts. Few chart kinds, drawn well, fast.",
5
5
  "license": "MIT",
6
6
  "author": "Roman Händler",
@@ -55,8 +55,8 @@
55
55
  "./styles.css": "./dist/charts.css"
56
56
  },
57
57
  "peerDependencies": {
58
- "react": ">=18",
59
- "react-dom": ">=18"
58
+ "react": ">=19",
59
+ "react-dom": ">=19"
60
60
  },
61
61
  "devDependencies": {
62
62
  "@fontsource/geist-mono": "^5.3.0",
@@ -71,7 +71,7 @@
71
71
  "vite": "^6.0.0",
72
72
  "vite-plugin-dts": "^4.3.0",
73
73
  "@umriss-ui/demo": "0.0.0",
74
- "@umriss-ui/core": "0.34.0"
74
+ "@umriss-ui/core": "0.36.0"
75
75
  },
76
76
  "scripts": {
77
77
  "props": "node --disable-warning=ExperimentalWarning --experimental-strip-types demo/props.ts",