SIG—02 Signature system
TrendChart
Values over time as an instrument: a live legend that reads the crosshair, drag-to-measure deltas, annotations, thresholds and linked views.
Live — this one is real
Illustrative data. Hover or use arrow keys to read; drag to measure a period; Ctrl-scroll to zoom.
Drag across the chart to measure a period.
Left and right arrows read each value; Shift extends a measured period and Enter zooms to it. Plus and minus zoom, 0 shows the whole range, Escape clears.
Drag across the chart to measure a period.
Left and right arrows read each value; Shift extends a measured period and Enter zooms to it. Plus and minus zoom, 0 shows the whole range, Escape clears.
Usage
import { TrendChart } from "mizu-ui";
export function Example() {
const day = (d: number) => Date.UTC(2026, 8, d);
return (
<TrendChart
label="Weekly active teams"
utc
series={[
{
id: "teams",
label: "Teams",
area: true,
data: [
{ x: day(1), y: 412 },
{ x: day(2), y: 436 },
{ x: day(3), y: 431 },
{ x: day(4), y: 478 },
{ x: day(5), y: 502 },
{ x: day(6), y: 497 },
{ x: day(7), y: 540 },
],
},
]}
/>
);
}
This code, running — no configuration beyond the data
Drag across the chart to measure a period.
Left and right arrows read each value; Shift extends a measured period and Enter zooms to it. Plus and minus zoom, 0 shows the whole range, Escape clears.
Keyboard
- ←→
- Read the previous or next value (Alt: ten at a time)
- Shift+←→
- Extend a measured period
- Enter
- Zoom to the measured period
- +−
- Zoom around the crosshair
- 0
- Show the whole range (or double-click)
- Esc
- Clear the crosshair and measurement
- Ctrl+scroll
- Zoom at the pointer
Source & setup
Add this component to your project with the shadcn CLI. The command copies its source and styles into your configured UI directory.
npx shadcn@latest add 0xuser64bit/mizu/trend-chartFor npm imports, import mizu-ui/styles.css once. Fonts are optional via mizu-ui/fonts.css. Override --mizu-* tokens or use className for local styling. Requires React and Motion.
Inspect signature/TrendChart.tsx
Source is included in the npm package under src/signature/TrendChart.tsx.
Props
| Prop | Type | Default | Description |
|---|---|---|---|
| label | string | — | Accessible name and visible title. |
| series | TrendSeries[] | — | id, label, data of { x, y } (null y leaves a gap), tone, area and dashed. |
| annotations / thresholds | TrendAnnotation[] / TrendThreshold[] | — | Numbered moments with detail; labelled reference values such as an SLO. |
| format / formatX | (value: number) => string | — | Value and x formatting. Values default to compact numbers; x to time stamps. |
| xType | "time" | "number" | "time" | How x is scaled and labelled. |
| utc / height / zero | boolean / number / boolean | — | UTC time, plot height and a zero baseline (on for areas). |
| range / defaultRange / onRangeChange | [number, number] | — | Visible x range. Share it between charts to zoom them together. |
| cursor / onCursorChange | number | null | — | Crosshair position. Share it to read several charts at once. |
| loading / empty | boolean / ReactNode | — | Loading and empty states. |
Accessibility
The plot is a focusable chart group: arrow keys step through readings and each reading is announced with every series. Shift extends a measured period. The legend is a set of toggle buttons that always keeps one series visible. A table view presents the visible readings as a real table.
Motion
Lines draw from left to right on first view and areas fade in after them. Zooms glide; the value axis eases to the visible data. Reduced motion shows the finished chart and changes instantly.