API index

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

Components

ControlChart

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 and 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.

function DataTable(): ReactNode;

Used on Chart, BoxPlot and Tooltip.

Legend

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, Chart, Axis, View, Line, Area, Bar, Scatter, BoxPlot, StateBand, LimitLine, Pareto, Tooltip, Legend and Benchmark.

LimitBand

LimitLine – A limit drawn as a band between two values of an axis - a tolerance or a zone. Otherwise a LimitLine.

Used on Scenarios, Chart, LimitLine and Tooltip.

LimitLine

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, Chart, Scatter, BoxPlot, LimitLine, ControlChart, Pareto and Tooltip.

Tooltip

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, Installation, Chart, Axis, Zoom and pan, View, Line, Area, Bar, Scatter, BoxPlot, StateBand, Matrix, LimitLine, ControlChart, Pareto, Tooltip, Legend and 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.
function useChart<Z>(rows: readonly Z[], options?: ChartOptions<Z>): ChartParts<Z>;

Used on Scenarios, Installation, Chart, Axis, Zoom and pan, View, Line, Area, Bar, Scatter, BoxPlot, StateBand, Matrix, LimitLine, ControlChart, Pareto, Tooltip, Legend and 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), 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.

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.

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.

breaks

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

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.

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.

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

Used on Scenarios, LimitLine and ControlChart.

invalidateTheme

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

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.

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.

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

Used on 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.

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): the schedule draws its subtasks with the colours of

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. Returns the unsubscribe.

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.

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.

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.

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.

function verdictWeight(verdict: Verdict): number;

violatedIndices

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

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.

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

Used on Scenarios and 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.

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

Used on 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.

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.

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

Used on ControlChart.

Constants

DAY

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

const DAY: number;

Used on Scenarios, Chart, Axis, Zoom and pan, StateBand, Tooltip and 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 on core's Language page.

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.

const DEFAULT_GRADIENT: readonly string[];

Used on Matrix.

HOUR

One hour in milliseconds.

const HOUR: number;

Used on Chart, Axis, Zoom and pan, Area, BoxPlot, Tooltip and Benchmark.

LinearScale

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

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.

const MINUTE: number;

Used on Scenarios, Installation, Chart, Axis, Zoom and pan, View, Line, Area, Scatter, BoxPlot, StateBand, LimitLine, Tooltip, Legend and Benchmark.

SECOND

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

const SECOND = 1000;

Types

AreaProps

Its table stands on Area.

AreaSeriesConfig<T = unknown>

An Area as the chart holds it once registered.

NameTypeDefaultDescription
kindrequired"area"—
baselineValueFunction<T>—Lower edge; without a value the fixed baseline 0.
fillOpacityrequirednumber—Opacity of the fill; the outline stays fully opaque.
strokeWidthrequirednumber—
dashreadonly number[]—Dash pattern of the outline.
accessorrequiredValueFunction<T>—Y value; null/undefined/NaN/±Infinity means a gap. from SeriesBase
datareadonly T[]—Series-own data; overrides the container data. from SeriesBase
xAxisIdrequiredstring— from SeriesBase
yAxisIdrequiredstring— from SeriesBase
namestring— 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
colorstring— 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
stackstring—The stack this series stands in: series with the same id, on the same x and y axis, stack in registration order. from Stackable
normalizeboolean—On any member, the whole stack sums to 100 at every x. from Stackable

Assessment

The verdict and what led to it.

NameTypeDefaultDescription
verdictrequiredVerdict
| "ok"
| "unknown"
| "warning"
| "alarm"
—
limitLimit—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.
excessnumber—The amount beyond the bound, always positive. Absent where none is violated.
deviationnumber—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.

NameTypeDefaultDescription
idrequiredstring—
orientationrequiredAxisOrientation
"x" | "y"
—
positionrequiredAxisPosition
| "bottom"
| "top"
| "left"
| "right"
—
accessor(d: T, index: number) => 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).
labelstring—
tickCountnumber—
tickFormat(v: number) => string—
domainrequired| "nice"
| "data"
| "visible"
| readonly [number, number]
—"visible" is a y axis' only: the extent of what its series show inside their x axis' domain.
gridbooleanonly the first registered axis per orientationWhether the axis draws its grid lines.
ticksreadonly number[]—Fixed tick values instead of the 1-2-5 algorithm, on a numeric axis: an hour axis' named hours, a lane grid.
categoriesreadonly 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).
categoryLabel(category: string) => string—What is written for a category, wherever it is written.
timeboolean—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).
calendarreadonly 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).
alignTicksboolean—y axes only: this axis' ticks on the first y axis' grid.
zoomableboolean—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).
zoomLimitsZoomLimitsat most the data's extent, at least three data stepsx 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.

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.

