# Premium options reference

> WestCoast Charts 1.1.5, release, public Core release, on npm. HTML: https://westcoast-charts.com/docs/reference/premium-options/ · Index for agents: https://westcoast-charts.com/llms.txt · Source: library guide, commit 95f093ba

Options and runtime commands of the `west-coast-charts/premium` chart types. For the concepts behind them see
[Premium and licensing](https://westcoast-charts.com/docs/premium/index.md) and the [Radial column guide](https://westcoast-charts.com/docs/radial-column/index.md).

Every premium type also takes `plotOptions.<type>.plugins` (see [The premium plugin object](#the-premium-plugin-object)).

## Contents

- [`sankey`](#plotoptionssankey)
- [`chord`](#plotoptionschord)
- [`gantt`](#plotoptionsgantt)
- [`tree`](#plotoptionstree)
- [`stock`](#plotoptionsstock)
- [`map`](#plotoptionsmap)
- [`marimekko`](#plotoptionsmarimekko)
- [`network`](#plotoptionsnetwork)
- [`radialColumn`](#plotoptionsradialcolumn)
- [`quint` (quintTimeline, quintConvergence)](#plotoptionsquint)
- [`vitalsClock`](#plotoptionsvitalsclock)
- [`schedule`](#plotoptionsschedule)
- [Runtime API](#runtime-api-common-commands)

## plotOptions.sankey

Chart type `sankey` (`WccSankeyOptions`).

| Option | Type | Description |
| --- | --- | --- |
| `plotOptions.sankey.plugins` | <code>WccPremiumPluginRef[]</code> | Plugins of this chart: plugin objects, registered names, or `[nameOrPlugin, options]`. |
| `plotOptions.sankey.plugins[].name` | <code>string</code> | Plugin id (state key and warnings); not set uses `plugin-&lt;index&gt;`. |
| `plotOptions.sankey.plugins[].defaults` | <code>object</code> | Default options of the plugin; the `[nameOrPlugin, options]` form overrides them. |
| `plotOptions.sankey.plugins[].reserve()` | <code>(p: any): { top?: number; right?: number; bottom?: number; left?: number } \| void</code> | `(p) =&gt; { top, right, bottom, left }`: space in px taken from the plot before layout. |
| `plotOptions.sankey.plugins[].afterRender()` | <code>(p: any): void</code> | `(p)`: called after each render; draw into `p.layer()` and bind events with `p.on()`. |
| `plotOptions.sankey.plugins[].event()` | <code>(name: string, e: Event \| null, payload: any, p: any): boolean \| void</code> | `(name, e, payload, p)`: called for every chart event; returning `false` cancels a cancelable one. |
| `plotOptions.sankey.plugins[].tooltip()` | <code>(content: any, p: any): any</code> | `(content, p) =&gt; content`: changes the tooltip content (rows, footer, …). |
| `plotOptions.sankey.plugins[].describe()` | <code>(p: any): string</code> | `(p) =&gt; string` appended to the screen-reader summary. |
| `plotOptions.sankey.plugins[].destroy()` | <code>(p: any): void</code> | `(p)`: called before each redraw and on destroy. |
| `plotOptions.sankey.orientation` | <code>'horizontal' \| 'vertical'</code> | `'horizontal'` lets the flow run left to right; `'vertical'` runs it top to bottom. Default: `'horizontal'`. |
| `plotOptions.sankey.nodeWidth` | <code>number</code> | Node bar thickness in px. Default: `12`. |
| `plotOptions.sankey.nodePadding` | <code>number</code> | Gap between nodes of a column in px. Default: `16`. |
| `plotOptions.sankey.nodeAlign` | <code>'left' \| 'right' \| 'center' \| 'justify'</code> | Column of nodes without outgoing links: `'justify'` moves them to the last column, `'left'` keeps them at their depth, `'right'` aligns everything to the end, `'center'` puts sources next to their first target. Default: `'justify'`. |
| `plotOptions.sankey.nodeBorderRadius` | <code>number</code> | Corner radius of the node bars in px. Default: `3`. |
| `plotOptions.sankey.minNodeHeight` | <code>number</code> | Smallest node length in px, so tiny values stay visible. Default: `2`. |
| `plotOptions.sankey.iterations` | <code>number</code> | Relaxation passes that reduce link crossings (ignored with `sort: 'input'`). Default: `32`. |
| `plotOptions.sankey.sort` | <code>'auto' \| 'input'</code> | `'input'` keeps the node order of the data; `'auto'` reorders nodes to reduce crossings. Default: `'auto'`. |
| `plotOptions.sankey.cycles` | <code>'error' \| 'break' \| 'circular'</code> | Data with a cycle: `'error'` shows an error and emits an `error` event, `'break'` drops the closing links (with a console warning), `'circular'` draws them as return loops. Default: `'error'`. |
| `plotOptions.sankey.nodes` | <code>object[]</code> | Node definitions that set names, colours or fixed columns. Default: `[]`. |
| `plotOptions.sankey.nodes[].id` | <code>string \| number</code> | Node id used in the links. |
| `plotOptions.sankey.nodes[].name` | <code>string</code> | Shown name; not set uses the id. |
| `plotOptions.sankey.nodes[].color` | <code>WccColor</code> | Node colour. |
| `plotOptions.sankey.nodes[].column` | <code>number</code> | Fixed column (0 is the first). |
| `plotOptions.sankey.draggable` | <code>boolean</code> | Lets the user drag nodes across the flow; positions survive updates. Default: `false`. |
| `plotOptions.sankey.rtl` | <code>'auto' \| boolean</code> | Mirrored layout, the flow runs right to left; `'auto'` follows the CSS direction. Default: `'auto'`. |
| `plotOptions.sankey.link` | <code>object</code> | Link ribbons. |
| `plotOptions.sankey.link.colorMode` | <code>'source' \| 'target' \| 'gradient'</code> | Ribbon colour from the `'source'` node, the `'target'` node, or a `'gradient'` between both. Default: `'gradient'`. |
| `plotOptions.sankey.link.color` | <code>WccColor</code> | One colour for all ribbons (a link's own `color` still wins). |
| `plotOptions.sankey.link.opacity` | <code>number</code> | Ribbon opacity; not set uses 0.34 (0.5 in dark mode). |
| `plotOptions.sankey.link.curvature` | <code>number</code> | Bend of the ribbons, 0 straight. Default: `0.5`. |
| `plotOptions.sankey.link.minWidth` | <code>number</code> | Thinnest ribbon in px. Default: `1`. |
| `plotOptions.sankey.link.circularWidth` | <code>number</code> | Width factor (0.1 to 1) of return loops with `cycles: 'circular'`. Default: `0.4`. |
| `plotOptions.sankey.link.particles` | <code>object</code> | Animated dots flowing along the links. |
| `plotOptions.sankey.link.particles.enabled` | <code>boolean</code> | Turns the particles on (not with motion off). Default: `false`. |
| `plotOptions.sankey.link.particles.density` | <code>number</code> | Factor on the number of particles. Default: `1`. |
| `plotOptions.sankey.link.particles.speed` | <code>number</code> | Factor on the particle speed. Default: `1`. |
| `plotOptions.sankey.link.particles.size` | <code>number</code> | Particle radius in px. Default: `2.2`. |
| `plotOptions.sankey.link.particles.color` | <code>WccColor</code> | Particle colour; not set uses the target node colour (white in dark mode). |
| `plotOptions.sankey.alluvial` | <code>object</code> | Alluvial mode: data points `{ from, to, value, stage }` link the same categories across stages. |
| `plotOptions.sankey.alluvial.enabled` | <code>boolean</code> | Turns alluvial mode on (input node order, a gradient link colour becomes source). Default: `false`. |
| `plotOptions.sankey.alluvial.stages` | <code>string[]</code> | Stage labels; not set numbers the stages from 1. Default: `[]`. |
| `plotOptions.sankey.alluvial.showStageLabels` | <code>boolean</code> | Shows the stage labels over the columns. Default: `true`. |
| `plotOptions.sankey.playback` | <code>object</code> | Animated playback of several data frames. |
| `plotOptions.sankey.playback.frames` | <code>object[]</code> | Frames `{ label, data }`; two or more start the playback. Default: `[]`. |
| `plotOptions.sankey.playback.frames[].label` | <code>string</code> | Frame label (series name, playback button and `playbackFrame` event). |
| `plotOptions.sankey.playback.frames[].data` | <code>any[]</code> | Link data of the frame. |
| `plotOptions.sankey.playback.interval` | <code>number</code> | Time per frame in ms (at least 300). Default: `2400`. |
| `plotOptions.sankey.playback.autoplay` | <code>boolean</code> | Starts playing on render. Default: `true`. |
| `plotOptions.sankey.playback.loop` | <code>boolean</code> | Starts again after the last frame. Default: `true`. |
| `plotOptions.sankey.playback.controls` | <code>boolean</code> | Shows play and frame buttons. Default: `true`. |
| `plotOptions.sankey.labels` | <code>object</code> | Node labels. |
| `plotOptions.sankey.labels.show` | <code>boolean</code> | Shows the node labels. Default: `true`. |
| `plotOptions.sankey.labels.position` | <code>'auto' \| 'outside'</code> | `'outside'` puts first-column labels on the outer side too; `'auto'` places them next to the node, inside the flow. Default: `'auto'`. |
| `plotOptions.sankey.labels.showValue` | <code>boolean</code> | Shows the node value under the name. Default: `true`. |
| `plotOptions.sankey.labels.fontSize` | <code>number \| string</code> | Label font size; not set uses the theme font size. |
| `plotOptions.sankey.labels.fontWeight` | <code>number \| string</code> | Label font weight. Default: `600`. |
| `plotOptions.sankey.labels.formatter` | <code>WccCallback</code> | `(name, { node, value, w }) =&gt; string` for the label name. |
| `plotOptions.sankey.labels.valueFormatter` | <code>WccCallback</code> | `(value, { node, w }) =&gt; string` for values in labels and tooltips; not set uses `tooltip.y.formatter` or a number format. |
| `plotOptions.sankey.drilldown` | <code>WccPremiumDrilldown</code> | Drill-down into nodes. |
| `plotOptions.sankey.drilldown.enabled` | <code>boolean</code> | `false` switches drill-down off. Default: `true`. |
| `plotOptions.sankey.drilldown.breadcrumb` | <code>boolean</code> | Shows the breadcrumb of the opened levels. Default: `true`. |
| `plotOptions.sankey.drilldown.rootLabel` | <code>string</code> | Breadcrumb label of the top level; not set uses `'Overview'` (sankey) or the map name. |
| `plotOptions.sankey.drilldown.load` | <code>(item: any, info: any) =&gt; any</code> | load(item, info) returns a level or a Promise of one |
| `plotOptions.sankey.drilldown.drillable` | <code>(string \| number)[] \| ((item: any) =&gt; boolean)</code> | ids that can be opened, or a test; default: every item when only load is set |
| `plotOptions.sankey.drilldown.nodes` | <code>object</code> | Levels per node id: link data, `{ data, label, nodes }`, or `true` to load the level via `load`. |

## plotOptions.chord

Chart type `chord` (`WccChordOptions`).

| Option | Type | Description |
| --- | --- | --- |
| `plotOptions.chord.plugins` | <code>WccPremiumPluginRef[]</code> | Plugins of this chart: plugin objects, registered names, or `[nameOrPlugin, options]`. |
| `plotOptions.chord.plugins[].name` | <code>string</code> | Plugin id (state key and warnings); not set uses `plugin-&lt;index&gt;`. |
| `plotOptions.chord.plugins[].defaults` | <code>object</code> | Default options of the plugin; the `[nameOrPlugin, options]` form overrides them. |
| `plotOptions.chord.plugins[].reserve()` | <code>(p: any): { top?: number; right?: number; bottom?: number; left?: number } \| void</code> | `(p) =&gt; { top, right, bottom, left }`: space in px taken from the plot before layout. |
| `plotOptions.chord.plugins[].afterRender()` | <code>(p: any): void</code> | `(p)`: called after each render; draw into `p.layer()` and bind events with `p.on()`. |
| `plotOptions.chord.plugins[].event()` | <code>(name: string, e: Event \| null, payload: any, p: any): boolean \| void</code> | `(name, e, payload, p)`: called for every chart event; returning `false` cancels a cancelable one. |
| `plotOptions.chord.plugins[].tooltip()` | <code>(content: any, p: any): any</code> | `(content, p) =&gt; content`: changes the tooltip content (rows, footer, …). |
| `plotOptions.chord.plugins[].describe()` | <code>(p: any): string</code> | `(p) =&gt; string` appended to the screen-reader summary. |
| `plotOptions.chord.plugins[].destroy()` | <code>(p: any): void</code> | `(p)`: called before each redraw and on destroy. |
| `plotOptions.chord.matrix` | <code>number[][] \| null</code> | Flow matrix instead of series data: rows are the sources, columns the targets (names from `labels`). Default: `null`. |
| `plotOptions.chord.labels` | <code>string[]</code> | Group names for the `matrix` rows and columns; missing names become `Group 1`, `Group 2`, …. Default: `[]`. |
| `plotOptions.chord.directed` | <code>'auto' \| boolean</code> | `true` sizes each arc by what the group sends plus what it receives; `false` by what it sends only (each flow is drawn once); `'auto'` uses `false` when every flow has an equal reverse flow. Default: `'auto'`. |
| `plotOptions.chord.padAngle` | <code>number</code> | Gap between neighbouring groups in radians. Default: `0.03`. |
| `plotOptions.chord.sort` | <code>'none' \| 'asc' \| 'desc'</code> | Group order around the circle: data order (`'none'`), or by size `'asc'` / `'desc'`. Default: `'none'`. |
| `plotOptions.chord.ringWidth` | <code>number</code> | Thickness of the group ring in px (4 px up to a third of the radius). Default: `12`. |
| `plotOptions.chord.ribbon` | <code>object</code> | Flow ribbons. |
| `plotOptions.chord.ribbon.opacity` | <code>number</code> | Ribbon opacity; not set uses 0.5 (0.58 in dark mode). |
| `plotOptions.chord.ribbon.colorMode` | <code>'source' \| 'target' \| 'gradient'</code> | Ribbon colour from the `'source'` group, the `'target'` group, or a `'gradient'` between both. Default: `'source'`. |
| `plotOptions.chord.ribbon.padding` | <code>number</code> | Gap between the ring and the ribbon ends in px. Default: `2`. |
| `plotOptions.chord.groups` | <code>object[]</code> | Group definitions that set names and colours. Default: `[]`. |
| `plotOptions.chord.groups[].id` | <code>string \| number</code> | Group id used in the data. |
| `plotOptions.chord.groups[].name` | <code>string</code> | Shown name; not set uses the id. |
| `plotOptions.chord.groups[].color` | <code>WccColor</code> | Group colour. |
| `plotOptions.chord.ticks` | <code>object</code> | Value ticks along the outside of the ring. |
| `plotOptions.chord.ticks.show` | <code>boolean</code> | Shows the ticks. Default: `false`. |
| `plotOptions.chord.ticks.step` | <code>'auto' \| number</code> | Value step of the minor ticks; `'auto'` keeps them about 9 px apart. Default: `'auto'`. |
| `plotOptions.chord.ticks.labelStep` | <code>'auto' \| number</code> | Value step of the labelled ticks; `'auto'` uses a 1/2/5/10 multiple of `step` about 44 px apart. Default: `'auto'`. |
| `plotOptions.chord.ticks.formatter` | <code>WccCallback</code> | `(value, { w }) =&gt; string` for tick labels; not set uses a compact number. |
| `plotOptions.chord.dataLabels` | <code>object</code> | Group labels outside the ring. |
| `plotOptions.chord.dataLabels.show` | <code>boolean</code> | Shows the group labels. Default: `true`. |
| `plotOptions.chord.dataLabels.showValue` | <code>boolean</code> | Shows the group size under the name. Default: `true`. |
| `plotOptions.chord.dataLabels.formatter` | <code>WccCallback</code> | `(name, { node, w }) =&gt; string` for the label name. |

## plotOptions.gantt

Chart type `gantt` (`WccGanttOptions`).

| Option | Type | Description |
| --- | --- | --- |
| `plotOptions.gantt.plugins` | <code>WccPremiumPluginRef[]</code> | Plugins of this chart: plugin objects, registered names, or `[nameOrPlugin, options]`. |
| `plotOptions.gantt.plugins[].name` | <code>string</code> | Plugin id (state key and warnings); not set uses `plugin-&lt;index&gt;`. |
| `plotOptions.gantt.plugins[].defaults` | <code>object</code> | Default options of the plugin; the `[nameOrPlugin, options]` form overrides them. |
| `plotOptions.gantt.plugins[].reserve()` | <code>(p: any): { top?: number; right?: number; bottom?: number; left?: number } \| void</code> | `(p) =&gt; { top, right, bottom, left }`: space in px taken from the plot before layout. |
| `plotOptions.gantt.plugins[].afterRender()` | <code>(p: any): void</code> | `(p)`: called after each render; draw into `p.layer()` and bind events with `p.on()`. |
| `plotOptions.gantt.plugins[].event()` | <code>(name: string, e: Event \| null, payload: any, p: any): boolean \| void</code> | `(name, e, payload, p)`: called for every chart event; returning `false` cancels a cancelable one. |
| `plotOptions.gantt.plugins[].tooltip()` | <code>(content: any, p: any): any</code> | `(content, p) =&gt; content`: changes the tooltip content (rows, footer, …). |
| `plotOptions.gantt.plugins[].describe()` | <code>(p: any): string</code> | `(p) =&gt; string` appended to the screen-reader summary. |
| `plotOptions.gantt.plugins[].destroy()` | <code>(p: any): void</code> | `(p)`: called before each redraw and on destroy. |
| `plotOptions.gantt.rowHeight` | <code>number</code> | Height of one task row in px. Default: `36`. |
| `plotOptions.gantt.barHeight` | <code>number</code> | fraction of the row |
| `plotOptions.gantt.barRadius` | <code>number</code> | Corner radius of the task bars in px. Default: `5`. |
| `plotOptions.gantt.sort` | <code>'input' \| 'start' \| 'end' \| 'name'</code> | `'input'` keeps the series order; `'start'` sorts the tasks of each group by start, then end. `'end'` sorts by end time; `'name'` sorts by locale-aware task name. Equal keys retain input order. Group order is unchanged. Default: `'input'`. |
| `plotOptions.gantt.grid` | <code>object</code> | Task table to the left of the timeline (right in RTL). |
| `plotOptions.gantt.grid.show` | <code>boolean</code> | `false` hides the table and gives the timeline the full width. Default: `true`. |
| `plotOptions.gantt.grid.width` | <code>number</code> | Table width in px, capped at 42 % of the plot width. Default: `260`. |
| `plotOptions.gantt.grid.columns` | <code>Array&lt;'name' \| 'start' \| 'end' \| 'duration' \| 'progress' \| 'assignee' \| 'wbs' \| 'ring' \| WccGanttColumnDef&gt;</code> | Columns of the table in order. Default: `['name', 'start', 'duration']`. |
| `plotOptions.gantt.grid.headers` | <code>{ [column in 'name' \| 'start' \| 'end' \| 'duration' \| 'progress' \| 'assignee' \| 'wbs' \| 'ring']?: string }</code> | Header text per column. Default: `{ name: 'Task', start: 'Start', end: 'End', duration: 'Days', progress: '%', assignee: 'Owner', wbs: 'WBS', ring: '' }`. |
| `plotOptions.gantt.groups` | <code>object</code> | Group rows (one group per series name). |
| `plotOptions.gantt.groups.show` | <code>boolean</code> | Draws a header row per group when there are several groups or the group is named. Default: `true`. |
| `plotOptions.gantt.groups.collapsible` | <code>boolean</code> | Lets a click on a group row collapse or expand its tasks. Default: `true`. |
| `plotOptions.gantt.labels` | <code>object</code> | Task name labels on the bars. |
| `plotOptions.gantt.labels.show` | <code>boolean</code> | `false` draws the bars without name labels. Default: `true`. |
| `plotOptions.gantt.labels.position` | <code>'right' \| 'left' \| 'inside'</code> | Preferred side of the label: `'right'` or `'left'` outside the bar, or `'inside'` when it fits (falls back outside on narrow bars). Default: `'right'`. |
| `plotOptions.gantt.labels.formatter` | <code>WccCallback</code> | `(name, { task, w }) =&gt; string` returns the label text; not set shows the name (plus the assignee when no assignee column is shown). |
| `plotOptions.gantt.progress` | <code>object</code> | Progress fill of the bars. |
| `plotOptions.gantt.progress.show` | <code>boolean</code> | Fills each bar to its `progress` and adds the percentage to the label. Default: `true`. |
| `plotOptions.gantt.dependencies` | <code>object</code> | Dependency links between tasks. |
| `plotOptions.gantt.dependencies.show` | <code>boolean</code> | `false` hides the links (and link editing). Default: `true`. |
| `plotOptions.gantt.dependencies.color` | <code>WccColor</code> | Link colour; not set uses a muted theme colour (critical links use the critical-path colour). |
| `plotOptions.gantt.dependencies.radius` | <code>number</code> | Corner radius of the link elbows in px. Default: `6`. |
| `plotOptions.gantt.dependencies.arrowSize` | <code>number</code> | Size of the arrow head in px. Default: `5`. |
| `plotOptions.gantt.dependencies.lagLabels` | <code>boolean</code> | Writes a link's lag or lead (e.g. "+2d") on the link. Default: `true`. |
| `plotOptions.gantt.dependencies.violations` | <code>boolean</code> | Dashes and marks links whose successor starts before the dependency allows. Default: `false`. |
| `plotOptions.gantt.dependencies.edit` | <code>boolean</code> | Lets the user draw links from the handle at a bar's end and delete a selected link. Default: `false`. |
| `plotOptions.gantt.today` | <code>object</code> | Today marker. |
| `plotOptions.gantt.today.show` | <code>boolean</code> | Draws a vertical line at today. Default: `true`. |
| `plotOptions.gantt.today.date` | <code>WccDate</code> | Date used as "today"; not set uses the current time. |
| `plotOptions.gantt.today.label` | <code>string</code> | Text of the today marker and its control button. Default: `'Today'`. |
| `plotOptions.gantt.weekends` | <code>object</code> | Weekend shading (used when no working calendar is set). |
| `plotOptions.gantt.weekends.show` | <code>boolean</code> | Shades Saturdays and Sundays once a day is at least 10 px wide. Default: `true`. |
| `plotOptions.gantt.calendar` | <code>object</code> | Working calendar: durations, moves and resizes count working days. Not set: calendar days. |
| `plotOptions.gantt.calendar.workingDays` | <code>number[]</code> | Working weekdays, 0 = Sunday ... 6 = Saturday. Default: `[1, 2, 3, 4, 5]`. |
| `plotOptions.gantt.calendar.holidays` | <code>object[]</code> | Non-working dates: a date, `{ date, name }` or a range `{ from, to, name }`. |
| `plotOptions.gantt.calendar.holidays[].date` | <code>WccDate</code> | Date of the holiday. |
| `plotOptions.gantt.calendar.holidays[].name` | <code>string</code> | Name shown for the holiday. |
| `plotOptions.gantt.calendar.holidays[].from` | <code>WccDate</code> | First day of the holiday range. |
| `plotOptions.gantt.calendar.holidays[].to` | <code>WccDate</code> | Last day of the holiday range (inclusive). |
| `plotOptions.gantt.calendar.shade` | <code>boolean</code> | `false` stops shading non-working days. Default: `true`. |
| `plotOptions.gantt.criticalPath` | <code>object</code> | Critical path highlighting. |
| `plotOptions.gantt.criticalPath.show` | <code>boolean</code> | Outlines the tasks without float (a delay moves the project end) and the links between them. Default: `false`. |
| `plotOptions.gantt.criticalPath.color` | <code>WccColor</code> | Colour of the critical path; not set uses the theme's negative colour. |
| `plotOptions.gantt.baselines` | <code>object</code> | Planned (baseline) bars. |
| `plotOptions.gantt.baselines.show` | <code>boolean</code> | Draws a task's `baseline` dates as a thin bar under it and adds it to the legend. Default: `true`. |
| `plotOptions.gantt.zoom` | <code>object</code> | Zoom of the time axis. |
| `plotOptions.gantt.zoom.enabled` | <code>boolean</code> | `false` disables zooming. Default: `true`. |
| `plotOptions.gantt.zoom.wheel` | <code>'ctrl' \| boolean \| string</code> | `false` turns off Ctrl/Cmd + wheel zoom; any other value keeps it (a plain wheel always scrolls). Default: `'ctrl'`. |
| `plotOptions.gantt.zoom.minDays` | <code>number</code> | Smallest visible span in days. Default: `3`. |
| `plotOptions.gantt.zoom.maxDays` | <code>number</code> | Largest visible span in days. Default: `3650`. |
| `plotOptions.gantt.drag` | <code>object</code> | Moving and resizing tasks with the pointer. |
| `plotOptions.gantt.drag.enabled` | <code>boolean</code> | Lets the user move bars (and enables the editing options). Default: `false`. |
| `plotOptions.gantt.drag.resize` | <code>boolean</code> | Adds resize handles at the bar ends while dragging is on. Default: `true`. |
| `plotOptions.gantt.drag.snap` | <code>'day' \| 'hour' \| false</code> | Snap of moved dates: `'day'`, `'hour'`, a step in ms, or `false` for none. Default: `'day'`. |
| `plotOptions.gantt.drag.draw` | <code>boolean</code> | Lets the user draw new tasks on empty rows and shows the "+ Add task" row. Default: `false`. |
| `plotOptions.gantt.edit` | <code>object</code> | Editing behaviour (needs `drag.enabled`). |
| `plotOptions.gantt.edit.undo` | <code>boolean</code> | Keeps an undo / redo history of edits. Default: `true`. |
| `plotOptions.gantt.edit.keyboard` | <code>boolean</code> | Allows keyboard edits of the focused task. Default: `true`. |
| `plotOptions.gantt.edit.remove` | <code>boolean</code> | Lets Delete / Backspace remove the focused task. Default: `true`. |
| `plotOptions.gantt.edit.rename` | <code>boolean</code> | Lets a double click on a task name rename it inline. Default: `true`. |
| `plotOptions.gantt.edit.newName` | <code>string</code> | Name given to a newly created task. Default: `'New task'`. |
| `plotOptions.gantt.edit.newDays` | <code>number</code> | Length in days of a task created with the add button or keyboard. Default: `3`. |
| `plotOptions.gantt.edit.addLabel` | <code>string</code> | Text of the add row (shown after "+ "). Default: `'Add task'`. |
| `plotOptions.gantt.range` | <code>object</code> | Fixed time range of the timeline. |
| `plotOptions.gantt.range.min` | <code>WccDate</code> | Start of the timeline; not set fits the tasks. |
| `plotOptions.gantt.range.max` | <code>WccDate</code> | End of the timeline; not set fits the tasks (with room for labels). |
| `plotOptions.gantt.boundary` | <code>object</code> | Project boundary: dashed start / deadline lines; tasks outside it are flagged. |
| `plotOptions.gantt.boundary.start` | <code>WccDate</code> | Project start date. |
| `plotOptions.gantt.boundary.end` | <code>WccDate</code> | Project end date (deadline). |
| `plotOptions.gantt.boundary.startLabel` | <code>string</code> | Label of the start line. Default: `'Start'`. |
| `plotOptions.gantt.boundary.endLabel` | <code>string</code> | Label of the deadline line. Default: `'Deadline'`. |
| `plotOptions.gantt.boundary.shade` | <code>boolean</code> | `false` stops shading the time outside the boundary. Default: `true`. |
| `plotOptions.gantt.annotations` | <code>object[]</code> | Timeline annotations: a marker line, a range (`x2`), or a note on a task's bar (`task`). Default: `[]`. |
| `plotOptions.gantt.annotations[].x` | <code>WccDate</code> | Date of the marker, or start of the range. |
| `plotOptions.gantt.annotations[].x2` | <code>WccDate</code> | End of the range; set draws a shaded band. |
| `plotOptions.gantt.annotations[].label` | <code>string</code> | Text of the chip or note. |
| `plotOptions.gantt.annotations[].color` | <code>WccColor</code> | Colour; not set cycles through theme colours. |
| `plotOptions.gantt.annotations[].dash` | <code>boolean</code> | `false` draws the marker solid; any other value keeps it dashed. |
| `plotOptions.gantt.annotations[].task` | <code>string \| number</code> | Task id: draws the annotation as a note on that task's row. |
| `plotOptions.gantt.persist` | <code>object \| string</code> | Saves the view to localStorage under this key (a string) or `{ key, ... }`; not set saves nothing. |
| `plotOptions.gantt.persist.key` | <code>string</code> | localStorage key. |
| `plotOptions.gantt.persist.view` | <code>boolean</code> | Saves the visible time range. Default: `true`. |
| `plotOptions.gantt.persist.collapsed` | <code>boolean</code> | Saves the collapsed groups. Default: `true`. |
| `plotOptions.gantt.persist.selection` | <code>boolean</code> | Saves the selected tasks. Default: `false`. |
| `plotOptions.gantt.controls` | <code>object</code> | On-chart buttons (today, zoom). |
| `plotOptions.gantt.controls.show` | <code>boolean</code> | `false` hides the control buttons. Default: `true`. |
| `plotOptions.gantt.selection` | <code>object</code> | Task selection. |
| `plotOptions.gantt.selection.enabled` | <code>boolean</code> | Lets a click select a task. Default: `true`. |
| `plotOptions.gantt.selection.multiple` | <code>boolean</code> | Lets Ctrl/Cmd/Shift + click add to the selection. Default: `true`. |
| `plotOptions.gantt.crosshair` | <code>object</code> | Time crosshair. |
| `plotOptions.gantt.crosshair.show` | <code>boolean</code> | Draws a vertical line with the date under the pointer. Default: `false`. |
| `plotOptions.gantt.rtl` | <code>'auto' \| boolean</code> | Mirrored layout (table on the right, time runs right to left); `'auto'` follows the CSS direction. Default: `'auto'`. |

## plotOptions.tree

Chart type `tree` (`WccTreeOptions`).

| Option | Type | Description |
| --- | --- | --- |
| `plotOptions.tree.plugins` | <code>WccPremiumPluginRef[]</code> | Plugins of this chart: plugin objects, registered names, or `[nameOrPlugin, options]`. |
| `plotOptions.tree.plugins[].name` | <code>string</code> | Plugin id (state key and warnings); not set uses `plugin-&lt;index&gt;`. |
| `plotOptions.tree.plugins[].defaults` | <code>object</code> | Default options of the plugin; the `[nameOrPlugin, options]` form overrides them. |
| `plotOptions.tree.plugins[].reserve()` | <code>(p: any): { top?: number; right?: number; bottom?: number; left?: number } \| void</code> | `(p) =&gt; { top, right, bottom, left }`: space in px taken from the plot before layout. |
| `plotOptions.tree.plugins[].afterRender()` | <code>(p: any): void</code> | `(p)`: called after each render; draw into `p.layer()` and bind events with `p.on()`. |
| `plotOptions.tree.plugins[].event()` | <code>(name: string, e: Event \| null, payload: any, p: any): boolean \| void</code> | `(name, e, payload, p)`: called for every chart event; returning `false` cancels a cancelable one. |
| `plotOptions.tree.plugins[].tooltip()` | <code>(content: any, p: any): any</code> | `(content, p) =&gt; content`: changes the tooltip content (rows, footer, …). |
| `plotOptions.tree.plugins[].describe()` | <code>(p: any): string</code> | `(p) =&gt; string` appended to the screen-reader summary. |
| `plotOptions.tree.plugins[].destroy()` | <code>(p: any): void</code> | `(p)`: called before each redraw and on destroy. |
| `plotOptions.tree.layout` | <code>'tidy' \| 'dendrogram'</code> | `'tidy'` places parents over their children; `'dendrogram'` puts all leaves on the last level. Default: `'tidy'`. |
| `plotOptions.tree.orientation` | <code>'vertical' \| 'horizontal' \| 'radial' \| 'top-to-bottom' \| 'bottom-to-top' \| 'left-to-right' \| 'right-to-left'</code> | Growth direction; `'radial'` places levels on rings. The aliases `'top-to-bottom'`, `'bottom-to-top'`, `'left-to-right'` and `'right-to-left'` also set `direction`. Default: `'vertical'`. |
| `plotOptions.tree.direction` | <code>'forward' \| 'reverse'</code> | `'reverse'` puts the root at the bottom (vertical) or right (horizontal). Default: `'forward'`. |
| `plotOptions.tree.rtl` | <code>'auto' \| boolean</code> | Mirrored layout (first child on the right, horizontal trees grow leftwards, card text right-aligned); `'auto'` follows the CSS direction. Default: `'auto'`. |
| `plotOptions.tree.node` | <code>object</code> | Node drawing. |
| `plotOptions.tree.node.template` | <code>'auto' \| 'card' \| 'compact' \| 'dot'</code> | `'card'`, `'compact'` or `'dot'`; `'auto'` uses dots for radial trees and dendrograms, otherwise cards. Default: `'auto'`. |
| `plotOptions.tree.node.width` | <code>number</code> | Card width in px. Default: `196`. |
| `plotOptions.tree.node.height` | <code>number</code> | Card height in px. Default: `60`. |
| `plotOptions.tree.node.radius` | <code>number</code> | Card corner radius in px. Default: `10`. |
| `plotOptions.tree.node.avatar` | <code>boolean</code> | Shows the avatar circle on cards at least 44 px high. Default: `true`. |
| `plotOptions.tree.node.dotSize` | <code>number</code> | Dot radius of the dot template in px. Default: `5`. |
| `plotOptions.tree.node.stackLeaves` | <code>'auto' \| boolean</code> | Stacks the leaf children of a vertical card tree in a column; `'auto'` keeps a plain row when that fits the plot better, `false` never stacks. Default: `'auto'`. |
| `plotOptions.tree.node.formatter` | <code>WccCallback</code> | returns text fields only, never HTML |
| `plotOptions.tree.node.size` | <code>(data: any, info: { node: any; depth: number; children: any[] }) =&gt; { width?: number; height?: number }</code> | `(data, { node, depth, children }) =&gt; { width, height }` sets a node's own card size (a `size` in the data also works). |
| `plotOptions.tree.node.autoHeight` | <code>boolean</code> | Wraps long titles and subtitles (up to `maxLines`) and grows the card to fit. Default: `false`. |
| `plotOptions.tree.node.maxLines` | <code>number</code> | Most lines of a wrapped text with `autoHeight`. Default: `3`. |
| `plotOptions.tree.wrappers` | <code>object[]</code> | Frames around a node and its visible descendants (cards only, not radial); a node's data `wrapper: true \| { label, color }` also adds one. Default: `[]`. |
| `plotOptions.tree.wrappers[].id` | <code>string \| number</code> | Id of the framed node. |
| `plotOptions.tree.wrappers[].label` | <code>string</code> | Label of the frame. |
| `plotOptions.tree.wrappers[].color` | <code>WccColor</code> | Frame colour. |
| `plotOptions.tree.wrappers[].dashed` | <code>boolean</code> | Dashes the frame outline. Default: `false`. |
| `plotOptions.tree.spacing` | <code>object</code> | Gaps of the layout in px. |
| `plotOptions.tree.spacing.sibling` | <code>number</code> | Gap between neighbouring cards. Default: `16`. |
| `plotOptions.tree.spacing.level` | <code>number</code> | Gap between levels. Default: `56`. |
| `plotOptions.tree.spacing.dot` | <code>number</code> | Distance between neighbouring dots. Default: `22`. |
| `plotOptions.tree.radial` | <code>object</code> | Radial layout. |
| `plotOptions.tree.radial.startAngle` | <code>number</code> | Start angle in degrees clockwise from 12 o'clock; not set is fitted to the plot. |
| `plotOptions.tree.radial.stretch` | <code>'auto' \| boolean</code> | `false` keeps a true circle; `'auto'` stretches it (up to 1.45 x) along the plot's long side. Default: `'auto'`. |
| `plotOptions.tree.links` | <code>object</code> | Parent-child links. |
| `plotOptions.tree.links.style` | <code>'auto' \| 'elbow' \| 'curve' \| 'straight'</code> | `'elbow'`, `'curve'` or `'straight'`; `'auto'` uses curves for dot trees (not dendrograms), otherwise elbows. Default: `'auto'`. |
| `plotOptions.tree.links.color` | <code>WccColor</code> | Link colour; not set uses a muted tone (a branch tint for dot trees). |
| `plotOptions.tree.links.width` | <code>number</code> | Link width in px. Default: `1.25`. |
| `plotOptions.tree.colorBy` | <code>'branch' \| 'depth' \| 'none'</code> | Node tint: one colour per top-level `'branch'`, per `'depth'`, or the accent for `'none'`. Default: `'branch'`. |
| `plotOptions.tree.collapse` | <code>object</code> | Folding of subtrees. |
| `plotOptions.tree.collapse.enabled` | <code>boolean</code> | Lets the user fold and unfold subtrees. Default: `true`. |
| `plotOptions.tree.collapse.initialDepth` | <code>number</code> | Folds nodes at this depth and deeper on the first render; not set opens everything (nodes with `collapsed: true` start folded). |
| `plotOptions.tree.zoom` | <code>WccZoomOptions</code> | Zoom and pan (scale 0.05 to 3 by default). |
| `plotOptions.tree.zoom.enabled` | <code>boolean</code> | Enables zoom and pan of the view. Default: `true`. |
| `plotOptions.tree.zoom.wheel` | <code>'ctrl' \| boolean \| string</code> | Wheel zoom: `'ctrl'` zooms only while Ctrl or Cmd is held, `true` on every wheel event, `false` never. Default: `'ctrl'`. |
| `plotOptions.tree.zoom.min` | <code>number</code> | Smallest zoom factor. Default: `0.25` for the network, `0.05` for the tree. |
| `plotOptions.tree.zoom.max` | <code>number</code> | Largest zoom factor. Default: `8` for the network, `3` for the tree. |
| `plotOptions.tree.zoom.fitMin` | <code>number</code> | Smallest scale of the initial fit; not set uses the scale where the smallest text is `readableFont` px. |
| `plotOptions.tree.zoom.fitMax` | <code>number</code> | Largest scale of the initial fit. Default: `1.5`. |
| `plotOptions.tree.zoom.readableFont` | <code>number</code> | Text size in px the initial view keeps readable. Default: `11`. |
| `plotOptions.tree.zoom.overviewFont` | <code>number \| false</code> | A tree too big for the readable scale still opens whole while its smallest text stays at least this size; `false` starts readable at the root instead. Default: `8`. |
| `plotOptions.tree.controls` | <code>object</code> | On-chart zoom buttons. |
| `plotOptions.tree.controls.show` | <code>boolean</code> | `false` hides the zoom buttons. Default: `true`. |
| `plotOptions.tree.lod` | <code>object</code> | Level of detail. |
| `plotOptions.tree.lod.threshold` | <code>number</code> | Below this zoom scale card texts are hidden and cards drawn as plain shapes. Default: `0.42`. |
| `plotOptions.tree.lazy` | <code>object</code> | Lazy children for nodes with `hasChildren: true` and no `children`. |
| `plotOptions.tree.lazy.load` | <code>(node: any, info: { w: any; id: any; name: string; depth: number }) =&gt; any</code> | `(node, { w, id, name, depth }) =&gt; children[] \| Promise`, called when such a node is first expanded. |
| `plotOptions.tree.lazy.loadingText` | <code>string</code> | Text of the placeholder while loading. Default: `'Loading…'`. |
| `plotOptions.tree.lazy.errorText` | <code>string</code> | Text when the load fails (a click retries). Default: `'Could not load · retry'`. |

## plotOptions.stock

Chart type `stock` (`WccStockOptions`).

| Option | Type | Description |
| --- | --- | --- |
| `plotOptions.stock.plugins` | <code>WccPremiumPluginRef[]</code> | Plugins of this chart: plugin objects, registered names, or `[nameOrPlugin, options]`. |
| `plotOptions.stock.plugins[].name` | <code>string</code> | Plugin id (state key and warnings); not set uses `plugin-&lt;index&gt;`. |
| `plotOptions.stock.plugins[].defaults` | <code>object</code> | Default options of the plugin; the `[nameOrPlugin, options]` form overrides them. |
| `plotOptions.stock.plugins[].reserve()` | <code>(p: any): { top?: number; right?: number; bottom?: number; left?: number } \| void</code> | `(p) =&gt; { top, right, bottom, left }`: space in px taken from the plot before layout. |
| `plotOptions.stock.plugins[].afterRender()` | <code>(p: any): void</code> | `(p)`: called after each render; draw into `p.layer()` and bind events with `p.on()`. |
| `plotOptions.stock.plugins[].event()` | <code>(name: string, e: Event \| null, payload: any, p: any): boolean \| void</code> | `(name, e, payload, p)`: called for every chart event; returning `false` cancels a cancelable one. |
| `plotOptions.stock.plugins[].tooltip()` | <code>(content: any, p: any): any</code> | `(content, p) =&gt; content`: changes the tooltip content (rows, footer, …). |
| `plotOptions.stock.plugins[].describe()` | <code>(p: any): string</code> | `(p) =&gt; string` appended to the screen-reader summary. |
| `plotOptions.stock.plugins[].destroy()` | <code>(p: any): void</code> | `(p)`: called before each redraw and on destroy. |
| `plotOptions.stock.enabled` | <code>boolean</code> | with chart.type 'candlestick': draw it with the stock renderer |
| `plotOptions.stock.style` | <code>'candlestick' \| 'ohlc' \| 'line' \| 'area'</code> | Price display: candles, OHLC bars, a close line or a close area. Default: `'candlestick'`. |
| `plotOptions.stock.colors` | <code>object</code> | Colours of rising and falling candles. |
| `plotOptions.stock.colors.up` | <code>WccColor</code> | Rising candle colour; not set uses the theme's positive colour. |
| `plotOptions.stock.colors.down` | <code>WccColor</code> | Falling candle colour; not set uses the theme's negative colour. |
| `plotOptions.stock.volume` | <code>object</code> | Volume bars at the bottom of the price pane (drawn when the data has volume). |
| `plotOptions.stock.volume.show` | <code>boolean</code> | `false` hides the volume bars. Default: `true`. |
| `plotOptions.stock.volume.height` | <code>number</code> | Share of the price pane used by volume (0.05 to 0.5). Default: `0.2`. |
| `plotOptions.stock.overlays` | <code>object[]</code> | Price overlays: SMA, EMA or Bollinger bands. Default: `[]`. |
| `plotOptions.stock.overlays[].type` | <code>'sma' \| 'ema' \| 'bollinger'</code> | Overlay kind (`'bb'` is accepted for Bollinger). |
| `plotOptions.stock.overlays[].period` | <code>number</code> | Period in candles. Default: `20`. |
| `plotOptions.stock.overlays[].k` | <code>number</code> | Bollinger band width in standard deviations. Default: `2`. |
| `plotOptions.stock.overlays[].color` | <code>WccColor</code> | Line colour; not set cycles through theme colours. |
| `plotOptions.stock.indicators` | <code>object[]</code> | Indicator panes under the price pane: RSI or MACD. Default: `[]`. |
| `plotOptions.stock.indicators[].type` | <code>'rsi'</code> | Indicator kind. |
| `plotOptions.stock.indicators[].period` | <code>number</code> | RSI period in candles. Default: `14`. |
| `plotOptions.stock.indicators[].type` | <code>'macd'</code> | Indicator kind. |
| `plotOptions.stock.indicators[].fast` | <code>number</code> | MACD fast EMA period. Default: `12`. |
| `plotOptions.stock.indicators[].slow` | <code>number</code> | MACD slow EMA period. Default: `26`. |
| `plotOptions.stock.indicators[].signal` | <code>number</code> | MACD signal EMA period. Default: `9`. |
| `plotOptions.stock.rangeSelector` | <code>object</code> | Range buttons above the chart. |
| `plotOptions.stock.rangeSelector.show` | <code>boolean</code> | `false` hides the range buttons. Default: `true`. |
| `plotOptions.stock.rangeSelector.buttons` | <code>object[]</code> | Buttons, each spanning `months`, `days`, the year to date (`ytd`) or `all`. Default: 1M, 3M, 6M, YTD, 1Y, All. |
| `plotOptions.stock.rangeSelector.buttons[].label` | <code>string</code> | Button text; also the value of `selected`. |
| `plotOptions.stock.rangeSelector.buttons[].months` | <code>number</code> | Months back from the last candle. |
| `plotOptions.stock.rangeSelector.buttons[].days` | <code>number</code> | Days back from the last candle. |
| `plotOptions.stock.rangeSelector.buttons[].ytd` | <code>boolean</code> | Spans from 1 January of the last candle's year. |
| `plotOptions.stock.rangeSelector.buttons[].all` | <code>boolean</code> | Spans all candles. |
| `plotOptions.stock.rangeSelector.selected` | <code>string</code> | Label of the initial range; not set picks 6M (over 400 days of data), 3M (over 120 days) or All. |
| `plotOptions.stock.navigator` | <code>object</code> | Overview strip with a draggable window under the chart. |
| `plotOptions.stock.navigator.show` | <code>boolean</code> | `false` hides the navigator. Default: `true`. |
| `plotOptions.stock.navigator.height` | <code>number</code> | Navigator height in px. Default: `46`. |
| `plotOptions.stock.crosshair` | <code>object</code> | Crosshair across all panes. |
| `plotOptions.stock.crosshair.show` | <code>boolean</code> | `false` hides the crosshair lines. Default: `true`. |
| `plotOptions.stock.readout` | <code>object</code> | OHLC and overlay values written at the top of the price pane. |
| `plotOptions.stock.readout.show` | <code>boolean</code> | `false` hides the readout and its reserved space. Default: `true`. |
| `plotOptions.stock.realtime` | <code>object</code> | Behaviour when candles are added. |
| `plotOptions.stock.realtime.follow` | <code>boolean</code> | Keeps the view at the newest candle when new ones arrive while the view is at the end. Default: `true`. |
| `plotOptions.stock.zoom` | <code>object</code> | Zoom and pan of the time axis. |
| `plotOptions.stock.zoom.enabled` | <code>boolean</code> | `false` disables wheel zoom and drag panning. Default: `true`. |
| `plotOptions.stock.zoom.wheel` | <code>'ctrl' \| boolean \| string</code> | `'ctrl'` zooms while Ctrl or Cmd is held, `true` on every wheel event; other values never. Default: `'ctrl'`. |
| `plotOptions.stock.zoom.minCandles` | <code>number</code> | Fewest candles in view (at least 2). Default: `8`. |
| `plotOptions.stock.yaxis` | <code>object</code> | Price axis. |
| `plotOptions.stock.yaxis.decimals` | <code>number</code> | Decimals of prices; not set uses 0 from 1000, 2 from 1, otherwise 4. |
| `plotOptions.stock.yaxis.formatter` | <code>WccCallback</code> | `(price, { w }) =&gt; string` for axis labels and readouts. |
| `plotOptions.stock.yaxis.type` | <code>'linear' \| 'log' \| 'percent'</code> | `'log'` uses a logarithmic scale, `'percent'` shows the change against the first visible close. Default: `'linear'`. |
| `plotOptions.stock.timeframe` | <code>'day' \| 'week' \| 'month'</code> | Candle size; `'week'` and `'month'` aggregate the input candles. Default: `'day'`. |
| `plotOptions.stock.priceLines` | <code>object[]</code> | Horizontal price levels (orders, targets, stops) with an axis label. Default: `[]`. |
| `plotOptions.stock.priceLines[].y` | <code>number</code> | Price of the line. |
| `plotOptions.stock.priceLines[].label` | <code>string</code> | Text chip at the left end of the line. |
| `plotOptions.stock.priceLines[].color` | <code>WccColor</code> | Line colour; not set cycles through theme colours. |
| `plotOptions.stock.priceLines[].dash` | <code>boolean</code> | `false` draws the line solid; otherwise it is dashed. |
| `plotOptions.stock.priceLines[].width` | <code>number</code> | Line width in px. Default: `1.2`. |
| `plotOptions.stock.markers` | <code>object[]</code> | Event flags (earnings, dividends, splits) on the candle of their date. Default: `[]`. |
| `plotOptions.stock.markers[].x` | <code>WccDate</code> | Date of the event. |
| `plotOptions.stock.markers[].label` | <code>string</code> | One or two characters inside the flag. Default: `'•'`. |
| `plotOptions.stock.markers[].text` | <code>string</code> | Hover text of the flag (after the date). |
| `plotOptions.stock.markers[].color` | <code>WccColor</code> | Flag colour; not set cycles through theme colours. |
| `plotOptions.stock.markers[].position` | <code>'below' \| 'above'</code> | `'below'` the candle's low or `'above'` its high. Default: `'below'`. |
| `plotOptions.stock.drawings` | <code>object</code> | Drawing tools for the user (opt-in). |
| `plotOptions.stock.drawings.enabled` | <code>boolean</code> | Turns the drawing tools on. Default: `false`. |
| `plotOptions.stock.drawings.tools` | <code>('trendline' \| 'ray' \| 'fib' \| 'rect')[]</code> | Tools in the toolbar. Default: `['trendline', 'ray', 'fib', 'rect']`. |
| `plotOptions.stock.drawings.items` | <code>WccStockDrawing[]</code> | Initial drawings. Default: `[]`. |
| `plotOptions.stock.drawings.items[].id` | <code>string \| number</code> | Id of the drawing; not set gets `'d1'`, `'d2'`, ... |
| `plotOptions.stock.drawings.items[].type` | <code>'trendline' \| 'ray' \| 'fib' \| 'rect' \| string</code> | `'trendline'` (2 points), `'ray'` (horizontal, 1 point), `'fib'` (retracement, 2 points) or `'rect'` (2 corners); aliases such as `'line'` or `'box'` are accepted. |
| `plotOptions.stock.drawings.items[].points` | <code>object[]</code> | Anchors as `{ t, y }` or `[t, y]` (time, price); invalid drawings are skipped. |
| `plotOptions.stock.drawings.items[].points[].t` | <code>WccDate</code> | Time of the anchor. |
| `plotOptions.stock.drawings.items[].points[].y` | <code>number</code> | Price of the anchor. |
| `plotOptions.stock.drawings.items[].color` | <code>WccColor</code> | Colour; not set uses `drawings.colors` or the palette. |
| `plotOptions.stock.drawings.items[].label` | <code>string</code> | Text written along the drawing. |
| `plotOptions.stock.drawings.items[].width` | <code>number</code> | Line width in px. Default: `1.6`. |
| `plotOptions.stock.drawings.items[].extend` | <code>boolean \| 'left' \| 'right' \| 'both'</code> | Trend line: extends to the plot edge (`true` or `'both'` both ways, `'left'`, `'right'`); fib: `false` ends the levels at the second point. |
| `plotOptions.stock.drawings.items[].dash` | <code>boolean \| string</code> | `true` dashes the line; a string is used as SVG dash array; not set draws it solid. |
| `plotOptions.stock.drawings.items[].fill` | <code>string</code> | Fill of a rectangle; not set uses a faint tint of the colour. |
| `plotOptions.stock.drawings.items[].levels` | <code>number[]</code> | Fibonacci levels as fractions. Default: `[0, 0.236, 0.382, 0.5, 0.618, 0.786, 1]`. |
| `plotOptions.stock.drawings.items[].locked` | <code>boolean</code> | `true` stops the user from moving or editing the drawing. |
| `plotOptions.stock.drawings.items[].labelPosition` | <code>'above' \| 'below'</code> | Side of the trend line label. Default: `'above'`. |
| `plotOptions.stock.drawings.toolbar` | <code>boolean</code> | `false` hides the tool buttons (drawings stay visible). Default: `true`. |
| `plotOptions.stock.drawings.magnet` | <code>boolean</code> | Snaps anchors to the open, high, low or close within 10 px of the pointer. Default: `true`. |
| `plotOptions.stock.drawings.keepTool` | <code>boolean</code> | Keeps the tool active after a drawing is finished. Default: `false`. |
| `plotOptions.stock.drawings.storageKey` | <code>string</code> | localStorage key; set saves and restores the drawings. |
| `plotOptions.stock.drawings.palette` | <code>'muted' \| 'vivid'</code> | `'muted'` uses the accent for trend lines and a muted tone for the rest; `'vivid'` gives every tool its own colour. Default: `'muted'`. |
| `plotOptions.stock.drawings.colors` | <code>object</code> | Colour per tool; wins over the palette. |
| `plotOptions.stock.drawings.colors.trendline` | <code>WccColor</code> | Trend line colour. |
| `plotOptions.stock.drawings.colors.ray` | <code>WccColor</code> | Horizontal ray colour. |
| `plotOptions.stock.drawings.colors.fib` | <code>WccColor</code> | Fibonacci retracement colour. |
| `plotOptions.stock.drawings.colors.rect` | <code>WccColor</code> | Rectangle colour. |

## plotOptions.map

Chart type `map` (`WccMapOptions`).

| Option | Type | Description |
| --- | --- | --- |
| `plotOptions.map.plugins` | <code>WccPremiumPluginRef[]</code> | Plugins of this chart: plugin objects, registered names, or `[nameOrPlugin, options]`. |
| `plotOptions.map.plugins[].name` | <code>string</code> | Plugin id (state key and warnings); not set uses `plugin-&lt;index&gt;`. |
| `plotOptions.map.plugins[].defaults` | <code>object</code> | Default options of the plugin; the `[nameOrPlugin, options]` form overrides them. |
| `plotOptions.map.plugins[].reserve()` | <code>(p: any): { top?: number; right?: number; bottom?: number; left?: number } \| void</code> | `(p) =&gt; { top, right, bottom, left }`: space in px taken from the plot before layout. |
| `plotOptions.map.plugins[].afterRender()` | <code>(p: any): void</code> | `(p)`: called after each render; draw into `p.layer()` and bind events with `p.on()`. |
| `plotOptions.map.plugins[].event()` | <code>(name: string, e: Event \| null, payload: any, p: any): boolean \| void</code> | `(name, e, payload, p)`: called for every chart event; returning `false` cancels a cancelable one. |
| `plotOptions.map.plugins[].tooltip()` | <code>(content: any, p: any): any</code> | `(content, p) =&gt; content`: changes the tooltip content (rows, footer, …). |
| `plotOptions.map.plugins[].describe()` | <code>(p: any): string</code> | `(p) =&gt; string` appended to the screen-reader summary. |
| `plotOptions.map.plugins[].destroy()` | <code>(p: any): void</code> | `(p)`: called before each redraw and on destroy. |
| `plotOptions.map.map` | <code>string \| object</code> | a registered map name, or TopoJSON / GeoJSON |
| `plotOptions.map.object` | <code>string \| null</code> | TopoJSON object name, when there are several |
| `plotOptions.map.projection` | <code>'auto' \| 'equalEarth' \| 'mercator' \| 'equirectangular' \| 'albers' \| 'albersUsa' \| 'orthographic'</code> | Projection; `'auto'` uses the map's own projection hint or `'equalEarth'`. Default: `'auto'`. |
| `plotOptions.map.rotate` | <code>[number, number]</code> | globe centre [lon, lat] |
| `plotOptions.map.normalize` | <code>object</code> | Per-unit choropleth values: value / `by` * `per` (e.g. per capita). |
| `plotOptions.map.normalize.by` | <code>string \| ((item: any) =&gt; number) \| null</code> | Denominator: a key of the data item or of the region's properties, or `(item, { feature }) =&gt; number`; not set: no normalisation. |
| `plotOptions.map.normalize.per` | <code>number</code> | Multiplier of the ratio (e.g. `100000` for "per 100k"). Default: `1`. |
| `plotOptions.map.normalize.label` | <code>string \| null</code> | Tooltip label of the raw total next to the normalised value. Default: `'Total'`. |
| `plotOptions.map.exclude` | <code>string[]</code> | Region ids or names left out of the map (case-insensitive). Default: `['ATA']`. |
| `plotOptions.map.style` | <code>'fill' \| 'dots' \| 'tiles'</code> | Region drawing: `'fill'` (shapes), `'dots'` (a dot grid clipped to the land) or `'tiles'` (one equal tile per region). Default: `'fill'`. |
| `plotOptions.map.dots` | <code>object</code> | Dot grid of `style: 'dots'`. |
| `plotOptions.map.dots.spacing` | <code>number</code> | Distance between dot centres in px (at least 3). Default: `7`. |
| `plotOptions.map.dots.size` | <code>number</code> | Dot diameter as a fraction of the spacing (0.2 to 1). Default: `0.72`. |
| `plotOptions.map.tiles` | <code>object</code> | Tile cartogram of `style: 'tiles'`. |
| `plotOptions.map.tiles.shape` | <code>'hex' \| 'square'</code> | `'hex'` or `'square'` tiles. Default: `'hex'`. |
| `plotOptions.map.tiles.gap` | <code>number</code> | Gap between tiles in px. Default: `2.5`. |
| `plotOptions.map.tiles.labels` | <code>boolean \| ((region: any) =&gt; string)</code> | `false` hides the tile labels; a function `({ id, name, value, properties }) =&gt; string` sets them. Default: `true` (region id). |
| `plotOptions.map.tiles.layout` | <code>object \| string</code> | Grid placement: a built-in layout name (e.g. `'us-states'`) or `{ id: [col, row] }`; not set uses the built-in layout of the map. |
| `plotOptions.map.sphere` | <code>boolean</code> | Draws the globe outline with a faint 30° graticule behind equalEarth and equirectangular maps. Default: `true`. |
| `plotOptions.map.colorScale` | <code>object</code> | Colour scale of choropleth values. |
| `plotOptions.map.colorScale.type` | <code>'linear' \| 'log' \| 'quantize' \| 'diverging'</code> | `'linear'`, `'log'`, `'quantize'` (stepped buckets) or `'diverging'` (around `mid`); a diverging palette implies `'diverging'`. Default: `'linear'`. |
| `plotOptions.map.colorScale.palette` | <code>string</code> | Named palette: blue, green, teal, purple, orange, red, gray, heat, viridis, or diverging blue-red, green-purple, teal-orange; not set derives a ramp from the theme accent. |
| `plotOptions.map.colorScale.reverse` | <code>boolean</code> | Reverses the named palette. Default: `false`. |
| `plotOptions.map.colorScale.colors` | <code>string[] \| null</code> | Own colour stops; win over `palette`. |
| `plotOptions.map.colorScale.min` | <code>number</code> | Lower end of the scale; not set uses the data minimum. |
| `plotOptions.map.colorScale.max` | <code>number</code> | Upper end of the scale; not set uses the data maximum. |
| `plotOptions.map.colorScale.mid` | <code>number</code> | Neutral value of a diverging scale. Default: `0`. |
| `plotOptions.map.colorScale.steps` | <code>number</code> | Number of buckets of a quantize scale (2 to 12). Default: `5`. |
| `plotOptions.map.colorScale.ranges` | <code>object[] \| null</code> | Explicit value ranges, each with its own colour (and legend entry); win over the scale type. |
| `plotOptions.map.colorScale.ranges[].from` | <code>number</code> | Lowest value of the range (inclusive); not set: open below. |
| `plotOptions.map.colorScale.ranges[].to` | <code>number</code> | Highest value of the range (inclusive); not set: open above. |
| `plotOptions.map.colorScale.ranges[].color` | <code>WccColor</code> | Colour of the range; not set takes the next scale colour. |
| `plotOptions.map.colorScale.ranges[].name` | <code>string</code> | Legend name of the range. |
| `plotOptions.map.colorScale.ranges[].pattern` | <code>WccMapPattern</code> | Pattern drawn over the range's regions. |
| `plotOptions.map.colorScale.ranges[].pattern.type` | <code>string</code> | Pattern: `'hatch'`, `'hatch-reverse'`, `'cross'`, `'dots'`, `'grid'`, `'vertical'` or `'horizontal'`; other values draw no pattern. |
| `plotOptions.map.colorScale.ranges[].pattern.color` | <code>WccColor</code> | Ink of the lines or dots; not set uses a contrasting theme ink. |
| `plotOptions.map.colorScale.ranges[].pattern.background` | <code>WccColor</code> | Fill behind the pattern; not set uses the region colour. |
| `plotOptions.map.colorScale.ranges[].pattern.size` | <code>number</code> | Pattern cell in px (3 to 40). Default: `6`, `7` for dots. |
| `plotOptions.map.colorScale.ranges[].pattern.width` | <code>number</code> | Line width or dot radius in px (0.3 to 10). Default: `1.1`, `1.4` for dots. |
| `plotOptions.map.colorScale.ranges[].pattern.angle` | <code>number</code> | Rotation in degrees. Default: `45` for hatch, `-45` for hatch-reverse, otherwise `0`. |
| `plotOptions.map.colorScale.nullColor` | <code>WccColor \| null</code> | Fill of regions without a value; not set uses a light theme grey. |
| `plotOptions.map.colorScale.patterns` | <code>boolean</code> | Adds automatic patterns to every bucket but the first (ranges and quantize scales), for print and colour-blind readers. Default: `false`. |
| `plotOptions.map.borders` | <code>object</code> | Region outlines. |
| `plotOptions.map.borders.width` | <code>number</code> | Outline width in px. Default: `0.6` (`0.5` on dark themes). |
| `plotOptions.map.borders.color` | <code>WccColor \| null</code> | Outline colour; not set uses the surface colour (none for dots). |
| `plotOptions.map.bubble` | <code>object</code> | Bubble layers sized by value. |
| `plotOptions.map.bubble.minRadius` | <code>number</code> | Smallest bubble radius in px. Default: `3`. |
| `plotOptions.map.bubble.maxRadius` | <code>number</code> | Largest bubble radius in px. Default: `26`. |
| `plotOptions.map.bubble.opacity` | <code>number</code> | Fill opacity of bubbles. Default: `0.62`. |
| `plotOptions.map.hexbin` | <code>object</code> | Hexbin layers that bin points into hexagons. |
| `plotOptions.map.hexbin.radius` | <code>'auto' \| number</code> | Hexagon radius in px; `'auto'` uses 1/60 of the map width (5 to 14 px). Default: `'auto'`. |
| `plotOptions.map.hexbin.scaleSize` | <code>boolean</code> | Scales each hexagon by its count as well as colouring it. Default: `true`. |
| `plotOptions.map.hexbin.colors` | <code>string[] \| null</code> | Colour stops of the count ramp; not set derives three stops from the layer colour. |
| `plotOptions.map.arcs` | <code>object</code> | Flow arc layers (from, to, value). |
| `plotOptions.map.arcs.curvature` | <code>number</code> | Bulge of the arcs relative to their length. Default: `0.28`. |
| `plotOptions.map.arcs.width` | <code>[number, number]</code> | `[min, max]` stroke width in px, scaled by the square root of the value. Default: `[1, 3.5]`. |
| `plotOptions.map.arcs.flow` | <code>boolean</code> | Animates a moving dash along each arc while animations are on. Default: `true`. |
| `plotOptions.map.arcs.endpoints` | <code>boolean</code> | Draws dots at both ends of each arc. Default: `true`. |
| `plotOptions.map.markers` | <code>object</code> | Fixed-size point markers. |
| `plotOptions.map.markers.shape` | <code>'pin' \| 'circle' \| 'square' \| 'diamond' \| 'triangle' \| 'star'</code> | Marker shape. Default: `'pin'`. |
| `plotOptions.map.markers.size` | <code>number</code> | Marker size in px. Default: `24`. |
| `plotOptions.map.markers.labels` | <code>boolean</code> | Writes the point name next to each marker (a layer or point setting wins). Default: `false`. |
| `plotOptions.map.routes` | <code>object</code> | Route layers through ordered stops. |
| `plotOptions.map.routes.width` | <code>number</code> | Line width in px (a layer or route setting wins). Default: `2.5`. |
| `plotOptions.map.routes.geodesic` | <code>boolean</code> | Follows great circles between stops instead of straight lines. Default: `true`. |
| `plotOptions.map.routes.stops` | <code>boolean</code> | Draws a dot at each stop. Default: `true`. |
| `plotOptions.map.routes.arrows` | <code>boolean</code> | Adds direction arrows along the route. Default: `true`. |
| `plotOptions.map.routes.labels` | <code>boolean</code> | Writes the stop names. Default: `false`. |
| `plotOptions.map.routes.dash` | <code>number \| string \| null</code> | SVG dash array of the route line; not set draws it solid. |
| `plotOptions.map.annotations` | <code>object[]</code> | Callouts, free text and region notes, placed by `region`, `at: [lon, lat]` or `lon`/`lat`; kept at screen size while zooming. Default: `[]`. |
| `plotOptions.map.legend` | <code>object</code> | Colour or size legend under the map. |
| `plotOptions.map.legend.show` | <code>boolean</code> | `false` hides the legend. Default: `true`. |
| `plotOptions.map.legend.title` | <code>string \| null</code> | Legend title; not set uses the layer name. |
| `plotOptions.map.fit` | <code>'auto' \| 'data' \| 'map'</code> | Framing: `'map'` shows the whole map, `'data'` frames the data, `'auto'` frames point, arc and route layers but shows the whole map for choropleths. Default: `'auto'`. |
| `plotOptions.map.fitParts` | <code>'all' \| 'largest'</code> | Geometry used only for data framing: all region polygons, or each region's largest polygon. Drawing retains every polygon. Default: `'all'`. |
| `plotOptions.map.zoom` | <code>WccZoomOptions</code> | Zoom and pan (scale 1 to 16 by default). |
| `plotOptions.map.zoom.enabled` | <code>boolean</code> | Enables zoom and pan of the view. Default: `true`. |
| `plotOptions.map.zoom.wheel` | <code>'ctrl' \| boolean \| string</code> | Wheel zoom: `'ctrl'` zooms only while Ctrl or Cmd is held, `true` on every wheel event, `false` never. Default: `'ctrl'`. |
| `plotOptions.map.zoom.min` | <code>number</code> | Smallest zoom factor. Default: `0.25` for the network, `0.05` for the tree. |
| `plotOptions.map.zoom.max` | <code>number</code> | Largest zoom factor. Default: `8` for the network, `3` for the tree. |
| `plotOptions.map.zoom.toRegion` | <code>boolean</code> | A double click on a region zooms to that region (instead of zooming in one step). Default: `true`. |
| `plotOptions.map.controls` | <code>object</code> | On-map zoom buttons. |
| `plotOptions.map.controls.show` | <code>boolean</code> | `false` hides the zoom buttons. Default: `true`. |
| `plotOptions.map.formatter` | <code>((value: number) =&gt; string) \| null</code> | `(value) =&gt; string` for values in tooltips and legend; not set uses `tooltip.y.formatter` or a compact number. |
| `plotOptions.map.drilldown` | <code>WccPremiumDrilldown</code> | Drill-down into regions. |
| `plotOptions.map.drilldown.enabled` | <code>boolean</code> | `false` switches drill-down off. Default: `true`. |
| `plotOptions.map.drilldown.breadcrumb` | <code>boolean</code> | Shows the breadcrumb of the opened levels. Default: `true`. |
| `plotOptions.map.drilldown.rootLabel` | <code>string</code> | Breadcrumb label of the top level; not set uses `'Overview'` (sankey) or the map name. |
| `plotOptions.map.drilldown.load` | <code>(item: any, info: any) =&gt; any</code> | load(item, info) returns a level or a Promise of one |
| `plotOptions.map.drilldown.drillable` | <code>(string \| number)[] \| ((item: any) =&gt; boolean)</code> | ids that can be opened, or a test; default: every item when only load is set |
| `plotOptions.map.drilldown.regions` | <code>object</code> | Levels per region id: `{ map, series, label, colorScale }`, or `true` to load the level via `load`. |

## plotOptions.marimekko

Chart type `marimekko` (`WccMarimekkoOptions`).

| Option | Type | Description |
| --- | --- | --- |
| `plotOptions.marimekko.plugins` | <code>WccPremiumPluginRef[]</code> | Plugins of this chart: plugin objects, registered names, or `[nameOrPlugin, options]`. |
| `plotOptions.marimekko.plugins[].name` | <code>string</code> | Plugin id (state key and warnings); not set uses `plugin-&lt;index&gt;`. |
| `plotOptions.marimekko.plugins[].defaults` | <code>object</code> | Default options of the plugin; the `[nameOrPlugin, options]` form overrides them. |
| `plotOptions.marimekko.plugins[].reserve()` | <code>(p: any): { top?: number; right?: number; bottom?: number; left?: number } \| void</code> | `(p) =&gt; { top, right, bottom, left }`: space in px taken from the plot before layout. |
| `plotOptions.marimekko.plugins[].afterRender()` | <code>(p: any): void</code> | `(p)`: called after each render; draw into `p.layer()` and bind events with `p.on()`. |
| `plotOptions.marimekko.plugins[].event()` | <code>(name: string, e: Event \| null, payload: any, p: any): boolean \| void</code> | `(name, e, payload, p)`: called for every chart event; returning `false` cancels a cancelable one. |
| `plotOptions.marimekko.plugins[].tooltip()` | <code>(content: any, p: any): any</code> | `(content, p) =&gt; content`: changes the tooltip content (rows, footer, …). |
| `plotOptions.marimekko.plugins[].describe()` | <code>(p: any): string</code> | `(p) =&gt; string` appended to the screen-reader summary. |
| `plotOptions.marimekko.plugins[].destroy()` | <code>(p: any): void</code> | `(p)`: called before each redraw and on destroy. |
| `plotOptions.marimekko.gap` | <code>number</code> | Gap between columns in px (0 to 12). Default: `2`. |
| `plotOptions.marimekko.radius` | <code>number</code> | Corner radius of the cells in px (0 to 8). Default: `3`. |
| `plotOptions.marimekko.fill` | <code>'soft' \| 'solid'</code> | `'soft'` uses calmer tones of the palette for the large cells, `'solid'` the palette as is (a series `color` is always kept). Default: `'soft'`. |
| `plotOptions.marimekko.widths` | <code>'total' \| number[]</code> | Column widths: `'total'` follows the column totals; an array sets explicit column weights. Default: `'total'`. |
| `plotOptions.marimekko.sort` | <code>'none' \| 'asc' \| 'desc'</code> | Column order: data order (`'none'`), or by column width `'asc'` / `'desc'`. Default: `'none'`. |
| `plotOptions.marimekko.dataLabels` | <code>object</code> | Labels inside the cells. |
| `plotOptions.marimekko.dataLabels.show` | <code>boolean</code> | Shows the cell labels. Default: `true`. |
| `plotOptions.marimekko.dataLabels.showName` | <code>boolean</code> | Adds the series name to the cell label when it fits. Default: `true`. |
| `plotOptions.marimekko.dataLabels.showPercent` | <code>boolean</code> | Shows the cell's share of its column; `false` shows the cell value instead. Default: `true`. |
| `plotOptions.marimekko.dataLabels.minWidth` | <code>number</code> | Narrowest cell in px that gets a label. Default: `34`. |
| `plotOptions.marimekko.dataLabels.minHeight` | <code>number</code> | Lowest cell in px that gets a label. Default: `18`. |
| `plotOptions.marimekko.dataLabels.outside` | <code>boolean</code> | A last column too narrow for its labels gets them in a gutter right of the plot. Default: `true`. |
| `plotOptions.marimekko.dataLabels.formatter` | <code>WccCallback</code> | `(share, { seriesIndex, category, value, w }) =&gt; string` for the value text of a cell. |
| `plotOptions.marimekko.columnLabels` | <code>object</code> | Column names under the plot. |
| `plotOptions.marimekko.columnLabels.show` | <code>boolean</code> | Shows the column names. Default: `true`. |
| `plotOptions.marimekko.columnLabels.showTotal` | <code>boolean</code> | Adds the column total under the name. Default: `true`. |
| `plotOptions.marimekko.columnLabels.showShare` | <code>boolean</code> | Adds the column's share of the whole under the name. Default: `true`. |
| `plotOptions.marimekko.columnLabels.wrap` | <code>boolean</code> | Wraps a name that does not fit onto two lines at a word break. Default: `true`. |
| `plotOptions.marimekko.columnLabels.abbreviate` | <code>boolean</code> | Abbreviates a name that still does not fit (initials; the full name is the hover title). Default: `true`. |
| `plotOptions.marimekko.columnLabels.abbreviations` | <code>object</code> | Own abbreviations per column name, e.g. `{ 'North America': 'NA' }`. |
| `plotOptions.marimekko.yAxis` | <code>object</code> | Percentage axis on the left. |
| `plotOptions.marimekko.yAxis.show` | <code>boolean</code> | Shows the 0 to 100 % axis. Default: `true`. |
| `plotOptions.marimekko.legend` | <code>object</code> | Series legend. |
| `plotOptions.marimekko.legend.show` | <code>boolean</code> | Shows the legend (with two or more series). Default: `true`. |

## plotOptions.network

Chart type `network` (`WccNetworkOptions`).

| Option | Type | Description |
| --- | --- | --- |
| `plotOptions.network.plugins` | <code>WccPremiumPluginRef[]</code> | Plugins of this chart: plugin objects, registered names, or `[nameOrPlugin, options]`. |
| `plotOptions.network.plugins[].name` | <code>string</code> | Plugin id (state key and warnings); not set uses `plugin-&lt;index&gt;`. |
| `plotOptions.network.plugins[].defaults` | <code>object</code> | Default options of the plugin; the `[nameOrPlugin, options]` form overrides them. |
| `plotOptions.network.plugins[].reserve()` | <code>(p: any): { top?: number; right?: number; bottom?: number; left?: number } \| void</code> | `(p) =&gt; { top, right, bottom, left }`: space in px taken from the plot before layout. |
| `plotOptions.network.plugins[].afterRender()` | <code>(p: any): void</code> | `(p)`: called after each render; draw into `p.layer()` and bind events with `p.on()`. |
| `plotOptions.network.plugins[].event()` | <code>(name: string, e: Event \| null, payload: any, p: any): boolean \| void</code> | `(name, e, payload, p)`: called for every chart event; returning `false` cancels a cancelable one. |
| `plotOptions.network.plugins[].tooltip()` | <code>(content: any, p: any): any</code> | `(content, p) =&gt; content`: changes the tooltip content (rows, footer, …). |
| `plotOptions.network.plugins[].describe()` | <code>(p: any): string</code> | `(p) =&gt; string` appended to the screen-reader summary. |
| `plotOptions.network.plugins[].destroy()` | <code>(p: any): void</code> | `(p)`: called before each redraw and on destroy. |
| `plotOptions.network.renderer` | <code>'auto' \| 'svg' \| 'canvas'</code> | `'svg'` or `'canvas'`; `'auto'` uses canvas from `canvasThreshold` nodes. Default: `'auto'`. |
| `plotOptions.network.canvasThreshold` | <code>number</code> | Node count above which `renderer: 'auto'` switches to canvas. Default: `1200`. |
| `plotOptions.network.nodes` | <code>object</code> | Node circles. |
| `plotOptions.network.nodes.minRadius` | <code>number</code> | Smallest node radius in px. Default: `4`. |
| `plotOptions.network.nodes.maxRadius` | <code>number</code> | Largest node radius in px (graphs over 1000 nodes cap it at 8). Default: `16`. |
| `plotOptions.network.nodes.sizeBy` | <code>'auto' \| 'value' \| 'degree' \| 'none'</code> | Node size from `'value'`, `'degree'` (number of links) or `'none'`; `'auto'` uses value when a node has one, else degree. Default: `'auto'`. |
| `plotOptions.network.nodes.strokeWidth` | <code>number</code> | Width of the ring around each node in px. Default: `1.5`. |
| `plotOptions.network.edges` | <code>object</code> | Edge lines. |
| `plotOptions.network.edges.width` | <code>[number, number]</code> | `[min, max]` line width in px, scaled by edge weight. Default: `[0.8, 3]`. |
| `plotOptions.network.edges.opacity` | <code>number</code> | Edge opacity; not set uses 0.3 (0.34 in dark mode, 0.16 over 1000 nodes). |
| `plotOptions.network.edges.bundle` | <code>boolean</code> | Bundles edges between groups through the group centres. Default: `false`. |
| `plotOptions.network.edges.bundleStrength` | <code>number</code> | How tightly bundled edges follow the group centres (0 to 1). Default: `0.85`. |
| `plotOptions.network.edges.curvature` | <code>number</code> | Bend of the edges, 0 straight. Default: `0`. |
| `plotOptions.network.layout` | <code>object</code> | Force layout. |
| `plotOptions.network.layout.type` | <code>'force' \| 'facet' \| 'preset'</code> | `'force'`: the force simulation. `'facet'`: a deterministic projection on concentric regular polygon shells (core in the centre, groups as filled facet sectors, causal paths across; options under `facet`). Default: `'force'`. |
| `plotOptions.network.layout.linkDistance` | <code>'auto' \| number</code> | Target edge length; `'auto'` derives it from the node sizes. Default: `'auto'`. |
| `plotOptions.network.layout.charge` | <code>'auto' \| number</code> | Repulsion between nodes; `'auto'` derives it from the node sizes. Default: `'auto'`. |
| `plotOptions.network.layout.groupStrength` | <code>number</code> | Pull of nodes towards their group centre (with two or more groups). Default: `0.1`. |
| `plotOptions.network.layout.iterations` | <code>'auto' \| number</code> | Simulation steps; `'auto'` runs until the layout has cooled down. Default: `'auto'`. |
| `plotOptions.network.layout.warmup` | <code>'auto' \| number</code> | Steps computed before the first paint; `'auto'` uses 40 from 600 nodes and 90 from 2000. Default: `'auto'`. |
| `plotOptions.network.groups` | <code>object</code> | Node groups (`group` in the node data). |
| `plotOptions.network.groups.show` | <code>boolean</code> | `false` treats all nodes as one group: no group colours, clustering or legend. Default: `true`. |
| `plotOptions.network.groups.hulls` | <code>boolean</code> | Draws a soft rounded hull behind each group (svg renderer, two or more groups). Default: `false`. |
| `plotOptions.network.labels` | <code>object</code> | Node labels. |
| `plotOptions.network.labels.show` | <code>boolean</code> | Shows labels, biggest nodes first, without overlaps. Default: `true`. |
| `plotOptions.network.labels.max` | <code>number</code> | Most labels at the fit zoom (fewer in dense graphs, more when zoomed in). Default: `40`. |
| `plotOptions.network.labels.minZoom` | <code>number</code> | Zoom from which small nodes get labels too. Default: `1.6`. |
| `plotOptions.network.labels.formatter` | <code>WccCallback</code> | `(name, { node, w }) =&gt; string` for the label text. |
| `plotOptions.network.labels.readability` | <code>WccReadability</code> | Facet layout: treatment of labels over facets and shell lines (pill by default; full options with features/readability). Default: `'auto'`. |
| `plotOptions.network.labels.readability.mode` | <code>'none' \| 'halo' \| 'pill' \| 'auto' \| 'hide'</code> | 'auto' (default where on): nothing for labels off the marks, a contrasting text colour over one fill, a pill over mixed fills; 'hide' = skip labels that sit on marks |
| `plotOptions.network.labels.readability.fallback` | <code>'pill' \| 'halo' \| 'hide'</code> | what 'auto' escalates to over mixed fills or when no text colour reaches minRatio. Default 'pill' |
| `plotOptions.network.labels.readability.enabled` | <code>boolean</code> | false switches the treatment off for this label kind |
| `plotOptions.network.labels.readability.contrast` | <code>boolean</code> | swap the text to `light`/`dark` when it misses minRatio against what is under it (any mode) |
| `plotOptions.network.labels.readability.minRatio` | <code>number</code> | WCAG 2 contrast ratio to reach. Default 4.5 |
| `plotOptions.network.labels.readability.light` | <code>string</code> | text/backdrop colour pair used by contrast and 'auto' fills. Defaults '#ffffff' / '#111827' |
| `plotOptions.network.labels.readability.dark` | <code>string</code> | Dark colour of the pair. Default: `'#111827'`. |
| `plotOptions.network.labels.readability.background` | <code>'auto' \| string</code> | colour under the chart; 'auto' = chart.background, else the first opaque ancestor |
| `plotOptions.network.labels.readability.halo` | <code>object</code> | outline behind the glyphs; blur &gt; 0 makes it a soft glow. Defaults width 3, color 'auto' (chart background), opacity 0.92 |
| `plotOptions.network.labels.readability.halo.width` | <code>number</code> | Outline width in pixels. Default: `3`. |
| `plotOptions.network.labels.readability.halo.color` | <code>'auto' \| string</code> | Outline colour; 'auto' uses the colour under the label or a contrasting one. Default: `'auto'`. |
| `plotOptions.network.labels.readability.halo.opacity` | <code>number</code> | Outline opacity (0 to 1). Default: `0.92`. |
| `plotOptions.network.labels.readability.halo.blur` | <code>number</code> | Blur in pixels; above 0 the outline becomes a soft glow. Default: `0`. |
| `plotOptions.network.labels.readability.pill` | <code>object</code> | backdrop box. padding = [vertical, horizontal]; offset = [dx, dy] px. Defaults fill 'auto', opacity 0.9, radius 4, padding [1, 4] |
| `plotOptions.network.labels.readability.pill.fill` | <code>'auto' \| string</code> | Box colour; 'auto' uses the colour under the label or a contrasting one. Default: `'auto'`. |
| `plotOptions.network.labels.readability.pill.opacity` | <code>number</code> | Box opacity (0 to 1). Default: `0.9`. |
| `plotOptions.network.labels.readability.pill.radius` | <code>number</code> | Corner radius in pixels. Default: `4`. |
| `plotOptions.network.labels.readability.pill.padding` | <code>number \| [number, number]</code> | Space around the text in pixels: one number, or [vertical, horizontal]. Default: `[1, 4]`. |
| `plotOptions.network.labels.readability.pill.stroke` | <code>string</code> | Outline colour of the box. Default: `'none'`. |
| `plotOptions.network.labels.readability.pill.strokeWidth` | <code>number</code> | Outline width in pixels. Default: `1`. |
| `plotOptions.network.labels.readability.pill.offset` | <code>[number, number]</code> | Shift of the box as [dx, dy] in pixels. Default: `[0, 0]`. |
| `plotOptions.network.labels.readability.shadow` | <code>object \| boolean</code> | drop shadow on the pill (on the text in halo mode) |
| `plotOptions.network.labels.readability.shadow.dx` | <code>number</code> | Horizontal shadow offset in pixels. Default: `0`. |
| `plotOptions.network.labels.readability.shadow.dy` | <code>number</code> | Vertical shadow offset in pixels. Default: `1`. |
| `plotOptions.network.labels.readability.shadow.blur` | <code>number</code> | Shadow blur in pixels. Default: `2`. |
| `plotOptions.network.labels.readability.shadow.color` | <code>string</code> | Shadow colour. Default: `'#000000'`. |
| `plotOptions.network.labels.readability.shadow.opacity` | <code>number</code> | Shadow opacity (0 to 1). Default: `0.35`. |
| `plotOptions.network.labels.readability.raise` | <code>boolean</code> | axis labels sitting on marks are moved above the series (default true) |
| `plotOptions.network.labels.readability.each` | <code>(info: WccReadabilityInfo) =&gt; WccReadability \| null \| undefined</code> | per label: return an override (or 'none') for this one label; called only when set |
| `plotOptions.network.drag` | <code>object</code> | Dragging nodes. |
| `plotOptions.network.drag.enabled` | <code>boolean</code> | Lets the user drag nodes. Default: `true`. |
| `plotOptions.network.drag.pin` | <code>boolean</code> | Keeps a dragged node where it was dropped. Default: `false`. |
| `plotOptions.network.zoom` | <code>WccZoomOptions</code> | Zoom and pan of the network view. |
| `plotOptions.network.zoom.enabled` | <code>boolean</code> | Enables zoom and pan of the view. Default: `true`. |
| `plotOptions.network.zoom.wheel` | <code>'ctrl' \| boolean \| string</code> | Wheel zoom: `'ctrl'` zooms only while Ctrl or Cmd is held, `true` on every wheel event, `false` never. Default: `'ctrl'`. |
| `plotOptions.network.zoom.min` | <code>number</code> | Smallest zoom factor. Default: `0.25` for the network, `0.05` for the tree. |
| `plotOptions.network.zoom.max` | <code>number</code> | Largest zoom factor. Default: `8` for the network, `3` for the tree. |
| `plotOptions.network.legend` | <code>object</code> | Group legend. |
| `plotOptions.network.legend.show` | <code>boolean</code> | Shows the group legend (with two or more groups). Default: `true`. |
| `plotOptions.network.controls` | <code>object</code> | On-chart zoom buttons. |
| `plotOptions.network.controls.show` | <code>boolean</code> | `false` hides the zoom buttons. Default: `true`. |
| `plotOptions.network.facet` | <code>WccNetworkFacetOptions</code> | Facet layout (`layout.type: 'facet'`). Node data may carry `level` (0 = centre), `severity` (`'critical' \| 'warning' \| 'info' \| 'ok'`), `anomaly` (`true` or a short text), `badge`, `labelPriority` (`true`: always labelled, like warnings) and `keys`. Label priority (any network layout): highlighted, then critical, then warning / anomaly / labelPriority – these labels are never dropped for the label budget or the zoom threshold. Edges `causal: true`; a series `paths: [{ name, nodes, severity, color }]`. |
| `plotOptions.network.facet.levels` | <code>object[] \| 'auto'</code> | Level names, centre first (`['Core', 'Services', …]` or `{ name, description }`); `'auto'` names them Core, Level 1, Level 2 … Default: `'auto'`. |
| `plotOptions.network.facet.levels[].name` | <code>string</code> |  |
| `plotOptions.network.facet.levels[].description` | <code>string</code> |  |
| `plotOptions.network.facet.core` | <code>string[]</code> | Node ids of the core when no node has `level: 0`; not set uses the most connected node. |
| `plotOptions.network.facet.sides` | <code>'auto' \| number</code> | Polygon sides; `'auto'` = the group count for 5–12 groups, twice it for 2–4, 6 for one group. Default: `'auto'`. |
| `plotOptions.network.facet.rotation` | <code>number</code> | Turns the shells, degrees; 0 puts a vertex at 12 o'clock. Default: `0`. |
| `plotOptions.network.facet.sectors` | <code>'auto' \| 'equal' \| 'weighted'</code> | Sector size per group: `'equal'`, `'weighted'` (by its most crowded shell) or `'auto'`. Default: `'auto'`. |
| `plotOptions.network.facet.order` | <code>'crossings' \| 'data'</code> | `'crossings'` reorders nodes inside a facet (barycentric sweeps) to reduce crossings; `'data'` keeps the data order. Default: `'crossings'`. |
| `plotOptions.network.facet.coreRadius` | <code>number</code> | Level-1 radius as a fraction of the outer radius. Default: `0.24`. |
| `plotOptions.network.facet.bundle` | <code>number</code> | Pull of plain edges towards the centre, 0 (straight) to 1; edges between two facets route through both facets' anchors. Default: `0.65`. |
| `plotOptions.network.facet.edges` | <code>object</code> | Plain edge rendering in dense estates. |
| `plotOptions.network.facet.edges.degreeAlpha` | <code>boolean</code> | Fades edges of hubs: opacity × clamp(2 / √(max endpoint degree), 0.35, 1). Default: `true`. |
| `plotOptions.network.facet.edges.lod` | <code>boolean \| 'auto'</code> | Level of detail for cross-facet edges, `'auto'` from 300 nodes: at overview zoom they fade (ribbons stand for them); zoomed in, only those with an end in view are drawn (hover / highlight still show all of a node's links). Default: `'auto'`. |
| `plotOptions.network.facet.edges.lodZoom` | <code>number</code> | Zoom factor from which the individual cross-facet edges come back. Default: `1.8`. |
| `plotOptions.network.facet.edges.ribbons` | <code>boolean</code> | With lod at overview zoom: one ribbon per facet pair, width by its link count (title: `A – B: n links`). Default: `true`. |
| `plotOptions.network.facet.shells` | <code>object</code> | Shell polygons. |
| `plotOptions.network.facet.shells.show` | <code>boolean</code> | Draws the shell outlines. Default: `true`. |
| `plotOptions.network.facet.shells.labels` | <code>boolean</code> | Writes the level name on each shell. Default: `true`. |
| `plotOptions.network.facet.shells.opacity` | <code>'auto' \| number</code> | Outline opacity; `'auto'` follows the theme. Default: `'auto'`. |
| `plotOptions.network.facet.facets` | <code>object</code> | Filled facet sectors, one per group. |
| `plotOptions.network.facet.facets.show` | <code>boolean</code> | Draws the facets. Default: `true`. |
| `plotOptions.network.facet.facets.opacity` | <code>'auto' \| number</code> | Fill opacity; `'auto'` = 0.07 light, 0.11 dark. Default: `'auto'`. |
| `plotOptions.network.facet.facets.labels` | <code>boolean</code> | Writes the group names outside the outer shell. Default: `true`. |
| `plotOptions.network.facet.paths` | <code>object</code> | Causal edges and `paths`. |
| `plotOptions.network.facet.paths.show` | <code>boolean</code> | Draws causal edges and paths. Default: `true`. |
| `plotOptions.network.facet.paths.width` | <code>number</code> | Line width in px. Default: `2`. |
| `plotOptions.network.facet.paths.dash` | <code>[number, number]</code> | Dash pattern `[dash, gap]` in px. Default: `[6, 5]`. |
| `plotOptions.network.facet.paths.curvature` | <code>number</code> | Sideways bow of a hop (fraction of its length). Default: `0.22`. |
| `plotOptions.network.facet.paths.arrows` | <code>boolean</code> | Arrow heads at the effect end. Default: `true`. |
| `plotOptions.network.facet.paths.flow` | <code>boolean</code> | Dashes flow from cause to effect (off under reduced motion). Default: `true`. |
| `plotOptions.network.facet.markers` | <code>object</code> | Severity / anomaly markers and badges. |
| `plotOptions.network.facet.markers.show` | <code>boolean</code> | Draws markers and badges. Default: `true`. |
| `plotOptions.network.facet.markers.colors` | <code>object</code> | Colours per severity; not set uses the theme's negative / warning / accent / positive. |
| `plotOptions.network.facet.markers.colors.critical` | <code>string</code> |  |
| `plotOptions.network.facet.markers.colors.warning` | <code>string</code> |  |
| `plotOptions.network.facet.markers.colors.info` | <code>string</code> |  |
| `plotOptions.network.facet.markers.colors.ok` | <code>string</code> |  |
| `plotOptions.network.facet.legend` | <code>object</code> | Level legend in the legend row above the plot (replaces the group legend; needs `legend.show` of the network too). |
| `plotOptions.network.facet.legend.show` | <code>boolean</code> | Shows the level legend. Default: `true`. |
| `plotOptions.network.facet.legend.title` | <code>string</code> | Leads the legend row (e.g. your word for "Levels"). |

## Stock drawing items

`plotOptions.stock.drawings.items[]` and the stock drawing commands (`WccStockDrawing`).

| Option | Type | Description |
| --- | --- | --- |
| `drawing.id` | <code>string \| number</code> | Id of the drawing; not set gets `'d1'`, `'d2'`, ... |
| `drawing.type` | <code>'trendline' \| 'ray' \| 'fib' \| 'rect' \| string</code> | `'trendline'` (2 points), `'ray'` (horizontal, 1 point), `'fib'` (retracement, 2 points) or `'rect'` (2 corners); aliases such as `'line'` or `'box'` are accepted. |
| `drawing.points` | <code>object[]</code> | Anchors as `{ t, y }` or `[t, y]` (time, price); invalid drawings are skipped. |
| `drawing.points[].t` | <code>WccDate</code> | Time of the anchor. |
| `drawing.points[].y` | <code>number</code> | Price of the anchor. |
| `drawing.color` | <code>WccColor</code> | Colour; not set uses `drawings.colors` or the palette. |
| `drawing.label` | <code>string</code> | Text written along the drawing. |
| `drawing.width` | <code>number</code> | Line width in px. Default: `1.6`. |
| `drawing.extend` | <code>boolean \| 'left' \| 'right' \| 'both'</code> | Trend line: extends to the plot edge (`true` or `'both'` both ways, `'left'`, `'right'`); fib: `false` ends the levels at the second point. |
| `drawing.dash` | <code>boolean \| string</code> | `true` dashes the line; a string is used as SVG dash array; not set draws it solid. |
| `drawing.fill` | <code>string</code> | Fill of a rectangle; not set uses a faint tint of the colour. |
| `drawing.levels` | <code>number[]</code> | Fibonacci levels as fractions. Default: `[0, 0.236, 0.382, 0.5, 0.618, 0.786, 1]`. |
| `drawing.locked` | <code>boolean</code> | `true` stops the user from moving or editing the drawing. |
| `drawing.labelPosition` | <code>'above' \| 'below'</code> | Side of the trend line label. Default: `'above'`. |

## plotOptions.radialColumn

Chart type `radialColumn` (`RadialColumnOptions`).

| Option | Type | Description |
| --- | --- | --- |
| `plotOptions.radialColumn.readabilityWarnings` | <code>boolean</code> | Warn once if inner rings are thinner than 8 px or heat cells below 2 px per slot. No values/layers are removed. Default: `true`. |
| `plotOptions.radialColumn.aggregate` | <code>'sum' \| 'mean' \| 'max' \| 'min' \| 'none'</code> | how the column values combine in the centre, the generated description, tooltip footers and the filter note. 'sum' (default) adds them into a Total — right for counts and amounts only. Use 'max' / 'min' for latencies and percentiles ('Highest p95 latency (ms): 412 (Matching · 20:00)'), 'mean' for rates, percentages and scores, 'none' to name no combined number at all. |
| `plotOptions.radialColumn.link` | <code>RadialColumnLink \| RadialLinkMode</code> | links between inner layers and the column ring (a mode string or options) |
| `plotOptions.radialColumn.link.mode` | <code>'none' \| 'category' \| 'angle' \| 'map' \| 'auto'</code> | auto (default): a datum's own link, else matching category names, else the angle span |
| `plotOptions.radialColumn.link.map` | <code>((segment: RadialLinkSegment) =&gt; Array&lt;number \| string&gt; \| null \| undefined) \| Record&lt;string, Array&lt;number \| string&gt;&gt;</code> | map mode: a function or an object keyed by 'A › B' path or name; values are category indices or names |
| `plotOptions.radialColumn.link.interaction` | <code>'highlight' \| 'filter' \| 'both'</code> | highlight on hover, filter (cross-filter / values) on click, or both. Default 'highlight' |
| `plotOptions.radialColumn.link.bidirectional` | <code>boolean</code> | hovering a bar also lights its segments (default true) |
| `plotOptions.radialColumn.link.align` | <code>boolean</code> | segments span exactly the angle of their linked bars (default false) |
| `plotOptions.radialColumn.link.indicator` | <code>boolean</code> | bracket arc on the outer edge over the linked bars (default true) |
| `plotOptions.radialColumn.link.unit` | <code>string</code> | what a category is, for tooltips and announcements ('18 of 72 time slots'). Default 'categories'. Name the real unit: categories that combine several things (service × day) are 'service-days', not 'days'. |
| `plotOptions.radialColumn.link.basis` | <code>string</code> | how the categories are composed, appended in brackets ('18 of 140 service-days (10 services × 14 days)'). Default: none |
| `plotOptions.radialColumn.encode` | <code>RadialColumnEncode</code> | bind colour / delta / length to separate metrics |
| `plotOptions.radialColumn.encode.angle` | <code>string</code> | name of the angular dimension for the guide (default: xaxis.title.text or 'Category') |
| `plotOptions.radialColumn.encode.length` | <code>'value' \| string</code> | bar length: 'value' (default) or a datum field |
| `plotOptions.radialColumn.encode.color` | <code>RadialEncodeChannel \| string</code> | bar colour = a separate metric |
| `plotOptions.radialColumn.encode.color.field` | <code>string</code> | Datum field of the metric (`datum.meta[field]` or `datum[field]`). |
| `plotOptions.radialColumn.encode.color.values` | <code>Array&lt;number \| null&gt;</code> | One value per category instead of a field. |
| `plotOptions.radialColumn.encode.color.name` | <code>string</code> | legend / tooltip name (default: the field) |
| `plotOptions.radialColumn.encode.color.unit` | <code>string</code> | appended to values: '%' sticks, other units get a space |
| `plotOptions.radialColumn.encode.color.decimals` | <code>number</code> | Decimals of the shown values; not set uses 0 from 100, 1 from 10, else 2. |
| `plotOptions.radialColumn.encode.color.format` | <code>(value: number) =&gt; string</code> | `(value) =&gt; string` for the shown values (wins over `decimals` and `unit`). |
| `plotOptions.radialColumn.encode.color.legend` | <code>boolean</code> | false: no key in the strip under the ring (default true) |
| `plotOptions.radialColumn.encode.color.show` | <code>boolean</code> | `false` switches the channel off. Default: `true`. |
| `plotOptions.radialColumn.encode.color.scale` | <code>'sequential' \| 'diverging'</code> | `'sequential'` (low to high) or `'diverging'` around `mid`. Default: `'sequential'`. |
| `plotOptions.radialColumn.encode.color.domain` | <code>number[]</code> | [lo, hi] or [lo, mid, hi]; default: data extent (diverging: symmetric around mid) |
| `plotOptions.radialColumn.encode.color.mid` | <code>number</code> | diverging centre (default 0) |
| `plotOptions.radialColumn.encode.color.stops` | <code>string[]</code> | Colour stops; not set uses `['#2dd4bf', '#facc15', '#f43f5e']` (diverging: blue, a neutral tone, orange). |
| `plotOptions.radialColumn.encode.color.reverse` | <code>boolean</code> | Reverses the colour stops. Default: `false`. |
| `plotOptions.radialColumn.encode.delta` | <code>RadialEncodeChannel \| string</code> | change vs a previous period outside the bars |
| `plotOptions.radialColumn.encode.delta.field` | <code>string</code> | Datum field of the metric (`datum.meta[field]` or `datum[field]`). |
| `plotOptions.radialColumn.encode.delta.values` | <code>Array&lt;number \| null&gt;</code> | One value per category instead of a field. |
| `plotOptions.radialColumn.encode.delta.name` | <code>string</code> | legend / tooltip name (default: the field) |
| `plotOptions.radialColumn.encode.delta.unit` | <code>string</code> | appended to values: '%' sticks, other units get a space |
| `plotOptions.radialColumn.encode.delta.decimals` | <code>number</code> | Decimals of the shown values; not set uses 0 from 100, 1 from 10, else 2. |
| `plotOptions.radialColumn.encode.delta.format` | <code>(value: number) =&gt; string</code> | `(value) =&gt; string` for the shown values (wins over `decimals` and `unit`). |
| `plotOptions.radialColumn.encode.delta.legend` | <code>boolean</code> | false: no key in the strip under the ring (default true) |
| `plotOptions.radialColumn.encode.delta.show` | <code>boolean</code> | `false` switches the channel off. Default: `true`. |
| `plotOptions.radialColumn.encode.delta.style` | <code>'band' \| 'ticks' \| 'bars'</code> | band: thin coloured ring; ticks: marks at the bar tips; bars: signed mini bars (out = up, in = down) |
| `plotOptions.radialColumn.encode.delta.colors` | <code>object</code> | Colours of increases and decreases. |
| `plotOptions.radialColumn.encode.delta.colors.up` | <code>string</code> | Colour of increases. Default: `'#22c55e'`. |
| `plotOptions.radialColumn.encode.delta.colors.down` | <code>string</code> | Colour of decreases. Default: `'#f43f5e'`. |
| `plotOptions.radialColumn.encode.delta.max` | <code>number</code> | \|value\| of full intensity / length (default: largest \|value\|) |
| `plotOptions.radialColumn.encode.guide` | <code>object \| boolean</code> | '?' button with a 'how to read' panel listing every bound channel |
| `plotOptions.radialColumn.encode.guide.show` | <code>boolean</code> | `false` hides the guide button. Default: `true`. |
| `plotOptions.radialColumn.encode.guide.open` | <code>boolean \| 'always'</code> | start open (true: only when the chart is &gt;= 560 px wide; 'always') |
| `plotOptions.radialColumn.markers` | <code>Array&lt;{ at: number \| string label?: string kind?: string color?: string shape?: 'dot' \| 'diamond' }&gt;</code> | rim marks (deploys, pipeline runs, incidents): a small glyph outside the bars at a slot, a tooltip row on that slot and a guide row |
| `plotOptions.radialColumn.startAngle` | <code>number</code> | degrees, 0 = 12 o'clock, clockwise; a partial range gives a gauge |
| `plotOptions.radialColumn.endAngle` | <code>number</code> | End of the range in degrees (same convention as `startAngle`). Default: `360`. |
| `plotOptions.radialColumn.innerRadius` | <code>'auto' \| number \| string</code> | base radius of the bars: 'auto', px, '40%' or a fraction of the outer radius |
| `plotOptions.radialColumn.barPadding` | <code>'auto' \| number</code> | gap between neighbouring slots: 'auto' or a fraction of the slot (0..0.9) |
| `plotOptions.radialColumn.groupPadding` | <code>number</code> | gap between the bars of one slot when grouped (fraction) |
| `plotOptions.radialColumn.stacked` | <code>boolean</code> | stack series outward (falls back to chart.stacked) |
| `plotOptions.radialColumn.stackGap` | <code>number</code> | Gap between stacked segments in px. Default: `1`. |
| `plotOptions.radialColumn.rounded` | <code>boolean</code> | rounded bar ends |
| `plotOptions.radialColumn.fill` | <code>object</code> | Bar colours. |
| `plotOptions.radialColumn.fill.type` | <code>'auto' \| 'spectrum' \| 'series' \| 'value'</code> | auto: spectrum for one uncoloured series, else series colours |
| `plotOptions.radialColumn.fill.stops` | <code>string[]</code> | gradient stops (spectrum by angle, value by magnitude) |
| `plotOptions.radialColumn.fill.ranges` | <code>object[]</code> | type 'value': fixed colours for value ranges (inclusive); values outside every range use the stops |
| `plotOptions.radialColumn.fill.ranges[].from` | <code>number</code> | Lowest value of the range (inclusive). |
| `plotOptions.radialColumn.fill.ranges[].to` | <code>number</code> | Highest value of the range (inclusive). |
| `plotOptions.radialColumn.fill.ranges[].color` | <code>string</code> | Colour of bars in the range. |
| `plotOptions.radialColumn.fill.fade` | <code>number</code> | inner fade of the bars, 0..1 (0 = off) |
| `plotOptions.radialColumn.track` | <code>object</code> | Background track behind the bars. |
| `plotOptions.radialColumn.track.show` | <code>boolean</code> | Shows the track. Default: `false`. |
| `plotOptions.radialColumn.track.color` | <code>string</code> | Track colour; not set uses a faint text tone. |
| `plotOptions.radialColumn.baseline` | <code>object</code> | Zero ring. |
| `plotOptions.radialColumn.baseline.show` | <code>boolean</code> | Draws the ring at value 0. Default: `true`. |
| `plotOptions.radialColumn.valueAxis` | <code>object</code> | Value scale of the bars. |
| `plotOptions.radialColumn.valueAxis.show` | <code>boolean</code> | `false` hides the grid rings and value labels. Default: `true`. |
| `plotOptions.radialColumn.valueAxis.min` | <code>number</code> | Fixed lower end; not set uses the data. |
| `plotOptions.radialColumn.valueAxis.max` | <code>number</code> | Fixed upper end; not set uses the data. |
| `plotOptions.radialColumn.valueAxis.tickAmount` | <code>number</code> | Target number of tick steps. Default: `4`. |
| `plotOptions.radialColumn.valueAxis.nice` | <code>boolean</code> | round free ends to the tightest whole tick step (3-6 ticks); false = data extent. Default true |
| `plotOptions.radialColumn.valueAxis.rings` | <code>boolean</code> | Draws the grid rings at the ticks (the value labels sit on them). Default: `true`. |
| `plotOptions.radialColumn.valueAxis.labels` | <code>object</code> | Tick labels of the value scale. |
| `plotOptions.radialColumn.valueAxis.labels.show` | <code>boolean</code> | Shows the tick labels. Default: `true`. |
| `plotOptions.radialColumn.valueAxis.labels.formatter` | <code>(value: number) =&gt; string</code> | `(value, { w }) =&gt; string`; not set uses a compact number. |
| `plotOptions.radialColumn.valueAxis.labels.readability` | <code>RadialReadability</code> | labels that sit on bars: 'auto' (default) = untouched off the bars, contrasting colour over one fill, pill over mixed fills; 'none' = off. Layered over chart.readability |
| `plotOptions.radialColumn.valueAxis.labels.readability.mode` | <code>'none' \| 'halo' \| 'pill' \| 'auto' \| 'hide'</code> | 'auto' (default where on): nothing for labels off the marks, a contrasting text colour over one fill, a pill over mixed fills; 'hide' = skip labels that sit on marks |
| `plotOptions.radialColumn.valueAxis.labels.readability.fallback` | <code>'pill' \| 'halo' \| 'hide'</code> | what 'auto' escalates to over mixed fills or when no text colour reaches minRatio. Default 'pill' |
| `plotOptions.radialColumn.valueAxis.labels.readability.enabled` | <code>boolean</code> | false switches the treatment off for this label kind |
| `plotOptions.radialColumn.valueAxis.labels.readability.contrast` | <code>boolean</code> | swap the text to `light`/`dark` when it misses minRatio against what is under it (any mode) |
| `plotOptions.radialColumn.valueAxis.labels.readability.minRatio` | <code>number</code> | WCAG 2 contrast ratio to reach. Default 4.5 |
| `plotOptions.radialColumn.valueAxis.labels.readability.light` | <code>string</code> | text/backdrop colour pair used by contrast and 'auto' fills. Defaults '#ffffff' / '#111827' |
| `plotOptions.radialColumn.valueAxis.labels.readability.dark` | <code>string</code> | Dark colour of the pair. Default: `'#111827'`. |
| `plotOptions.radialColumn.valueAxis.labels.readability.background` | <code>'auto' \| string</code> | colour under the chart; 'auto' = chart.background, else the first opaque ancestor |
| `plotOptions.radialColumn.valueAxis.labels.readability.halo` | <code>object</code> | outline behind the glyphs; blur &gt; 0 makes it a soft glow. Defaults width 3, color 'auto' (chart background), opacity 0.92 |
| `plotOptions.radialColumn.valueAxis.labels.readability.halo.width` | <code>number</code> | Outline width in pixels. Default: `3`. |
| `plotOptions.radialColumn.valueAxis.labels.readability.halo.color` | <code>'auto' \| string</code> | Outline colour; 'auto' uses the colour under the label or a contrasting one. Default: `'auto'`. |
| `plotOptions.radialColumn.valueAxis.labels.readability.halo.opacity` | <code>number</code> | Outline opacity (0 to 1). Default: `0.92`. |
| `plotOptions.radialColumn.valueAxis.labels.readability.halo.blur` | <code>number</code> | Blur in pixels; above 0 the outline becomes a soft glow. Default: `0`. |
| `plotOptions.radialColumn.valueAxis.labels.readability.pill` | <code>object</code> | backdrop box. padding = [vertical, horizontal]; offset = [dx, dy] px. Defaults fill 'auto', opacity 0.9, radius 4, padding [1, 4] |
| `plotOptions.radialColumn.valueAxis.labels.readability.pill.fill` | <code>'auto' \| string</code> | Box colour; 'auto' uses the colour under the label or a contrasting one. Default: `'auto'`. |
| `plotOptions.radialColumn.valueAxis.labels.readability.pill.opacity` | <code>number</code> | Box opacity (0 to 1). Default: `0.9`. |
| `plotOptions.radialColumn.valueAxis.labels.readability.pill.radius` | <code>number</code> | Corner radius in pixels. Default: `4`. |
| `plotOptions.radialColumn.valueAxis.labels.readability.pill.padding` | <code>number \| [number, number]</code> | Space around the text in pixels: one number, or [vertical, horizontal]. Default: `[1, 4]`. |
| `plotOptions.radialColumn.valueAxis.labels.readability.pill.stroke` | <code>string</code> | Outline colour of the box. Default: `'none'`. |
| `plotOptions.radialColumn.valueAxis.labels.readability.pill.strokeWidth` | <code>number</code> | Outline width in pixels. Default: `1`. |
| `plotOptions.radialColumn.valueAxis.labels.readability.pill.offset` | <code>[number, number]</code> | Shift of the box as [dx, dy] in pixels. Default: `[0, 0]`. |
| `plotOptions.radialColumn.valueAxis.labels.readability.shadow` | <code>object \| boolean</code> | drop shadow on the pill (on the text in halo mode) |
| `plotOptions.radialColumn.valueAxis.labels.readability.shadow.dx` | <code>number</code> | Horizontal shadow offset in pixels. Default: `0`. |
| `plotOptions.radialColumn.valueAxis.labels.readability.shadow.dy` | <code>number</code> | Vertical shadow offset in pixels. Default: `1`. |
| `plotOptions.radialColumn.valueAxis.labels.readability.shadow.blur` | <code>number</code> | Shadow blur in pixels. Default: `2`. |
| `plotOptions.radialColumn.valueAxis.labels.readability.shadow.color` | <code>string</code> | Shadow colour. Default: `'#000000'`. |
| `plotOptions.radialColumn.valueAxis.labels.readability.shadow.opacity` | <code>number</code> | Shadow opacity (0 to 1). Default: `0.35`. |
| `plotOptions.radialColumn.valueAxis.labels.readability.raise` | <code>boolean</code> | axis labels sitting on marks are moved above the series (default true) |
| `plotOptions.radialColumn.valueAxis.labels.readability.each` | <code>(info: WccReadabilityInfo) =&gt; WccReadability \| null \| undefined</code> | per label: return an override (or 'none') for this one label; called only when set |
| `plotOptions.radialColumn.valueAxis.labels.angle` | <code>number \| 'auto'</code> | where the scale sits: degrees (startAngle convention, 0 = 12 o'clock) or 'auto' = the slot boundary with the shortest bars on both sides. Default: the start of the range |
| `plotOptions.radialColumn.valueAxis.labels.pinAngle` | <code>boolean</code> | 'auto' keeps the first angle it found across updates (no jumping scale). Default true |
| `plotOptions.radialColumn.categoryLabels` | <code>object</code> | Category names around the ring. |
| `plotOptions.radialColumn.categoryLabels.show` | <code>boolean</code> | Shows the category names. Default: `true`. |
| `plotOptions.radialColumn.categoryLabels.orientation` | <code>'auto' \| 'horizontal' \| 'radial'</code> | `'horizontal'` or along the `'radial'` direction; `'auto'` keeps names horizontal when they fit their slot. Default: `'auto'`. |
| `plotOptions.radialColumn.categoryLabels.offset` | <code>number</code> | Distance from the bars in px. Default: `8`. |
| `plotOptions.radialColumn.categoryLabels.maxWidth` | <code>number</code> | Longest name in px before it is shortened. Default: `110`. |
| `plotOptions.radialColumn.categoryLabels.step` | <code>number</code> | label every n-th category (disables automatic thinning) |
| `plotOptions.radialColumn.categoryLabels.maxCount` | <code>number</code> | most labels to show; default from the ring length (one per ~4 font sizes, 4-24) |
| `plotOptions.radialColumn.categoryLabels.formatter` | <code>(category: string, opts: { index: number }) =&gt; string</code> | `(category, { index }) =&gt; string` for the name. |
| `plotOptions.radialColumn.center` | <code>object</code> | Value and label in the hole. |
| `plotOptions.radialColumn.center.readability` | <code>RadialReadability</code> | centre value + label readability (explicit modes; default none) |
| `plotOptions.radialColumn.center.readability.mode` | <code>'none' \| 'halo' \| 'pill' \| 'auto' \| 'hide'</code> | 'auto' (default where on): nothing for labels off the marks, a contrasting text colour over one fill, a pill over mixed fills; 'hide' = skip labels that sit on marks |
| `plotOptions.radialColumn.center.readability.fallback` | <code>'pill' \| 'halo' \| 'hide'</code> | what 'auto' escalates to over mixed fills or when no text colour reaches minRatio. Default 'pill' |
| `plotOptions.radialColumn.center.readability.enabled` | <code>boolean</code> | false switches the treatment off for this label kind |
| `plotOptions.radialColumn.center.readability.contrast` | <code>boolean</code> | swap the text to `light`/`dark` when it misses minRatio against what is under it (any mode) |
| `plotOptions.radialColumn.center.readability.minRatio` | <code>number</code> | WCAG 2 contrast ratio to reach. Default 4.5 |
| `plotOptions.radialColumn.center.readability.light` | <code>string</code> | text/backdrop colour pair used by contrast and 'auto' fills. Defaults '#ffffff' / '#111827' |
| `plotOptions.radialColumn.center.readability.dark` | <code>string</code> | Dark colour of the pair. Default: `'#111827'`. |
| `plotOptions.radialColumn.center.readability.background` | <code>'auto' \| string</code> | colour under the chart; 'auto' = chart.background, else the first opaque ancestor |
| `plotOptions.radialColumn.center.readability.halo` | <code>object</code> | outline behind the glyphs; blur &gt; 0 makes it a soft glow. Defaults width 3, color 'auto' (chart background), opacity 0.92 |
| `plotOptions.radialColumn.center.readability.halo.width` | <code>number</code> | Outline width in pixels. Default: `3`. |
| `plotOptions.radialColumn.center.readability.halo.color` | <code>'auto' \| string</code> | Outline colour; 'auto' uses the colour under the label or a contrasting one. Default: `'auto'`. |
| `plotOptions.radialColumn.center.readability.halo.opacity` | <code>number</code> | Outline opacity (0 to 1). Default: `0.92`. |
| `plotOptions.radialColumn.center.readability.halo.blur` | <code>number</code> | Blur in pixels; above 0 the outline becomes a soft glow. Default: `0`. |
| `plotOptions.radialColumn.center.readability.pill` | <code>object</code> | backdrop box. padding = [vertical, horizontal]; offset = [dx, dy] px. Defaults fill 'auto', opacity 0.9, radius 4, padding [1, 4] |
| `plotOptions.radialColumn.center.readability.pill.fill` | <code>'auto' \| string</code> | Box colour; 'auto' uses the colour under the label or a contrasting one. Default: `'auto'`. |
| `plotOptions.radialColumn.center.readability.pill.opacity` | <code>number</code> | Box opacity (0 to 1). Default: `0.9`. |
| `plotOptions.radialColumn.center.readability.pill.radius` | <code>number</code> | Corner radius in pixels. Default: `4`. |
| `plotOptions.radialColumn.center.readability.pill.padding` | <code>number \| [number, number]</code> | Space around the text in pixels: one number, or [vertical, horizontal]. Default: `[1, 4]`. |
| `plotOptions.radialColumn.center.readability.pill.stroke` | <code>string</code> | Outline colour of the box. Default: `'none'`. |
| `plotOptions.radialColumn.center.readability.pill.strokeWidth` | <code>number</code> | Outline width in pixels. Default: `1`. |
| `plotOptions.radialColumn.center.readability.pill.offset` | <code>[number, number]</code> | Shift of the box as [dx, dy] in pixels. Default: `[0, 0]`. |
| `plotOptions.radialColumn.center.readability.shadow` | <code>object \| boolean</code> | drop shadow on the pill (on the text in halo mode) |
| `plotOptions.radialColumn.center.readability.shadow.dx` | <code>number</code> | Horizontal shadow offset in pixels. Default: `0`. |
| `plotOptions.radialColumn.center.readability.shadow.dy` | <code>number</code> | Vertical shadow offset in pixels. Default: `1`. |
| `plotOptions.radialColumn.center.readability.shadow.blur` | <code>number</code> | Shadow blur in pixels. Default: `2`. |
| `plotOptions.radialColumn.center.readability.shadow.color` | <code>string</code> | Shadow colour. Default: `'#000000'`. |
| `plotOptions.radialColumn.center.readability.shadow.opacity` | <code>number</code> | Shadow opacity (0 to 1). Default: `0.35`. |
| `plotOptions.radialColumn.center.readability.raise` | <code>boolean</code> | axis labels sitting on marks are moved above the series (default true) |
| `plotOptions.radialColumn.center.readability.each` | <code>(info: WccReadabilityInfo) =&gt; WccReadability \| null \| undefined</code> | per label: return an override (or 'none') for this one label; called only when set |
| `plotOptions.radialColumn.center.show` | <code>boolean \| 'auto'</code> | `true` always shows the centre; `'auto'` shows it when the hole is at least 34 px. Default: `'auto'`. |
| `plotOptions.radialColumn.center.label` | <code>string</code> | Label under the value; not set uses the gauge layer name, `'Total'` with columns, or the first layer name. |
| `plotOptions.radialColumn.center.value` | <code>number \| string \| (() =&gt; string)</code> | Fixed value or text, or a function returning text; not set uses the gauge value or the total. |
| `plotOptions.radialColumn.center.formatter` | <code>(value: number) =&gt; string</code> | `(value, { w }) =&gt; string` for a numeric centre value. |
| `plotOptions.radialColumn.center.hover` | <code>boolean</code> | show the hovered slot / segment in the centre |
| `plotOptions.radialColumn.layers` | <code>RadialColumnLayer[]</code> | Inner layers, innermost first. Default: `[]`. |
| `plotOptions.radialColumn.layers[].type` | <code>'pie' \| 'donut' \| 'nestedDonut' \| 'sunburst' \| 'arc' \| 'radialBar' \| 'polarArea' \| 'heatmap' \| 'chord' \| 'goals' \| 'gauge' \| 'wave' \| 'matrix' \| 'incident' \| 'bands' \| 'trace' \| 'span' \| 'vitalsNow'</code> | 'radialBar' is an alias of 'arc'; 'chord' is best as the innermost layer (its ribbons fill the centre) |
| `plotOptions.radialColumn.layers[].name` | <code>string</code> | Layer name (legend, tooltip, centre label of a gauge). |
| `plotOptions.radialColumn.layers[].data` | <code>RadialLayerDatum[] \| Array&lt;{ /** Ring name. */ name?: string /** Segments or cells of the ring (inner first). */ data: Array&lt;RadialLayerDatum \| null&gt; }&gt; \| Ar…</code> | pie/donut/arc/polarArea: segments; nestedDonut and heatmap: rings [{ name, data }] or number[][] (innermost first, heatmap cells may be null); sunburst: a node tree; chord: flows [from, to, value] or { from, to, value }; wave: rows RadialWaveSeries[] (or one plain number array = one row) matrix: rows × cols values or status names, flows [row, col, value], or RadialMatrixCell objects incident (west-coast-charts/layers/quint): RadialIncident windows, a wedge across every ring each |
| `plotOptions.radialColumn.layers[].data[].x` | <code>string</code> | Name of the segment (alias of `name`). |
| `plotOptions.radialColumn.layers[].data[].name` | <code>string</code> | Name of the segment. |
| `plotOptions.radialColumn.layers[].data[].y` | <code>number</code> | Value of the segment (alias of `value`). |
| `plotOptions.radialColumn.layers[].data[].value` | <code>number</code> | Value of the segment. |
| `plotOptions.radialColumn.layers[].data[].color` | <code>string</code> | Colour of the segment. |
| `plotOptions.radialColumn.layers[].data[].max` | <code>number</code> | Arc and goals layers: value of a full arc for this point. |
| `plotOptions.radialColumn.layers[].data[].target` | <code>number</code> | goals: the ring's target (alias of max) |
| `plotOptions.radialColumn.layers[].data[].trackColor` | <code>string</code> | goals: track colour of this ring (default: derived from the ring colour) |
| `plotOptions.radialColumn.layers[].data[].label` | <code>string</code> | goals: ring label (default: the name) |
| `plotOptions.radialColumn.layers[].data[].children` | <code>RadialLayerDatum[]</code> | Sunburst: child segments on the next ring. |
| `plotOptions.radialColumn.layers[].data[].link` | <code>Array&lt;number \| string&gt;</code> | linked categories (indices or names) |
| `plotOptions.radialColumn.layers[].data[].keys` | <code>string[]</code> | semantic keys (e.g. a service id): marks of other layers sharing a key light together; a sunburst parent takes the union of its children |
| `plotOptions.radialColumn.layers[].data[].values` | <code>Array&lt;number \| null&gt;</code> | this segment's own outer values (filter interaction) |
| `plotOptions.radialColumn.layers[].data[].from` | <code>string</code> | Source group id. |
| `plotOptions.radialColumn.layers[].data[].to` | <code>string</code> | Target group id. |
| `plotOptions.radialColumn.layers[].data[].data` | <code>Array&lt;number \| null \| [unknown, number \| null] \| { y: number \| null }&gt;</code> | One value per point; null = gap. Numbers, [x, y] or { y }. |
| `plotOptions.radialColumn.layers[].data[].envelope` | <code>object</code> | Normal range per point: a soft band behind the wave; points outside it are anomalies. |
| `plotOptions.radialColumn.layers[].data[].envelope.lo` | <code>Array&lt;number \| null&gt;</code> | Lower bound per point. |
| `plotOptions.radialColumn.layers[].data[].envelope.hi` | <code>Array&lt;number \| null&gt;</code> | Upper bound per point. |
| `plotOptions.radialColumn.layers[].data[].forecast` | <code>object</code> | Forecast per point (usually null up to now): dashed crest, optional hatched range. |
| `plotOptions.radialColumn.layers[].data[].forecast.data` | <code>Array&lt;number \| null&gt;</code> | Forecast values. |
| `plotOptions.radialColumn.layers[].data[].forecast.lo` | <code>Array&lt;number \| null&gt;</code> | Lower bound of the forecast range. |
| `plotOptions.radialColumn.layers[].data[].forecast.hi` | <code>Array&lt;number \| null&gt;</code> | Upper bound of the forecast range. |
| `plotOptions.radialColumn.layers[].data[].anomalies` | <code>RadialWaveAnomaly[]</code> | Anomalies of this row (as layer anomalies, without series). |
| `plotOptions.radialColumn.layers[].data[].anomalies[].series` | <code>string</code> | Row name (layer-level lists; not set = every row). |
| `plotOptions.radialColumn.layers[].data[].anomalies[].at` | <code>number \| string</code> | Point index, or a point label (e.g. 'Wed 18:00'). |
| `plotOptions.radialColumn.layers[].data[].anomalies[].label` | <code>string</code> | Text in the tooltip, data table and rim marks. |
| `plotOptions.radialColumn.layers[].data[].anomalies[].kind` | <code>string</code> | Kind shown when there is no label. Default: 'Anomaly' ('Above normal' / 'Below normal' for automatic ones). |
| `plotOptions.radialColumn.layers[].data[].anomalies[].color` | <code>string</code> | Spike colour. Default: a rose red (lighter in dark mode). |
| `plotOptions.radialColumn.layers[].data[].row` | <code>string</code> | Row id (or name). |
| `plotOptions.radialColumn.layers[].data[].col` | <code>string</code> | Column id (or name). |
| `plotOptions.radialColumn.layers[].data[].status` | <code>string</code> | Status name (ok, info, warn, crit, unknown or one of `statuses`). |
| `plotOptions.radialColumn.layers[].series` | <code>number \| string</code> | take the data from config.series (index or name) instead; that series leaves the column ring |
| `plotOptions.radialColumn.layers[].labels` | <code>string[]</code> | segment names for plain number data; wave: point labels, one per point (e.g. '14:00 Tue') or one per sector point ('14:00', shown as 'Tue 14:00') |
| `plotOptions.radialColumn.layers[].thickness` | <code>number \| string</code> | ring thickness: px, '30%' of the available radius, or a fraction (0..1) |
| `plotOptions.radialColumn.layers[].gap` | <code>number</code> | px between this layer and the one inside it (default 6) |
| `plotOptions.radialColumn.layers[].ringGap` | <code>number</code> | px between the rings of a nestedDonut / sunburst / arc layer (default 2) |
| `plotOptions.radialColumn.layers[].padding` | <code>number</code> | constant px gap between neighbouring segments |
| `plotOptions.radialColumn.layers[].corner` | <code>number</code> | corner radius of segment ends, px |
| `plotOptions.radialColumn.layers[].colors` | <code>string[]</code> | Own palette of the layer; heatmap: two or more colours are the ramp stops, low to high. |
| `plotOptions.radialColumn.layers[].colorBy` | <code>'spectrum'</code> | colour segments from the column ring's spectrum by angle |
| `plotOptions.radialColumn.layers[].legend` | <code>boolean</code> | keep this layer's segments out of the legend |
| `plotOptions.radialColumn.layers[].link` | <code>RadialColumnLink \| boolean \| RadialLinkMode</code> | link to the column ring for this layer: false = none, a mode, or options overriding plotOptions.radialColumn.link |
| `plotOptions.radialColumn.layers[].link.mode` | <code>'none' \| 'category' \| 'angle' \| 'map' \| 'auto'</code> | auto (default): a datum's own link, else matching category names, else the angle span |
| `plotOptions.radialColumn.layers[].link.map` | <code>((segment: RadialLinkSegment) =&gt; Array&lt;number \| string&gt; \| null \| undefined) \| Record&lt;string, Array&lt;number \| string&gt;&gt;</code> | map mode: a function or an object keyed by 'A › B' path or name; values are category indices or names |
| `plotOptions.radialColumn.layers[].link.interaction` | <code>'highlight' \| 'filter' \| 'both'</code> | highlight on hover, filter (cross-filter / values) on click, or both. Default 'highlight' |
| `plotOptions.radialColumn.layers[].link.bidirectional` | <code>boolean</code> | hovering a bar also lights its segments (default true) |
| `plotOptions.radialColumn.layers[].link.align` | <code>boolean</code> | segments span exactly the angle of their linked bars (default false) |
| `plotOptions.radialColumn.layers[].link.indicator` | <code>boolean</code> | bracket arc on the outer edge over the linked bars (default true) |
| `plotOptions.radialColumn.layers[].link.unit` | <code>string</code> | what a category is, for tooltips and announcements ('18 of 72 time slots'). Default 'categories'. Name the real unit: categories that combine several things (service × day) are 'service-days', not 'days'. |
| `plotOptions.radialColumn.layers[].link.basis` | <code>string</code> | how the categories are composed, appended in brackets ('18 of 140 service-days (10 services × 14 days)'). Default: none |
| `plotOptions.radialColumn.layers[].align` | <code>boolean</code> | shorthand for link.align |
| `plotOptions.radialColumn.layers[].trackColor` | <code>string</code> | Track colour of arc, goals and gauge layers; not set uses a faint text tone (goals: a tone of the ring colour). |
| `plotOptions.radialColumn.layers[].startAngle` | <code>number</code> | degrees, 0 = 12 o'clock, clockwise; default: the chart's range |
| `plotOptions.radialColumn.layers[].endAngle` | <code>number</code> | End angle in degrees (same convention as `startAngle`); not set uses the chart's range. |
| `plotOptions.radialColumn.layers[].min` | <code>number</code> | arc layers: value range of a full arc (default 0..100; per point via datum.max); wave: base of the height scale (default min(0, data)) |
| `plotOptions.radialColumn.layers[].max` | <code>number</code> | Arc layers: value of a full arc. Default: `100`. Wave: top of the height scale (default: the data, envelopes and forecasts rounded up to a nice tick). |
| `plotOptions.radialColumn.layers[].color` | <code>RadialMatrixScale \| string</code> | heatmap / matrix: base colour of the default ramp (surface tone -&gt; colour -&gt; towards the text colour); colors (2+) overrides the ramp. matrix (value mode) also takes a colour scale. |
| `plotOptions.radialColumn.layers[].color.scale` | <code>'sequential' \| 'diverging'</code> | `'sequential'` (low to high) or `'diverging'` around `mid`. Default: `'sequential'`. |
| `plotOptions.radialColumn.layers[].color.domain` | <code>number[]</code> | [lo, hi] or [lo, mid, hi]; default: data extent. |
| `plotOptions.radialColumn.layers[].color.mid` | <code>number</code> | Diverging centre. Default: `0`. |
| `plotOptions.radialColumn.layers[].color.stops` | <code>string[]</code> | Colour stops, low to high. |
| `plotOptions.radialColumn.layers[].color.reverse` | <code>boolean</code> | Reverses the colour stops. Default: `false`. |
| `plotOptions.radialColumn.layers[].groups` | <code>RadialChordGroup[]</code> | chord: group definitions (order, names, colours, linked categories) |
| `plotOptions.radialColumn.layers[].groups[].id` | <code>string</code> | Group id used in the flows. |
| `plotOptions.radialColumn.layers[].groups[].name` | <code>string</code> | Shown name; not set uses the id. |
| `plotOptions.radialColumn.layers[].groups[].color` | <code>string</code> | Group colour. |
| `plotOptions.radialColumn.layers[].groups[].values` | <code>number[]</code> | per-group values (shown in its tooltip) |
| `plotOptions.radialColumn.layers[].groups[].link` | <code>string \| number \| Array&lt;string \| number&gt;</code> | categories (names or indices) of the column ring this group links to (overrides link.map) |
| `plotOptions.radialColumn.layers[].matrix` | <code>number[][]</code> | chord: a square flow matrix instead of data; row = source, column = target (with labels) |
| `plotOptions.radialColumn.layers[].directed` | <code>boolean</code> | chord: directed flows give each end its own share (A-&gt;B and B-&gt;A differ) |
| `plotOptions.radialColumn.layers[].sort` | <code>'none' \| 'asc' \| 'desc'</code> | chord: order of the groups around the ring (default: as given) |
| `plotOptions.radialColumn.layers[].ringWidth` | <code>number</code> | chord: px width of the group arcs (default: the layer thickness) |
| `plotOptions.radialColumn.layers[].ribbon` | <code>object</code> | chord ribbons |
| `plotOptions.radialColumn.layers[].ribbon.opacity` | <code>number</code> | Ribbon opacity; not set uses 0.52 (0.6 in dark mode). |
| `plotOptions.radialColumn.layers[].ribbon.colorMode` | <code>'source' \| 'target' \| 'gradient'</code> | Ribbon colour from the `'source'` group, the `'target'` group, or a `'gradient'` between both. Default: `'source'`. |
| `plotOptions.radialColumn.layers[].ribbon.padding` | <code>number</code> | Gap between the group arcs and the ribbon ends in px. Default: `2`. |
| `plotOptions.radialColumn.layers[].target` | <code>number</code> | goals: default target of every ring (datum target/max wins; default 100) |
| `plotOptions.radialColumn.layers[].maxLaps` | <code>number</code> | goals: laps drawn past 100 % (default 2, i.e. up to 300 %) |
| `plotOptions.radialColumn.layers[].ringLabels` | <code>boolean</code> | curved labels on the segments: goals from the ring start (default true); any other layer centred on each segment, upright in the lower half (default false) |
| `plotOptions.radialColumn.layers[].ringTitles` | <code>boolean</code> | incident: name the heatmap rings (curved, in the gap outside each ring, at 12 o'clock) and add their colour scales to the key under the ring (default true) |
| `plotOptions.radialColumn.layers[].legendTitle` | <code>string</code> | header of this layer's entries in a right-hand legend (e.g. 'Regions'); entries of consecutive layers sharing a title form one group |
| `plotOptions.radialColumn.layers[].rows` | <code>Array&lt;string \| RadialMatrixHeader \| RadialVitalsRow&gt;</code> | matrix: row headers (ids, or definitions with keys / link); default: the ids used in flow data |
| `plotOptions.radialColumn.layers[].cols` | <code>Array&lt;string \| RadialMatrixHeader&gt;</code> | matrix: column headers; default: the rows (square adjacency matrix) |
| `plotOptions.radialColumn.layers[].statuses` | <code>Record&lt;string, RadialMatrixStatus&gt;</code> | matrix: adds or overrides statuses (built in: ok, info, warn, crit, unknown) |
| `plotOptions.radialColumn.layers[].headers` | <code>object \| boolean</code> | matrix: row / column header labels (false hides them) |
| `plotOptions.radialColumn.layers[].headers.show` | <code>boolean</code> | `false` hides the headers. Default: `true`. |
| `plotOptions.radialColumn.layers[].headers.fontSize` | <code>number</code> | Largest header font size in px; it shrinks to 9 px before labels are cut. Default: theme font size − 1. |
| `plotOptions.radialColumn.layers[].headers.readability` | <code>RadialReadability</code> | Label readability of the headers (explicit modes only, e.g. 'pill' / 'halo'). |
| `plotOptions.radialColumn.layers[].headers.readability.mode` | <code>'none' \| 'halo' \| 'pill' \| 'auto' \| 'hide'</code> | 'auto' (default where on): nothing for labels off the marks, a contrasting text colour over one fill, a pill over mixed fills; 'hide' = skip labels that sit on marks |
| `plotOptions.radialColumn.layers[].headers.readability.fallback` | <code>'pill' \| 'halo' \| 'hide'</code> | what 'auto' escalates to over mixed fills or when no text colour reaches minRatio. Default 'pill' |
| `plotOptions.radialColumn.layers[].headers.readability.enabled` | <code>boolean</code> | false switches the treatment off for this label kind |
| `plotOptions.radialColumn.layers[].headers.readability.contrast` | <code>boolean</code> | swap the text to `light`/`dark` when it misses minRatio against what is under it (any mode) |
| `plotOptions.radialColumn.layers[].headers.readability.minRatio` | <code>number</code> | WCAG 2 contrast ratio to reach. Default 4.5 |
| `plotOptions.radialColumn.layers[].headers.readability.light` | <code>string</code> | text/backdrop colour pair used by contrast and 'auto' fills. Defaults '#ffffff' / '#111827' |
| `plotOptions.radialColumn.layers[].headers.readability.dark` | <code>string</code> | Dark colour of the pair. Default: `'#111827'`. |
| `plotOptions.radialColumn.layers[].headers.readability.background` | <code>'auto' \| string</code> | colour under the chart; 'auto' = chart.background, else the first opaque ancestor |
| `plotOptions.radialColumn.layers[].headers.readability.halo` | <code>object</code> | outline behind the glyphs; blur &gt; 0 makes it a soft glow. Defaults width 3, color 'auto' (chart background), opacity 0.92 |
| `plotOptions.radialColumn.layers[].headers.readability.halo.width` | <code>number</code> | Outline width in pixels. Default: `3`. |
| `plotOptions.radialColumn.layers[].headers.readability.halo.color` | <code>'auto' \| string</code> | Outline colour; 'auto' uses the colour under the label or a contrasting one. Default: `'auto'`. |
| `plotOptions.radialColumn.layers[].headers.readability.halo.opacity` | <code>number</code> | Outline opacity (0 to 1). Default: `0.92`. |
| `plotOptions.radialColumn.layers[].headers.readability.halo.blur` | <code>number</code> | Blur in pixels; above 0 the outline becomes a soft glow. Default: `0`. |
| `plotOptions.radialColumn.layers[].headers.readability.pill` | <code>object</code> | backdrop box. padding = [vertical, horizontal]; offset = [dx, dy] px. Defaults fill 'auto', opacity 0.9, radius 4, padding [1, 4] |
| `plotOptions.radialColumn.layers[].headers.readability.pill.fill` | <code>'auto' \| string</code> | Box colour; 'auto' uses the colour under the label or a contrasting one. Default: `'auto'`. |
| `plotOptions.radialColumn.layers[].headers.readability.pill.opacity` | <code>number</code> | Box opacity (0 to 1). Default: `0.9`. |
| `plotOptions.radialColumn.layers[].headers.readability.pill.radius` | <code>number</code> | Corner radius in pixels. Default: `4`. |
| `plotOptions.radialColumn.layers[].headers.readability.pill.padding` | <code>number \| [number, number]</code> | Space around the text in pixels: one number, or [vertical, horizontal]. Default: `[1, 4]`. |
| `plotOptions.radialColumn.layers[].headers.readability.pill.stroke` | <code>string</code> | Outline colour of the box. Default: `'none'`. |
| `plotOptions.radialColumn.layers[].headers.readability.pill.strokeWidth` | <code>number</code> | Outline width in pixels. Default: `1`. |
| `plotOptions.radialColumn.layers[].headers.readability.pill.offset` | <code>[number, number]</code> | Shift of the box as [dx, dy] in pixels. Default: `[0, 0]`. |
| `plotOptions.radialColumn.layers[].headers.readability.shadow` | <code>object \| boolean</code> | drop shadow on the pill (on the text in halo mode) |
| `plotOptions.radialColumn.layers[].headers.readability.shadow.dx` | <code>number</code> | Horizontal shadow offset in pixels. Default: `0`. |
| `plotOptions.radialColumn.layers[].headers.readability.shadow.dy` | <code>number</code> | Vertical shadow offset in pixels. Default: `1`. |
| `plotOptions.radialColumn.layers[].headers.readability.shadow.blur` | <code>number</code> | Shadow blur in pixels. Default: `2`. |
| `plotOptions.radialColumn.layers[].headers.readability.shadow.color` | <code>string</code> | Shadow colour. Default: `'#000000'`. |
| `plotOptions.radialColumn.layers[].headers.readability.shadow.opacity` | <code>number</code> | Shadow opacity (0 to 1). Default: `0.35`. |
| `plotOptions.radialColumn.layers[].headers.readability.raise` | <code>boolean</code> | axis labels sitting on marks are moved above the series (default true) |
| `plotOptions.radialColumn.layers[].headers.readability.each` | <code>(info: WccReadabilityInfo) =&gt; WccReadability \| null \| undefined</code> | per label: return an override (or 'none') for this one label; called only when set |
| `plotOptions.radialColumn.layers[].values` | <code>boolean \| 'auto'</code> | matrix: print the value inside a cell ('auto': when it fits). Default: `'auto'`. |
| `plotOptions.radialColumn.layers[].minCell` | <code>number</code> | matrix: smallest cell in px before rows / columns are merged or dropped. Default: `6`. |
| `plotOptions.radialColumn.layers[].overflow` | <code>'aggregate' \| 'truncate'</code> | matrix: rows / columns past minCell merge into one '+N' row / column ('aggregate'), or are dropped with a '+N' note ('truncate'). Default: `'aggregate'`. |
| `plotOptions.radialColumn.layers[].aggregate` | <code>'sum' \| 'max' \| 'mean' \| 'min' \| 'median' \| 'last'</code> | matrix: how merged cells and row / column headers combine values (statuses: always the worst). Default: `'sum'` (header tooltip 'Total'); use 'max' / 'mean' / 'min' for non-additive cells such as latencies or rates ('Highest', 'Average', 'Lowest'). |
| `plotOptions.radialColumn.layers[].inset` | <code>number</code> | matrix: px between the grid (with its headers) and the edge of the centre disc. Default: `6`. |
| `plotOptions.radialColumn.layers[].unit` | <code>string</code> | matrix: appended to values in cells, tooltip and table; heatmap: appended to the value in the slot tooltip |
| `plotOptions.radialColumn.layers[].value` | <code>number</code> | gauge: the value (else data[0]) |
| `plotOptions.radialColumn.layers[].follow` | <code>string \| number \| boolean</code> | gauge: take the latest value of this column series (name, index or true = first); it stays in the ring |
| `plotOptions.radialColumn.layers[].bandsLow` | <code>RadialVitalsBand[]</code> | gauge: colour by value band, ascending: [{ to: 60, color }] Span lower-value bands. Missing keeps the generic shared fallback; choose a policy explicitly to avoid a warning. |
| `plotOptions.radialColumn.layers[].bandsLow[].to` | <code>number</code> | Upper value of the band (inclusive); omitted on the last band. |
| `plotOptions.radialColumn.layers[].bandsLow[].level` | <code>0 \| 1 \| 2 \| 3</code> | 0 = normal ... 3 = highest; colour + pattern. |
| `plotOptions.radialColumn.layers[].bandsLow[].label` | <code>string</code> | Text of the band in tooltip and table. |
| `plotOptions.radialColumn.layers[].bandsLowPolicy` | <code>'high-only' \| 'shared'</code> | Span classification when bandsLow is absent; generic span default is shared, VitalsClock defaults high-only. |
| `plotOptions.radialColumn.layers[].bands` | <code>RadialVitalsBand[] \| Array&lt;{ /** Upper value of the band (inclusive). */ to: number /** Arc colour for values in the band. */ color: string }&gt;</code> |  |
| `plotOptions.radialColumn.layers[].bands[].to` | <code>number</code> | Upper value of the band (inclusive); omitted on the last band. |
| `plotOptions.radialColumn.layers[].bands[].level` | <code>0 \| 1 \| 2 \| 3</code> | 0 = normal ... 3 = highest; colour + pattern. |
| `plotOptions.radialColumn.layers[].bands[].label` | <code>string</code> | Text of the band in tooltip and table. |
| `plotOptions.radialColumn.layers[].formatter` | <code>(value: number) =&gt; string</code> | gauge: value formatter (centre, min/max ticks, tooltip) |
| `plotOptions.radialColumn.layers[].center` | <code>boolean</code> | gauge: show the value in the chart centre (default true) |
| `plotOptions.radialColumn.layers[].scale` | <code>boolean \| 'linear' \| 'log'</code> | gauge: min/max labels at the ends of a partial arc (boolean, default true); heatmap: colour scale, 'log' spaces the ramp by ratio (positive values; default 'linear') |
| `plotOptions.radialColumn.layers[].now` | <code>object \| boolean \| number \| string</code> | gauge with follow: the 'now' tick over the newest slot (default true) |
| `plotOptions.radialColumn.layers[].now.label` | <code>string</code> | Text of the tick. Default: `'now'`. |
| `plotOptions.radialColumn.layers[].now.color` | <code>string</code> | Tick colour; not set uses the gauge colour. |
| `plotOptions.radialColumn.layers[].time` | <code>object</code> | trace / span / vitalsNow (layers/vitals): the window the ring shows, ms or ISO. |
| `plotOptions.radialColumn.layers[].time.start` | <code>number \| string</code> |  |
| `plotOptions.radialColumn.layers[].time.end` | <code>number \| string</code> |  |
| `plotOptions.radialColumn.layers[].upto` | <code>number</code> | bands / trace / span (layers/vitals): index of the current slot; later slots are "no data yet". |
| `plotOptions.radialColumn.layers[].endLabel` | <code>string</code> | bands (layers/vitals): end label of the last slot (e.g. '24:00'); not set uses the last slot label. |
| `plotOptions.radialColumn.layers[].gapAfter` | <code>number</code> | trace / span (layers/vitals): a gap longer than this many minutes breaks the line. Default: 3 slots. |
| `plotOptions.radialColumn.layers[].alarms` | <code>Array&lt;{ from: number \| string, to?: number \| string, label?: string }&gt;</code> | vitalsNow (layers/vitals): caller alarm windows, drawn as wedges. |
| `plotOptions.radialColumn.layers[].status` | <code>Array&lt;{ name: string, text: string, ago?: number, stale?: boolean }&gt;</code> | vitalsNow (layers/vitals): last value per parameter in the strip under the ring. |
| `plotOptions.radialColumn.layers[].note` | <code>string</code> | vitalsNow (layers/vitals): a note in the strip, e.g. 'Demo data'. |
| `plotOptions.radialColumn.layers[].mode` | <code>'ridge' \| 'overlay' \| 'stack' \| 'auto' \| 'value' \| 'status'</code> | wave: 'ridge' (default) staggers the rows in lanes that rise into the lane behind them; 'overlay' shares one translucent band; 'stack' piles the rows. matrix: 'status' colours cells by severity with patterns; 'auto' (default) = status once any cell has one; 'value' = value scale. |
| `plotOptions.radialColumn.layers[].overlap` | <code>number</code> | wave ridge: how far a wave may rise into the lanes behind it, in lane steps (default 0.8; 0 = no overlap) |
| `plotOptions.radialColumn.layers[].sectors` | <code>number \| Array&lt;string \| RadialWaveSector&gt;</code> | wave: the equal sectors (cycles) of the ring - a count, or names / objects in order (default 1) |
| `plotOptions.radialColumn.layers[].sectorLabels` | <code>boolean</code> | wave: curved sector names on a band at the inner edge (default true when there are 2+ sectors and room) |
| `plotOptions.radialColumn.layers[].depth` | <code>number</code> | wave: shading from crest to base, 0 = flat .. 1 = deep (default 0.55) |
| `plotOptions.radialColumn.layers[].curve` | <code>'smooth' \| 'linear'</code> | wave: 'smooth' monotone cubic that never overshoots the data (default) or 'linear' |
| `plotOptions.radialColumn.layers[].anomalies` | <code>RadialWaveAnomaly \| false</code> | wave: anomaly spikes. Default: points outside their envelope. A list adds or relabels points; false = none; { color } recolours the automatic ones |
| `plotOptions.radialColumn.layers[].anomalies.series` | <code>string</code> | Row name (layer-level lists; not set = every row). |
| `plotOptions.radialColumn.layers[].anomalies.at` | <code>number \| string</code> | Point index, or a point label (e.g. 'Wed 18:00'). |
| `plotOptions.radialColumn.layers[].anomalies.label` | <code>string</code> | Text in the tooltip, data table and rim marks. |
| `plotOptions.radialColumn.layers[].anomalies.kind` | <code>string</code> | Kind shown when there is no label. Default: 'Anomaly' ('Above normal' / 'Below normal' for automatic ones). |
| `plotOptions.radialColumn.layers[].anomalies.color` | <code>string</code> | Spike colour. Default: a rose red (lighter in dark mode). |
| `plotOptions.radialColumn.layerGap` | <code>number</code> | px between the outermost inner layer and the column ring |
| `plotOptions.radialColumn.hole` | <code>'auto' \| number \| string</code> | radius of the empty centre: 'auto', px, '%' or fraction of the space inside the column ring |
| `plotOptions.radialColumn.legend` | <code>object</code> | Legend of series and layer items. |
| `plotOptions.radialColumn.legend.show` | <code>boolean \| 'auto'</code> | `true` always shows it; `'auto'` from two items. Default: `'auto'`. |
| `plotOptions.radialColumn.legend.position` | <code>'auto' \| 'right' \| 'bottom'</code> | `'right'` or `'bottom'`; `'auto'` uses the right on wide plots. Default: `'auto'`. |

## plotOptions.radialColumn.layers[]

One inner layer (`RadialColumnLayer`), innermost first.

| Option | Type | Description |
| --- | --- | --- |
| `plotOptions.radialColumn.layers[].type` | <code>'pie' \| 'donut' \| 'nestedDonut' \| 'sunburst' \| 'arc' \| 'radialBar' \| 'polarArea' \| 'heatmap' \| 'chord' \| 'goals' \| 'gauge' \| 'wave' \| 'matrix' \| 'incident' \| 'bands' \| 'trace' \| 'span' \| 'vitalsNow'</code> | 'radialBar' is an alias of 'arc'; 'chord' is best as the innermost layer (its ribbons fill the centre) |
| `plotOptions.radialColumn.layers[].name` | <code>string</code> | Layer name (legend, tooltip, centre label of a gauge). |
| `plotOptions.radialColumn.layers[].data` | <code>RadialLayerDatum[] \| Array&lt;{ /** Ring name. */ name?: string /** Segments or cells of the ring (inner first). */ data: Array&lt;RadialLayerDatum \| null&gt; }&gt; \| Ar…</code> | pie/donut/arc/polarArea: segments; nestedDonut and heatmap: rings [{ name, data }] or number[][] (innermost first, heatmap cells may be null); sunburst: a node tree; chord: flows [from, to, value] or { from, to, value }; wave: rows RadialWaveSeries[] (or one plain number array = one row) matrix: rows × cols values or status names, flows [row, col, value], or RadialMatrixCell objects incident (west-coast-charts/layers/quint): RadialIncident windows, a wedge across every ring each |
| `plotOptions.radialColumn.layers[].data[].x` | <code>string</code> | Name of the segment (alias of `name`). |
| `plotOptions.radialColumn.layers[].data[].name` | <code>string</code> | Name of the segment. |
| `plotOptions.radialColumn.layers[].data[].y` | <code>number</code> | Value of the segment (alias of `value`). |
| `plotOptions.radialColumn.layers[].data[].value` | <code>number</code> | Value of the segment. |
| `plotOptions.radialColumn.layers[].data[].color` | <code>string</code> | Colour of the segment. |
| `plotOptions.radialColumn.layers[].data[].max` | <code>number</code> | Arc and goals layers: value of a full arc for this point. |
| `plotOptions.radialColumn.layers[].data[].target` | <code>number</code> | goals: the ring's target (alias of max) |
| `plotOptions.radialColumn.layers[].data[].trackColor` | <code>string</code> | goals: track colour of this ring (default: derived from the ring colour) |
| `plotOptions.radialColumn.layers[].data[].label` | <code>string</code> | goals: ring label (default: the name) |
| `plotOptions.radialColumn.layers[].data[].children` | <code>RadialLayerDatum[]</code> | Sunburst: child segments on the next ring. |
| `plotOptions.radialColumn.layers[].data[].link` | <code>Array&lt;number \| string&gt;</code> | linked categories (indices or names) |
| `plotOptions.radialColumn.layers[].data[].keys` | <code>string[]</code> | semantic keys (e.g. a service id): marks of other layers sharing a key light together; a sunburst parent takes the union of its children |
| `plotOptions.radialColumn.layers[].data[].values` | <code>Array&lt;number \| null&gt;</code> | this segment's own outer values (filter interaction) |
| `plotOptions.radialColumn.layers[].data[].from` | <code>string</code> | Source group id. |
| `plotOptions.radialColumn.layers[].data[].to` | <code>string</code> | Target group id. |
| `plotOptions.radialColumn.layers[].data[].data` | <code>Array&lt;number \| null \| [unknown, number \| null] \| { y: number \| null }&gt;</code> | One value per point; null = gap. Numbers, [x, y] or { y }. |
| `plotOptions.radialColumn.layers[].data[].envelope` | <code>object</code> | Normal range per point: a soft band behind the wave; points outside it are anomalies. |
| `plotOptions.radialColumn.layers[].data[].envelope.lo` | <code>Array&lt;number \| null&gt;</code> | Lower bound per point. |
| `plotOptions.radialColumn.layers[].data[].envelope.hi` | <code>Array&lt;number \| null&gt;</code> | Upper bound per point. |
| `plotOptions.radialColumn.layers[].data[].forecast` | <code>object</code> | Forecast per point (usually null up to now): dashed crest, optional hatched range. |
| `plotOptions.radialColumn.layers[].data[].forecast.data` | <code>Array&lt;number \| null&gt;</code> | Forecast values. |
| `plotOptions.radialColumn.layers[].data[].forecast.lo` | <code>Array&lt;number \| null&gt;</code> | Lower bound of the forecast range. |
| `plotOptions.radialColumn.layers[].data[].forecast.hi` | <code>Array&lt;number \| null&gt;</code> | Upper bound of the forecast range. |
| `plotOptions.radialColumn.layers[].data[].anomalies` | <code>RadialWaveAnomaly[]</code> | Anomalies of this row (as layer anomalies, without series). |
| `plotOptions.radialColumn.layers[].data[].anomalies[].series` | <code>string</code> | Row name (layer-level lists; not set = every row). |
| `plotOptions.radialColumn.layers[].data[].anomalies[].at` | <code>number \| string</code> | Point index, or a point label (e.g. 'Wed 18:00'). |
| `plotOptions.radialColumn.layers[].data[].anomalies[].label` | <code>string</code> | Text in the tooltip, data table and rim marks. |
| `plotOptions.radialColumn.layers[].data[].anomalies[].kind` | <code>string</code> | Kind shown when there is no label. Default: 'Anomaly' ('Above normal' / 'Below normal' for automatic ones). |
| `plotOptions.radialColumn.layers[].data[].anomalies[].color` | <code>string</code> | Spike colour. Default: a rose red (lighter in dark mode). |
| `plotOptions.radialColumn.layers[].data[].row` | <code>string</code> | Row id (or name). |
| `plotOptions.radialColumn.layers[].data[].col` | <code>string</code> | Column id (or name). |
| `plotOptions.radialColumn.layers[].data[].status` | <code>string</code> | Status name (ok, info, warn, crit, unknown or one of `statuses`). |
| `plotOptions.radialColumn.layers[].series` | <code>number \| string</code> | take the data from config.series (index or name) instead; that series leaves the column ring |
| `plotOptions.radialColumn.layers[].labels` | <code>string[]</code> | segment names for plain number data; wave: point labels, one per point (e.g. '14:00 Tue') or one per sector point ('14:00', shown as 'Tue 14:00') |
| `plotOptions.radialColumn.layers[].thickness` | <code>number \| string</code> | ring thickness: px, '30%' of the available radius, or a fraction (0..1) |
| `plotOptions.radialColumn.layers[].gap` | <code>number</code> | px between this layer and the one inside it (default 6) |
| `plotOptions.radialColumn.layers[].ringGap` | <code>number</code> | px between the rings of a nestedDonut / sunburst / arc layer (default 2) |
| `plotOptions.radialColumn.layers[].padding` | <code>number</code> | constant px gap between neighbouring segments |
| `plotOptions.radialColumn.layers[].corner` | <code>number</code> | corner radius of segment ends, px |
| `plotOptions.radialColumn.layers[].colors` | <code>string[]</code> | Own palette of the layer; heatmap: two or more colours are the ramp stops, low to high. |
| `plotOptions.radialColumn.layers[].colorBy` | <code>'spectrum'</code> | colour segments from the column ring's spectrum by angle |
| `plotOptions.radialColumn.layers[].legend` | <code>boolean</code> | keep this layer's segments out of the legend |
| `plotOptions.radialColumn.layers[].link` | <code>RadialColumnLink \| boolean \| RadialLinkMode</code> | link to the column ring for this layer: false = none, a mode, or options overriding plotOptions.radialColumn.link |
| `plotOptions.radialColumn.layers[].link.mode` | <code>'none' \| 'category' \| 'angle' \| 'map' \| 'auto'</code> | auto (default): a datum's own link, else matching category names, else the angle span |
| `plotOptions.radialColumn.layers[].link.map` | <code>((segment: RadialLinkSegment) =&gt; Array&lt;number \| string&gt; \| null \| undefined) \| Record&lt;string, Array&lt;number \| string&gt;&gt;</code> | map mode: a function or an object keyed by 'A › B' path or name; values are category indices or names |
| `plotOptions.radialColumn.layers[].link.interaction` | <code>'highlight' \| 'filter' \| 'both'</code> | highlight on hover, filter (cross-filter / values) on click, or both. Default 'highlight' |
| `plotOptions.radialColumn.layers[].link.bidirectional` | <code>boolean</code> | hovering a bar also lights its segments (default true) |
| `plotOptions.radialColumn.layers[].link.align` | <code>boolean</code> | segments span exactly the angle of their linked bars (default false) |
| `plotOptions.radialColumn.layers[].link.indicator` | <code>boolean</code> | bracket arc on the outer edge over the linked bars (default true) |
| `plotOptions.radialColumn.layers[].link.unit` | <code>string</code> | what a category is, for tooltips and announcements ('18 of 72 time slots'). Default 'categories'. Name the real unit: categories that combine several things (service × day) are 'service-days', not 'days'. |
| `plotOptions.radialColumn.layers[].link.basis` | <code>string</code> | how the categories are composed, appended in brackets ('18 of 140 service-days (10 services × 14 days)'). Default: none |
| `plotOptions.radialColumn.layers[].align` | <code>boolean</code> | shorthand for link.align |
| `plotOptions.radialColumn.layers[].trackColor` | <code>string</code> | Track colour of arc, goals and gauge layers; not set uses a faint text tone (goals: a tone of the ring colour). |
| `plotOptions.radialColumn.layers[].startAngle` | <code>number</code> | degrees, 0 = 12 o'clock, clockwise; default: the chart's range |
| `plotOptions.radialColumn.layers[].endAngle` | <code>number</code> | End angle in degrees (same convention as `startAngle`); not set uses the chart's range. |
| `plotOptions.radialColumn.layers[].min` | <code>number</code> | arc layers: value range of a full arc (default 0..100; per point via datum.max); wave: base of the height scale (default min(0, data)) |
| `plotOptions.radialColumn.layers[].max` | <code>number</code> | Arc layers: value of a full arc. Default: `100`. Wave: top of the height scale (default: the data, envelopes and forecasts rounded up to a nice tick). |
| `plotOptions.radialColumn.layers[].color` | <code>RadialMatrixScale \| string</code> | heatmap / matrix: base colour of the default ramp (surface tone -&gt; colour -&gt; towards the text colour); colors (2+) overrides the ramp. matrix (value mode) also takes a colour scale. |
| `plotOptions.radialColumn.layers[].color.scale` | <code>'sequential' \| 'diverging'</code> | `'sequential'` (low to high) or `'diverging'` around `mid`. Default: `'sequential'`. |
| `plotOptions.radialColumn.layers[].color.domain` | <code>number[]</code> | [lo, hi] or [lo, mid, hi]; default: data extent. |
| `plotOptions.radialColumn.layers[].color.mid` | <code>number</code> | Diverging centre. Default: `0`. |
| `plotOptions.radialColumn.layers[].color.stops` | <code>string[]</code> | Colour stops, low to high. |
| `plotOptions.radialColumn.layers[].color.reverse` | <code>boolean</code> | Reverses the colour stops. Default: `false`. |
| `plotOptions.radialColumn.layers[].groups` | <code>RadialChordGroup[]</code> | chord: group definitions (order, names, colours, linked categories) |
| `plotOptions.radialColumn.layers[].groups[].id` | <code>string</code> | Group id used in the flows. |
| `plotOptions.radialColumn.layers[].groups[].name` | <code>string</code> | Shown name; not set uses the id. |
| `plotOptions.radialColumn.layers[].groups[].color` | <code>string</code> | Group colour. |
| `plotOptions.radialColumn.layers[].groups[].values` | <code>number[]</code> | per-group values (shown in its tooltip) |
| `plotOptions.radialColumn.layers[].groups[].link` | <code>string \| number \| Array&lt;string \| number&gt;</code> | categories (names or indices) of the column ring this group links to (overrides link.map) |
| `plotOptions.radialColumn.layers[].matrix` | <code>number[][]</code> | chord: a square flow matrix instead of data; row = source, column = target (with labels) |
| `plotOptions.radialColumn.layers[].directed` | <code>boolean</code> | chord: directed flows give each end its own share (A-&gt;B and B-&gt;A differ) |
| `plotOptions.radialColumn.layers[].sort` | <code>'none' \| 'asc' \| 'desc'</code> | chord: order of the groups around the ring (default: as given) |
| `plotOptions.radialColumn.layers[].ringWidth` | <code>number</code> | chord: px width of the group arcs (default: the layer thickness) |
| `plotOptions.radialColumn.layers[].ribbon` | <code>object</code> | chord ribbons |
| `plotOptions.radialColumn.layers[].ribbon.opacity` | <code>number</code> | Ribbon opacity; not set uses 0.52 (0.6 in dark mode). |
| `plotOptions.radialColumn.layers[].ribbon.colorMode` | <code>'source' \| 'target' \| 'gradient'</code> | Ribbon colour from the `'source'` group, the `'target'` group, or a `'gradient'` between both. Default: `'source'`. |
| `plotOptions.radialColumn.layers[].ribbon.padding` | <code>number</code> | Gap between the group arcs and the ribbon ends in px. Default: `2`. |
| `plotOptions.radialColumn.layers[].target` | <code>number</code> | goals: default target of every ring (datum target/max wins; default 100) |
| `plotOptions.radialColumn.layers[].maxLaps` | <code>number</code> | goals: laps drawn past 100 % (default 2, i.e. up to 300 %) |
| `plotOptions.radialColumn.layers[].ringLabels` | <code>boolean</code> | curved labels on the segments: goals from the ring start (default true); any other layer centred on each segment, upright in the lower half (default false) |
| `plotOptions.radialColumn.layers[].ringTitles` | <code>boolean</code> | incident: name the heatmap rings (curved, in the gap outside each ring, at 12 o'clock) and add their colour scales to the key under the ring (default true) |
| `plotOptions.radialColumn.layers[].legendTitle` | <code>string</code> | header of this layer's entries in a right-hand legend (e.g. 'Regions'); entries of consecutive layers sharing a title form one group |
| `plotOptions.radialColumn.layers[].rows` | <code>Array&lt;string \| RadialMatrixHeader \| RadialVitalsRow&gt;</code> | matrix: row headers (ids, or definitions with keys / link); default: the ids used in flow data |
| `plotOptions.radialColumn.layers[].cols` | <code>Array&lt;string \| RadialMatrixHeader&gt;</code> | matrix: column headers; default: the rows (square adjacency matrix) |
| `plotOptions.radialColumn.layers[].statuses` | <code>Record&lt;string, RadialMatrixStatus&gt;</code> | matrix: adds or overrides statuses (built in: ok, info, warn, crit, unknown) |
| `plotOptions.radialColumn.layers[].headers` | <code>object \| boolean</code> | matrix: row / column header labels (false hides them) |
| `plotOptions.radialColumn.layers[].headers.show` | <code>boolean</code> | `false` hides the headers. Default: `true`. |
| `plotOptions.radialColumn.layers[].headers.fontSize` | <code>number</code> | Largest header font size in px; it shrinks to 9 px before labels are cut. Default: theme font size − 1. |
| `plotOptions.radialColumn.layers[].headers.readability` | <code>RadialReadability</code> | Label readability of the headers (explicit modes only, e.g. 'pill' / 'halo'). |
| `plotOptions.radialColumn.layers[].headers.readability.mode` | <code>'none' \| 'halo' \| 'pill' \| 'auto' \| 'hide'</code> | 'auto' (default where on): nothing for labels off the marks, a contrasting text colour over one fill, a pill over mixed fills; 'hide' = skip labels that sit on marks |
| `plotOptions.radialColumn.layers[].headers.readability.fallback` | <code>'pill' \| 'halo' \| 'hide'</code> | what 'auto' escalates to over mixed fills or when no text colour reaches minRatio. Default 'pill' |
| `plotOptions.radialColumn.layers[].headers.readability.enabled` | <code>boolean</code> | false switches the treatment off for this label kind |
| `plotOptions.radialColumn.layers[].headers.readability.contrast` | <code>boolean</code> | swap the text to `light`/`dark` when it misses minRatio against what is under it (any mode) |
| `plotOptions.radialColumn.layers[].headers.readability.minRatio` | <code>number</code> | WCAG 2 contrast ratio to reach. Default 4.5 |
| `plotOptions.radialColumn.layers[].headers.readability.light` | <code>string</code> | text/backdrop colour pair used by contrast and 'auto' fills. Defaults '#ffffff' / '#111827' |
| `plotOptions.radialColumn.layers[].headers.readability.dark` | <code>string</code> | Dark colour of the pair. Default: `'#111827'`. |
| `plotOptions.radialColumn.layers[].headers.readability.background` | <code>'auto' \| string</code> | colour under the chart; 'auto' = chart.background, else the first opaque ancestor |
| `plotOptions.radialColumn.layers[].headers.readability.halo` | <code>object</code> | outline behind the glyphs; blur &gt; 0 makes it a soft glow. Defaults width 3, color 'auto' (chart background), opacity 0.92 |
| `plotOptions.radialColumn.layers[].headers.readability.halo.width` | <code>number</code> | Outline width in pixels. Default: `3`. |
| `plotOptions.radialColumn.layers[].headers.readability.halo.color` | <code>'auto' \| string</code> | Outline colour; 'auto' uses the colour under the label or a contrasting one. Default: `'auto'`. |
| `plotOptions.radialColumn.layers[].headers.readability.halo.opacity` | <code>number</code> | Outline opacity (0 to 1). Default: `0.92`. |
| `plotOptions.radialColumn.layers[].headers.readability.halo.blur` | <code>number</code> | Blur in pixels; above 0 the outline becomes a soft glow. Default: `0`. |
| `plotOptions.radialColumn.layers[].headers.readability.pill` | <code>object</code> | backdrop box. padding = [vertical, horizontal]; offset = [dx, dy] px. Defaults fill 'auto', opacity 0.9, radius 4, padding [1, 4] |
| `plotOptions.radialColumn.layers[].headers.readability.pill.fill` | <code>'auto' \| string</code> | Box colour; 'auto' uses the colour under the label or a contrasting one. Default: `'auto'`. |
| `plotOptions.radialColumn.layers[].headers.readability.pill.opacity` | <code>number</code> | Box opacity (0 to 1). Default: `0.9`. |
| `plotOptions.radialColumn.layers[].headers.readability.pill.radius` | <code>number</code> | Corner radius in pixels. Default: `4`. |
| `plotOptions.radialColumn.layers[].headers.readability.pill.padding` | <code>number \| [number, number]</code> | Space around the text in pixels: one number, or [vertical, horizontal]. Default: `[1, 4]`. |
| `plotOptions.radialColumn.layers[].headers.readability.pill.stroke` | <code>string</code> | Outline colour of the box. Default: `'none'`. |
| `plotOptions.radialColumn.layers[].headers.readability.pill.strokeWidth` | <code>number</code> | Outline width in pixels. Default: `1`. |
| `plotOptions.radialColumn.layers[].headers.readability.pill.offset` | <code>[number, number]</code> | Shift of the box as [dx, dy] in pixels. Default: `[0, 0]`. |
| `plotOptions.radialColumn.layers[].headers.readability.shadow` | <code>object \| boolean</code> | drop shadow on the pill (on the text in halo mode) |
| `plotOptions.radialColumn.layers[].headers.readability.shadow.dx` | <code>number</code> | Horizontal shadow offset in pixels. Default: `0`. |
| `plotOptions.radialColumn.layers[].headers.readability.shadow.dy` | <code>number</code> | Vertical shadow offset in pixels. Default: `1`. |
| `plotOptions.radialColumn.layers[].headers.readability.shadow.blur` | <code>number</code> | Shadow blur in pixels. Default: `2`. |
| `plotOptions.radialColumn.layers[].headers.readability.shadow.color` | <code>string</code> | Shadow colour. Default: `'#000000'`. |
| `plotOptions.radialColumn.layers[].headers.readability.shadow.opacity` | <code>number</code> | Shadow opacity (0 to 1). Default: `0.35`. |
| `plotOptions.radialColumn.layers[].headers.readability.raise` | <code>boolean</code> | axis labels sitting on marks are moved above the series (default true) |
| `plotOptions.radialColumn.layers[].headers.readability.each` | <code>(info: WccReadabilityInfo) =&gt; WccReadability \| null \| undefined</code> | per label: return an override (or 'none') for this one label; called only when set |
| `plotOptions.radialColumn.layers[].values` | <code>boolean \| 'auto'</code> | matrix: print the value inside a cell ('auto': when it fits). Default: `'auto'`. |
| `plotOptions.radialColumn.layers[].minCell` | <code>number</code> | matrix: smallest cell in px before rows / columns are merged or dropped. Default: `6`. |
| `plotOptions.radialColumn.layers[].overflow` | <code>'aggregate' \| 'truncate'</code> | matrix: rows / columns past minCell merge into one '+N' row / column ('aggregate'), or are dropped with a '+N' note ('truncate'). Default: `'aggregate'`. |
| `plotOptions.radialColumn.layers[].aggregate` | <code>'sum' \| 'max' \| 'mean' \| 'min' \| 'median' \| 'last'</code> | matrix: how merged cells and row / column headers combine values (statuses: always the worst). Default: `'sum'` (header tooltip 'Total'); use 'max' / 'mean' / 'min' for non-additive cells such as latencies or rates ('Highest', 'Average', 'Lowest'). |
| `plotOptions.radialColumn.layers[].inset` | <code>number</code> | matrix: px between the grid (with its headers) and the edge of the centre disc. Default: `6`. |
| `plotOptions.radialColumn.layers[].unit` | <code>string</code> | matrix: appended to values in cells, tooltip and table; heatmap: appended to the value in the slot tooltip |
| `plotOptions.radialColumn.layers[].value` | <code>number</code> | gauge: the value (else data[0]) |
| `plotOptions.radialColumn.layers[].follow` | <code>string \| number \| boolean</code> | gauge: take the latest value of this column series (name, index or true = first); it stays in the ring |
| `plotOptions.radialColumn.layers[].bandsLow` | <code>RadialVitalsBand[]</code> | gauge: colour by value band, ascending: [{ to: 60, color }] Span lower-value bands. Missing keeps the generic shared fallback; choose a policy explicitly to avoid a warning. |
| `plotOptions.radialColumn.layers[].bandsLow[].to` | <code>number</code> | Upper value of the band (inclusive); omitted on the last band. |
| `plotOptions.radialColumn.layers[].bandsLow[].level` | <code>0 \| 1 \| 2 \| 3</code> | 0 = normal ... 3 = highest; colour + pattern. |
| `plotOptions.radialColumn.layers[].bandsLow[].label` | <code>string</code> | Text of the band in tooltip and table. |
| `plotOptions.radialColumn.layers[].bandsLowPolicy` | <code>'high-only' \| 'shared'</code> | Span classification when bandsLow is absent; generic span default is shared, VitalsClock defaults high-only. |
| `plotOptions.radialColumn.layers[].bands` | <code>RadialVitalsBand[] \| Array&lt;{ /** Upper value of the band (inclusive). */ to: number /** Arc colour for values in the band. */ color: string }&gt;</code> |  |
| `plotOptions.radialColumn.layers[].bands[].to` | <code>number</code> | Upper value of the band (inclusive); omitted on the last band. |
| `plotOptions.radialColumn.layers[].bands[].level` | <code>0 \| 1 \| 2 \| 3</code> | 0 = normal ... 3 = highest; colour + pattern. |
| `plotOptions.radialColumn.layers[].bands[].label` | <code>string</code> | Text of the band in tooltip and table. |
| `plotOptions.radialColumn.layers[].formatter` | <code>(value: number) =&gt; string</code> | gauge: value formatter (centre, min/max ticks, tooltip) |
| `plotOptions.radialColumn.layers[].center` | <code>boolean</code> | gauge: show the value in the chart centre (default true) |
| `plotOptions.radialColumn.layers[].scale` | <code>boolean \| 'linear' \| 'log'</code> | gauge: min/max labels at the ends of a partial arc (boolean, default true); heatmap: colour scale, 'log' spaces the ramp by ratio (positive values; default 'linear') |
| `plotOptions.radialColumn.layers[].now` | <code>object \| boolean \| number \| string</code> | gauge with follow: the 'now' tick over the newest slot (default true) |
| `plotOptions.radialColumn.layers[].now.label` | <code>string</code> | Text of the tick. Default: `'now'`. |
| `plotOptions.radialColumn.layers[].now.color` | <code>string</code> | Tick colour; not set uses the gauge colour. |
| `plotOptions.radialColumn.layers[].time` | <code>object</code> | trace / span / vitalsNow (layers/vitals): the window the ring shows, ms or ISO. |
| `plotOptions.radialColumn.layers[].time.start` | <code>number \| string</code> |  |
| `plotOptions.radialColumn.layers[].time.end` | <code>number \| string</code> |  |
| `plotOptions.radialColumn.layers[].upto` | <code>number</code> | bands / trace / span (layers/vitals): index of the current slot; later slots are "no data yet". |
| `plotOptions.radialColumn.layers[].endLabel` | <code>string</code> | bands (layers/vitals): end label of the last slot (e.g. '24:00'); not set uses the last slot label. |
| `plotOptions.radialColumn.layers[].gapAfter` | <code>number</code> | trace / span (layers/vitals): a gap longer than this many minutes breaks the line. Default: 3 slots. |
| `plotOptions.radialColumn.layers[].alarms` | <code>Array&lt;{ from: number \| string, to?: number \| string, label?: string }&gt;</code> | vitalsNow (layers/vitals): caller alarm windows, drawn as wedges. |
| `plotOptions.radialColumn.layers[].status` | <code>Array&lt;{ name: string, text: string, ago?: number, stale?: boolean }&gt;</code> | vitalsNow (layers/vitals): last value per parameter in the strip under the ring. |
| `plotOptions.radialColumn.layers[].note` | <code>string</code> | vitalsNow (layers/vitals): a note in the strip, e.g. 'Demo data'. |
| `plotOptions.radialColumn.layers[].mode` | <code>'ridge' \| 'overlay' \| 'stack' \| 'auto' \| 'value' \| 'status'</code> | wave: 'ridge' (default) staggers the rows in lanes that rise into the lane behind them; 'overlay' shares one translucent band; 'stack' piles the rows. matrix: 'status' colours cells by severity with patterns; 'auto' (default) = status once any cell has one; 'value' = value scale. |
| `plotOptions.radialColumn.layers[].overlap` | <code>number</code> | wave ridge: how far a wave may rise into the lanes behind it, in lane steps (default 0.8; 0 = no overlap) |
| `plotOptions.radialColumn.layers[].sectors` | <code>number \| Array&lt;string \| RadialWaveSector&gt;</code> | wave: the equal sectors (cycles) of the ring - a count, or names / objects in order (default 1) |
| `plotOptions.radialColumn.layers[].sectorLabels` | <code>boolean</code> | wave: curved sector names on a band at the inner edge (default true when there are 2+ sectors and room) |
| `plotOptions.radialColumn.layers[].depth` | <code>number</code> | wave: shading from crest to base, 0 = flat .. 1 = deep (default 0.55) |
| `plotOptions.radialColumn.layers[].curve` | <code>'smooth' \| 'linear'</code> | wave: 'smooth' monotone cubic that never overshoots the data (default) or 'linear' |
| `plotOptions.radialColumn.layers[].anomalies` | <code>RadialWaveAnomaly \| false</code> | wave: anomaly spikes. Default: points outside their envelope. A list adds or relabels points; false = none; { color } recolours the automatic ones |
| `plotOptions.radialColumn.layers[].anomalies.series` | <code>string</code> | Row name (layer-level lists; not set = every row). |
| `plotOptions.radialColumn.layers[].anomalies.at` | <code>number \| string</code> | Point index, or a point label (e.g. 'Wed 18:00'). |
| `plotOptions.radialColumn.layers[].anomalies.label` | <code>string</code> | Text in the tooltip, data table and rim marks. |
| `plotOptions.radialColumn.layers[].anomalies.kind` | <code>string</code> | Kind shown when there is no label. Default: 'Anomaly' ('Above normal' / 'Below normal' for automatic ones). |
| `plotOptions.radialColumn.layers[].anomalies.color` | <code>string</code> | Spike colour. Default: a rose red (lighter in dark mode). |

## Layer data

A segment datum of an inner layer (`RadialLayerDatum`, object form).

| Option | Type | Description |
| --- | --- | --- |
| `datum.x` | <code>string</code> | Name of the segment (alias of `name`). |
| `datum.name` | <code>string</code> | Name of the segment. |
| `datum.y` | <code>number</code> | Value of the segment (alias of `value`). |
| `datum.value` | <code>number</code> | Value of the segment. |
| `datum.color` | <code>string</code> | Colour of the segment. |
| `datum.max` | <code>number</code> | Arc and goals layers: value of a full arc for this point. |
| `datum.target` | <code>number</code> | goals: the ring's target (alias of max) |
| `datum.trackColor` | <code>string</code> | goals: track colour of this ring (default: derived from the ring colour) |
| `datum.label` | <code>string</code> | goals: ring label (default: the name) |
| `datum.children` | <code>RadialLayerDatum[]</code> | Sunburst: child segments on the next ring. |
| `datum.link` | <code>Array&lt;number \| string&gt;</code> | linked categories (indices or names) |
| `datum.keys` | <code>string[]</code> | semantic keys (e.g. a service id): marks of other layers sharing a key light together; a sunburst parent takes the union of its children |
| `datum.values` | <code>Array&lt;number \| null&gt;</code> | this segment's own outer values (filter interaction) |

## Chord groups

`layers[].groups[]` of a chord layer (`RadialChordGroup`).

| Option | Type | Description |
| --- | --- | --- |
| `groups[].id` | <code>string</code> | Group id used in the flows. |
| `groups[].name` | <code>string</code> | Shown name; not set uses the id. |
| `groups[].color` | <code>string</code> | Group colour. |
| `groups[].values` | <code>number[]</code> | per-group values (shown in its tooltip) |
| `groups[].link` | <code>string \| number \| Array&lt;string \| number&gt;</code> | categories (names or indices) of the column ring this group links to (overrides link.map) |

## plotOptions.quint

Chart types `quintTimeline` and `quintConvergence` (`WccQuintOptions`), premium type module `west-coast-charts/layers/quint`.

| Option | Type | Description |
| --- | --- | --- |
| `plotOptions.quint.plugins` | <code>WccPremiumPluginRef[]</code> | Plugins of this chart: plugin objects, registered names, or `[nameOrPlugin, options]`. |
| `plotOptions.quint.plugins[].name` | <code>string</code> | Plugin id (state key and warnings); not set uses `plugin-&lt;index&gt;`. |
| `plotOptions.quint.plugins[].defaults` | <code>object</code> | Default options of the plugin; the `[nameOrPlugin, options]` form overrides them. |
| `plotOptions.quint.plugins[].reserve()` | <code>(p: any): { top?: number; right?: number; bottom?: number; left?: number } \| void</code> | `(p) =&gt; { top, right, bottom, left }`: space in px taken from the plot before layout. |
| `plotOptions.quint.plugins[].afterRender()` | <code>(p: any): void</code> | `(p)`: called after each render; draw into `p.layer()` and bind events with `p.on()`. |
| `plotOptions.quint.plugins[].event()` | <code>(name: string, e: Event \| null, payload: any, p: any): boolean \| void</code> | `(name, e, payload, p)`: called for every chart event; returning `false` cancels a cancelable one. |
| `plotOptions.quint.plugins[].tooltip()` | <code>(content: any, p: any): any</code> | `(content, p) =&gt; content`: changes the tooltip content (rows, footer, …). |
| `plotOptions.quint.plugins[].describe()` | <code>(p: any): string</code> | `(p) =&gt; string` appended to the screen-reader summary. |
| `plotOptions.quint.plugins[].destroy()` | <code>(p: any): void</code> | `(p)`: called before each redraw and on destroy. |
| `plotOptions.quint.time` | <code>object</code> | The slots: slot i covers `start + i × step` to `start + (i + 1) × step`. |
| `plotOptions.quint.time.start` | <code>string \| number</code> | First slot: ISO string or ms. |
| `plotOptions.quint.time.step` | <code>number</code> | Slot length in ms. |
| `plotOptions.quint.lanes` | <code>WccQuintLane[]</code> | The lanes, top to bottom. |
| `plotOptions.quint.lanes[].id` | <code>string</code> | Lane id; series name it in `lane`. |
| `plotOptions.quint.lanes[].kind` | <code>'events' \| 'heatmap' \| 'budget' \| 'lines' \| 'stacked'</code> | `'events'` columns (counts per slot, colour = error rate), `'heatmap'` one strip per series, `'budget'` error budget left per series (%), `'lines'`, `'stacked'` areas. |
| `plotOptions.quint.lanes[].title` | <code>string</code> | Lane title. Default: the kind's name. |
| `plotOptions.quint.lanes[].unit` | <code>string</code> | Unit of the values, used on the lane, in tooltips, the CSV export and describe(): `'requests / 10 min'`, `'€ / h'`, `'ms'`, `'%'`. |
| `plotOptions.quint.lanes[].aggregate` | <code>'sum' \| 'mean' \| 'max' \| 'min' \| 'last'</code> | How the values add up over time in describe() and the a11y items. Default: events `'sum'`, budget `'last'`, others `'mean'`. |
| `plotOptions.quint.lanes[].color` | <code>string</code> | Lane colour (events columns without errorRate, heatmap ramp). |
| `plotOptions.quint.lanes[].max` | <code>number</code> | Upper end of the value axis; not set uses the data. |
| `plotOptions.quint.lanes[].height` | <code>number</code> | Lane height in px; not set shares the free height (events 1, lines 1.25, stacked 1). |
| `plotOptions.quint.markers` | <code>object[]</code> | Deploys (◆) and pipeline runs (●) on the events lane. The deploy within 2 h before the first incident that shares one of its keys is marked as the likely cause. |
| `plotOptions.quint.markers[].time` | <code>string \| number</code> |  |
| `plotOptions.quint.markers[].kind` | <code>'deploy' \| 'pipeline'</code> |  |
| `plotOptions.quint.markers[].label` | <code>string</code> |  |
| `plotOptions.quint.markers[].keys` | <code>string[] \| string</code> |  |
| `plotOptions.quint.markers[].emphasis` | <code>boolean</code> |  |
| `plotOptions.quint.incidents` | <code>object[]</code> | Incident bands across all lanes. |
| `plotOptions.quint.incidents[].from` | <code>string \| number</code> |  |
| `plotOptions.quint.incidents[].to` | <code>string \| number</code> |  |
| `plotOptions.quint.incidents[].label` | <code>string</code> |  |
| `plotOptions.quint.incidents[].keys` | <code>string[] \| string</code> |  |
| `plotOptions.quint.utc` | <code>boolean</code> | Time labels in UTC (with "UTC" in the export header) or local time. Default: `true`. |
| `plotOptions.quint.errorRate` | <code>object</code> | Error-rate classes of the events columns in %: below `warn`, `warn`–`critical`, above. Default: `{ warn: 1, critical: 5 }`. |
| `plotOptions.quint.errorRate.warn` | <code>number</code> |  |
| `plotOptions.quint.errorRate.critical` | <code>number</code> |  |
| `plotOptions.quint.lens` | <code>object</code> | Focus lens: magnifies the time axis between `from` and `to` (default: the first incident ± max(3 slots, 30 min)) by `factor` relative to the rest of the axis (1.5–12, default 4). Values are never changed. Shown as a header chip (a button: click or L toggles it), on the axis and in describe(). Default: on for quintConvergence, off for quintTimeline. |
| `plotOptions.quint.lens.enabled` | <code>boolean</code> |  |
| `plotOptions.quint.lens.factor` | <code>number</code> |  |
| `plotOptions.quint.lens.from` | <code>string \| number</code> |  |
| `plotOptions.quint.lens.to` | <code>string \| number</code> |  |
| `plotOptions.quint.lens.pad` | <code>number</code> |  |
| `plotOptions.quint.focus` | <code>object</code> | Incident callouts: one value per lane at the incident, wired to its start. Default: on for quintConvergence. |
| `plotOptions.quint.focus.enabled` | <code>boolean</code> |  |
| `plotOptions.quint.crosshair` | <code>boolean</code> | Shared crosshair over all lanes. Default: `true`. |
| `plotOptions.quint.legend` | <code>object</code> | Legend below the lanes. Default: `{ show: true }`. |
| `plotOptions.quint.legend.show` | <code>boolean</code> |  |

## plotOptions.quint.lanes[]

One lane (`WccQuintLane`), top to bottom.

| Option | Type | Description |
| --- | --- | --- |
| `plotOptions.quint.lanes[].id` | <code>string</code> | Lane id; series name it in `lane`. |
| `plotOptions.quint.lanes[].kind` | <code>'events' \| 'heatmap' \| 'budget' \| 'lines' \| 'stacked'</code> | `'events'` columns (counts per slot, colour = error rate), `'heatmap'` one strip per series, `'budget'` error budget left per series (%), `'lines'`, `'stacked'` areas. |
| `plotOptions.quint.lanes[].title` | <code>string</code> | Lane title. Default: the kind's name. |
| `plotOptions.quint.lanes[].unit` | <code>string</code> | Unit of the values, used on the lane, in tooltips, the CSV export and describe(): `'requests / 10 min'`, `'€ / h'`, `'ms'`, `'%'`. |
| `plotOptions.quint.lanes[].aggregate` | <code>'sum' \| 'mean' \| 'max' \| 'min' \| 'last'</code> | How the values add up over time in describe() and the a11y items. Default: events `'sum'`, budget `'last'`, others `'mean'`. |
| `plotOptions.quint.lanes[].color` | <code>string</code> | Lane colour (events columns without errorRate, heatmap ramp). |
| `plotOptions.quint.lanes[].max` | <code>number</code> | Upper end of the value axis; not set uses the data. |
| `plotOptions.quint.lanes[].height` | <code>number</code> | Lane height in px; not set shares the free height (events 1, lines 1.25, stacked 1). |

## plotOptions.vitalsClock

Chart type `vitalsClock` (`WccVitalsClockOptions`), premium type module `west-coast-charts/layers/vitals` ([guide](https://westcoast-charts.com/docs/medical/index.md)).

| Option | Type | Description |
| --- | --- | --- |
| `plotOptions.vitalsClock.plugins` | <code>WccPremiumPluginRef[]</code> | Plugins of this chart: plugin objects, registered names, or `[nameOrPlugin, options]`. |
| `plotOptions.vitalsClock.plugins[].name` | <code>string</code> | Plugin id (state key and warnings); not set uses `plugin-&lt;index&gt;`. |
| `plotOptions.vitalsClock.plugins[].defaults` | <code>object</code> | Default options of the plugin; the `[nameOrPlugin, options]` form overrides them. |
| `plotOptions.vitalsClock.plugins[].reserve()` | <code>(p: any): { top?: number; right?: number; bottom?: number; left?: number } \| void</code> | `(p) =&gt; { top, right, bottom, left }`: space in px taken from the plot before layout. |
| `plotOptions.vitalsClock.plugins[].afterRender()` | <code>(p: any): void</code> | `(p)`: called after each render; draw into `p.layer()` and bind events with `p.on()`. |
| `plotOptions.vitalsClock.plugins[].event()` | <code>(name: string, e: Event \| null, payload: any, p: any): boolean \| void</code> | `(name, e, payload, p)`: called for every chart event; returning `false` cancels a cancelable one. |
| `plotOptions.vitalsClock.plugins[].tooltip()` | <code>(content: any, p: any): any</code> | `(content, p) =&gt; content`: changes the tooltip content (rows, footer, …). |
| `plotOptions.vitalsClock.plugins[].describe()` | <code>(p: any): string</code> | `(p) =&gt; string` appended to the screen-reader summary. |
| `plotOptions.vitalsClock.plugins[].destroy()` | <code>(p: any): void</code> | `(p)`: called before each redraw and on destroy. |
| `plotOptions.vitalsClock.time` | <code>object</code> | The window: start (ms or ISO), span ('24h', '12h') and slot length ('60min'). |
| `plotOptions.vitalsClock.time.start` | <code>number \| string</code> |  |
| `plotOptions.vitalsClock.time.span` | <code>string</code> |  |
| `plotOptions.vitalsClock.time.step` | <code>string</code> |  |
| `plotOptions.vitalsClock.now` | <code>number \| string</code> | Snapshot cutoff for all measurement channels; future measurements are excluded. |
| `plotOptions.vitalsClock.followNow` | <code>boolean</code> | Advance now to later appended measurements. Historical arrivals never move it backwards. Default: `false`. |
| `plotOptions.vitalsClock.timeZone` | <code>string</code> | IANA zone of the labels. Default: the runtime's zone. |
| `plotOptions.vitalsClock.params` | <code>WccVitalsParam[]</code> | The parameters, outermost ring first. |
| `plotOptions.vitalsClock.params[].id` | <code>string</code> | Parameter id. |
| `plotOptions.vitalsClock.params[].title` | <code>string</code> | Ring title, e.g. 'Herzfrequenz'. |
| `plotOptions.vitalsClock.params[].short` | <code>string</code> | Short name in the status strip and describe(), e.g. 'HF'. |
| `plotOptions.vitalsClock.params[].unit` | <code>string</code> | Unit, e.g. '/min', '%', 'mmHg'. |
| `plotOptions.vitalsClock.params[].kind` | <code>'columns' \| 'cells' \| 'trace' \| 'range'</code> | 'columns' = the column ring (median per slot), 'cells' = band cells, 'trace' = line at true times, 'range' = high / low pairs. |
| `plotOptions.vitalsClock.params[].aggregate` | <code>'median' \| 'min' \| 'max' \| 'last' \| 'mean'</code> | Per-slot aggregation for columns and cells. Default: `'median'`. |
| `plotOptions.vitalsClock.params[].bands` | <code>RadialVitalsBand[]</code> | The caller's threshold bands (no built-in clinical thresholds). |
| `plotOptions.vitalsClock.params[].bands[].to` | <code>number</code> | Upper value of the band (inclusive); omitted on the last band. |
| `plotOptions.vitalsClock.params[].bands[].level` | <code>0 \| 1 \| 2 \| 3</code> | 0 = normal ... 3 = highest; colour + pattern. |
| `plotOptions.vitalsClock.params[].bands[].label` | <code>string</code> | Text of the band in tooltip and table. |
| `plotOptions.vitalsClock.params[].data` | <code>Array&lt;[number \| string, number] \| [number \| string, number, number]&gt;</code> | Measurements: [time, value] or, for 'range', [time, high, low]; time = ms or ISO. |
| `plotOptions.vitalsClock.params[].staleAfter` | <code>number \| string</code> | After this long the last value is shown as stale: minutes, or a duration such as '4h'. |
| `plotOptions.vitalsClock.params[].decimals` | <code>number</code> | Decimals at most in labels and tooltips. Default: 1. |
| `plotOptions.vitalsClock.params[].color` | <code>string</code> | Ring colour; not set uses the palette. |
| `plotOptions.vitalsClock.params[].bandsLow` | <code>RadialVitalsBand[]</code> | 'range': caller-supplied bands for the low value, independent of the high-value bands. |
| `plotOptions.vitalsClock.params[].bandsLow[].to` | <code>number</code> | Upper value of the band (inclusive); omitted on the last band. |
| `plotOptions.vitalsClock.params[].bandsLow[].level` | <code>0 \| 1 \| 2 \| 3</code> | 0 = normal ... 3 = highest; colour + pattern. |
| `plotOptions.vitalsClock.params[].bandsLow[].label` | <code>string</code> | Text of the band in tooltip and table. |
| `plotOptions.vitalsClock.params[].bandsLowPolicy` | <code>'high-only' \| 'shared'</code> | Missing low bands: classify only high (default) or explicitly share high bands. An implicit high-only fallback warns once. |
| `plotOptions.vitalsClock.params[].gapAfter` | <code>number</code> | 'trace' / 'range': a gap longer than this many minutes breaks the line. Default: 3 slots. |
| `plotOptions.vitalsClock.params[].min` | <code>number</code> | Lower end of the value scale. |
| `plotOptions.vitalsClock.params[].max` | <code>number</code> | Upper end of the value scale. |
| `plotOptions.vitalsClock.events` | <code>Array&lt;{ at: number \| string, kind?: string, label?: string }&gt;</code> | Event markers on the dial, e.g. medication. |
| `plotOptions.vitalsClock.alarms` | <code>Array&lt;{ from: number \| string, to?: number \| string, label?: string }&gt;</code> | Caller alarm windows (wedges); never computed by the chart. |
| `plotOptions.vitalsClock.core` | <code>RadialColumnLayer</code> | Any radialColumn layer from the caller for the centre, e.g. a 'matrix' of the caller's own scores. |
| `plotOptions.vitalsClock.core.type` | <code>'pie' \| 'donut' \| 'nestedDonut' \| 'sunburst' \| 'arc' \| 'radialBar' \| 'polarArea' \| 'heatmap' \| 'chord' \| 'goals' \| 'gauge' \| 'wave' \| 'matrix' \| 'incident' \| 'bands' \| 'trace' \| 'span' \| 'vitalsNow'</code> | 'radialBar' is an alias of 'arc'; 'chord' is best as the innermost layer (its ribbons fill the centre) |
| `plotOptions.vitalsClock.core.name` | <code>string</code> | Layer name (legend, tooltip, centre label of a gauge). |
| `plotOptions.vitalsClock.core.data` | <code>RadialLayerDatum[] \| Array&lt;{ /** Ring name. */ name?: string /** Segments or cells of the ring (inner first). */ data: Array&lt;RadialLayerDatum \| null&gt; }&gt; \| Ar…</code> | pie/donut/arc/polarArea: segments; nestedDonut and heatmap: rings [{ name, data }] or number[][] (innermost first, heatmap cells may be null); sunburst: a node tree; chord: flows [from, to, value] or { from, to, value }; wave: rows RadialWaveSeries[] (or one plain number array = one row) matrix: rows × cols values or status names, flows [row, col, value], or RadialMatrixCell objects incident (west-coast-charts/layers/quint): RadialIncident windows, a wedge across every ring each |
| `plotOptions.vitalsClock.core.data[].x` | <code>string</code> | Name of the segment (alias of `name`). |
| `plotOptions.vitalsClock.core.data[].name` | <code>string</code> | Name of the segment. |
| `plotOptions.vitalsClock.core.data[].y` | <code>number</code> | Value of the segment (alias of `value`). |
| `plotOptions.vitalsClock.core.data[].value` | <code>number</code> | Value of the segment. |
| `plotOptions.vitalsClock.core.data[].color` | <code>string</code> | Colour of the segment. |
| `plotOptions.vitalsClock.core.data[].max` | <code>number</code> | Arc and goals layers: value of a full arc for this point. |
| `plotOptions.vitalsClock.core.data[].target` | <code>number</code> | goals: the ring's target (alias of max) |
| `plotOptions.vitalsClock.core.data[].trackColor` | <code>string</code> | goals: track colour of this ring (default: derived from the ring colour) |
| `plotOptions.vitalsClock.core.data[].label` | <code>string</code> | goals: ring label (default: the name) |
| `plotOptions.vitalsClock.core.data[].children` | <code>RadialLayerDatum[]</code> | Sunburst: child segments on the next ring. |
| `plotOptions.vitalsClock.core.data[].link` | <code>Array&lt;number \| string&gt;</code> | linked categories (indices or names) |
| `plotOptions.vitalsClock.core.data[].keys` | <code>string[]</code> | semantic keys (e.g. a service id): marks of other layers sharing a key light together; a sunburst parent takes the union of its children |
| `plotOptions.vitalsClock.core.data[].values` | <code>Array&lt;number \| null&gt;</code> | this segment's own outer values (filter interaction) |
| `plotOptions.vitalsClock.core.data[].from` | <code>string</code> | Source group id. |
| `plotOptions.vitalsClock.core.data[].to` | <code>string</code> | Target group id. |
| `plotOptions.vitalsClock.core.data[].data` | <code>Array&lt;number \| null \| [unknown, number \| null] \| { y: number \| null }&gt;</code> | One value per point; null = gap. Numbers, [x, y] or { y }. |
| `plotOptions.vitalsClock.core.data[].envelope` | <code>object</code> | Normal range per point: a soft band behind the wave; points outside it are anomalies. |
| `plotOptions.vitalsClock.core.data[].envelope.lo` | <code>Array&lt;number \| null&gt;</code> | Lower bound per point. |
| `plotOptions.vitalsClock.core.data[].envelope.hi` | <code>Array&lt;number \| null&gt;</code> | Upper bound per point. |
| `plotOptions.vitalsClock.core.data[].forecast` | <code>object</code> | Forecast per point (usually null up to now): dashed crest, optional hatched range. |
| `plotOptions.vitalsClock.core.data[].forecast.data` | <code>Array&lt;number \| null&gt;</code> | Forecast values. |
| `plotOptions.vitalsClock.core.data[].forecast.lo` | <code>Array&lt;number \| null&gt;</code> | Lower bound of the forecast range. |
| `plotOptions.vitalsClock.core.data[].forecast.hi` | <code>Array&lt;number \| null&gt;</code> | Upper bound of the forecast range. |
| `plotOptions.vitalsClock.core.data[].anomalies` | <code>RadialWaveAnomaly[]</code> | Anomalies of this row (as layer anomalies, without series). |
| `plotOptions.vitalsClock.core.data[].anomalies[].series` | <code>string</code> | Row name (layer-level lists; not set = every row). |
| `plotOptions.vitalsClock.core.data[].anomalies[].at` | <code>number \| string</code> | Point index, or a point label (e.g. 'Wed 18:00'). |
| `plotOptions.vitalsClock.core.data[].anomalies[].label` | <code>string</code> | Text in the tooltip, data table and rim marks. |
| `plotOptions.vitalsClock.core.data[].anomalies[].kind` | <code>string</code> | Kind shown when there is no label. Default: 'Anomaly' ('Above normal' / 'Below normal' for automatic ones). |
| `plotOptions.vitalsClock.core.data[].anomalies[].color` | <code>string</code> | Spike colour. Default: a rose red (lighter in dark mode). |
| `plotOptions.vitalsClock.core.data[].row` | <code>string</code> | Row id (or name). |
| `plotOptions.vitalsClock.core.data[].col` | <code>string</code> | Column id (or name). |
| `plotOptions.vitalsClock.core.data[].status` | <code>string</code> | Status name (ok, info, warn, crit, unknown or one of `statuses`). |
| `plotOptions.vitalsClock.core.series` | <code>number \| string</code> | take the data from config.series (index or name) instead; that series leaves the column ring |
| `plotOptions.vitalsClock.core.labels` | <code>string[]</code> | segment names for plain number data; wave: point labels, one per point (e.g. '14:00 Tue') or one per sector point ('14:00', shown as 'Tue 14:00') |
| `plotOptions.vitalsClock.core.thickness` | <code>number \| string</code> | ring thickness: px, '30%' of the available radius, or a fraction (0..1) |
| `plotOptions.vitalsClock.core.gap` | <code>number</code> | px between this layer and the one inside it (default 6) |
| `plotOptions.vitalsClock.core.ringGap` | <code>number</code> | px between the rings of a nestedDonut / sunburst / arc layer (default 2) |
| `plotOptions.vitalsClock.core.padding` | <code>number</code> | constant px gap between neighbouring segments |
| `plotOptions.vitalsClock.core.corner` | <code>number</code> | corner radius of segment ends, px |
| `plotOptions.vitalsClock.core.colors` | <code>string[]</code> | Own palette of the layer; heatmap: two or more colours are the ramp stops, low to high. |
| `plotOptions.vitalsClock.core.colorBy` | <code>'spectrum'</code> | colour segments from the column ring's spectrum by angle |
| `plotOptions.vitalsClock.core.legend` | <code>boolean</code> | keep this layer's segments out of the legend |
| `plotOptions.vitalsClock.core.link` | <code>RadialColumnLink \| boolean \| RadialLinkMode</code> | link to the column ring for this layer: false = none, a mode, or options overriding plotOptions.radialColumn.link |
| `plotOptions.vitalsClock.core.link.mode` | <code>'none' \| 'category' \| 'angle' \| 'map' \| 'auto'</code> | auto (default): a datum's own link, else matching category names, else the angle span |
| `plotOptions.vitalsClock.core.link.map` | <code>((segment: RadialLinkSegment) =&gt; Array&lt;number \| string&gt; \| null \| undefined) \| Record&lt;string, Array&lt;number \| string&gt;&gt;</code> | map mode: a function or an object keyed by 'A › B' path or name; values are category indices or names |
| `plotOptions.vitalsClock.core.link.interaction` | <code>'highlight' \| 'filter' \| 'both'</code> | highlight on hover, filter (cross-filter / values) on click, or both. Default 'highlight' |
| `plotOptions.vitalsClock.core.link.bidirectional` | <code>boolean</code> | hovering a bar also lights its segments (default true) |
| `plotOptions.vitalsClock.core.link.align` | <code>boolean</code> | segments span exactly the angle of their linked bars (default false) |
| `plotOptions.vitalsClock.core.link.indicator` | <code>boolean</code> | bracket arc on the outer edge over the linked bars (default true) |
| `plotOptions.vitalsClock.core.link.unit` | <code>string</code> | what a category is, for tooltips and announcements ('18 of 72 time slots'). Default 'categories'. Name the real unit: categories that combine several things (service × day) are 'service-days', not 'days'. |
| `plotOptions.vitalsClock.core.link.basis` | <code>string</code> | how the categories are composed, appended in brackets ('18 of 140 service-days (10 services × 14 days)'). Default: none |
| `plotOptions.vitalsClock.core.align` | <code>boolean</code> | shorthand for link.align |
| `plotOptions.vitalsClock.core.trackColor` | <code>string</code> | Track colour of arc, goals and gauge layers; not set uses a faint text tone (goals: a tone of the ring colour). |
| `plotOptions.vitalsClock.core.startAngle` | <code>number</code> | degrees, 0 = 12 o'clock, clockwise; default: the chart's range |
| `plotOptions.vitalsClock.core.endAngle` | <code>number</code> | End angle in degrees (same convention as `startAngle`); not set uses the chart's range. |
| `plotOptions.vitalsClock.core.min` | <code>number</code> | arc layers: value range of a full arc (default 0..100; per point via datum.max); wave: base of the height scale (default min(0, data)) |
| `plotOptions.vitalsClock.core.max` | <code>number</code> | Arc layers: value of a full arc. Default: `100`. Wave: top of the height scale (default: the data, envelopes and forecasts rounded up to a nice tick). |
| `plotOptions.vitalsClock.core.color` | <code>RadialMatrixScale \| string</code> | heatmap / matrix: base colour of the default ramp (surface tone -&gt; colour -&gt; towards the text colour); colors (2+) overrides the ramp. matrix (value mode) also takes a colour scale. |
| `plotOptions.vitalsClock.core.color.scale` | <code>'sequential' \| 'diverging'</code> | `'sequential'` (low to high) or `'diverging'` around `mid`. Default: `'sequential'`. |
| `plotOptions.vitalsClock.core.color.domain` | <code>number[]</code> | [lo, hi] or [lo, mid, hi]; default: data extent. |
| `plotOptions.vitalsClock.core.color.mid` | <code>number</code> | Diverging centre. Default: `0`. |
| `plotOptions.vitalsClock.core.color.stops` | <code>string[]</code> | Colour stops, low to high. |
| `plotOptions.vitalsClock.core.color.reverse` | <code>boolean</code> | Reverses the colour stops. Default: `false`. |
| `plotOptions.vitalsClock.core.groups` | <code>RadialChordGroup[]</code> | chord: group definitions (order, names, colours, linked categories) |
| `plotOptions.vitalsClock.core.groups[].id` | <code>string</code> | Group id used in the flows. |
| `plotOptions.vitalsClock.core.groups[].name` | <code>string</code> | Shown name; not set uses the id. |
| `plotOptions.vitalsClock.core.groups[].color` | <code>string</code> | Group colour. |
| `plotOptions.vitalsClock.core.groups[].values` | <code>number[]</code> | per-group values (shown in its tooltip) |
| `plotOptions.vitalsClock.core.groups[].link` | <code>string \| number \| Array&lt;string \| number&gt;</code> | categories (names or indices) of the column ring this group links to (overrides link.map) |
| `plotOptions.vitalsClock.core.matrix` | <code>number[][]</code> | chord: a square flow matrix instead of data; row = source, column = target (with labels) |
| `plotOptions.vitalsClock.core.directed` | <code>boolean</code> | chord: directed flows give each end its own share (A-&gt;B and B-&gt;A differ) |
| `plotOptions.vitalsClock.core.sort` | <code>'none' \| 'asc' \| 'desc'</code> | chord: order of the groups around the ring (default: as given) |
| `plotOptions.vitalsClock.core.ringWidth` | <code>number</code> | chord: px width of the group arcs (default: the layer thickness) |
| `plotOptions.vitalsClock.core.ribbon` | <code>object</code> | chord ribbons |
| `plotOptions.vitalsClock.core.ribbon.opacity` | <code>number</code> | Ribbon opacity; not set uses 0.52 (0.6 in dark mode). |
| `plotOptions.vitalsClock.core.ribbon.colorMode` | <code>'source' \| 'target' \| 'gradient'</code> | Ribbon colour from the `'source'` group, the `'target'` group, or a `'gradient'` between both. Default: `'source'`. |
| `plotOptions.vitalsClock.core.ribbon.padding` | <code>number</code> | Gap between the group arcs and the ribbon ends in px. Default: `2`. |
| `plotOptions.vitalsClock.core.target` | <code>number</code> | goals: default target of every ring (datum target/max wins; default 100) |
| `plotOptions.vitalsClock.core.maxLaps` | <code>number</code> | goals: laps drawn past 100 % (default 2, i.e. up to 300 %) |
| `plotOptions.vitalsClock.core.ringLabels` | <code>boolean</code> | curved labels on the segments: goals from the ring start (default true); any other layer centred on each segment, upright in the lower half (default false) |
| `plotOptions.vitalsClock.core.ringTitles` | <code>boolean</code> | incident: name the heatmap rings (curved, in the gap outside each ring, at 12 o'clock) and add their colour scales to the key under the ring (default true) |
| `plotOptions.vitalsClock.core.legendTitle` | <code>string</code> | header of this layer's entries in a right-hand legend (e.g. 'Regions'); entries of consecutive layers sharing a title form one group |
| `plotOptions.vitalsClock.core.rows` | <code>Array&lt;string \| RadialMatrixHeader \| RadialVitalsRow&gt;</code> | matrix: row headers (ids, or definitions with keys / link); default: the ids used in flow data |
| `plotOptions.vitalsClock.core.cols` | <code>Array&lt;string \| RadialMatrixHeader&gt;</code> | matrix: column headers; default: the rows (square adjacency matrix) |
| `plotOptions.vitalsClock.core.statuses` | <code>Record&lt;string, RadialMatrixStatus&gt;</code> | matrix: adds or overrides statuses (built in: ok, info, warn, crit, unknown) |
| `plotOptions.vitalsClock.core.headers` | <code>object \| boolean</code> | matrix: row / column header labels (false hides them) |
| `plotOptions.vitalsClock.core.headers.show` | <code>boolean</code> | `false` hides the headers. Default: `true`. |
| `plotOptions.vitalsClock.core.headers.fontSize` | <code>number</code> | Largest header font size in px; it shrinks to 9 px before labels are cut. Default: theme font size − 1. |
| `plotOptions.vitalsClock.core.headers.readability` | <code>RadialReadability</code> | Label readability of the headers (explicit modes only, e.g. 'pill' / 'halo'). |
| `plotOptions.vitalsClock.core.headers.readability.mode` | <code>'none' \| 'halo' \| 'pill' \| 'auto' \| 'hide'</code> | 'auto' (default where on): nothing for labels off the marks, a contrasting text colour over one fill, a pill over mixed fills; 'hide' = skip labels that sit on marks |
| `plotOptions.vitalsClock.core.headers.readability.fallback` | <code>'pill' \| 'halo' \| 'hide'</code> | what 'auto' escalates to over mixed fills or when no text colour reaches minRatio. Default 'pill' |
| `plotOptions.vitalsClock.core.headers.readability.enabled` | <code>boolean</code> | false switches the treatment off for this label kind |
| `plotOptions.vitalsClock.core.headers.readability.contrast` | <code>boolean</code> | swap the text to `light`/`dark` when it misses minRatio against what is under it (any mode) |
| `plotOptions.vitalsClock.core.headers.readability.minRatio` | <code>number</code> | WCAG 2 contrast ratio to reach. Default 4.5 |
| `plotOptions.vitalsClock.core.headers.readability.light` | <code>string</code> | text/backdrop colour pair used by contrast and 'auto' fills. Defaults '#ffffff' / '#111827' |
| `plotOptions.vitalsClock.core.headers.readability.dark` | <code>string</code> | Dark colour of the pair. Default: `'#111827'`. |
| `plotOptions.vitalsClock.core.headers.readability.background` | <code>'auto' \| string</code> | colour under the chart; 'auto' = chart.background, else the first opaque ancestor |
| `plotOptions.vitalsClock.core.headers.readability.halo` | <code>object</code> | outline behind the glyphs; blur &gt; 0 makes it a soft glow. Defaults width 3, color 'auto' (chart background), opacity 0.92 |
| `plotOptions.vitalsClock.core.headers.readability.halo.width` | <code>number</code> | Outline width in pixels. Default: `3`. |
| `plotOptions.vitalsClock.core.headers.readability.halo.color` | <code>'auto' \| string</code> | Outline colour; 'auto' uses the colour under the label or a contrasting one. Default: `'auto'`. |
| `plotOptions.vitalsClock.core.headers.readability.halo.opacity` | <code>number</code> | Outline opacity (0 to 1). Default: `0.92`. |
| `plotOptions.vitalsClock.core.headers.readability.halo.blur` | <code>number</code> | Blur in pixels; above 0 the outline becomes a soft glow. Default: `0`. |
| `plotOptions.vitalsClock.core.headers.readability.pill` | <code>object</code> | backdrop box. padding = [vertical, horizontal]; offset = [dx, dy] px. Defaults fill 'auto', opacity 0.9, radius 4, padding [1, 4] |
| `plotOptions.vitalsClock.core.headers.readability.pill.fill` | <code>'auto' \| string</code> | Box colour; 'auto' uses the colour under the label or a contrasting one. Default: `'auto'`. |
| `plotOptions.vitalsClock.core.headers.readability.pill.opacity` | <code>number</code> | Box opacity (0 to 1). Default: `0.9`. |
| `plotOptions.vitalsClock.core.headers.readability.pill.radius` | <code>number</code> | Corner radius in pixels. Default: `4`. |
| `plotOptions.vitalsClock.core.headers.readability.pill.padding` | <code>number \| [number, number]</code> | Space around the text in pixels: one number, or [vertical, horizontal]. Default: `[1, 4]`. |
| `plotOptions.vitalsClock.core.headers.readability.pill.stroke` | <code>string</code> | Outline colour of the box. Default: `'none'`. |
| `plotOptions.vitalsClock.core.headers.readability.pill.strokeWidth` | <code>number</code> | Outline width in pixels. Default: `1`. |
| `plotOptions.vitalsClock.core.headers.readability.pill.offset` | <code>[number, number]</code> | Shift of the box as [dx, dy] in pixels. Default: `[0, 0]`. |
| `plotOptions.vitalsClock.core.headers.readability.shadow` | <code>object \| boolean</code> | drop shadow on the pill (on the text in halo mode) |
| `plotOptions.vitalsClock.core.headers.readability.shadow.dx` | <code>number</code> | Horizontal shadow offset in pixels. Default: `0`. |
| `plotOptions.vitalsClock.core.headers.readability.shadow.dy` | <code>number</code> | Vertical shadow offset in pixels. Default: `1`. |
| `plotOptions.vitalsClock.core.headers.readability.shadow.blur` | <code>number</code> | Shadow blur in pixels. Default: `2`. |
| `plotOptions.vitalsClock.core.headers.readability.shadow.color` | <code>string</code> | Shadow colour. Default: `'#000000'`. |
| `plotOptions.vitalsClock.core.headers.readability.shadow.opacity` | <code>number</code> | Shadow opacity (0 to 1). Default: `0.35`. |
| `plotOptions.vitalsClock.core.headers.readability.raise` | <code>boolean</code> | axis labels sitting on marks are moved above the series (default true) |
| `plotOptions.vitalsClock.core.headers.readability.each` | <code>(info: WccReadabilityInfo) =&gt; WccReadability \| null \| undefined</code> | per label: return an override (or 'none') for this one label; called only when set |
| `plotOptions.vitalsClock.core.values` | <code>boolean \| 'auto'</code> | matrix: print the value inside a cell ('auto': when it fits). Default: `'auto'`. |
| `plotOptions.vitalsClock.core.minCell` | <code>number</code> | matrix: smallest cell in px before rows / columns are merged or dropped. Default: `6`. |
| `plotOptions.vitalsClock.core.overflow` | <code>'aggregate' \| 'truncate'</code> | matrix: rows / columns past minCell merge into one '+N' row / column ('aggregate'), or are dropped with a '+N' note ('truncate'). Default: `'aggregate'`. |
| `plotOptions.vitalsClock.core.aggregate` | <code>'sum' \| 'max' \| 'mean' \| 'min' \| 'median' \| 'last'</code> | matrix: how merged cells and row / column headers combine values (statuses: always the worst). Default: `'sum'` (header tooltip 'Total'); use 'max' / 'mean' / 'min' for non-additive cells such as latencies or rates ('Highest', 'Average', 'Lowest'). |
| `plotOptions.vitalsClock.core.inset` | <code>number</code> | matrix: px between the grid (with its headers) and the edge of the centre disc. Default: `6`. |
| `plotOptions.vitalsClock.core.unit` | <code>string</code> | matrix: appended to values in cells, tooltip and table; heatmap: appended to the value in the slot tooltip |
| `plotOptions.vitalsClock.core.value` | <code>number</code> | gauge: the value (else data[0]) |
| `plotOptions.vitalsClock.core.follow` | <code>string \| number \| boolean</code> | gauge: take the latest value of this column series (name, index or true = first); it stays in the ring |
| `plotOptions.vitalsClock.core.bandsLow` | <code>RadialVitalsBand[]</code> | gauge: colour by value band, ascending: [{ to: 60, color }] Span lower-value bands. Missing keeps the generic shared fallback; choose a policy explicitly to avoid a warning. |
| `plotOptions.vitalsClock.core.bandsLow[].to` | <code>number</code> | Upper value of the band (inclusive); omitted on the last band. |
| `plotOptions.vitalsClock.core.bandsLow[].level` | <code>0 \| 1 \| 2 \| 3</code> | 0 = normal ... 3 = highest; colour + pattern. |
| `plotOptions.vitalsClock.core.bandsLow[].label` | <code>string</code> | Text of the band in tooltip and table. |
| `plotOptions.vitalsClock.core.bandsLowPolicy` | <code>'high-only' \| 'shared'</code> | Span classification when bandsLow is absent; generic span default is shared, VitalsClock defaults high-only. |
| `plotOptions.vitalsClock.core.bands` | <code>RadialVitalsBand[] \| Array&lt;{ /** Upper value of the band (inclusive). */ to: number /** Arc colour for values in the band. */ color: string }&gt;</code> |  |
| `plotOptions.vitalsClock.core.bands[].to` | <code>number</code> | Upper value of the band (inclusive); omitted on the last band. |
| `plotOptions.vitalsClock.core.bands[].level` | <code>0 \| 1 \| 2 \| 3</code> | 0 = normal ... 3 = highest; colour + pattern. |
| `plotOptions.vitalsClock.core.bands[].label` | <code>string</code> | Text of the band in tooltip and table. |
| `plotOptions.vitalsClock.core.formatter` | <code>(value: number) =&gt; string</code> | gauge: value formatter (centre, min/max ticks, tooltip) |
| `plotOptions.vitalsClock.core.center` | <code>boolean</code> | gauge: show the value in the chart centre (default true) |
| `plotOptions.vitalsClock.core.scale` | <code>boolean \| 'linear' \| 'log'</code> | gauge: min/max labels at the ends of a partial arc (boolean, default true); heatmap: colour scale, 'log' spaces the ramp by ratio (positive values; default 'linear') |
| `plotOptions.vitalsClock.core.now` | <code>object \| boolean \| number \| string</code> | gauge with follow: the 'now' tick over the newest slot (default true) |
| `plotOptions.vitalsClock.core.now.label` | <code>string</code> | Text of the tick. Default: `'now'`. |
| `plotOptions.vitalsClock.core.now.color` | <code>string</code> | Tick colour; not set uses the gauge colour. |
| `plotOptions.vitalsClock.core.time` | <code>object</code> | trace / span / vitalsNow (layers/vitals): the window the ring shows, ms or ISO. |
| `plotOptions.vitalsClock.core.time.start` | <code>number \| string</code> |  |
| `plotOptions.vitalsClock.core.time.end` | <code>number \| string</code> |  |
| `plotOptions.vitalsClock.core.upto` | <code>number</code> | bands / trace / span (layers/vitals): index of the current slot; later slots are "no data yet". |
| `plotOptions.vitalsClock.core.endLabel` | <code>string</code> | bands (layers/vitals): end label of the last slot (e.g. '24:00'); not set uses the last slot label. |
| `plotOptions.vitalsClock.core.gapAfter` | <code>number</code> | trace / span (layers/vitals): a gap longer than this many minutes breaks the line. Default: 3 slots. |
| `plotOptions.vitalsClock.core.alarms` | <code>Array&lt;{ from: number \| string, to?: number \| string, label?: string }&gt;</code> | vitalsNow (layers/vitals): caller alarm windows, drawn as wedges. |
| `plotOptions.vitalsClock.core.status` | <code>Array&lt;{ name: string, text: string, ago?: number, stale?: boolean }&gt;</code> | vitalsNow (layers/vitals): last value per parameter in the strip under the ring. |
| `plotOptions.vitalsClock.core.note` | <code>string</code> | vitalsNow (layers/vitals): a note in the strip, e.g. 'Demo data'. |
| `plotOptions.vitalsClock.core.mode` | <code>'ridge' \| 'overlay' \| 'stack' \| 'auto' \| 'value' \| 'status'</code> | wave: 'ridge' (default) staggers the rows in lanes that rise into the lane behind them; 'overlay' shares one translucent band; 'stack' piles the rows. matrix: 'status' colours cells by severity with patterns; 'auto' (default) = status once any cell has one; 'value' = value scale. |
| `plotOptions.vitalsClock.core.overlap` | <code>number</code> | wave ridge: how far a wave may rise into the lanes behind it, in lane steps (default 0.8; 0 = no overlap) |
| `plotOptions.vitalsClock.core.sectors` | <code>number \| Array&lt;string \| RadialWaveSector&gt;</code> | wave: the equal sectors (cycles) of the ring - a count, or names / objects in order (default 1) |
| `plotOptions.vitalsClock.core.sectorLabels` | <code>boolean</code> | wave: curved sector names on a band at the inner edge (default true when there are 2+ sectors and room) |
| `plotOptions.vitalsClock.core.depth` | <code>number</code> | wave: shading from crest to base, 0 = flat .. 1 = deep (default 0.55) |
| `plotOptions.vitalsClock.core.curve` | <code>'smooth' \| 'linear'</code> | wave: 'smooth' monotone cubic that never overshoots the data (default) or 'linear' |
| `plotOptions.vitalsClock.core.anomalies` | <code>RadialWaveAnomaly \| false</code> | wave: anomaly spikes. Default: points outside their envelope. A list adds or relabels points; false = none; { color } recolours the automatic ones |
| `plotOptions.vitalsClock.core.anomalies.series` | <code>string</code> | Row name (layer-level lists; not set = every row). |
| `plotOptions.vitalsClock.core.anomalies.at` | <code>number \| string</code> | Point index, or a point label (e.g. 'Wed 18:00'). |
| `plotOptions.vitalsClock.core.anomalies.label` | <code>string</code> | Text in the tooltip, data table and rim marks. |
| `plotOptions.vitalsClock.core.anomalies.kind` | <code>string</code> | Kind shown when there is no label. Default: 'Anomaly' ('Above normal' / 'Below normal' for automatic ones). |
| `plotOptions.vitalsClock.core.anomalies.color` | <code>string</code> | Spike colour. Default: a rose red (lighter in dark mode). |
| `plotOptions.vitalsClock.demo` | <code>boolean \| string</code> | Marks the chart as demo data (status strip and describe()). |
| `plotOptions.vitalsClock.radialColumn` | <code>RadialColumnOptions</code> | radialColumn options passed through. |
| `plotOptions.vitalsClock.radialColumn.readabilityWarnings` | <code>boolean</code> | Warn once if inner rings are thinner than 8 px or heat cells below 2 px per slot. No values/layers are removed. Default: `true`. |
| `plotOptions.vitalsClock.radialColumn.aggregate` | <code>'sum' \| 'mean' \| 'max' \| 'min' \| 'none'</code> | how the column values combine in the centre, the generated description, tooltip footers and the filter note. 'sum' (default) adds them into a Total — right for counts and amounts only. Use 'max' / 'min' for latencies and percentiles ('Highest p95 latency (ms): 412 (Matching · 20:00)'), 'mean' for rates, percentages and scores, 'none' to name no combined number at all. |
| `plotOptions.vitalsClock.radialColumn.link` | <code>RadialColumnLink \| RadialLinkMode</code> | links between inner layers and the column ring (a mode string or options) |
| `plotOptions.vitalsClock.radialColumn.link.mode` | <code>'none' \| 'category' \| 'angle' \| 'map' \| 'auto'</code> | auto (default): a datum's own link, else matching category names, else the angle span |
| `plotOptions.vitalsClock.radialColumn.link.map` | <code>((segment: RadialLinkSegment) =&gt; Array&lt;number \| string&gt; \| null \| undefined) \| Record&lt;string, Array&lt;number \| string&gt;&gt;</code> | map mode: a function or an object keyed by 'A › B' path or name; values are category indices or names |
| `plotOptions.vitalsClock.radialColumn.link.interaction` | <code>'highlight' \| 'filter' \| 'both'</code> | highlight on hover, filter (cross-filter / values) on click, or both. Default 'highlight' |
| `plotOptions.vitalsClock.radialColumn.link.bidirectional` | <code>boolean</code> | hovering a bar also lights its segments (default true) |
| `plotOptions.vitalsClock.radialColumn.link.align` | <code>boolean</code> | segments span exactly the angle of their linked bars (default false) |
| `plotOptions.vitalsClock.radialColumn.link.indicator` | <code>boolean</code> | bracket arc on the outer edge over the linked bars (default true) |
| `plotOptions.vitalsClock.radialColumn.link.unit` | <code>string</code> | what a category is, for tooltips and announcements ('18 of 72 time slots'). Default 'categories'. Name the real unit: categories that combine several things (service × day) are 'service-days', not 'days'. |
| `plotOptions.vitalsClock.radialColumn.link.basis` | <code>string</code> | how the categories are composed, appended in brackets ('18 of 140 service-days (10 services × 14 days)'). Default: none |
| `plotOptions.vitalsClock.radialColumn.encode` | <code>RadialColumnEncode</code> | bind colour / delta / length to separate metrics |
| `plotOptions.vitalsClock.radialColumn.encode.angle` | <code>string</code> | name of the angular dimension for the guide (default: xaxis.title.text or 'Category') |
| `plotOptions.vitalsClock.radialColumn.encode.length` | <code>'value' \| string</code> | bar length: 'value' (default) or a datum field |
| `plotOptions.vitalsClock.radialColumn.encode.color` | <code>RadialEncodeChannel \| string</code> | bar colour = a separate metric |
| `plotOptions.vitalsClock.radialColumn.encode.color.field` | <code>string</code> | Datum field of the metric (`datum.meta[field]` or `datum[field]`). |
| `plotOptions.vitalsClock.radialColumn.encode.color.values` | <code>Array&lt;number \| null&gt;</code> | One value per category instead of a field. |
| `plotOptions.vitalsClock.radialColumn.encode.color.name` | <code>string</code> | legend / tooltip name (default: the field) |
| `plotOptions.vitalsClock.radialColumn.encode.color.unit` | <code>string</code> | appended to values: '%' sticks, other units get a space |
| `plotOptions.vitalsClock.radialColumn.encode.color.decimals` | <code>number</code> | Decimals of the shown values; not set uses 0 from 100, 1 from 10, else 2. |
| `plotOptions.vitalsClock.radialColumn.encode.color.format` | <code>(value: number) =&gt; string</code> | `(value) =&gt; string` for the shown values (wins over `decimals` and `unit`). |
| `plotOptions.vitalsClock.radialColumn.encode.color.legend` | <code>boolean</code> | false: no key in the strip under the ring (default true) |
| `plotOptions.vitalsClock.radialColumn.encode.color.show` | <code>boolean</code> | `false` switches the channel off. Default: `true`. |
| `plotOptions.vitalsClock.radialColumn.encode.color.scale` | <code>'sequential' \| 'diverging'</code> | `'sequential'` (low to high) or `'diverging'` around `mid`. Default: `'sequential'`. |
| `plotOptions.vitalsClock.radialColumn.encode.color.domain` | <code>number[]</code> | [lo, hi] or [lo, mid, hi]; default: data extent (diverging: symmetric around mid) |
| `plotOptions.vitalsClock.radialColumn.encode.color.mid` | <code>number</code> | diverging centre (default 0) |
| `plotOptions.vitalsClock.radialColumn.encode.color.stops` | <code>string[]</code> | Colour stops; not set uses `['#2dd4bf', '#facc15', '#f43f5e']` (diverging: blue, a neutral tone, orange). |
| `plotOptions.vitalsClock.radialColumn.encode.color.reverse` | <code>boolean</code> | Reverses the colour stops. Default: `false`. |
| `plotOptions.vitalsClock.radialColumn.encode.delta` | <code>RadialEncodeChannel \| string</code> | change vs a previous period outside the bars |
| `plotOptions.vitalsClock.radialColumn.encode.delta.field` | <code>string</code> | Datum field of the metric (`datum.meta[field]` or `datum[field]`). |
| `plotOptions.vitalsClock.radialColumn.encode.delta.values` | <code>Array&lt;number \| null&gt;</code> | One value per category instead of a field. |
| `plotOptions.vitalsClock.radialColumn.encode.delta.name` | <code>string</code> | legend / tooltip name (default: the field) |
| `plotOptions.vitalsClock.radialColumn.encode.delta.unit` | <code>string</code> | appended to values: '%' sticks, other units get a space |
| `plotOptions.vitalsClock.radialColumn.encode.delta.decimals` | <code>number</code> | Decimals of the shown values; not set uses 0 from 100, 1 from 10, else 2. |
| `plotOptions.vitalsClock.radialColumn.encode.delta.format` | <code>(value: number) =&gt; string</code> | `(value) =&gt; string` for the shown values (wins over `decimals` and `unit`). |
| `plotOptions.vitalsClock.radialColumn.encode.delta.legend` | <code>boolean</code> | false: no key in the strip under the ring (default true) |
| `plotOptions.vitalsClock.radialColumn.encode.delta.show` | <code>boolean</code> | `false` switches the channel off. Default: `true`. |
| `plotOptions.vitalsClock.radialColumn.encode.delta.style` | <code>'band' \| 'ticks' \| 'bars'</code> | band: thin coloured ring; ticks: marks at the bar tips; bars: signed mini bars (out = up, in = down) |
| `plotOptions.vitalsClock.radialColumn.encode.delta.colors` | <code>object</code> | Colours of increases and decreases. |
| `plotOptions.vitalsClock.radialColumn.encode.delta.colors.up` | <code>string</code> | Colour of increases. Default: `'#22c55e'`. |
| `plotOptions.vitalsClock.radialColumn.encode.delta.colors.down` | <code>string</code> | Colour of decreases. Default: `'#f43f5e'`. |
| `plotOptions.vitalsClock.radialColumn.encode.delta.max` | <code>number</code> | \|value\| of full intensity / length (default: largest \|value\|) |
| `plotOptions.vitalsClock.radialColumn.encode.guide` | <code>object \| boolean</code> | '?' button with a 'how to read' panel listing every bound channel |
| `plotOptions.vitalsClock.radialColumn.encode.guide.show` | <code>boolean</code> | `false` hides the guide button. Default: `true`. |
| `plotOptions.vitalsClock.radialColumn.encode.guide.open` | <code>boolean \| 'always'</code> | start open (true: only when the chart is &gt;= 560 px wide; 'always') |
| `plotOptions.vitalsClock.radialColumn.markers` | <code>Array&lt;{ at: number \| string label?: string kind?: string color?: string shape?: 'dot' \| 'diamond' }&gt;</code> | rim marks (deploys, pipeline runs, incidents): a small glyph outside the bars at a slot, a tooltip row on that slot and a guide row |
| `plotOptions.vitalsClock.radialColumn.startAngle` | <code>number</code> | degrees, 0 = 12 o'clock, clockwise; a partial range gives a gauge |
| `plotOptions.vitalsClock.radialColumn.endAngle` | <code>number</code> | End of the range in degrees (same convention as `startAngle`). Default: `360`. |
| `plotOptions.vitalsClock.radialColumn.innerRadius` | <code>'auto' \| number \| string</code> | base radius of the bars: 'auto', px, '40%' or a fraction of the outer radius |
| `plotOptions.vitalsClock.radialColumn.barPadding` | <code>'auto' \| number</code> | gap between neighbouring slots: 'auto' or a fraction of the slot (0..0.9) |
| `plotOptions.vitalsClock.radialColumn.groupPadding` | <code>number</code> | gap between the bars of one slot when grouped (fraction) |
| `plotOptions.vitalsClock.radialColumn.stacked` | <code>boolean</code> | stack series outward (falls back to chart.stacked) |
| `plotOptions.vitalsClock.radialColumn.stackGap` | <code>number</code> | Gap between stacked segments in px. Default: `1`. |
| `plotOptions.vitalsClock.radialColumn.rounded` | <code>boolean</code> | rounded bar ends |
| `plotOptions.vitalsClock.radialColumn.fill` | <code>object</code> | Bar colours. |
| `plotOptions.vitalsClock.radialColumn.fill.type` | <code>'auto' \| 'spectrum' \| 'series' \| 'value'</code> | auto: spectrum for one uncoloured series, else series colours |
| `plotOptions.vitalsClock.radialColumn.fill.stops` | <code>string[]</code> | gradient stops (spectrum by angle, value by magnitude) |
| `plotOptions.vitalsClock.radialColumn.fill.ranges` | <code>object[]</code> | type 'value': fixed colours for value ranges (inclusive); values outside every range use the stops |
| `plotOptions.vitalsClock.radialColumn.fill.ranges[].from` | <code>number</code> | Lowest value of the range (inclusive). |
| `plotOptions.vitalsClock.radialColumn.fill.ranges[].to` | <code>number</code> | Highest value of the range (inclusive). |
| `plotOptions.vitalsClock.radialColumn.fill.ranges[].color` | <code>string</code> | Colour of bars in the range. |
| `plotOptions.vitalsClock.radialColumn.fill.fade` | <code>number</code> | inner fade of the bars, 0..1 (0 = off) |
| `plotOptions.vitalsClock.radialColumn.track` | <code>object</code> | Background track behind the bars. |
| `plotOptions.vitalsClock.radialColumn.track.show` | <code>boolean</code> | Shows the track. Default: `false`. |
| `plotOptions.vitalsClock.radialColumn.track.color` | <code>string</code> | Track colour; not set uses a faint text tone. |
| `plotOptions.vitalsClock.radialColumn.baseline` | <code>object</code> | Zero ring. |
| `plotOptions.vitalsClock.radialColumn.baseline.show` | <code>boolean</code> | Draws the ring at value 0. Default: `true`. |
| `plotOptions.vitalsClock.radialColumn.valueAxis` | <code>object</code> | Value scale of the bars. |
| `plotOptions.vitalsClock.radialColumn.valueAxis.show` | <code>boolean</code> | `false` hides the grid rings and value labels. Default: `true`. |
| `plotOptions.vitalsClock.radialColumn.valueAxis.min` | <code>number</code> | Fixed lower end; not set uses the data. |
| `plotOptions.vitalsClock.radialColumn.valueAxis.max` | <code>number</code> | Fixed upper end; not set uses the data. |
| `plotOptions.vitalsClock.radialColumn.valueAxis.tickAmount` | <code>number</code> | Target number of tick steps. Default: `4`. |
| `plotOptions.vitalsClock.radialColumn.valueAxis.nice` | <code>boolean</code> | round free ends to the tightest whole tick step (3-6 ticks); false = data extent. Default true |
| `plotOptions.vitalsClock.radialColumn.valueAxis.rings` | <code>boolean</code> | Draws the grid rings at the ticks (the value labels sit on them). Default: `true`. |
| `plotOptions.vitalsClock.radialColumn.valueAxis.labels` | <code>object</code> | Tick labels of the value scale. |
| `plotOptions.vitalsClock.radialColumn.valueAxis.labels.show` | <code>boolean</code> | Shows the tick labels. Default: `true`. |
| `plotOptions.vitalsClock.radialColumn.valueAxis.labels.formatter` | <code>(value: number) =&gt; string</code> | `(value, { w }) =&gt; string`; not set uses a compact number. |
| `plotOptions.vitalsClock.radialColumn.valueAxis.labels.readability` | <code>RadialReadability</code> | labels that sit on bars: 'auto' (default) = untouched off the bars, contrasting colour over one fill, pill over mixed fills; 'none' = off. Layered over chart.readability |
| `plotOptions.vitalsClock.radialColumn.valueAxis.labels.readability.mode` | <code>'none' \| 'halo' \| 'pill' \| 'auto' \| 'hide'</code> | 'auto' (default where on): nothing for labels off the marks, a contrasting text colour over one fill, a pill over mixed fills; 'hide' = skip labels that sit on marks |
| `plotOptions.vitalsClock.radialColumn.valueAxis.labels.readability.fallback` | <code>'pill' \| 'halo' \| 'hide'</code> | what 'auto' escalates to over mixed fills or when no text colour reaches minRatio. Default 'pill' |
| `plotOptions.vitalsClock.radialColumn.valueAxis.labels.readability.enabled` | <code>boolean</code> | false switches the treatment off for this label kind |
| `plotOptions.vitalsClock.radialColumn.valueAxis.labels.readability.contrast` | <code>boolean</code> | swap the text to `light`/`dark` when it misses minRatio against what is under it (any mode) |
| `plotOptions.vitalsClock.radialColumn.valueAxis.labels.readability.minRatio` | <code>number</code> | WCAG 2 contrast ratio to reach. Default 4.5 |
| `plotOptions.vitalsClock.radialColumn.valueAxis.labels.readability.light` | <code>string</code> | text/backdrop colour pair used by contrast and 'auto' fills. Defaults '#ffffff' / '#111827' |
| `plotOptions.vitalsClock.radialColumn.valueAxis.labels.readability.dark` | <code>string</code> | Dark colour of the pair. Default: `'#111827'`. |
| `plotOptions.vitalsClock.radialColumn.valueAxis.labels.readability.background` | <code>'auto' \| string</code> | colour under the chart; 'auto' = chart.background, else the first opaque ancestor |
| `plotOptions.vitalsClock.radialColumn.valueAxis.labels.readability.halo` | <code>object</code> | outline behind the glyphs; blur &gt; 0 makes it a soft glow. Defaults width 3, color 'auto' (chart background), opacity 0.92 |
| `plotOptions.vitalsClock.radialColumn.valueAxis.labels.readability.halo.width` | <code>number</code> | Outline width in pixels. Default: `3`. |
| `plotOptions.vitalsClock.radialColumn.valueAxis.labels.readability.halo.color` | <code>'auto' \| string</code> | Outline colour; 'auto' uses the colour under the label or a contrasting one. Default: `'auto'`. |
| `plotOptions.vitalsClock.radialColumn.valueAxis.labels.readability.halo.opacity` | <code>number</code> | Outline opacity (0 to 1). Default: `0.92`. |
| `plotOptions.vitalsClock.radialColumn.valueAxis.labels.readability.halo.blur` | <code>number</code> | Blur in pixels; above 0 the outline becomes a soft glow. Default: `0`. |
| `plotOptions.vitalsClock.radialColumn.valueAxis.labels.readability.pill` | <code>object</code> | backdrop box. padding = [vertical, horizontal]; offset = [dx, dy] px. Defaults fill 'auto', opacity 0.9, radius 4, padding [1, 4] |
| `plotOptions.vitalsClock.radialColumn.valueAxis.labels.readability.pill.fill` | <code>'auto' \| string</code> | Box colour; 'auto' uses the colour under the label or a contrasting one. Default: `'auto'`. |
| `plotOptions.vitalsClock.radialColumn.valueAxis.labels.readability.pill.opacity` | <code>number</code> | Box opacity (0 to 1). Default: `0.9`. |
| `plotOptions.vitalsClock.radialColumn.valueAxis.labels.readability.pill.radius` | <code>number</code> | Corner radius in pixels. Default: `4`. |
| `plotOptions.vitalsClock.radialColumn.valueAxis.labels.readability.pill.padding` | <code>number \| [number, number]</code> | Space around the text in pixels: one number, or [vertical, horizontal]. Default: `[1, 4]`. |
| `plotOptions.vitalsClock.radialColumn.valueAxis.labels.readability.pill.stroke` | <code>string</code> | Outline colour of the box. Default: `'none'`. |
| `plotOptions.vitalsClock.radialColumn.valueAxis.labels.readability.pill.strokeWidth` | <code>number</code> | Outline width in pixels. Default: `1`. |
| `plotOptions.vitalsClock.radialColumn.valueAxis.labels.readability.pill.offset` | <code>[number, number]</code> | Shift of the box as [dx, dy] in pixels. Default: `[0, 0]`. |
| `plotOptions.vitalsClock.radialColumn.valueAxis.labels.readability.shadow` | <code>object \| boolean</code> | drop shadow on the pill (on the text in halo mode) |
| `plotOptions.vitalsClock.radialColumn.valueAxis.labels.readability.shadow.dx` | <code>number</code> | Horizontal shadow offset in pixels. Default: `0`. |
| `plotOptions.vitalsClock.radialColumn.valueAxis.labels.readability.shadow.dy` | <code>number</code> | Vertical shadow offset in pixels. Default: `1`. |
| `plotOptions.vitalsClock.radialColumn.valueAxis.labels.readability.shadow.blur` | <code>number</code> | Shadow blur in pixels. Default: `2`. |
| `plotOptions.vitalsClock.radialColumn.valueAxis.labels.readability.shadow.color` | <code>string</code> | Shadow colour. Default: `'#000000'`. |
| `plotOptions.vitalsClock.radialColumn.valueAxis.labels.readability.shadow.opacity` | <code>number</code> | Shadow opacity (0 to 1). Default: `0.35`. |
| `plotOptions.vitalsClock.radialColumn.valueAxis.labels.readability.raise` | <code>boolean</code> | axis labels sitting on marks are moved above the series (default true) |
| `plotOptions.vitalsClock.radialColumn.valueAxis.labels.readability.each` | <code>(info: WccReadabilityInfo) =&gt; WccReadability \| null \| undefined</code> | per label: return an override (or 'none') for this one label; called only when set |
| `plotOptions.vitalsClock.radialColumn.valueAxis.labels.angle` | <code>number \| 'auto'</code> | where the scale sits: degrees (startAngle convention, 0 = 12 o'clock) or 'auto' = the slot boundary with the shortest bars on both sides. Default: the start of the range |
| `plotOptions.vitalsClock.radialColumn.valueAxis.labels.pinAngle` | <code>boolean</code> | 'auto' keeps the first angle it found across updates (no jumping scale). Default true |
| `plotOptions.vitalsClock.radialColumn.categoryLabels` | <code>object</code> | Category names around the ring. |
| `plotOptions.vitalsClock.radialColumn.categoryLabels.show` | <code>boolean</code> | Shows the category names. Default: `true`. |
| `plotOptions.vitalsClock.radialColumn.categoryLabels.orientation` | <code>'auto' \| 'horizontal' \| 'radial'</code> | `'horizontal'` or along the `'radial'` direction; `'auto'` keeps names horizontal when they fit their slot. Default: `'auto'`. |
| `plotOptions.vitalsClock.radialColumn.categoryLabels.offset` | <code>number</code> | Distance from the bars in px. Default: `8`. |
| `plotOptions.vitalsClock.radialColumn.categoryLabels.maxWidth` | <code>number</code> | Longest name in px before it is shortened. Default: `110`. |
| `plotOptions.vitalsClock.radialColumn.categoryLabels.step` | <code>number</code> | label every n-th category (disables automatic thinning) |
| `plotOptions.vitalsClock.radialColumn.categoryLabels.maxCount` | <code>number</code> | most labels to show; default from the ring length (one per ~4 font sizes, 4-24) |
| `plotOptions.vitalsClock.radialColumn.categoryLabels.formatter` | <code>(category: string, opts: { index: number }) =&gt; string</code> | `(category, { index }) =&gt; string` for the name. |
| `plotOptions.vitalsClock.radialColumn.center` | <code>object</code> | Value and label in the hole. |
| `plotOptions.vitalsClock.radialColumn.center.readability` | <code>RadialReadability</code> | centre value + label readability (explicit modes; default none) |
| `plotOptions.vitalsClock.radialColumn.center.readability.mode` | <code>'none' \| 'halo' \| 'pill' \| 'auto' \| 'hide'</code> | 'auto' (default where on): nothing for labels off the marks, a contrasting text colour over one fill, a pill over mixed fills; 'hide' = skip labels that sit on marks |
| `plotOptions.vitalsClock.radialColumn.center.readability.fallback` | <code>'pill' \| 'halo' \| 'hide'</code> | what 'auto' escalates to over mixed fills or when no text colour reaches minRatio. Default 'pill' |
| `plotOptions.vitalsClock.radialColumn.center.readability.enabled` | <code>boolean</code> | false switches the treatment off for this label kind |
| `plotOptions.vitalsClock.radialColumn.center.readability.contrast` | <code>boolean</code> | swap the text to `light`/`dark` when it misses minRatio against what is under it (any mode) |
| `plotOptions.vitalsClock.radialColumn.center.readability.minRatio` | <code>number</code> | WCAG 2 contrast ratio to reach. Default 4.5 |
| `plotOptions.vitalsClock.radialColumn.center.readability.light` | <code>string</code> | text/backdrop colour pair used by contrast and 'auto' fills. Defaults '#ffffff' / '#111827' |
| `plotOptions.vitalsClock.radialColumn.center.readability.dark` | <code>string</code> | Dark colour of the pair. Default: `'#111827'`. |
| `plotOptions.vitalsClock.radialColumn.center.readability.background` | <code>'auto' \| string</code> | colour under the chart; 'auto' = chart.background, else the first opaque ancestor |
| `plotOptions.vitalsClock.radialColumn.center.readability.halo` | <code>object</code> | outline behind the glyphs; blur &gt; 0 makes it a soft glow. Defaults width 3, color 'auto' (chart background), opacity 0.92 |
| `plotOptions.vitalsClock.radialColumn.center.readability.halo.width` | <code>number</code> | Outline width in pixels. Default: `3`. |
| `plotOptions.vitalsClock.radialColumn.center.readability.halo.color` | <code>'auto' \| string</code> | Outline colour; 'auto' uses the colour under the label or a contrasting one. Default: `'auto'`. |
| `plotOptions.vitalsClock.radialColumn.center.readability.halo.opacity` | <code>number</code> | Outline opacity (0 to 1). Default: `0.92`. |
| `plotOptions.vitalsClock.radialColumn.center.readability.halo.blur` | <code>number</code> | Blur in pixels; above 0 the outline becomes a soft glow. Default: `0`. |
| `plotOptions.vitalsClock.radialColumn.center.readability.pill` | <code>object</code> | backdrop box. padding = [vertical, horizontal]; offset = [dx, dy] px. Defaults fill 'auto', opacity 0.9, radius 4, padding [1, 4] |
| `plotOptions.vitalsClock.radialColumn.center.readability.pill.fill` | <code>'auto' \| string</code> | Box colour; 'auto' uses the colour under the label or a contrasting one. Default: `'auto'`. |
| `plotOptions.vitalsClock.radialColumn.center.readability.pill.opacity` | <code>number</code> | Box opacity (0 to 1). Default: `0.9`. |
| `plotOptions.vitalsClock.radialColumn.center.readability.pill.radius` | <code>number</code> | Corner radius in pixels. Default: `4`. |
| `plotOptions.vitalsClock.radialColumn.center.readability.pill.padding` | <code>number \| [number, number]</code> | Space around the text in pixels: one number, or [vertical, horizontal]. Default: `[1, 4]`. |
| `plotOptions.vitalsClock.radialColumn.center.readability.pill.stroke` | <code>string</code> | Outline colour of the box. Default: `'none'`. |
| `plotOptions.vitalsClock.radialColumn.center.readability.pill.strokeWidth` | <code>number</code> | Outline width in pixels. Default: `1`. |
| `plotOptions.vitalsClock.radialColumn.center.readability.pill.offset` | <code>[number, number]</code> | Shift of the box as [dx, dy] in pixels. Default: `[0, 0]`. |
| `plotOptions.vitalsClock.radialColumn.center.readability.shadow` | <code>object \| boolean</code> | drop shadow on the pill (on the text in halo mode) |
| `plotOptions.vitalsClock.radialColumn.center.readability.shadow.dx` | <code>number</code> | Horizontal shadow offset in pixels. Default: `0`. |
| `plotOptions.vitalsClock.radialColumn.center.readability.shadow.dy` | <code>number</code> | Vertical shadow offset in pixels. Default: `1`. |
| `plotOptions.vitalsClock.radialColumn.center.readability.shadow.blur` | <code>number</code> | Shadow blur in pixels. Default: `2`. |
| `plotOptions.vitalsClock.radialColumn.center.readability.shadow.color` | <code>string</code> | Shadow colour. Default: `'#000000'`. |
| `plotOptions.vitalsClock.radialColumn.center.readability.shadow.opacity` | <code>number</code> | Shadow opacity (0 to 1). Default: `0.35`. |
| `plotOptions.vitalsClock.radialColumn.center.readability.raise` | <code>boolean</code> | axis labels sitting on marks are moved above the series (default true) |
| `plotOptions.vitalsClock.radialColumn.center.readability.each` | <code>(info: WccReadabilityInfo) =&gt; WccReadability \| null \| undefined</code> | per label: return an override (or 'none') for this one label; called only when set |
| `plotOptions.vitalsClock.radialColumn.center.show` | <code>boolean \| 'auto'</code> | `true` always shows the centre; `'auto'` shows it when the hole is at least 34 px. Default: `'auto'`. |
| `plotOptions.vitalsClock.radialColumn.center.label` | <code>string</code> | Label under the value; not set uses the gauge layer name, `'Total'` with columns, or the first layer name. |
| `plotOptions.vitalsClock.radialColumn.center.value` | <code>number \| string \| (() =&gt; string)</code> | Fixed value or text, or a function returning text; not set uses the gauge value or the total. |
| `plotOptions.vitalsClock.radialColumn.center.formatter` | <code>(value: number) =&gt; string</code> | `(value, { w }) =&gt; string` for a numeric centre value. |
| `plotOptions.vitalsClock.radialColumn.center.hover` | <code>boolean</code> | show the hovered slot / segment in the centre |
| `plotOptions.vitalsClock.radialColumn.layers` | <code>RadialColumnLayer[]</code> | Inner layers, innermost first. Default: `[]`. |
| `plotOptions.vitalsClock.radialColumn.layers[].type` | <code>'pie' \| 'donut' \| 'nestedDonut' \| 'sunburst' \| 'arc' \| 'radialBar' \| 'polarArea' \| 'heatmap' \| 'chord' \| 'goals' \| 'gauge' \| 'wave' \| 'matrix' \| 'incident' \| 'bands' \| 'trace' \| 'span' \| 'vitalsNow'</code> | 'radialBar' is an alias of 'arc'; 'chord' is best as the innermost layer (its ribbons fill the centre) |
| `plotOptions.vitalsClock.radialColumn.layers[].name` | <code>string</code> | Layer name (legend, tooltip, centre label of a gauge). |
| `plotOptions.vitalsClock.radialColumn.layers[].data` | <code>RadialLayerDatum[] \| Array&lt;{ /** Ring name. */ name?: string /** Segments or cells of the ring (inner first). */ data: Array&lt;RadialLayerDatum \| null&gt; }&gt; \| Ar…</code> | pie/donut/arc/polarArea: segments; nestedDonut and heatmap: rings [{ name, data }] or number[][] (innermost first, heatmap cells may be null); sunburst: a node tree; chord: flows [from, to, value] or { from, to, value }; wave: rows RadialWaveSeries[] (or one plain number array = one row) matrix: rows × cols values or status names, flows [row, col, value], or RadialMatrixCell objects incident (west-coast-charts/layers/quint): RadialIncident windows, a wedge across every ring each |
| `plotOptions.vitalsClock.radialColumn.layers[].data[].x` | <code>string</code> | Name of the segment (alias of `name`). |
| `plotOptions.vitalsClock.radialColumn.layers[].data[].name` | <code>string</code> | Name of the segment. |
| `plotOptions.vitalsClock.radialColumn.layers[].data[].y` | <code>number</code> | Value of the segment (alias of `value`). |
| `plotOptions.vitalsClock.radialColumn.layers[].data[].value` | <code>number</code> | Value of the segment. |
| `plotOptions.vitalsClock.radialColumn.layers[].data[].color` | <code>string</code> | Colour of the segment. |
| `plotOptions.vitalsClock.radialColumn.layers[].data[].max` | <code>number</code> | Arc and goals layers: value of a full arc for this point. |
| `plotOptions.vitalsClock.radialColumn.layers[].data[].target` | <code>number</code> | goals: the ring's target (alias of max) |
| `plotOptions.vitalsClock.radialColumn.layers[].data[].trackColor` | <code>string</code> | goals: track colour of this ring (default: derived from the ring colour) |
| `plotOptions.vitalsClock.radialColumn.layers[].data[].label` | <code>string</code> | goals: ring label (default: the name) |
| `plotOptions.vitalsClock.radialColumn.layers[].data[].children` | <code>RadialLayerDatum[]</code> | Sunburst: child segments on the next ring. |
| `plotOptions.vitalsClock.radialColumn.layers[].data[].link` | <code>Array&lt;number \| string&gt;</code> | linked categories (indices or names) |
| `plotOptions.vitalsClock.radialColumn.layers[].data[].keys` | <code>string[]</code> | semantic keys (e.g. a service id): marks of other layers sharing a key light together; a sunburst parent takes the union of its children |
| `plotOptions.vitalsClock.radialColumn.layers[].data[].values` | <code>Array&lt;number \| null&gt;</code> | this segment's own outer values (filter interaction) |
| `plotOptions.vitalsClock.radialColumn.layers[].data[].from` | <code>string</code> | Source group id. |
| `plotOptions.vitalsClock.radialColumn.layers[].data[].to` | <code>string</code> | Target group id. |
| `plotOptions.vitalsClock.radialColumn.layers[].data[].data` | <code>Array&lt;number \| null \| [unknown, number \| null] \| { y: number \| null }&gt;</code> | One value per point; null = gap. Numbers, [x, y] or { y }. |
| `plotOptions.vitalsClock.radialColumn.layers[].data[].envelope` | <code>object</code> | Normal range per point: a soft band behind the wave; points outside it are anomalies. |
| `plotOptions.vitalsClock.radialColumn.layers[].data[].envelope.lo` | <code>Array&lt;number \| null&gt;</code> | Lower bound per point. |
| `plotOptions.vitalsClock.radialColumn.layers[].data[].envelope.hi` | <code>Array&lt;number \| null&gt;</code> | Upper bound per point. |
| `plotOptions.vitalsClock.radialColumn.layers[].data[].forecast` | <code>object</code> | Forecast per point (usually null up to now): dashed crest, optional hatched range. |
| `plotOptions.vitalsClock.radialColumn.layers[].data[].forecast.data` | <code>Array&lt;number \| null&gt;</code> | Forecast values. |
| `plotOptions.vitalsClock.radialColumn.layers[].data[].forecast.lo` | <code>Array&lt;number \| null&gt;</code> | Lower bound of the forecast range. |
| `plotOptions.vitalsClock.radialColumn.layers[].data[].forecast.hi` | <code>Array&lt;number \| null&gt;</code> | Upper bound of the forecast range. |
| `plotOptions.vitalsClock.radialColumn.layers[].data[].anomalies` | <code>RadialWaveAnomaly[]</code> | Anomalies of this row (as layer anomalies, without series). |
| `plotOptions.vitalsClock.radialColumn.layers[].data[].anomalies[].series` | <code>string</code> | Row name (layer-level lists; not set = every row). |
| `plotOptions.vitalsClock.radialColumn.layers[].data[].anomalies[].at` | <code>number \| string</code> | Point index, or a point label (e.g. 'Wed 18:00'). |
| `plotOptions.vitalsClock.radialColumn.layers[].data[].anomalies[].label` | <code>string</code> | Text in the tooltip, data table and rim marks. |
| `plotOptions.vitalsClock.radialColumn.layers[].data[].anomalies[].kind` | <code>string</code> | Kind shown when there is no label. Default: 'Anomaly' ('Above normal' / 'Below normal' for automatic ones). |
| `plotOptions.vitalsClock.radialColumn.layers[].data[].anomalies[].color` | <code>string</code> | Spike colour. Default: a rose red (lighter in dark mode). |
| `plotOptions.vitalsClock.radialColumn.layers[].data[].row` | <code>string</code> | Row id (or name). |
| `plotOptions.vitalsClock.radialColumn.layers[].data[].col` | <code>string</code> | Column id (or name). |
| `plotOptions.vitalsClock.radialColumn.layers[].data[].status` | <code>string</code> | Status name (ok, info, warn, crit, unknown or one of `statuses`). |
| `plotOptions.vitalsClock.radialColumn.layers[].series` | <code>number \| string</code> | take the data from config.series (index or name) instead; that series leaves the column ring |
| `plotOptions.vitalsClock.radialColumn.layers[].labels` | <code>string[]</code> | segment names for plain number data; wave: point labels, one per point (e.g. '14:00 Tue') or one per sector point ('14:00', shown as 'Tue 14:00') |
| `plotOptions.vitalsClock.radialColumn.layers[].thickness` | <code>number \| string</code> | ring thickness: px, '30%' of the available radius, or a fraction (0..1) |
| `plotOptions.vitalsClock.radialColumn.layers[].gap` | <code>number</code> | px between this layer and the one inside it (default 6) |
| `plotOptions.vitalsClock.radialColumn.layers[].ringGap` | <code>number</code> | px between the rings of a nestedDonut / sunburst / arc layer (default 2) |
| `plotOptions.vitalsClock.radialColumn.layers[].padding` | <code>number</code> | constant px gap between neighbouring segments |
| `plotOptions.vitalsClock.radialColumn.layers[].corner` | <code>number</code> | corner radius of segment ends, px |
| `plotOptions.vitalsClock.radialColumn.layers[].colors` | <code>string[]</code> | Own palette of the layer; heatmap: two or more colours are the ramp stops, low to high. |
| `plotOptions.vitalsClock.radialColumn.layers[].colorBy` | <code>'spectrum'</code> | colour segments from the column ring's spectrum by angle |
| `plotOptions.vitalsClock.radialColumn.layers[].legend` | <code>boolean</code> | keep this layer's segments out of the legend |
| `plotOptions.vitalsClock.radialColumn.layers[].link` | <code>RadialColumnLink \| boolean \| RadialLinkMode</code> | link to the column ring for this layer: false = none, a mode, or options overriding plotOptions.radialColumn.link |
| `plotOptions.vitalsClock.radialColumn.layers[].link.mode` | <code>'none' \| 'category' \| 'angle' \| 'map' \| 'auto'</code> | auto (default): a datum's own link, else matching category names, else the angle span |
| `plotOptions.vitalsClock.radialColumn.layers[].link.map` | <code>((segment: RadialLinkSegment) =&gt; Array&lt;number \| string&gt; \| null \| undefined) \| Record&lt;string, Array&lt;number \| string&gt;&gt;</code> | map mode: a function or an object keyed by 'A › B' path or name; values are category indices or names |
| `plotOptions.vitalsClock.radialColumn.layers[].link.interaction` | <code>'highlight' \| 'filter' \| 'both'</code> | highlight on hover, filter (cross-filter / values) on click, or both. Default 'highlight' |
| `plotOptions.vitalsClock.radialColumn.layers[].link.bidirectional` | <code>boolean</code> | hovering a bar also lights its segments (default true) |
| `plotOptions.vitalsClock.radialColumn.layers[].link.align` | <code>boolean</code> | segments span exactly the angle of their linked bars (default false) |
| `plotOptions.vitalsClock.radialColumn.layers[].link.indicator` | <code>boolean</code> | bracket arc on the outer edge over the linked bars (default true) |
| `plotOptions.vitalsClock.radialColumn.layers[].link.unit` | <code>string</code> | what a category is, for tooltips and announcements ('18 of 72 time slots'). Default 'categories'. Name the real unit: categories that combine several things (service × day) are 'service-days', not 'days'. |
| `plotOptions.vitalsClock.radialColumn.layers[].link.basis` | <code>string</code> | how the categories are composed, appended in brackets ('18 of 140 service-days (10 services × 14 days)'). Default: none |
| `plotOptions.vitalsClock.radialColumn.layers[].align` | <code>boolean</code> | shorthand for link.align |
| `plotOptions.vitalsClock.radialColumn.layers[].trackColor` | <code>string</code> | Track colour of arc, goals and gauge layers; not set uses a faint text tone (goals: a tone of the ring colour). |
| `plotOptions.vitalsClock.radialColumn.layers[].startAngle` | <code>number</code> | degrees, 0 = 12 o'clock, clockwise; default: the chart's range |
| `plotOptions.vitalsClock.radialColumn.layers[].endAngle` | <code>number</code> | End angle in degrees (same convention as `startAngle`); not set uses the chart's range. |
| `plotOptions.vitalsClock.radialColumn.layers[].min` | <code>number</code> | arc layers: value range of a full arc (default 0..100; per point via datum.max); wave: base of the height scale (default min(0, data)) |
| `plotOptions.vitalsClock.radialColumn.layers[].max` | <code>number</code> | Arc layers: value of a full arc. Default: `100`. Wave: top of the height scale (default: the data, envelopes and forecasts rounded up to a nice tick). |
| `plotOptions.vitalsClock.radialColumn.layers[].color` | <code>RadialMatrixScale \| string</code> | heatmap / matrix: base colour of the default ramp (surface tone -&gt; colour -&gt; towards the text colour); colors (2+) overrides the ramp. matrix (value mode) also takes a colour scale. |
| `plotOptions.vitalsClock.radialColumn.layers[].color.scale` | <code>'sequential' \| 'diverging'</code> | `'sequential'` (low to high) or `'diverging'` around `mid`. Default: `'sequential'`. |
| `plotOptions.vitalsClock.radialColumn.layers[].color.domain` | <code>number[]</code> | [lo, hi] or [lo, mid, hi]; default: data extent. |
| `plotOptions.vitalsClock.radialColumn.layers[].color.mid` | <code>number</code> | Diverging centre. Default: `0`. |
| `plotOptions.vitalsClock.radialColumn.layers[].color.stops` | <code>string[]</code> | Colour stops, low to high. |
| `plotOptions.vitalsClock.radialColumn.layers[].color.reverse` | <code>boolean</code> | Reverses the colour stops. Default: `false`. |
| `plotOptions.vitalsClock.radialColumn.layers[].groups` | <code>RadialChordGroup[]</code> | chord: group definitions (order, names, colours, linked categories) |
| `plotOptions.vitalsClock.radialColumn.layers[].groups[].id` | <code>string</code> | Group id used in the flows. |
| `plotOptions.vitalsClock.radialColumn.layers[].groups[].name` | <code>string</code> | Shown name; not set uses the id. |
| `plotOptions.vitalsClock.radialColumn.layers[].groups[].color` | <code>string</code> | Group colour. |
| `plotOptions.vitalsClock.radialColumn.layers[].groups[].values` | <code>number[]</code> | per-group values (shown in its tooltip) |
| `plotOptions.vitalsClock.radialColumn.layers[].groups[].link` | <code>string \| number \| Array&lt;string \| number&gt;</code> | categories (names or indices) of the column ring this group links to (overrides link.map) |
| `plotOptions.vitalsClock.radialColumn.layers[].matrix` | <code>number[][]</code> | chord: a square flow matrix instead of data; row = source, column = target (with labels) |
| `plotOptions.vitalsClock.radialColumn.layers[].directed` | <code>boolean</code> | chord: directed flows give each end its own share (A-&gt;B and B-&gt;A differ) |
| `plotOptions.vitalsClock.radialColumn.layers[].sort` | <code>'none' \| 'asc' \| 'desc'</code> | chord: order of the groups around the ring (default: as given) |
| `plotOptions.vitalsClock.radialColumn.layers[].ringWidth` | <code>number</code> | chord: px width of the group arcs (default: the layer thickness) |
| `plotOptions.vitalsClock.radialColumn.layers[].ribbon` | <code>object</code> | chord ribbons |
| `plotOptions.vitalsClock.radialColumn.layers[].ribbon.opacity` | <code>number</code> | Ribbon opacity; not set uses 0.52 (0.6 in dark mode). |
| `plotOptions.vitalsClock.radialColumn.layers[].ribbon.colorMode` | <code>'source' \| 'target' \| 'gradient'</code> | Ribbon colour from the `'source'` group, the `'target'` group, or a `'gradient'` between both. Default: `'source'`. |
| `plotOptions.vitalsClock.radialColumn.layers[].ribbon.padding` | <code>number</code> | Gap between the group arcs and the ribbon ends in px. Default: `2`. |
| `plotOptions.vitalsClock.radialColumn.layers[].target` | <code>number</code> | goals: default target of every ring (datum target/max wins; default 100) |
| `plotOptions.vitalsClock.radialColumn.layers[].maxLaps` | <code>number</code> | goals: laps drawn past 100 % (default 2, i.e. up to 300 %) |
| `plotOptions.vitalsClock.radialColumn.layers[].ringLabels` | <code>boolean</code> | curved labels on the segments: goals from the ring start (default true); any other layer centred on each segment, upright in the lower half (default false) |
| `plotOptions.vitalsClock.radialColumn.layers[].ringTitles` | <code>boolean</code> | incident: name the heatmap rings (curved, in the gap outside each ring, at 12 o'clock) and add their colour scales to the key under the ring (default true) |
| `plotOptions.vitalsClock.radialColumn.layers[].legendTitle` | <code>string</code> | header of this layer's entries in a right-hand legend (e.g. 'Regions'); entries of consecutive layers sharing a title form one group |
| `plotOptions.vitalsClock.radialColumn.layers[].rows` | <code>Array&lt;string \| RadialMatrixHeader \| RadialVitalsRow&gt;</code> | matrix: row headers (ids, or definitions with keys / link); default: the ids used in flow data |
| `plotOptions.vitalsClock.radialColumn.layers[].cols` | <code>Array&lt;string \| RadialMatrixHeader&gt;</code> | matrix: column headers; default: the rows (square adjacency matrix) |
| `plotOptions.vitalsClock.radialColumn.layers[].statuses` | <code>Record&lt;string, RadialMatrixStatus&gt;</code> | matrix: adds or overrides statuses (built in: ok, info, warn, crit, unknown) |
| `plotOptions.vitalsClock.radialColumn.layers[].headers` | <code>object \| boolean</code> | matrix: row / column header labels (false hides them) |
| `plotOptions.vitalsClock.radialColumn.layers[].headers.show` | <code>boolean</code> | `false` hides the headers. Default: `true`. |
| `plotOptions.vitalsClock.radialColumn.layers[].headers.fontSize` | <code>number</code> | Largest header font size in px; it shrinks to 9 px before labels are cut. Default: theme font size − 1. |
| `plotOptions.vitalsClock.radialColumn.layers[].headers.readability` | <code>RadialReadability</code> | Label readability of the headers (explicit modes only, e.g. 'pill' / 'halo'). |
| `plotOptions.vitalsClock.radialColumn.layers[].headers.readability.mode` | <code>'none' \| 'halo' \| 'pill' \| 'auto' \| 'hide'</code> | 'auto' (default where on): nothing for labels off the marks, a contrasting text colour over one fill, a pill over mixed fills; 'hide' = skip labels that sit on marks |
| `plotOptions.vitalsClock.radialColumn.layers[].headers.readability.fallback` | <code>'pill' \| 'halo' \| 'hide'</code> | what 'auto' escalates to over mixed fills or when no text colour reaches minRatio. Default 'pill' |
| `plotOptions.vitalsClock.radialColumn.layers[].headers.readability.enabled` | <code>boolean</code> | false switches the treatment off for this label kind |
| `plotOptions.vitalsClock.radialColumn.layers[].headers.readability.contrast` | <code>boolean</code> | swap the text to `light`/`dark` when it misses minRatio against what is under it (any mode) |
| `plotOptions.vitalsClock.radialColumn.layers[].headers.readability.minRatio` | <code>number</code> | WCAG 2 contrast ratio to reach. Default 4.5 |
| `plotOptions.vitalsClock.radialColumn.layers[].headers.readability.light` | <code>string</code> | text/backdrop colour pair used by contrast and 'auto' fills. Defaults '#ffffff' / '#111827' |
| `plotOptions.vitalsClock.radialColumn.layers[].headers.readability.dark` | <code>string</code> | Dark colour of the pair. Default: `'#111827'`. |
| `plotOptions.vitalsClock.radialColumn.layers[].headers.readability.background` | <code>'auto' \| string</code> | colour under the chart; 'auto' = chart.background, else the first opaque ancestor |
| `plotOptions.vitalsClock.radialColumn.layers[].headers.readability.halo` | <code>object</code> | outline behind the glyphs; blur &gt; 0 makes it a soft glow. Defaults width 3, color 'auto' (chart background), opacity 0.92 |
| `plotOptions.vitalsClock.radialColumn.layers[].headers.readability.halo.width` | <code>number</code> | Outline width in pixels. Default: `3`. |
| `plotOptions.vitalsClock.radialColumn.layers[].headers.readability.halo.color` | <code>'auto' \| string</code> | Outline colour; 'auto' uses the colour under the label or a contrasting one. Default: `'auto'`. |
| `plotOptions.vitalsClock.radialColumn.layers[].headers.readability.halo.opacity` | <code>number</code> | Outline opacity (0 to 1). Default: `0.92`. |
| `plotOptions.vitalsClock.radialColumn.layers[].headers.readability.halo.blur` | <code>number</code> | Blur in pixels; above 0 the outline becomes a soft glow. Default: `0`. |
| `plotOptions.vitalsClock.radialColumn.layers[].headers.readability.pill` | <code>object</code> | backdrop box. padding = [vertical, horizontal]; offset = [dx, dy] px. Defaults fill 'auto', opacity 0.9, radius 4, padding [1, 4] |
| `plotOptions.vitalsClock.radialColumn.layers[].headers.readability.pill.fill` | <code>'auto' \| string</code> | Box colour; 'auto' uses the colour under the label or a contrasting one. Default: `'auto'`. |
| `plotOptions.vitalsClock.radialColumn.layers[].headers.readability.pill.opacity` | <code>number</code> | Box opacity (0 to 1). Default: `0.9`. |
| `plotOptions.vitalsClock.radialColumn.layers[].headers.readability.pill.radius` | <code>number</code> | Corner radius in pixels. Default: `4`. |
| `plotOptions.vitalsClock.radialColumn.layers[].headers.readability.pill.padding` | <code>number \| [number, number]</code> | Space around the text in pixels: one number, or [vertical, horizontal]. Default: `[1, 4]`. |
| `plotOptions.vitalsClock.radialColumn.layers[].headers.readability.pill.stroke` | <code>string</code> | Outline colour of the box. Default: `'none'`. |
| `plotOptions.vitalsClock.radialColumn.layers[].headers.readability.pill.strokeWidth` | <code>number</code> | Outline width in pixels. Default: `1`. |
| `plotOptions.vitalsClock.radialColumn.layers[].headers.readability.pill.offset` | <code>[number, number]</code> | Shift of the box as [dx, dy] in pixels. Default: `[0, 0]`. |
| `plotOptions.vitalsClock.radialColumn.layers[].headers.readability.shadow` | <code>object \| boolean</code> | drop shadow on the pill (on the text in halo mode) |
| `plotOptions.vitalsClock.radialColumn.layers[].headers.readability.shadow.dx` | <code>number</code> | Horizontal shadow offset in pixels. Default: `0`. |
| `plotOptions.vitalsClock.radialColumn.layers[].headers.readability.shadow.dy` | <code>number</code> | Vertical shadow offset in pixels. Default: `1`. |
| `plotOptions.vitalsClock.radialColumn.layers[].headers.readability.shadow.blur` | <code>number</code> | Shadow blur in pixels. Default: `2`. |
| `plotOptions.vitalsClock.radialColumn.layers[].headers.readability.shadow.color` | <code>string</code> | Shadow colour. Default: `'#000000'`. |
| `plotOptions.vitalsClock.radialColumn.layers[].headers.readability.shadow.opacity` | <code>number</code> | Shadow opacity (0 to 1). Default: `0.35`. |
| `plotOptions.vitalsClock.radialColumn.layers[].headers.readability.raise` | <code>boolean</code> | axis labels sitting on marks are moved above the series (default true) |
| `plotOptions.vitalsClock.radialColumn.layers[].headers.readability.each` | <code>(info: WccReadabilityInfo) =&gt; WccReadability \| null \| undefined</code> | per label: return an override (or 'none') for this one label; called only when set |
| `plotOptions.vitalsClock.radialColumn.layers[].values` | <code>boolean \| 'auto'</code> | matrix: print the value inside a cell ('auto': when it fits). Default: `'auto'`. |
| `plotOptions.vitalsClock.radialColumn.layers[].minCell` | <code>number</code> | matrix: smallest cell in px before rows / columns are merged or dropped. Default: `6`. |
| `plotOptions.vitalsClock.radialColumn.layers[].overflow` | <code>'aggregate' \| 'truncate'</code> | matrix: rows / columns past minCell merge into one '+N' row / column ('aggregate'), or are dropped with a '+N' note ('truncate'). Default: `'aggregate'`. |
| `plotOptions.vitalsClock.radialColumn.layers[].aggregate` | <code>'sum' \| 'max' \| 'mean' \| 'min' \| 'median' \| 'last'</code> | matrix: how merged cells and row / column headers combine values (statuses: always the worst). Default: `'sum'` (header tooltip 'Total'); use 'max' / 'mean' / 'min' for non-additive cells such as latencies or rates ('Highest', 'Average', 'Lowest'). |
| `plotOptions.vitalsClock.radialColumn.layers[].inset` | <code>number</code> | matrix: px between the grid (with its headers) and the edge of the centre disc. Default: `6`. |
| `plotOptions.vitalsClock.radialColumn.layers[].unit` | <code>string</code> | matrix: appended to values in cells, tooltip and table; heatmap: appended to the value in the slot tooltip |
| `plotOptions.vitalsClock.radialColumn.layers[].value` | <code>number</code> | gauge: the value (else data[0]) |
| `plotOptions.vitalsClock.radialColumn.layers[].follow` | <code>string \| number \| boolean</code> | gauge: take the latest value of this column series (name, index or true = first); it stays in the ring |
| `plotOptions.vitalsClock.radialColumn.layers[].bandsLow` | <code>RadialVitalsBand[]</code> | gauge: colour by value band, ascending: [{ to: 60, color }] Span lower-value bands. Missing keeps the generic shared fallback; choose a policy explicitly to avoid a warning. |
| `plotOptions.vitalsClock.radialColumn.layers[].bandsLow[].to` | <code>number</code> | Upper value of the band (inclusive); omitted on the last band. |
| `plotOptions.vitalsClock.radialColumn.layers[].bandsLow[].level` | <code>0 \| 1 \| 2 \| 3</code> | 0 = normal ... 3 = highest; colour + pattern. |
| `plotOptions.vitalsClock.radialColumn.layers[].bandsLow[].label` | <code>string</code> | Text of the band in tooltip and table. |
| `plotOptions.vitalsClock.radialColumn.layers[].bandsLowPolicy` | <code>'high-only' \| 'shared'</code> | Span classification when bandsLow is absent; generic span default is shared, VitalsClock defaults high-only. |
| `plotOptions.vitalsClock.radialColumn.layers[].bands` | <code>RadialVitalsBand[] \| Array&lt;{ /** Upper value of the band (inclusive). */ to: number /** Arc colour for values in the band. */ color: string }&gt;</code> |  |
| `plotOptions.vitalsClock.radialColumn.layers[].bands[].to` | <code>number</code> | Upper value of the band (inclusive); omitted on the last band. |
| `plotOptions.vitalsClock.radialColumn.layers[].bands[].level` | <code>0 \| 1 \| 2 \| 3</code> | 0 = normal ... 3 = highest; colour + pattern. |
| `plotOptions.vitalsClock.radialColumn.layers[].bands[].label` | <code>string</code> | Text of the band in tooltip and table. |
| `plotOptions.vitalsClock.radialColumn.layers[].formatter` | <code>(value: number) =&gt; string</code> | gauge: value formatter (centre, min/max ticks, tooltip) |
| `plotOptions.vitalsClock.radialColumn.layers[].center` | <code>boolean</code> | gauge: show the value in the chart centre (default true) |
| `plotOptions.vitalsClock.radialColumn.layers[].scale` | <code>boolean \| 'linear' \| 'log'</code> | gauge: min/max labels at the ends of a partial arc (boolean, default true); heatmap: colour scale, 'log' spaces the ramp by ratio (positive values; default 'linear') |
| `plotOptions.vitalsClock.radialColumn.layers[].now` | <code>object \| boolean \| number \| string</code> | gauge with follow: the 'now' tick over the newest slot (default true) |
| `plotOptions.vitalsClock.radialColumn.layers[].now.label` | <code>string</code> | Text of the tick. Default: `'now'`. |
| `plotOptions.vitalsClock.radialColumn.layers[].now.color` | <code>string</code> | Tick colour; not set uses the gauge colour. |
| `plotOptions.vitalsClock.radialColumn.layers[].time` | <code>object</code> | trace / span / vitalsNow (layers/vitals): the window the ring shows, ms or ISO. |
| `plotOptions.vitalsClock.radialColumn.layers[].time.start` | <code>number \| string</code> |  |
| `plotOptions.vitalsClock.radialColumn.layers[].time.end` | <code>number \| string</code> |  |
| `plotOptions.vitalsClock.radialColumn.layers[].upto` | <code>number</code> | bands / trace / span (layers/vitals): index of the current slot; later slots are "no data yet". |
| `plotOptions.vitalsClock.radialColumn.layers[].endLabel` | <code>string</code> | bands (layers/vitals): end label of the last slot (e.g. '24:00'); not set uses the last slot label. |
| `plotOptions.vitalsClock.radialColumn.layers[].gapAfter` | <code>number</code> | trace / span (layers/vitals): a gap longer than this many minutes breaks the line. Default: 3 slots. |
| `plotOptions.vitalsClock.radialColumn.layers[].alarms` | <code>Array&lt;{ from: number \| string, to?: number \| string, label?: string }&gt;</code> | vitalsNow (layers/vitals): caller alarm windows, drawn as wedges. |
| `plotOptions.vitalsClock.radialColumn.layers[].status` | <code>Array&lt;{ name: string, text: string, ago?: number, stale?: boolean }&gt;</code> | vitalsNow (layers/vitals): last value per parameter in the strip under the ring. |
| `plotOptions.vitalsClock.radialColumn.layers[].note` | <code>string</code> | vitalsNow (layers/vitals): a note in the strip, e.g. 'Demo data'. |
| `plotOptions.vitalsClock.radialColumn.layers[].mode` | <code>'ridge' \| 'overlay' \| 'stack' \| 'auto' \| 'value' \| 'status'</code> | wave: 'ridge' (default) staggers the rows in lanes that rise into the lane behind them; 'overlay' shares one translucent band; 'stack' piles the rows. matrix: 'status' colours cells by severity with patterns; 'auto' (default) = status once any cell has one; 'value' = value scale. |
| `plotOptions.vitalsClock.radialColumn.layers[].overlap` | <code>number</code> | wave ridge: how far a wave may rise into the lanes behind it, in lane steps (default 0.8; 0 = no overlap) |
| `plotOptions.vitalsClock.radialColumn.layers[].sectors` | <code>number \| Array&lt;string \| RadialWaveSector&gt;</code> | wave: the equal sectors (cycles) of the ring - a count, or names / objects in order (default 1) |
| `plotOptions.vitalsClock.radialColumn.layers[].sectorLabels` | <code>boolean</code> | wave: curved sector names on a band at the inner edge (default true when there are 2+ sectors and room) |
| `plotOptions.vitalsClock.radialColumn.layers[].depth` | <code>number</code> | wave: shading from crest to base, 0 = flat .. 1 = deep (default 0.55) |
| `plotOptions.vitalsClock.radialColumn.layers[].curve` | <code>'smooth' \| 'linear'</code> | wave: 'smooth' monotone cubic that never overshoots the data (default) or 'linear' |
| `plotOptions.vitalsClock.radialColumn.layers[].anomalies` | <code>RadialWaveAnomaly \| false</code> | wave: anomaly spikes. Default: points outside their envelope. A list adds or relabels points; false = none; { color } recolours the automatic ones |
| `plotOptions.vitalsClock.radialColumn.layers[].anomalies.series` | <code>string</code> | Row name (layer-level lists; not set = every row). |
| `plotOptions.vitalsClock.radialColumn.layers[].anomalies.at` | <code>number \| string</code> | Point index, or a point label (e.g. 'Wed 18:00'). |
| `plotOptions.vitalsClock.radialColumn.layers[].anomalies.label` | <code>string</code> | Text in the tooltip, data table and rim marks. |
| `plotOptions.vitalsClock.radialColumn.layers[].anomalies.kind` | <code>string</code> | Kind shown when there is no label. Default: 'Anomaly' ('Above normal' / 'Below normal' for automatic ones). |
| `plotOptions.vitalsClock.radialColumn.layers[].anomalies.color` | <code>string</code> | Spike colour. Default: a rose red (lighter in dark mode). |
| `plotOptions.vitalsClock.radialColumn.layerGap` | <code>number</code> | px between the outermost inner layer and the column ring |
| `plotOptions.vitalsClock.radialColumn.hole` | <code>'auto' \| number \| string</code> | radius of the empty centre: 'auto', px, '%' or fraction of the space inside the column ring |
| `plotOptions.vitalsClock.radialColumn.legend` | <code>object</code> | Legend of series and layer items. |
| `plotOptions.vitalsClock.radialColumn.legend.show` | <code>boolean \| 'auto'</code> | `true` always shows it; `'auto'` from two items. Default: `'auto'`. |
| `plotOptions.vitalsClock.radialColumn.legend.position` | <code>'auto' \| 'right' \| 'bottom'</code> | `'right'` or `'bottom'`; `'auto'` uses the right on wide plots. Default: `'auto'`. |

## plotOptions.vitalsClock.params[]

One parameter (`WccVitalsParam`), outermost ring first.

| Option | Type | Description |
| --- | --- | --- |
| `plotOptions.vitalsClock.params[].id` | <code>string</code> | Parameter id. |
| `plotOptions.vitalsClock.params[].title` | <code>string</code> | Ring title, e.g. 'Herzfrequenz'. |
| `plotOptions.vitalsClock.params[].short` | <code>string</code> | Short name in the status strip and describe(), e.g. 'HF'. |
| `plotOptions.vitalsClock.params[].unit` | <code>string</code> | Unit, e.g. '/min', '%', 'mmHg'. |
| `plotOptions.vitalsClock.params[].kind` | <code>'columns' \| 'cells' \| 'trace' \| 'range'</code> | 'columns' = the column ring (median per slot), 'cells' = band cells, 'trace' = line at true times, 'range' = high / low pairs. |
| `plotOptions.vitalsClock.params[].aggregate` | <code>'median' \| 'min' \| 'max' \| 'last' \| 'mean'</code> | Per-slot aggregation for columns and cells. Default: `'median'`. |
| `plotOptions.vitalsClock.params[].bands` | <code>RadialVitalsBand[]</code> | The caller's threshold bands (no built-in clinical thresholds). |
| `plotOptions.vitalsClock.params[].bands[].to` | <code>number</code> | Upper value of the band (inclusive); omitted on the last band. |
| `plotOptions.vitalsClock.params[].bands[].level` | <code>0 \| 1 \| 2 \| 3</code> | 0 = normal ... 3 = highest; colour + pattern. |
| `plotOptions.vitalsClock.params[].bands[].label` | <code>string</code> | Text of the band in tooltip and table. |
| `plotOptions.vitalsClock.params[].data` | <code>Array&lt;[number \| string, number] \| [number \| string, number, number]&gt;</code> | Measurements: [time, value] or, for 'range', [time, high, low]; time = ms or ISO. |
| `plotOptions.vitalsClock.params[].staleAfter` | <code>number \| string</code> | After this long the last value is shown as stale: minutes, or a duration such as '4h'. |
| `plotOptions.vitalsClock.params[].decimals` | <code>number</code> | Decimals at most in labels and tooltips. Default: 1. |
| `plotOptions.vitalsClock.params[].color` | <code>string</code> | Ring colour; not set uses the palette. |
| `plotOptions.vitalsClock.params[].bandsLow` | <code>RadialVitalsBand[]</code> | 'range': caller-supplied bands for the low value, independent of the high-value bands. |
| `plotOptions.vitalsClock.params[].bandsLow[].to` | <code>number</code> | Upper value of the band (inclusive); omitted on the last band. |
| `plotOptions.vitalsClock.params[].bandsLow[].level` | <code>0 \| 1 \| 2 \| 3</code> | 0 = normal ... 3 = highest; colour + pattern. |
| `plotOptions.vitalsClock.params[].bandsLow[].label` | <code>string</code> | Text of the band in tooltip and table. |
| `plotOptions.vitalsClock.params[].bandsLowPolicy` | <code>'high-only' \| 'shared'</code> | Missing low bands: classify only high (default) or explicitly share high bands. An implicit high-only fallback warns once. |
| `plotOptions.vitalsClock.params[].gapAfter` | <code>number</code> | 'trace' / 'range': a gap longer than this many minutes breaks the line. Default: 3 slots. |
| `plotOptions.vitalsClock.params[].min` | <code>number</code> | Lower end of the value scale. |
| `plotOptions.vitalsClock.params[].max` | <code>number</code> | Upper end of the value scale. |

## plotOptions.schedule

Chart type `schedule` (`WccScheduleOptions`), premium type module `west-coast-charts/layers/schedule` ([guide](https://westcoast-charts.com/docs/medical/index.md)).

| Option | Type | Description |
| --- | --- | --- |
| `plotOptions.schedule.plugins` | <code>WccPremiumPluginRef[]</code> | Plugins of this chart: plugin objects, registered names, or `[nameOrPlugin, options]`. |
| `plotOptions.schedule.plugins[].name` | <code>string</code> | Plugin id (state key and warnings); not set uses `plugin-&lt;index&gt;`. |
| `plotOptions.schedule.plugins[].defaults` | <code>object</code> | Default options of the plugin; the `[nameOrPlugin, options]` form overrides them. |
| `plotOptions.schedule.plugins[].reserve()` | <code>(p: any): { top?: number; right?: number; bottom?: number; left?: number } \| void</code> | `(p) =&gt; { top, right, bottom, left }`: space in px taken from the plot before layout. |
| `plotOptions.schedule.plugins[].afterRender()` | <code>(p: any): void</code> | `(p)`: called after each render; draw into `p.layer()` and bind events with `p.on()`. |
| `plotOptions.schedule.plugins[].event()` | <code>(name: string, e: Event \| null, payload: any, p: any): boolean \| void</code> | `(name, e, payload, p)`: called for every chart event; returning `false` cancels a cancelable one. |
| `plotOptions.schedule.plugins[].tooltip()` | <code>(content: any, p: any): any</code> | `(content, p) =&gt; content`: changes the tooltip content (rows, footer, …). |
| `plotOptions.schedule.plugins[].describe()` | <code>(p: any): string</code> | `(p) =&gt; string` appended to the screen-reader summary. |
| `plotOptions.schedule.plugins[].destroy()` | <code>(p: any): void</code> | `(p)`: called before each redraw and on destroy. |
| `plotOptions.schedule.date` | <code>string</code> | The day shown (YYYY-MM-DD in timeZone; a week starts on its Monday). |
| `plotOptions.schedule.range` | <code>'day' \| 'week'</code> | Default: `'day'`. |
| `plotOptions.schedule.timeZone` | <code>string</code> | IANA zone of the wall-clock times. |
| `plotOptions.schedule.now` | <code>number \| string</code> | The current time (now line). |
| `plotOptions.schedule.resources` | <code>Array&lt;{ id: string, name?: string, kind?: 'room' \| 'device' \| 'staff' }&gt;</code> |  |
| `plotOptions.schedule.people` | <code>Array&lt;{ id: string, name?: string, role?: string, color?: string, dash?: string }&gt;</code> | Doctors and staff: colour + dash identify a person's route. |
| `plotOptions.schedule.items` | <code>Array&lt;{ id: string, resource: string, start: number \| string, end: number \| string, people?: string[], patient?: string, label?: string, status?: 'confirmed'…</code> | Appointments; start / end as ms, ISO or 'HH:MM' on `date`. `patient` is a pseudonymous id, hidden unless redact: false. |
| `plotOptions.schedule.hours` | <code>object</code> | Opening hours: closed time and breaks are hatched; appointments outside are a warning. |
| `plotOptions.schedule.hours.open` | <code>string</code> |  |
| `plotOptions.schedule.hours.close` | <code>string</code> |  |
| `plotOptions.schedule.hours.days` | <code>number[]</code> |  |
| `plotOptions.schedule.hours.breaks` | <code>Array&lt;[string, string]&gt;</code> |  |
| `plotOptions.schedule.rules` | <code>object</code> | A changeover between two rooms below minTransfer is a warning. Default: `'5min'`. |
| `plotOptions.schedule.rules.minTransfer` | <code>string \| number</code> |  |
| `plotOptions.schedule.view` | <code>'auto' \| 'lanes' \| 'board'</code> | 'lanes' (horizontal), 'board' (vertical), 'auto' = board below 560 px. Default: `'auto'`. |
| `plotOptions.schedule.lanes` | <code>'resources' \| 'people'</code> | Lanes per resource or per person. Default: `'resources'`. |
| `plotOptions.schedule.routes` | <code>boolean</code> | Draw a route per person. Default: `true`. |
| `plotOptions.schedule.snap` | <code>number</code> | Snap of drag / keyboard moves in minutes. Default: `15`. |
| `plotOptions.schedule.editable` | <code>boolean</code> | Drag / resize / keyboard moves emit 'scheduleChange' proposals (data is never changed). Default: `true`. |
| `plotOptions.schedule.redact` | <code>boolean</code> | Keep patient ids out of describe(), tooltips and the table. Default: `true`. |
| `plotOptions.schedule.filter` | <code>object</code> | Only appointments of these people. |
| `plotOptions.schedule.filter.people` | <code>string \| string[]</code> |  |
| `plotOptions.schedule.legend` | <code>object</code> |  |
| `plotOptions.schedule.legend.show` | <code>boolean</code> |  |
| `plotOptions.schedule.conflicts` | <code>object</code> | Conflict summary in the header and the number of listed conflicts. Default: `{ show: true, list: 3 }`. |
| `plotOptions.schedule.conflicts.show` | <code>boolean</code> |  |
| `plotOptions.schedule.conflicts.list` | <code>number</code> |  |

## Runtime API: common commands

`premium.api(chart)` returns these for every premium type (`PremiumApiBase`), plus the commands of the type below. `commands` lists the names the current renderer offers.

| Option | Type | Description |
| --- | --- | --- |
| `api.type` | <code>T</code> | The chart type the commands belong to. |
| `api.describe()` | <code>(): string</code> | the generated screen-reader summary |
| `api.dataTable()` | <code>(): { head: string[]; rows: any[][] } \| null</code> | the rows of the accessible data table (also used for CSV) |
| `api.clearHighlight()` | <code>(): void</code> | Removes the current hover or keyboard highlight. |

## Runtime API: drill-down (map, sankey)

`DrillApi`.

| Option | Type | Description |
| --- | --- | --- |
| `api.drillDown()` | <code>(id: Id): Promise&lt;boolean&gt;</code> | open the level of a drillable item; false when it is not drillable or the drill was cancelled |
| `api.drillUp()` | <code>(depth?: number): Promise&lt;boolean&gt;</code> | Goes back to an earlier level: `depth` 0 is the top level; no argument goes up one level. Resolves to `false` when already at the top or when the `drillup` event cancels it. |
| `api.drillPath()` | <code>(): string[]</code> | Breadcrumb labels from the top level to the open level; `[]` at the top level. |

## Runtime API: sankey

`premium.api<SankeyApi>(chart)`.

| Option | Type | Description |
| --- | --- | --- |
| `api.highlight()` | <code>(id: Id \| null): void</code> | highlight the flows of a node; null clears |
| `api.resetPositions()` | <code>(): Promise&lt;void&gt;</code> | drop dragged node offsets |
| `api.nodes()` | <code>(): { id: Id; name: string; value: number; column: number; color: string }[]</code> | Every laid-out node with its value, column index and fill colour. |
| `api.nodeBox()` | <code>(id: Id): { x: number; y: number; width: number; height: number } \| null</code> | a node's box in chart coordinates |

## Runtime API: gantt

`premium.api<GanttApi>(chart)`.

| Option | Type | Description |
| --- | --- | --- |
| `api.scrollTo()` | <code>(id: Id): boolean</code> | Opens the task's collapsed group, scrolls the task into view (rows and time) and highlights it; `false` when the id is unknown. |
| `api.select()` | <code>(id: Id \| Id[] \| null): void</code> | Replaces the selection with one id, a list of ids, or nothing (`null`). |
| `api.selected()` | <code>(): Id[]</code> | Ids of the selected tasks. |
| `api.toggleGroup()` | <code>(name: string): void</code> | Collapses or expands a group row by name. |
| `api.expandAll()` | <code>(): void</code> | Expands every group. |
| `api.collapseAll()` | <code>(): void</code> | Collapses every group. |
| `api.setView()` | <code>(min: WccDate, max: WccDate, animate?: boolean): void</code> | Sets the visible time window; animated unless `animate` is `false`. Ignored when `max` is not after `min`. |
| `api.view()` | <code>(): [number, number] \| null</code> | The visible time window as `[min, max]` timestamps; `null` before the first render. |
| `api.fit()` | <code>(): void</code> | Animates the view back to the window that fits every task. |
| `api.zoomBy()` | <code>(factor: number): void</code> | Zooms the time axis around the centre of the view; `factor` &gt; 1 zooms in, &lt; 1 zooms out. |
| `api.addTask()` | <code>(task: { seriesIndex?: number; index?: number; name?: string; start?: WccDate; end?: WccDate; duration?: number; data?: any }): Promise&lt;any&gt;</code> | Adds a task (end from `end`, or `start` plus `duration` days, default 1, working days under a calendar) through the `taskCreate` event and the undo history; resolves to the new item or `null`. |
| `api.updateTask()` | <code>(id: Id, patch: { start?: WccDate; end?: WccDate; name?: string }): any</code> | Changes a task's start, end or name as an edit (`taskChange` event, undo history); `false` when the id is unknown or the change was cancelled. |
| `api.removeTask()` | <code>(id: Id): Promise&lt;any&gt;</code> | Deletes a task through the `taskDelete` event; resolves to `false` when the id is unknown or the event cancels it. |
| `api.rename()` | <code>(id: Id): void</code> | open the inline name editor |
| `api.undo()` | <code>(): any</code> | Reverts the last edit; resolves to `false` when there is nothing to undo. |
| `api.redo()` | <code>(): any</code> | Repeats the last undone edit; resolves to `false` when there is nothing to redo. |
| `api.canUndo()` | <code>(): boolean</code> | `true` when there is an edit to undo. |
| `api.canRedo()` | <code>(): boolean</code> | `true` when there is an undone edit to repeat. |
| `api.history()` | <code>(): { undo: any[]; redo: any[] }</code> | Copies of the undo and redo stacks. |
| `api.clearHistory()` | <code>(): void</code> | Empties both stacks and emits a history change. |
| `api.workDays()` | <code>(a: WccDate, b: WccDate): number</code> | working days between two dates (calendar aware) |
| `api.dependencies()` | <code>(): GanttDependency[]</code> | Every dependency link of the chart. |
| `api.addDependency()` | <code>(from: Id, to: Id, opts?: { type?: GanttDependency['type']; lag?: number }): Promise&lt;boolean&gt;</code> | Adds a link between two tasks (default type `'FS'`, lag 0 days); resolves to `false` for an unknown id, an existing link, a cycle or a cancelled `dependencyCreate`. |
| `api.removeDependency()` | <code>(from: Id, to: Id): Promise&lt;boolean&gt;</code> | Removes the link between two tasks; resolves to `false` when there is none or `dependencyDelete` cancels it. |
| `api.outOfBounds()` | <code>(): Id[]</code> | ids of tasks outside plotOptions.gantt.boundary |
| `api.saveState()` | <code>(): void</code> | Writes the persisted state (view, collapsed groups, optionally the selection) to localStorage now; does nothing unless plotOptions.gantt.persist sets a key. |
| `api.clearSavedState()` | <code>(): void</code> | Removes the saved state from localStorage. |

## Runtime API: tree

`premium.api<TreeApi>(chart)`.

| Option | Type | Description |
| --- | --- | --- |
| `api.expandAll()` | <code>(): void</code> | Expands every node and refits the view. |
| `api.collapseAll()` | <code>(depth?: number): void</code> | Collapses every node at `depth` or deeper and refits; the default 1 leaves only the root's children visible. |
| `api.toggle()` | <code>(id: Id): void</code> | Collapses or expands one node (as a click on its toggle). |
| `api.focus()` | <code>(id: Id): void</code> | open collapsed ancestors, select the node and pan to it |
| `api.select()` | <code>(id: Id \| null): void</code> | Selects a visible node (as a click); `null` is ignored. |
| `api.selected()` | <code>(): Id \| null</code> | Id of the selected node, or `null`. |
| `api.zoomBy()` | <code>(factor: number): void</code> | Zooms around the centre of the plot; `factor` &gt; 1 zooms in. |
| `api.fit()` | <code>(): void</code> | Animates the view back to fit the whole tree. |

## Runtime API: stock

`premium.api<StockApi>(chart)`.

| Option | Type | Description |
| --- | --- | --- |
| `api.range()` | <code>(label: string): void</code> | apply a range-selector button by label |
| `api.setRange()` | <code>(from: WccDate, to: WccDate, animate?: boolean): void</code> | Shows the candles between two dates; animated unless `animate` is `false`. |
| `api.timeframe()` | <code>(tf: 'day' \| 'week' \| 'month'): void</code> | 'day' \| 'week' \| 'month' |
| `api.view()` | <code>(): { from: number; to: number; candles: number }</code> | First and last timestamp of the view and the number of candles shown. |
| `api.zoomBy()` | <code>(factor: number): void</code> | f &gt; 1 zooms in |
| `api.tool()` | <code>(name?: string \| null): string \| null</code> | get the active drawing tool, or set it (null turns it off) |
| `api.drawings()` | <code>(): WccStockDrawing[]</code> | Every drawing as plain objects. |
| `api.addDrawing()` | <code>(d: WccStockDrawing): any</code> | Adds a drawing (undoable); returns it, or `null` when it is invalid. |
| `api.updateDrawing()` | <code>(id: Id, patch: Partial&lt;WccStockDrawing&gt;): any</code> | Merges `patch` into a drawing; returns the drawing, or `null` when the id is unknown or the result is invalid. |
| `api.removeDrawing()` | <code>(id: Id): any</code> | Removes a drawing; `false` when the id is unknown. |
| `api.clearDrawings()` | <code>(): any</code> | Removes every drawing; `false` when there are none. |
| `api.selectDrawing()` | <code>(id: Id \| null): any</code> | Selects a drawing (shows its handles); `null` clears the selection. |
| `api.serializeDrawings()` | <code>(): string</code> | JSON string of every drawing |
| `api.loadDrawings()` | <code>(jsonOrArray: string \| WccStockDrawing[]): any</code> | Replaces every drawing with an array or its JSON string; `false` when the JSON does not parse. |

## Runtime API: map

`premium.api<MapApi>(chart)`.

| Option | Type | Description |
| --- | --- | --- |
| `api.unmatched()` | <code>(): Array&lt;{ id: string; seriesIndex: number; dataIndex: number; value: unknown }&gt;</code> | Data rows lacking a geometry in the registered map; returns copied records. |
| `api.zoomTo()` | <code>(id: Id): boolean</code> | Zooms to a region by id, name or ISO/postal code (case-insensitive); `false` when it is not found. |
| `api.select()` | <code>(id: Id \| null): boolean</code> | Selects a region by id, name or ISO/postal code, `null` clears; `false` when it is not found. |
| `api.selected()` | <code>(): Id \| null</code> | Id of the selected region, or `null`. |
| `api.zoomBy()` | <code>(factor: number): void</code> | Zooms around the centre of the map; `factor` &gt; 1 zooms in. |
| `api.reset()` | <code>(): void</code> | Resets zoom and pan to the whole map. |
| `api.rotate()` | <code>(lonLat: [number, number]): void</code> | globe projection: centre [lon, lat] |
| `api.palettes()` | <code>(): string[]</code> | names of the built-in colour ramps |

## Runtime API: network

`premium.api<NetworkApi>(chart)`.

| Option | Type | Description |
| --- | --- | --- |
| `api.performanceStats()` | <code>(): { modelMs: number; layoutMs: number; drawMs: number; labelsMs: number; renderMs: number; frames: number; settled: boolean; layout: 'force' \| 'preset' \| '…</code> | Cumulative renderer phase timings, useful only when compared in the same environment. |
| `api.highlightKeys()` | <code>(keys: string \| string[] \| null): boolean</code> | Lights every node that carries one of the keys (`null` clears); facet and force layouts. Pinned: survives pointer leave and redraws. `false` when nothing matched. |
| `api.highlightPath()` | <code>(path: string \| number \| null): boolean</code> | Facet layout: highlights a causal path by name or index (`null` clears). Pinned like highlightKeys. `false` when there is no such path. |
| `api.select()` | <code>(id: string \| number \| null): { [key: string]: unknown } \| null</code> | Lights one node and its neighbours (pinned; `null` clears); returns the node's tooltip payload or `null`. |
| `api.layout()` | <code>(): { type: 'facet'; levels: string[]; sides: number; nodes: NetworkFacetNode[] } \| null</code> | Facet layout: the computed geometry; `null` for the force layout or no data. |

## Runtime API: radialColumn

`premium.api<RadialColumnApi>(chart)`.

| Option | Type | Description |
| --- | --- | --- |
| `api.type` | <code>'radialColumn'</code> | The chart type, `'radialColumn'`. |
| `api.describe()` | <code>(category?: string): string \| null</code> | no argument: the chart summary; a category: every bound channel as one line ('13:20 · 412 Requests · 3.4% Error rate · +12% vs last week') |
| `api.dataTable()` | <code>(): { head: string[]; rows: string[][] } \| null</code> | Rows of the accessible data table and CSV: one row per category (series values and the color/delta channels), then the segments of the inner layers; `null` before the first render. |
| `api.clearHighlight()` | <code>(): void</code> | Removes the hover or keyboard highlight. |
| `api.toggle()` | <code>(id: string): void</code> | Hides or shows a column series (`'s:&lt;series&gt;'`, the last visible one stays), a segment (`'c:&lt;segment name&gt;'`) or the cells of a matrix status (`'x:&lt;status&gt;'`), as a legend click. |
| `api.highlightCategory()` | <code>(name: string): boolean</code> | Highlights one category across every ring; an unknown name clears and returns `false`. |
| `api.layers()` | <code>(): Array&lt;{ index: number; type: RadialColumnLayer['type']; name: string; rings: number; radii: Array&lt;[number, number]&gt;; link?: RadialLinkMode; mode?: 'ridge…</code> | Summary of the inner layers: index, type, name, ring count, radii and link mode. wave layers add mode, sectors, points, domain and their anomalies |
| `api.links()` | <code>(segment: string): string[]</code> | category names linked to a segment (name or 'A › B' path) |
| `api.matrix()` | <code>(): { name: string; mode: 'value' \| 'status'; rows: string[]; cols: string[]; cells: Array&lt;{ row: string; col: string; value: number \| null; status?: string …</code> | The centre matrix as drawn (after overflow): row / column names ('+N' for a merged one), cells row-major and how many rows / columns were merged or dropped; `null` without a matrix layer. |
| `api.select()` | <code>(nameOrPath: string): boolean</code> | sticky selection of a category, segment or matrix cell ('Row → Col') (as a click); false when not found |
| `api.selected()` | <code>(): { slot?: number; key?: string; rib?: string } \| null</code> | The sticky selection: `{ slot }` for a category, `{ key }` for a segment, `{ rib }` for a chord ribbon; `null` when nothing is selected. |
| `api.clearSelection()` | <code>(): void</code> | Clears the sticky selection (and the link filter it set). |
| `api.channels()` | <code>(): Array&lt;[string, string]&gt;</code> | [channel, meaning] rows of the bound encodings |

## Runtime API: quintTimeline / quintConvergence

`premium.api<QuintApi>(chart)`.

| Option | Type | Description |
| --- | --- | --- |
| `api.lens()` | <code>(on?: boolean): { from: number; to: number; factor: number } \| null \| void</code> | without an argument: the focus lens ({ from, to, factor } in ms) or null; lens(true \| false) switches it |
| `api.pin()` | <code>(time: string \| number \| null): void</code> | pins the slot that contains the time (ms or ISO); null unpins |
| `api.select()` | <code>(keys: string \| string[] \| null): void</code> | highlights the keys in every lane; null clears |
| `api.clear()` | <code>(): void</code> | clears selection and pin (as Esc) |
| `api.selection()` | <code>(): { keys: string[] \| null; pinned: number \| null }</code> | current selection: keys and the pinned slot start (ms) |
| `api.ticks()` | <code>(): string[]</code> | the time-axis labels as drawn (one per instant) |

## The premium plugin object

Default export of `west-coast-charts/premium` (`WestCoastChartsPremium`).

| Option | Type | Description |
| --- | --- | --- |
| `premium.name` | <code>'west-coast-charts/premium'</code> | Package name of the plugin. |
| `premium.types` | <code>ReadonlyArray&lt;PremiumChartType&gt;</code> | The chart types the plugin adds. |
| `premium.install()` | <code>(lib: unknown, hook: object): void</code> | Called by `WestCoastCharts.use(premium)`; throws when called otherwise or with a core older than 1.0.0. |
| `premium.setLicenseKey()` | <code>(key: string): Promise&lt;ApexCharts.WestCoastChartsLicense \| null&gt;</code> | same as WestCoastCharts.setLicenseKey (docs/spec/06-premium-types.md §10); no dev-host exemption, so it also checks a key on localhost |
| `premium.api()` | <code>(chart: ApexCharts): (A & { readonly commands: string[] }) \| null</code> | the runtime commands of a rendered premium chart; null for other charts. The object always talks to the chart's current renderer, so it stays valid across updates. Narrow it with the type parameter: premium.api&lt;GanttApi&gt;(chart) |
| `premium.registerPlugin()` | <code>(name: string, plugin: P): P</code> | register a plugin under a name for plotOptions.&lt;type&gt;.plugins: ['name'] |
| `premium.plugins()` | <code>(): string[]</code> | names of the registered plugins |
| `premium.registerLayer()` | <code>(module: WccLayerModule): boolean</code> | register a layer module (west-coast-charts/layers/&lt;name&gt;); same as WestCoastCharts.use(module). true when registered (or already registered), false for a module of another major version. |
| `premium.layers()` | <code>(): string[]</code> | names of the registered layer modules ('west-coast-charts/layers/wave-ring', ...) |
| `premium.autoload` | <code>boolean</code> | a chart that needs a layer module that is not registered loads it by itself (default true); otherwise it warns once and draws without it |
| `premium.layerBase` | <code>string</code> | where autoload finds the modules (URL or path; default: dist/layers/ next to the premium file) |
| `premium.setLayerLoader()` | <code>(loader: ((name: WccLayerName) =&gt; WccLayerModule \| { default: WccLayerModule } \| void \| Promise&lt;WccLayerModule \| { default: WccLayerModule } \| void&gt;) \| null)…</code> | own loader for autoload: (name, e.g. 'wave-ring') =&gt; the module (or a promise of it / of its ES module namespace); null = built-in |

## Premium plugins

An entry of `plotOptions.<type>.plugins` or `premium.registerPlugin(name, plugin)` (`WccPremiumPlugin`). Every hook is optional.

| Option | Type | Description |
| --- | --- | --- |
| `plugin.name` | <code>string</code> | Plugin id (state key and warnings); not set uses `plugin-&lt;index&gt;`. |
| `plugin.defaults` | <code>object</code> | Default options of the plugin; the `[nameOrPlugin, options]` form overrides them. |
| `plugin.reserve()` | <code>(p: any): { top?: number; right?: number; bottom?: number; left?: number } \| void</code> | `(p) =&gt; { top, right, bottom, left }`: space in px taken from the plot before layout. |
| `plugin.afterRender()` | <code>(p: any): void</code> | `(p)`: called after each render; draw into `p.layer()` and bind events with `p.on()`. |
| `plugin.event()` | <code>(name: string, e: Event \| null, payload: any, p: any): boolean \| void</code> | `(name, e, payload, p)`: called for every chart event; returning `false` cancels a cancelable one. |
| `plugin.tooltip()` | <code>(content: any, p: any): any</code> | `(content, p) =&gt; content`: changes the tooltip content (rows, footer, …). |
| `plugin.describe()` | <code>(p: any): string</code> | `(p) =&gt; string` appended to the screen-reader summary. |
| `plugin.destroy()` | <code>(p: any): void</code> | `(p)`: called before each redraw and on destroy. |

## Licence key payload

`WestCoastCharts.setLicenseKey(key)` resolves to this object (`WestCoastChartsLicense`) or `null`.

| Option | Type | Description |
| --- | --- | --- |
| `payload.l` | <code>string</code> | licensee |
| `payload.t` | <code>'premium' \| 'oem'</code> | product tier |
| `payload.e` | <code>number</code> | expiry, ms since 1970; 0 = perpetual |
| `payload.v` | <code>[number, number]</code> | covered major versions, inclusive |
| `payload.i` | <code>number</code> | issued, ms since 1970 |
| `payload.d` | <code>string[]</code> | host patterns the key is bound to ('acme.com', '*.acme.com', '10.20.*'); absent = any host |
