data |
Row[] |
(required) |
The rows: one per category. |
config |
ChartConfig |
(required) |
The chart config: per data key a label, a color (any CSS color, usually var(--chart-N)) or a theme { light, dark }, and an optional icon; legendType and tooltipType; strokeDasharray and strokeOpacity dash and fade a line or an area's edge. Each key becomes --color-<key> on the chart. |
x |
string |
(required) |
The category field. |
series |
string[] |
[] |
The value fields to draw. Empty draws every config key that has numbers in the data. |
layout |
"horizontal" | "vertical" |
"horizontal" |
vertical runs the categories down the chart and the values across it; the arrows follow them. |
curve |
"linear" | "monotone" | "natural" | "step" | "stepBefore" | "stepAfter" | "basis" | "bump" |
"linear" |
How the line joins its points. |
strokeWidth |
number |
0 |
Line width in px. 0 follows the theme. |
dots |
boolean | { r?: number; shape?: "circle" | "square" | "diamond" | "commit"; colorByRow?: boolean; nameKey?: string; hollow?: boolean } |
false |
A marker on every point. colorByRow fills each from its row's fill. |
activeDot |
boolean | { r?: number; shape?: "circle" | "square" | "diamond" | "commit"; colorByRow?: boolean; nameKey?: string; hollow?: boolean } |
true |
The markers on every series at the active point. |
connectNulls |
boolean |
false |
Draw across missing values instead of breaking the line. |
categoryAxis |
boolean | { tickFormatter?: (value, index) => string; tickLine?: boolean; axisLine?: boolean; tickMargin?: number; tickCount?: number; domain?: [number | "auto" | "dataMin" | "dataMax", ...]; size?: number; showAll?: boolean; minTickGap?: number; orientation?: "left" | "right" | "top" | "bottom"; series?: string[]; key?: string; hide?: boolean; reversed?: boolean; angle?: number; label?: string | { value, offset? }; unit?: string; ticks?: (number | string)[]; allowDecimals?: boolean; allowDataOverflow?: boolean; niceTicks?: "auto" | "none"; interval?: number | "preserveEnd" | "preserveStart" | "preserveStartEnd" | "equidistantPreserveStart"; padding?: { left?, right?, top?, bottom? }; scale?: "linear" | "log" | "sqrt"; type?: "category" | "number"; mirror?: boolean; tickSize?: number; tick?: boolean; includeHidden?: boolean; allowDuplicatedCategory?: boolean } | AxisOptions[] |
true |
The category axis. A list draws several, such as a second on top showing another field (key, orientation). Options: reversed, angle, label, interval, padding, type number, tickSize, tick, allowDuplicatedCategory. |
valueAxis |
boolean | { tickFormatter?: (value, index) => string; tickLine?: boolean; axisLine?: boolean; tickMargin?: number; tickCount?: number; domain?: [number | "auto" | "dataMin" | "dataMax", ...]; size?: number; showAll?: boolean; minTickGap?: number; orientation?: "left" | "right" | "top" | "bottom"; series?: string[]; key?: string; hide?: boolean; reversed?: boolean; angle?: number; label?: string | { value, offset? }; unit?: string; ticks?: (number | string)[]; allowDecimals?: boolean; allowDataOverflow?: boolean; niceTicks?: "auto" | "none"; interval?: number | "preserveEnd" | "preserveStart" | "preserveStartEnd" | "equidistantPreserveStart"; padding?: { left?, right?, top?, bottom? }; scale?: "linear" | "log" | "sqrt"; type?: "category" | "number"; mirror?: boolean; tickSize?: number; tick?: boolean; includeHidden?: boolean; allowDuplicatedCategory?: boolean } | AxisOptions[] |
false |
The value axis. domain and tickCount shape its scale; a list adds axes, each scaling the series it names, on the right with orientation. Options: reversed, unit, ticks, allowDecimals, allowDataOverflow, niceTicks, scale (linear, log, sqrt), mirror, label, includeHidden. |
grid |
boolean | { horizontal?: boolean; vertical?: boolean; strokeDasharray?: string; fill?: string; fillOpacity?: number; horizontalFill?: string[]; verticalFill?: string[]; horizontalValues?: (number | string)[]; verticalValues?: (number | string)[]; horizontalPoints?: number[]; verticalPoints?: number[]; horizontalCoordinatesGenerator?: (plot) => number[]; verticalCoordinatesGenerator?: (plot) => number[]; syncWithTicks?: boolean } |
true |
The grid: horizontal lines at the value ticks by default, vertical on request; dashed lines, a background fill and stripes between the lines; lines at given values or pixels; syncWithTicks keeps the category lines to the ticks that show. |
labels |
boolean | LabelOptions | LabelOptions[] (LabelOptions: { position?, key?, series?, formatter?: (value, row) => string, offset?, color?, class? }) |
false |
A value or another field above (or below) each point. |
tooltip |
boolean | { indicator?: "dot" | "line" | "dashed"; hideLabel?: boolean; hideIndicator?: boolean; color?: string; labelKey?: string; nameKey?: string; labelFormatter?: (label, row) => string; formatter?: (value, key, row) => string; footer?: (row) => string; footerLabel?: string; unit?: string; defaultIndex?: number; cursor?: boolean; filterNull?: boolean; trigger?: "hover" | "click"; active?: boolean; position?: { x?, y? }; reverseDirection?: { x?, y? }; itemSorter?: "name" | "value" | "key" | (item) => number | string; includeHidden?: boolean; animationDuration?: number; animationEasing?: string | (t) => number; isAnimationActive?: boolean } |
true |
The tooltip: false turns it off; an object sets the indicator, hides the heading or swatches, takes names and headings from other keys, formats them, adds a footer line, or turns off the hover cursor. More options: trigger click (a click shows it and it stays), active (always or never shown), position (a fixed spot), reverseDirection, itemSorter and includeHidden. |
legend |
boolean | { position?: "top" | "bottom" | "left" | "right" | "center" | "insideTop" | "insideBottom" | "insideLeft" | "insideRight" | "insideTopLeft" | "insideTopRight" | "insideBottomLeft" | "insideBottomRight" | { x, y }; offset?: number; iconSize?: number; verticalAlign?: "top" | "middle" | "bottom"; align?: "left" | "center" | "right"; layout?: "horizontal" | "vertical"; iconType?: "square" | "rect" | "circle" | "line" | "plainline" | "diamond" | "triangle" | "cross" | "star" | "wye" | "none"; formatter?: (name, key) => string; itemSorter?: "name" | "key" | (item) => number | string; hideIcon?: boolean; nameKey?: string; toggle?: boolean } |
false |
The legend: above or below the plot, or beside it with verticalAlign middle; position puts it beside the plot, over it at an inside spot or the center, or at a point, offset moves it, iconSize sizes the swatch; align, a vertical layout, the swatch shape (iconType), a name formatter and an itemSorter; names from another key; toggle makes each item a button that hides its series. |
margin |
{ top?, right?, bottom?, left? } |
{} |
Space around the plot in px; each side defaults to 5. |
active |
number (two-way) |
-1 |
The active item index. Hover and the arrow keys move it; when the pointer leaves it returns to the value it had. |
hidden |
string[] (two-way) |
[] |
Series keys not drawn. They stay in the legend, where a toggle legend shows them again. |
label |
string |
"Line chart" |
The chart's accessible name and its table's caption. |
animate |
boolean |
true |
Marks enter with motion and move to new values. Off under prefers-reduced-motion. |
animation |
{ begin?: number; duration?: number; easing?: string | (t) => number; matchBy?: "index" | "append" | (item, index) => key; interpolate?: (items, t) => items; newValues?: boolean } |
{} |
Times the entry and the move to new data. matchBy pairs old and new items by position or by a key, matchByDataKey(field) from the chart package; interpolate draws every frame of a change from the paired items and the eased time; newValues false shows an unpaired new point at once. |
showTable |
boolean |
false |
Show the chart's data table under the plot. The table is always in the accessibility tree. |
class |
string |
"" |
Classes on the figure. Size the chart here: it keeps a 16:9 box unless given a height or aspect-ratio. |
attrs |
Record<string, string | number | boolean | undefined> |
{} |
Any other attributes for the figure: id, data-testid, aria-*. |
syncId |
string |
"" |
Charts with the same syncId share the active item and its tooltip. |
syncMethod |
"index" | "value" |
"index" |
Match the shared item by position, or by its category or name. |
onActiveChange |
(index: number) => void |
() => {} |
The user moved the active item (hover, leave or keys). |
onItemClick |
(index: number) => void |
() => {} |
A click or tap on an item, with its index. |
onHiddenChange |
(hidden: string[]) => void |
() => {} |
A legend toggle changed hidden. |