Line chart
Active users
Usage
Import the component and the stylesheet once. See Getting started to install the package.
import { LineChartCard } from '@lilt-ui/charts';
import '@lilt-ui/charts/styles.css';<LineChartCard
title="Active users"
data={dailySessions}
x="date"
series={[{ key: 'desktop' }, { key: 'mobile' }]}
/>Omit title to leave out the visible title. Set header={false} to remove the whole header, and use aria-label to name a chart inside your own card. legend={false} removes the legend independently. surface="ghost" controls only the visual frame. See Card composition.
Data
Pass your rows as they are. x and each series key name fields on the row, and TypeScript rejects keys that don’t exist or aren’t numbers. By default the headline totals every series; use aggregate and headlineSeries when the numbers are rates or levels rather than counts. null is a gap, not zero.
// One row per x position, one numeric field per series.
const latency = [
{ hour: '00:00', p50: 82, p95: 210 },
{ hour: '03:00', p50: 76, p95: 188 },
];
<LineChartCard
title="Response time"
data={latency}
x="hour"
series={[{ key: 'p50' }, { key: 'p95' }]}
aggregate="mean" // average, not total
headlineSeries="p95" // the headline tracks p95
/>For a working period select, pass ranges. Each range brings its own data and delta.
<LineChartCard
title="Active users"
x="date"
series={series}
ranges={[
{ id: 'three-weeks', label: 'Last 21 days', data: last21Days, delta: 0.126 },
{ id: 'week', label: 'Last 7 days', data: last7Days, delta: 0.034 },
]}
/>Props
Every prop LineChartCard accepts, in the order you are likely to reach for them.
| Prop | Type | Description |
|---|---|---|
title | string | Optional visible title. Omit to render no title. Also supplies the accessible name unless aria-label is set. |
data | Row[] | One row per x position. Omit when using ranges. |
x | key of Row | Text, number, or Date field for the x axis. |
series | { key, label?, color?, dashed? }[] | Numeric fields to plot, checked against your row type. Dashed series are references left out of the headline. |
indexed | boolean | Rebase each series to 100 at its first finite reading. Zero baselines are unindexable. Unitless output; defaults to the latest first-series headline. Forecast envelopes are omitted while indexed. |
curve | 'smooth' | 'linear' | 'step' | Monotone spline, straight segments, or steps that hold each value. |
points | boolean | Mark every observation with a small dot. |
baseline | 'auto' | 'zero' | Fit the y axis to the data (default) or start it at zero. |
aggregate | 'sum' | 'mean' | 'last' | 'max' | How the headline and tiles summarize the period. Defaults to sum. |
headlineSeries | key | Make the headline follow one series instead of the total. |
bleed | boolean | Run lines to the card edges with a soft fade. Defaults to true. |
depth | boolean | Draws each line as a lit tube with a soft shadow along its exact path. Dashed references stay flat. |
decimate | boolean | Draw a long series from each pixel column’s first, last, lowest and highest point, so tens of thousands of points stay fast. Hover, tiles and exports still read every row. Defaults to true. |
header | boolean | Defaults to true. False removes the whole header: title, headline, delta and period controls, with no reserved space. Pass data directly when your app owns period selection. |
aria-label | string | Accessible chart name, independent of the visible title. Falls back to title, then a generic chart name. |
delta | number | Fractional change for the chip: 0.082 shows +8.2%. |
deltaTone | 'default' | 'inverse' | 'neutral' | Use inverse when a decrease is good. |
headline | number | Resting headline. Defaults to the aggregate of non-reference series; dashed series are excluded. |
range | string | Static period label in the header. |
ranges | { id, label, data, delta?, headline? }[] | Turns the period label into a select. Each range swaps the data. |
valueFormat | Intl.NumberFormatOptions | Formats the headline, tiles, and axis, e.g. currency. |
tiles | boolean | Per-series value tiles. Defaults to true; false hides the legend. |
legend | false | 'tiles' | 'inline' | 'list' | 'pills' | 'bars' | False removes the legend without changing the data. How the legend under the plot lays out: value tiles (default), a compact inline key, list rows, tinted pills, or bars that also draw each value against the largest. |
legendSwatch | 'square' | 'dot' | 'line' | The mark beside each legend label. Defaults to a rounded square. |
height | number | Plot height in pixels. Defaults to 240. |
axis | 'minimal' | 'dots' | 'inline' | 'ruler' | 'classic' | 'segmented' | { x, y } | Axis preset. Minimal (default) labels only the x ends and has no grid. Set one per axis with `{ x, y }`; a segmented axis can take a `gradient` to read as a range. |
hover | 'pills' | 'tooltip' | 'strip' | 'headline' | The one readout for the hovered point: pills on the axes (default), a tooltip with every series, a strip docked above the plot, or the headline and tiles alone. |
hoverStyle | 'soft' | 'solid' | 'accent' | How the pills or tooltip look. Soft (default) is surface glass; accent tints it with the hovered series. |
pillSeries | 'nearest' | 'total' | key | Which series the y pill reads and the tooltip leads with. Nearest (default) follows the pointer. |
pillPosition | 'auto' | 'mark' | 'axis' | Where the value pill sits: above the hovered mark, or on the y axis. Auto picks mark when there are no y labels. |
tooltipIndicator | 'square' | 'dot' | 'line' | Series marker on each tooltip row, with hover="tooltip". Square by default. |
background | 'dots' | 'grid' | 'lines' | 'none' | Texture behind the marks. Dots by default, with a hover spotlight. |
surface | 'elevated' | 'outline' | 'ghost' | Card treatment. Ghost removes the visual frame only; header and legend are independent controls. |
palette | 'iris' | 'cobalt' | 'emerald' | Series colors. Iris by default; explicit series colors still win. |
axisInset | number | Padding between the plot edges and axis labels or pills. |
loading | boolean | Shows a neutral loading skeleton, not data. |
loadingStyle | 'shimmer' | 'draw' | 'breathe' | Shimmer sweeps a highlight over still shapes; draw reveals them in order; breathe lets them settle. Follows the selected look, including depth, and respects reduced motion. |
empty | 'dots' | 'shape' | ReactElement | null | What the card shows when the period has no data. Dots (default) gathers a quiet dot field around the message; shape lays the chart’s own outline behind it. Pass `<ChartEmpty>` with your own words, any element of your own, or null for nothing. Both looks stay still, so empty never reads as loading, and the headline reads a dash, never zero. |
compare | boolean | 'headline' | 'badge' | Drag across the plot to compare two points in time. True or headline reads the change in the headline; badge reads it in the card’s tab and leaves the headline at rest. |
target | number | { value, label? } | A goal each point should reach: a labeled line, a “vs target” chip on hover, and a count of points on target at rest. |
forecast | { from, lower?, upper?, label?, bands?: { lower, upper, label }[] } | Rows from `from` onward are projections: dotted and excluded from the headline. Supply lower/upper for one envelope, or bands ordered widest to narrowest for a fan on Line and unstacked Area. Every bound is inspectable; no forecast is estimated. |
sync | string | Link hover and pins with every card that uses the same name, matched by x value. A click pins them all, with a ghost pin on the others; Alt-click pins one card only. |
numberStyle | 'count' | 'pop' | 'slide' | 'roll' | 'flow' | 'scramble' | How the headline animates when its value changes. Count (default) counts to the new value. |
motion | 'auto' | 'none' | None turns off decorative motion; reduced motion does this automatically. |
defaultRange | string | Initial range id; defaults to the first supplied range. |
locale | string | Locale used for number formatting. Defaults to en-US. |
formatValue | (value: number) => string | Custom value text, taking precedence over valueFormat. |
formatAxisValue | (value: number) => string | Custom compact axis value text. |
formatX | (value: string | number | Date) => string | Custom x label text. |
xType | 'category' | 'number' | 'time' | Override inferred x type. Use time for numeric Unix timestamps in milliseconds. |
spotlight | boolean | Highlight the inspected position in the plot background. Defaults to true. |
badge | ReactNode | Content in the tab above the card. A comparison badge can replace this while a comparison is active. |
className | string | Additional class on the card frame. |
style | CSSProperties | ChartStyle | Inline styles and scoped --lilt-* chart variables. |
pillValue | 'series' | 'stack' | Read an individual series value (default) or its stacked height. Has no effect when the card has no stacked series. |