Skip to content
Charts

Composed Chart

Area, bar, and line on one axis. Default and Motion variants.

Examples

Installation

Default is a ready-made wrapper from the registry. Motion is the composable engine at @cronus-ui/ui/charts (peer visx + motion).

bash
npx cronus-ui add composed-chart
tsx
import { ComposedChart } from "@cronus-ui/ui";

Usage

tsx
import { ComposedChart, Area, SeriesBar, Line, Grid, XAxis, ChartTooltip } from "@cronus-ui/ui/charts";
import { curveCatmullRom } from "@visx/curve";
<ComposedChart data={data}>
<Grid horizontal />
<Area dataKey="runRate" fill="var(--chart-2)" fillOpacity={0.25} />
<SeriesBar dataKey="units" fill="var(--chart-3)" radius={4} />
<Line dataKey="revenue" stroke="var(--chart-1)" strokeWidth={2.5} curve={curveCatmullRom} />
<XAxis />
<ChartTooltip />
</ComposedChart>

Components

Motion API — compose these under the chart root. Default wrapper props are in Default API below.

ComposedChart

Root that sizes the SVG, provides scales, and hosts series children.

Skip ComposedChartProps props table
PropTypeDefaultDescription
data*
Record<string, unknown>[]Rows with a date (or x) field and numeric series.
xDataKey
string"date"Key for the x-axis.
margin
`Partial<{ top, right, bottom, left }>`{ top: 40, right: 40, bottom: 40, left: 40 }Plot margins.
animationDuration
number1100Clip-reveal duration in ms.
aspectRatio
string"2 / 1"CSS aspect ratio.
status
"loading" | "ready""ready"Loading ↔ ready choreography.
xDomain
[Date, Date]Visible x-range for brush zoom.
className
stringContainer class.
barSize
numberTarget bar width in px.
maxBarSize
numberMaximum bar width in px.
barGap
number4Gap between grouped SeriesBar series.
stacked
booleanfalseStack SeriesBar segments (line/area are not stacked).

Area

Filled series with an optional stroke, edge fade, markers, and a dashed tail.

Skip AreaProps props table
PropTypeDefaultDescription
dataKey*
stringY-value key.
yAxisId
string | number"left"Scale group for dual axes.
fill
stringvar(--chart-line-primary)Gradient start color.
fillOpacity
number0.4Opacity at the top of the fill.
stroke
stringsame as fillLine color.
strokeWidth
number2Line width.
curve
CurveFactorycurveMonotoneXd3 curve.
fadeEdges
boolean | "left" | "right"falseFade fill/stroke at chart edges.
showMarkers
booleanfalseRing markers at each point.
dashFromIndex
numberIndex from which the stroke becomes dashed.

SeriesBar

Time-aligned columns inside ComposedChart (not the categorical Bar).

Skip SeriesBarProps props table
PropTypeDefaultDescription
dataKey*
stringValue key.
fill
stringvar(--chart-line-primary)Fill color.
radius
number0Top corner radius.
fadedOpacity
number0.3Opacity when another x is hovered.

Line

Stroked series with optional edge fade, markers, loading pulse, and a dashed tail.

Skip LineProps props table
PropTypeDefaultDescription
dataKey*
stringY-value key.
yAxisId
string | number"left"Scale group for dual axes.
stroke
stringvar(--chart-line-primary)Line color.
strokeWidth
number2.5Line width.
curve
CurveFactorycurveNaturald3 curve.
fadeEdges
boolean | "left" | "right"falseFade the stroke at chart edges.
dashFromIndex
numberIndex from which the stroke becomes dashed.
showMarkers
booleanfalsePoint markers.

Grid

Plot-area grid lines. Horizontal by default; optional shimmer while loading.

Skip GridProps props table
PropTypeDefaultDescription
horizontal
booleantrueShow horizontal lines.
vertical
booleanfalseShow vertical lines.
numTicksRows
number5Horizontal line count.
numTicksColumns
number10Vertical line count.
stroke
stringvar(--chart-grid)Line color while ready.
strokeDasharray
string"4,4"Dash pattern.
shimmer
booleanfalseAnimate a band across horizontal lines.
highlightRowValues
number[]Rows drawn with alternate styling (e.g. zero).

XAxis

Time-axis labels that fade when the crosshair passes.

Skip XAxisProps props table
PropTypeDefaultDescription
numTicks
number5Tick labels to show, including first and last.
tickerHalfWidth
number50Fade radius around the date pill.
tickMode
"data" | "domain""data"`data` snaps labels to rows (crosshair-aligned). `domain` spaces ticks evenly.

ChartTooltip

Motion tooltip: crosshair, series dots, floating panel, optional date pill. This is not the recharts ChartTooltip from `@cronus-ui/ui`.

Skip ChartTooltipProps props table
PropTypeDefaultDescription
showDatePill
booleantrueAnimated date ticker on the x-axis.
showCrosshair
booleantrueVertical crosshair.
showDots
booleantrueDots on series at the hovered x.
dotVariant
"dot" | "ring""dot"Filled circle or ring.
indicatorColor
string | (point) => stringCrosshair and dot color.
indicatorDasharray
stringDash pattern for the crosshair.
indicatorFadeEdges
"both" | "top" | "bottom" | "none""both"Vertical crosshair fade.
matchCrosshair
booleanfalsePanel uses the crosshair spring when true.
damping
number20Panel follow when matchCrosshair is false. 0 = instant.
content
(props) => ReactNodeCustom tooltip renderer.
rows
(point) => TooltipRow[]Custom row generator.

Mixing series

Child order is paint order. Put Area first, SeriesBar next, Line on top. Tooltip rows follow registered series.

tsx
<ComposedChart data={data} barSize={18}>
<Area dataKey="runRate" fillOpacity={0.25} />
<SeriesBar dataKey="units" radius={4} />
<Line dataKey="revenue" strokeWidth={2.5} />
<XAxis />
<ChartTooltip />
</ComposedChart>

Data format

ts
const data = [
{ date: new Date("2026-01-01"), runRate: 420, units: 36, revenue: 18400 },
{ date: new Date("2026-01-02"), runRate: 438, units: 41, revenue: 19200 },
];

Theming

Motion charts read `--chart-*` aliases that map onto Cronus semantic tokens (`--cronus-chart-1`…`--cronus-chart-5`, `--cronus-border`, `--cronus-fg`, surfaces). Override the aliases or the tokens — never palette scales (`bg-zinc-900`). Default wrappers use `ChartConfig` with `var(--cronus-chart-*)` / `var(--cronus-primary)`.

Full token reference: Theming.

Dependencies

Default needs the recharts peer. Motion needs visx (and sometimes d3) as optional peers — install only what this chart uses.

bash
bun add recharts
bash
bun add @visx/curve @visx/responsive @visx/scale @visx/shape motion react-use-measure @visx/gradient

Default API

Generated from the Default wrapper's exported types. Motion subcomponents are documented above.

ComposedChartProps

Extends HTMLAttributes<HTMLDivElement>

Skip ComposedChartProps props table
PropTypeDefaultDescription
data*
Record<string, unknown>[]
xKey
string"date"
series*
ComposedChartSeries[]
formatValue
(value: number, name: string) => string