type AxisOrientation = "x" | "y";

AxisPosition

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

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

AxisSpans

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

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

AxisValue

What an axis reads from a row (ADR-0052): 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.

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

BarProps

Its table stands on Bar.

BarSeriesConfig<T = unknown>

A Bar as the chart holds it once registered.

NameTypeDefaultDescription
kindrequired"bar"—
barWidthrequirednumber—Width as a fraction of the step; the group shares this fraction.
accessorrequiredValueFunction<T>—Y value; null/undefined/NaN/±Infinity means a gap. from SeriesBase
datareadonly T[]—Series-own data; overrides the container data. from SeriesBase
xAxisIdrequiredstring— from SeriesBase
yAxisIdrequiredstring— from SeriesBase
namestring— 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
colorstring— 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
stackstring—The stack this series stands in: series with the same id, on the same x and y axis, stack in registration order. from Stackable
normalizeboolean—On any member, the whole stack sums to 100 at every x. from Stackable

Bin

A bin, the way it is drawn.

NameTypeDefaultDescription
fromrequirednumber—Lower edge; the bin holds it.
torequirednumber—Upper edge; the bin holds it only if it is the last one.
xrequirednumber—The middle, (from + to) / 2 - the bar's x.
countrequirednumber—How many values fall in it.

BinOptions

The settings of bin.

NameTypeDefaultDescription
widthnumber—The width of a bin. Wins over count. Without a domain the edges are multiples of it.

Shown in: Count readings into a histogram (Bar)

countnumber10About 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.
domainreadonly [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).

NameTypeDefaultDescription
outliersrequiredFloat64Array | null—Every box's outliers, flat, box after box; null without outliers.
outlierOffsetsrequiredUint32Array | 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.
meanrequiredFloat64Array | null—The optional numbers, each null where not given.
notchLowerrequiredFloat64Array | null—
notchUpperrequiredFloat64Array | null—
countrequiredFloat64Array | null—
lowerQuartilerequiredFloat64Array— from BoxNumbers
upperQuartilerequiredFloat64Array— from BoxNumbers
lowerWhiskerrequiredFloat64Array— from BoxNumbers
upperWhiskerrequiredFloat64Array— from BoxNumbers

BoxExtras<V = number>

The optional numbers of a box by name.

NameTypeDefaultDescription
meanrequiredV—
notchLowerrequiredV—
notchUpperrequiredV—
countrequiredV—

BoxNumbers<V = number>

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

NameTypeDefaultDescription
lowerQuartilerequiredV—
upperQuartilerequiredV—
lowerWhiskerrequiredV—
upperWhiskerrequiredV—

BoxPlotProps

Its table stands on BoxPlot.

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.

NameTypeDefaultDescription
kindrequired"box"—
lowerQuartilerequiredValueFunction<T>—
upperQuartilerequiredValueFunction<T>—
lowerWhiskerrequiredValueFunction<T>—
upperWhiskerrequiredValueFunction<T>—
outliersListFunction<T>—The values beyond the whiskers, per box (ADR-0040).
meanValueFunction<T>—
notchLowerValueFunction<T>—Both bounds or neither (CONTEXT.md: Notch).
notchUpperValueFunction<T>—
countValueFunction<T>—How many values stand behind the box; no y value.
boxWidthrequirednumber—Width as a fraction of the step; boxes and bars on one x axis share it.
accessorrequiredValueFunction<T>—Y value; null/undefined/NaN/±Infinity means a gap. from SeriesBase
datareadonly T[]—Series-own data; overrides the container data. from SeriesBase
xAxisIdrequiredstring— from SeriesBase
yAxisIdrequiredstring— from SeriesBase
namestring— 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
colorstring— 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.

type CalendarInput = WorkingCalendar | readonly WorkingInterval[];

ChartOptions

Its table stands on Zoom and pan.

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.

