---
id: "packages/active-charts/all-exports/line-chart"
title: "LineChart"
description: "LineChart, LineChartProps, LineChartSeriesConfig: generated from the source of active-charts."
url: "/packages/active-charts/all-exports/line-chart"
locale: "en"
revision: "g0mvjxwj5c-88bdbe1c:line-chart"
---

# LineChart

Exported by `@workspace/active-charts`. Generated from the package source; part of [the index of every export](/packages/active-charts/all-exports).

## `LineChart`

| Prop | Type | Required | Description |
| --- | --- | --- | --- |
| `data` | `TDatum[]` | yes | Flat array of row objects keyed by field name. |
| `height` | `number` | yes | Container height in pixels. Width is always responsive. |
| `xAxis` | `CategoryXAxis<TimeAxisTickValue> \| NumericXAxis<TimeAxisTickValue> \| (Omit<AxisConfig, "formatter" \| "temporalSemantic" \| "type"> & { formatter?: AxisFormatter<TimeAxisTickValue> \| undefined; } & { type?: TemporalAxisType; temporalSemantic: TemporalSemantic; })` | yes |  |
| `xKey` | `Extract<keyof TDatum, string> \| XKeyFor<TDatum>` | yes |  |
| `accessibility` | `AccessibilityOptions` | no | Accessibility configuration — ARIA label/description, screen-reader data table, live-region announcements. Merged with ChartDefaults. |
| `animation` | `FeatureOption<Omit<AnimationOptions, "replay">>` | no | How the chart moves: a profile and semantic classes. `false` turns every interpolation off. See {@link AnimationOptions}. |
| `annotations` | `AnnotationOptions[]` | no | Point annotations: a label with an optional connector and marker at a data coordinate, `xValue` on the x axis and `yValue` on the first value axis. The contract of `<Chart>`'s `options.annotations` (BC1). |
| `className` | `string` | no | Optional className applied to the outer container. |
| `colors` | `string[]` | no | Categorical palette for this chart only: replaces the host palette (`--chart-1` … `--chart-10`) in the chart's colour assignment, and nothing else. It is a data encoding, not a theme: surfaces, text, grid and semantic roles keep coming from the CSS token contract, and a series, datum or annotation that sets its own colour keeps it. Any CSS colour string (a public token reference such as `var(--chart-3)`, hex, oklch). |
| `contextMenu` | `FeatureOption<ChartContextMenuOptions<CartesianPoint<TDatum>, "copy" \| "export" \| "series" \| "zoom">>` | no | The context menu. Opened on a mark, the host's builder receives a typed {@link CartesianPoint} as `context.target.element` (the point the tooltip names, or the focused point); on empty plot area the target is the chart, on a legend entry the entry. Its own groups are copy, zoom, series and export; a Cartesian chart has no replay. |
| `crosshairs` | `boolean \| CrosshairOptions` | no | Enable crosshairs. Default: `true` for line charts. |
| `crossLines` | `CrossLineOptions[]` | no | Cross lines (reference lines/bands) drawn on the chart. |
| `dataGrouping` | `boolean \| DataGroupingOptions` | no | Time-based data grouping — aggregates dense time-series into calendar-aligned buckets (week / month / quarter / year) at the current zoom level. Pass `true` for sensible defaults (`groupPixelWidth: 6`, approximation per series type, anchor `'start'`).  Runs after zoom-slicing and before reduction: grouping aggregates every series role by role, and reduction still applies to buckets that exceed `maxPoints`. Grouping applies to every series or to none. |
| `defaultSelectedItems` | `readonly ChartItemRef[]` | no | The initial selection of an uncontrolled chart. |
| `dir` | `"ltr" \| "rtl"` | no | The chart's UI direction: the reading direction of its HTML text and chrome (tooltip, legend, menus, the accessible table), and the direction the context menu carries under `<body>`.  Left out, the chart inherits the direction of the page around it (the nearest `dir` attribute, else the computed CSS direction) and follows a later change of that attribute. It is never inferred from `locale`, and it never reverses an axis or reorders data: `reversed` stays an explicit axis choice. Under `rtl` the chrome mirrors (legend flow, tooltip side, context menu and submenus, report text in exports), a title-like label starts at the inline start, and a label placed by geometry (an axis tick, a slice or bar label) keeps its physical side; plot arrow keys stay spatial while legend and menu arrows follow the reading direction. |
| `events` | `(ChartEvents & ChartSelectionEvents<TDatum, ChartSeriesItem<TDatum>>)` | no | Every event callback in one prop, selection events included. |
| `indicators` | `IndicatorConfig[]` | no | Technical indicators (SMA, EMA, MACD) overlaid as extra line series. |
| `label` | `PointLabelOptions` | no | Point labels for every series: the value above each point, hidden where it collides (the `<Chart>` line series `label`, BC1). `formatter` receives the row and the series as its second argument. Default: off. |
| `legend` | `boolean \| LegendOptions` | no | Enable legend. Default: `false` (single-series) / `true` (with indicators). |
| `legendLink` | `ChartLegendLink` | no | Connects the chart's legend to `useChartLegend()`, for a legend the host renders itself. Give one link to one chart. |
| `locale` | `ValuePresentation` | no | Presentation input for axis labels, tooltips, labels and accessibility announcements: a locale code (notation follows the language), or a presentation-context object (`{languageLocale, dateShape?, dateFormat?, timeFormat?, numberFormat?, currencyDisplay?}`) carrying language and notation independently. `dateShape` is the normal human date shape a plain date consumer inherits; an axis that declares its own preset for readability keeps it. Forwarded untouched to the central `@workspace/active-format`; the package never resolves tenant or application settings itself. When omitted, `<ChartDefaults>` supplies it; with neither, the chart throws a configuration error (no `'en'` fallback, active-format D14). Object inputs must be referentially stable across renders. |
| `maxPoints` | `number` | no | The number of rows above which the chart reduces the drawn line. Reduction keeps, per pixel column, the first, last, lowest and highest row of every series and every gap edge, so the line keeps its shape, extremes and gaps; it runs on a continuous or ordinal-time x axis only. Default `500`; `0` draws every row. The screen-reader table lists the displayed rows and says so; CSV export always carries every row. |
| `name` | `string` | no | Name for the single series (used in legend/tooltip). Ignored when `series` is set. |
| `navigator` | `boolean \| NavigatorOptions` | no | Enable navigator mini-chart with brush. Default: `false`. |
| `onAnimationComplete` | `((event: AnimationCompleteEvent) => void)` | no | Fired when a chart animation completes. - `'load'`: initial mount animation finished (or immediately if animation disabled / prefers-reduced-motion is active). - `'update'`: data-update transition finished.  Not triggered by zoom animations (use `onZoomChange`) or tooltip fades. |
| `onExportComplete` | `((result: ChartExportResult) => void)` | no | Fired after a successful export action (PNG/SVG/CSV/PDF), including from the context menu and from imperative `ChartHandle` calls. |
| `onExportError` | `((format: ChartExportFormat, error: unknown) => void)` | no | Fired when an export could not produce its file (W11), from the handle as well as from the context menu. Without it a failed context-menu export is reported as an error diagnostic (`<ChartDefaults diagnostics>`). |
| `onItemActivate` | `((item: ChartSeriesItem<TDatum>, source: ChartInteractionSource) => void)` | no | Fired when the reader activates an item: a click or tap on it, or `Enter` on the focused item (`Shift+Enter` on a sankey, whose `Enter` moves between nodes and links). With a handler, `Enter` activates instead of opening the context menu (`Shift+F10` and the context-menu key still open it). |
| `onLegendChange` | `((change: ChartLegendChange) => void)` | no | Fired once for every legend change the chart applies: a hide, a show, an isolation or a show-all, from the built-in legend (click, key, double click, double tap), its menu, or `useChartLegend()`. The change names the entry and its target by identity and lists every hidden target after it. A refused action (the last visible target, `legend.interactive: false`) changes nothing and reports nothing. |
| `onReady` | `(() => void)` | no | Fired exactly once per chart instance, after the first successful mount with valid dimensions and **before** any entrance animation starts. "Ready" means: the SVG is in the DOM, layout has run with real dimensions, and the chart can be queried by integration tests.  Distinct from {@link onAnimationComplete} with `type: 'load'`, which fires *after* the load animation finishes. A chart with `animation={false}` still fires `onReady` — animation state has no effect on readiness.  A new React `key` on the host produces a new component instance and `onReady` fires again. Identity changes of the callback itself after the first fire are ignored (latch is per-instance).  **Consumer requirement — stable from first render.** The latch closes on the first effect run regardless of whether `onReady` was defined at that moment. If `onReady` is initially `undefined` and later resolves to a function, the callback will **never** fire — the latch has already closed with a no-op. Pass a stable reference (typically via `useCallback`) or pass the final function unconditionally from the first render. |
| `onSelectionChange` | `((selection: ChartItemRef[], change: ChartSelectionChange<TDatum, ChartSeriesItem<TDatum>>) => void)` | no | Fired when the reader changes the selection (pointer, touch or keyboard), and when an uncontrolled selection drops items the data no longer contains. `selection` is the complete selection the change makes; it keeps every reference the selection held, of whatever form. On a controlled chart it is a proposal (`change.requested: true`), computed from the current `selectedItems` and never from an earlier proposal; the host applies it, changes it or ignores it. |
| `onZoomChange` | `((startFraction: number, endFraction: number, yStartFraction?: number, yEndFraction?: number) => void)` | no | Fired when the zoom range changes (after animation completes). Fractions [0..1]. Y params are only provided when Y-zoom is active. Cartesian charts only. |
| `ref` | `Ref<ChartHandle>` | no | Imperative handle — see {@link ChartHandle}. Allows getting a ref to the component instance. Once the component unmounts, React will set `ref.current` to `null` (or call the ref with `null` if you passed a callback ref). |
| `selectedItems` | `readonly ChartItemRef[]` | no | The selection, controlled by the host. The chart draws, announces and lists the items it resolves to and never changes it; the host updates it from `onSelectionChange`. A request the host applies is announced when the host passes it back; one it ignores is never announced. A reference to an item that is hidden, zoomed or drilled out of view, or not in the data stays in the host's selection and is not shown as selected. |
| `selection` | `FeatureOption<ChartSelectionOptions>` | no | Item selection. `true` = single selection keyed by the default key. |
| `series` | `LineChartSeriesConfig[]` | no | Multiple series configuration. When present, the top-level `yKey` and `name` are ignored. |
| `sync` | `boolean \| ChartSyncOptions` | no | Synchronize with other charts in a SyncGroup. Default: `false`. |
| `t` | `ChartTranslateFn` | no | The host translator for every text the chart shows or announces. When omitted, `<ChartDefaults>` supplies it; with neither, the chart throws a configuration error (no English fallback, ADR-028). |
| `tooltip` | `FeatureOption<TooltipOptions>` | no | Tooltip configuration. `true` = defaults, `false` = disabled, object = explicit. |
| `width` | `number` | no | Optional fixed width in pixels. Default: fill container. |
| `yAxis` | `UprightValueAxisConfig` | no | Y-axis configuration. |
| `yKey` | `string` | no | Y-axis field name (single-series shorthand). Mutually exclusive with `series`. For multi-series charts, declare each y-series explicitly via `series: [{yKey: 'open'}, {yKey: 'close'}]`. |
| `zoom` | `boolean \| ZoomOptions` | no | Enable zoom & pan. Default: `false`. |