NameTypeDefaultDescription
Chartrequired(props: ChartProps) => ReactNode—The chart over the hook's rows. One per useChart: it holds the view, and a second chart is a second call.

Shown in: Draw a first chart (Installation), Size a chart by its container (Installation), Mix series kinds (Chart) and 74 more

XAxisrequired<T = Z>(props: 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.

Shown in: Draw a first chart (Installation), Size a chart by its container (Installation), Mix series kinds (Chart) and 74 more

YAxisrequired(props: YAxisProps) => null—

Shown in: Draw a first chart (Installation), Size a chart by its container (Installation), Mix series kinds (Chart) and 74 more

Linerequired<T = Z>(props: LineProps<T>) => null—

Shown in: Draw a first chart (Installation), Size a chart by its container (Installation), Mix series kinds (Chart) and 47 more

Arearequired<T = Z>(props: AreaProps<T>) => null—

Shown in: Mix series kinds (Chart), Mark every kind (Chart), Bind every kind of series to a second axis (Axis) and 5 more

Barrequired<T = Z>(props: BarProps<T>) => null—

Shown in: Mix series kinds (Chart), Mark every kind (Chart), Bind every kind of series to a second axis (Axis) and 13 more

Scatterrequired<T = Z>(props: ScatterProps<T>) => null—

Shown in: Mix series kinds (Chart), Mark every kind (Chart), Bind every kind of series to a second axis (Axis) and 3 more

StateBandrequired<T = Z>(props: StateBandProps<T> & OneLane) => null—

Shown in: Mark bands, limits and cells (Chart), One vehicle through the day (StateBand), Lay a state under a course (StateBand) and 4 more

Matrixrequired<T = Z>(props: MatrixProps<T>) => null—

Shown in: Mark bands, limits and cells (Chart), Colour cells by their limits (Matrix), Colour cells along a gradient (Matrix) and 1 more

BoxPlotrequired<T = Z>(props: BoxPlotProps<T>) => null—

Shown in: One box per service (BoxPlot), A box per hour on a time axis (BoxPlot), With outliers (BoxPlot) and 4 more

viewrequiredChartView—How the reader is looking at the chart.

Shown in: Keep and restore a view (View)

domainsrequiredAxisSpans—The span each zoomable x axis shows, by axis id; an axis absent shows its own domain.
setViewrequired(view: 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.

Shown in: Read it by keyboard and screen reader (Chart), Keep charts in step (Zoom and pan), Keep and restore a view (View)

setDomainrequired(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.

Shown in: Measure a million points (Benchmark)

hiddenrequiredreadonly string[]—The hidden series, by name.
toggleSeriesrequired(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.
showOnlyrequired(name: string) => void—Hides every series but name; all are shown where none carries it.

Shown in: Hide a series from the legend (Legend)

showAllSeriesrequired() => void—Shows every series again.

Shown in: Hide a series from the legend (Legend)

Used on Chart.

ChartPerf

Measurements of the instrumentation for the benchmark page.

Used on Benchmark.

ChartProps

Its table stands on Chart.

ChartsWording

Everything the charts put out as text.

NameTypeDefaultDescription
localerequiredstring—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.
roleDescriptionrequiredstring—What a screen reader calls the plot area that takes the keys (aria-roledescription).
emptyrequiredstring—Shown in the plot area when no visible series has a point to show.
seriesListrequired(names: readonly string[]) => string—The summary's visible series, by name.
visibleRangerequired(from: string, to: string) => string—The summary's visible stretch of the x axis, both ends formatted.
seriesExtentrequired(name: string, min: string, max: string) => string—The summary's lowest and highest value of one series in that stretch.
limitListrequired(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).
readoutrequired(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.
stackTotalrequiredstring—The last row of a stack in the tooltip and the readout: the sum of its members at the point.
percentrequired(value: string) => string—A share in a normalised stack, its number already formatted.
walkHelprequiredstring—The keys that walk the chart.
selectHelprequiredstring—The key that reports the Active point - only where onSelect is given.
zoomHelprequiredstring—The keys that zoom and pan it - only where the chart can be zoomed.
legendHelprequiredstring—The keys of the legend's entries - only where it has one to press.
allShownrequiredstring—Read out where hiding would leave nothing to see, and every series is shown instead.
showAllrequiredstring—The control over a zoomed plot that brings every zoomed axis back to its own domain (component-view 04).
showDatarequiredstring—The data table's disclosure key, closed and open.
hideDatarequiredstring—
positionColumnrequiredstring—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.
rowColumnrequiredstring—
tableCaptionrequired(from: string, to: string) => string—The table's caption: the visible stretch it lists, both ends formatted.
upperWhiskerrequiredstring—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).
upperQuartilerequiredstring—
medianrequiredstring—
lowerQuartilerequiredstring—
lowerWhiskerrequiredstring—
outliersrequiredstring—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).
meanrequiredstring—A box's optional readings: its mean, its notch's two bounds as one row, and how many values stand behind it.
notchrequiredstring—
countrequiredstring—
outlierListrequired(values: readonly string[], more: number) => string—
downsampledrequired(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.

Used on Zoom and pan and View.

ControlChartProps

Its table stands on ControlChart.

ControlLimitOrigin

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

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.

NameTypeDefaultDescription
centerrequirednumber—

Shown in: Set specification and control limits side by side (LimitLine)

sigmarequirednumber—Estimated spread of a single value, not the distance to the limit.
upperrequirednumber—

Shown in: Set specification and control limits side by side (LimitLine)

lowerrequirednumber—

Shown in: Set specification and control limits side by side (LimitLine)

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.

NameTypeDefaultDescription
keyrequiredstring—
captionrequiredstring—
columnsrequiredreadonly string[]—
rowsrequiredreadonly (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.

NameTypeDefaultDescription
placementrequired"top" | "bottom"—

LegendProps

Its table stands on Legend.

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.

LimitBandConfig

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

NameTypeDefaultDescription
kindrequired"band"—
fromrequirednumber—
torequirednumber—
axisIdstring—Axis on which the value lies; without one, the first axis of its orientation. from LimitBase
orientationrequiredAxisOrientation
"x" | "y"
— from LimitBase
severityrequiredSeverity
"warning" | "alarm"
— from LimitBase
labelstring— from LimitBase
colorstring—A colour of its own; without one, that of the role or of the severity out of the theme. from LimitBase
inExtentrequiredboolean—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

NameTypeDefaultDescription
rolerequiredLimitRole
| "specification"
| "control"
| "zone"
— from LimitBase

LimitBandProps

Its table stands on LimitLine.

LimitConfig

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

type LimitConfig = LimitLineConfig | LimitBandConfig;

LimitLineConfig

A LimitLine as the chart holds it once registered.

NameTypeDefaultDescription
kindrequired"line"—
valuerequirednumber—
axisIdstring—Axis on which the value lies; without one, the first axis of its orientation. from LimitBase
orientationrequiredAxisOrientation
"x" | "y"
— from LimitBase
severityrequiredSeverity
"warning" | "alarm"
— from LimitBase
labelstring— from LimitBase
colorstring—A colour of its own; without one, that of the role or of the severity out of the theme. from LimitBase
inExtentrequiredboolean—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

NameTypeDefaultDescription
rolerequiredLimitRole
| "specification"
| "control"
| "zone"
— from LimitBase

LimitLineProps

Its table stands on LimitLine.

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).

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.

NameTypeDefaultDescription
limitsreadonly Limit[]—In any order; none, one or several.

Shown in: Mark bands, limits and cells (Chart), Colour cells by their limits (Matrix)

targetnumber—

Used on Scenarios.

LineProps

Its table stands on Line.

LineSeriesConfig<T = unknown>

A Line as the chart holds it once registered.

NameTypeDefaultDescription
kindrequired"line"—
strokeWidthrequirednumber—
dashreadonly number[]—
markersrequired| "auto"
| "always"
| "never"
—
stepboolean—Sample-and-hold: each value holds until the next sample.
accessorrequiredValueFunction<T>—Y value; null/undefined/NaN/±Infinity means a gap. from SeriesBase
datareadonly T[]—Series-own data; overrides the container data. from SeriesBase
xAxisIdrequiredstring— from SeriesBase
yAxisIdrequiredstring— from SeriesBase
namestring— 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
colorstring— 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.

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), the function form of ListValue. null/undefined or an empty array is none; a value that is not finite is left out.

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.

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.

NameTypeDefaultDescription
xrequiredFloat64Array—
yrequiredFloat64Array—
y0requiredFloat64Array | null—Lower edge, where the baseline is an accessor of its own; otherwise null. A fixed baseline needs no channel - it is a number.
wrequiredFloat64Array | 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). null for every kind that does not use it.
boxrequiredBoxChannels | null—A box's further numbers beside its median in y; null for every other kind (ADR-0011).
lengthrequirednumber—

MatrixColoring

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

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.

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) - the one series kind whose base accessor reads more than a number.

NameTypeDefaultDescription
kindrequired"matrix"—
levelrequiredValueFunction<T>—The level that decides the colour - the third channel (ADR-0011). The base accessor yields the row position, not this level.
coloringrequiredMatrixColoring—
accessorrequiredValueFunction<T>—Y value; null/undefined/NaN/±Infinity means a gap. from SeriesBase
datareadonly T[]—Series-own data; overrides the container data. from SeriesBase
xAxisIdrequiredstring— from SeriesBase
yAxisIdrequiredstring— from SeriesBase
namestring— 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
colorstring— 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.

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.

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

Padding

Space in CSS pixels on each side of a rectangle.

NameTypeDefaultDescription
toprequirednumber—

Shown in: Fix the domain and name the ticks (Axis)

rightrequirednumber—

Shown in: Fix the domain and name the ticks (Axis)

bottomrequirednumber—

Shown in: Fix the domain and name the ticks (Axis)

leftrequirednumber—

Shown in: Fix the domain and name the ticks (Axis)

ParetoEntry

An item, the way it is drawn.

NameTypeDefaultDescription
namerequiredstring—
valuerequirednumber—
indexrequirednumber—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.
sharerequirednumber—Share of the total, 0…1.
cumulativerequirednumber—Cumulative share up to and including this entry, 0…1. Exactly 1 at the last entry.

Shown in: Sort causes and collect the tail (Pareto)

remainderrequiredboolean—The collected tail. Exactly one entry can be this, and it always stands last.

ParetoItem

An item, the way the caller counts it.

NameTypeDefaultDescription
namerequiredstring—
valuerequirednumber—

ParetoOptions

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

NameTypeDefaultDescription
cutoffrequirednumber0.8The 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.
collectRankrequirednumberInfinityHow 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.
remainderNamestringnone - the caller names itName 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.

NameTypeDefaultDescription
entriesrequiredreadonly ParetoEntry[]—

Shown in: Sort causes and collect the tail (Pareto)

totalrequirednumber—Total of the drawn entries - after collecting, the same as before.
cutoffIndexrequirednumber—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.

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.

NameTypeDefaultDescription
xrequirednumber—
yrequirednumber—
widthrequirednumber—
heightrequirednumber—

RemovedSpan

A removed span and the place it collapses onto.

NameTypeDefaultDescription
fromrequirednumber—
torequirednumber—
workingTimerequirednumber—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.

NameTypeDefaultDescription
colorAxisrequiredstring—
colorGridrequiredstring—
colorTextrequiredstring—
colorBgrequiredstring—
colorWarningrequiredstring—Colours of the two limit severities. A limit carries the colour of its severity, not that of its series - it belongs to none.
colorAlarmrequiredstring—
colorOkrequiredstring—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.
fontrequiredstring—
fontMonorequiredstring—
seriesrequiredreadonly string[]—
forcedrequiredboolean—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.

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

Used on Scenarios and ControlChart.

RuleOptions

Which rules run, and with which run lengths.

NameTypeDefaultDescription
outlierrequiredboolean—
runrequiredboolean—
trendrequiredboolean—
twoOfThreerequiredboolean—
runLengthrequirednumber—Points on one side of the centre line from which rule 2 fires.
trendLengthrequirednumber—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.

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.

ScatterSeriesConfig<T = unknown>

A Scatter as the chart holds it once registered.

NameTypeDefaultDescription
kindrequired"scatter"—
radiusrequirednumber—Point radius in CSS pixels.
accessorrequiredValueFunction<T>—Y value; null/undefined/NaN/±Infinity means a gap. from SeriesBase
datareadonly T[]—Series-own data; overrides the container data. from SeriesBase
xAxisIdrequiredstring— from SeriesBase
yAxisIdrequiredstring— from SeriesBase
namestring— 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
colorstring— 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.

NameTypeDefaultDescription
accessorrequiredValueFunction<T>—Y value; null/undefined/NaN/±Infinity means a gap.
datareadonly T[]—Series-own data; overrides the container data.
xAxisIdrequiredstring—
yAxisIdrequiredstring—
namestring—
format(value: number) => string—The value in the tooltip; before the y axis' tickFormat. Compared by its source text, as an accessor is.
colorstring—
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.

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.

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.

type Severity = "warning" | "alarm";

Side

Whether a limit is an upper or a lower bound.

type Side = "upper" | "lower";

StateBandProps

Its table stands on StateBand.

StateEntry

One state of the closed set a state series knows.

NameTypeDefaultDescription
labelrequiredstring—
colorrequiredstring—

StateSeriesConfig<T = unknown>

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

NameTypeDefaultDescription
kindrequired"state"—
statesrequiredreadonly StateEntry[]—The closed set of states. The accessor yields the index into it - a number, not a key (ADR-0007).
lanestring—The lane by its name: a category of the y axis, whose place the band takes (ADR-0052).
laneFromnumber—Lower edge of the lane in domain units of the y axis; without a value the beginning of the axis domain.
laneTonumber—Upper edge of the lane; without a value the end of the axis domain.
accessorrequiredValueFunction<T>—Y value; null/undefined/NaN/±Infinity means a gap. from SeriesBase
datareadonly T[]—Series-own data; overrides the container data. from SeriesBase
xAxisIdrequiredstring— from SeriesBase
yAxisIdrequiredstring— from SeriesBase
namestring— 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
colorstring— 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.

NameTypeDefaultDescription
moderequired"x" | "nearest"—
limitsboolean—
render(hit: 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.

NameTypeDefaultDescription
xValuerequirednumber—

Shown in: Fix the domain and name the ticks (Axis), Write the tooltip yourself (Tooltip), Choose a hit (Tooltip)

pointsrequiredreadonly TooltipPoint<T>[]—

Shown in: Fix the domain and name the ticks (Axis), Write the tooltip yourself (Tooltip), Choose a hit (Tooltip)

xPxrequirednumber—Pixel position of the crosshair (snapped to the data point).
yPxrequirednumber—Pixel position of the primary hit.

Used on Axis and Tooltip.

TooltipPoint<T = unknown>

One hit per series in the tooltip.

NameTypeDefaultDescription
seriesNamerequiredstring—

Shown in: Fix the domain and name the ticks (Axis), Write the tooltip yourself (Tooltip), Choose a hit (Tooltip)

colorrequiredstring—
xValuerequirednumber—The point's x value on its own x axis - with several x axes it can differ from the hit's.
yValuerequirednumber—The point's y value; in a stack its own value, not its top - in a normalised stack its share in percent.

Shown in: Fix the domain and name the ticks (Axis), Choose a hit (Tooltip)

datumrequiredT—

Shown in: Write the tooltip yourself (Tooltip)

indexrequirednumber—
levelnumber—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 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.
boxBoxNumbers & Partial<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).

TooltipProps

Its table stands on Tooltip.

Value<T>

A value read from the row (ADR-0048): the name of a number field, compared by its name, or a function, compared by its source text (ValueFunction).

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.

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.

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

Violation

A rule and the indices it violates.

Used on 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.

NameTypeDefaultDescription
intervalsrequiredreadonly WorkingInterval[]—
offsetsrequiredreadonly number[]—Working time accumulated before the respective interval begins.
totalrequirednumber—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.

NameTypeDefaultDescription
fromrequirednumber—
torequirednumber—

WorkingTimeTick

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

NameTypeDefaultDescription
wallClockrequirednumber—
workingTimerequirednumber—

XAxisProps

Its table stands on Axis.

YAxisProps

Its table stands on Axis.

Zone

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

NameTypeDefaultDescription
krequirednumber—
upperrequirednumber—
lowerrequirednumber—

Used on Scenarios, Axis, LimitLine and ControlChart.

ZoomLimits

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

NameTypeDefaultDescription
minrequirednumber—

Shown in: Limit the zoom (Zoom and pan)

maxrequirednumber—

Shown in: Limit the zoom (Zoom and pan)

Used on 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 on core's Language page.

const GERMAN_CHARTS_WORDING: ChartsWording;

Used on Installation and Chart.

Every page of @umriss-ui/charts

Getting started

Chart

Series

Limits and alarms

Around the chart

API index