## Types

**LineChartProps**

```ts
type LineChartProps<TDatum extends ChartDatum = ChartDatum> =
  LineChartBaseProps<TDatum> & CartesianXKeyTimeDefault<TDatum>;
```

Props for {@link LineChart}. Extends {@link BaseChartProps} (adds
`height`, `width`, `className`, `locale`, `t`, `accessibility`,
`colors`, `tooltip`, `contextMenu`, `animation`, `events`, `ref`, and the
chart-level event callbacks).

Props are a discriminated union on `xAxis`:

- Default / `'ordinal-time'` / `'time'`: `xKey` MUST point to a
`Date | number | IsoDateString` field in `TDatum`. A raw `string`
field (e.g. a locale-formatted date) will not compile — consumers
must brand the value via `toIsoDateString(...)` from
`@workspace/active-format` at the data-boundary.
- `'category'` / `'number'` / `'log'` / `'sqrt'`: `xKey` may reference
any field in `TDatum`. Use this when the x-axis is intentionally
non-temporal.

Single-series usage: `<LineChart data={...} xKey="date" yKey="value" />`.
Multi-series usage: `<LineChart data={...} xKey="date" series={[...]} />`.

**LineChartSeriesConfig**

```ts
interface LineChartSeriesConfig {
  id?: string;
  yKey: string;
  name?: string;
  stroke?: string;
  strokeWidth?: number;
  lineDash?: number[];
  curve?: CurveType;
  marker?: MarkerOptions;
  connectMissingData?: boolean;
  errorBars?: ErrorBarOptions;
  zones?: SeriesZones<LineZoneRange>;
  yAxisId?: string;
  visible?: boolean;
  showInLegend?: boolean;
}
```
