Chart style

Applies to every chart.

Palette

Theme

Appearance

Depth
Surface
Background

Reading & motion

Axis
Hover
Legend
Numbers
Loading
Empty
Using chart defaults
3,109npm
1stars

Charts

Every chart, by the job it does

Trends3

  • Area
  • Line
  • Combo

Comparison4

  • Bar
  • Horizontal bar
  • Slope
  • RangeNew

Part of a whole4

  • Radial
  • Treemap
  • Funnel
  • Sankey

KPIs3

  • Stat cards
  • Progress
  • Activity ring

Patterns4

  • Heatmap
  • Scatter
  • Radar
  • Box plotNew

Cool23

  • Chord loomNew
  • Rank ribbonsNew
  • Event helixNew
  • Contour islandsNew
  • Parallel ribbonsNew
  • Sunburst terracesNew
  • Cluster constellationNew
  • Ternary prismNew
  • Wind roseNew
  • Marimekko blocksNew
  • Intersection towersNew
  • Horizon foldsNew
  • Circle archipelagoNew
  • Helix ribbonsNew
  • Voxel cloudNew
  • Arc bridgesNew
  • TerrainNew
  • Hex cityNew
  • Voxel waffleNew
  • SkylineNew
  • Block cityNew
  • RidgelineNew
  • Spiral yearNew

Finance6

  • CandlestickNew
  • IndicatorsNew
  • PriceNew
  • DepthNew
  • Order bookNew
  • PortfolioNew

Event helix

Service activity

1,5151,515
09-2809-2909-3010-0110-02
One turn per UTC day · Time rises from bottom to top · Larger beads: larger events
Service activity
ObservationValue
Run 01 · 2026-09-28 02:00 UTC12
Run 02 · 2026-09-28 06:00 UTC29
Run 03 · 2026-09-28 09:00 UTC46
Run 04 · 2026-09-28 12:00 UTC63
Run 05 · 2026-09-28 16:00 UTC80
Run 06 · 2026-09-28 21:00 UTC17
Run 07 · 2026-09-29 02:00 UTC34
Run 08 · 2026-09-29 06:00 UTC51
Run 09 · 2026-09-29 09:00 UTC68
Run 10 · 2026-09-29 12:00 UTC85
Run 11 · 2026-09-29 16:00 UTC22
Run 12 · 2026-09-29 21:00 UTC39
Run 13 · 2026-09-30 02:00 UTC56
Run 14 · 2026-09-30 06:00 UTC73
Run 15 · 2026-09-30 09:00 UTC90
Run 16 · 2026-09-30 12:00 UTC27
Run 17 · 2026-09-30 16:00 UTC44
Run 18 · 2026-09-30 21:00 UTC61
Run 19 · 2026-10-01 02:00 UTC78
Run 20 · 2026-10-01 06:00 UTC15
Run 21 · 2026-10-01 09:00 UTC32
Run 22 · 2026-10-01 12:00 UTC49
Run 23 · 2026-10-01 16:00 UTC66
Run 24 · 2026-10-01 21:00 UTC83
Run 25 · 2026-10-02 02:00 UTC20
Run 26 · 2026-10-02 06:00 UTC37
Run 27 · 2026-10-02 09:00 UTC54
Run 28 · 2026-10-02 12:00 UTC71
Run 29 · 2026-10-02 16:00 UTC88
Run 30 · 2026-10-02 21:00 UTC25
Default01 / 02

Usage

Import the component and the stylesheet once. See Getting started to install the package.

import { EventHelixCard } from '@lilt-ui/charts';
import '@lilt-ui/charts/styles.css';
<EventHelixCard title="Service activity" data={serviceEvents} label="event" date="at" value="requests" group="service" />

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

Each event has a unique label, timestamp and nonnegative magnitude. Dates accept Date objects, epoch milliseconds or ISO strings with explicit time zones (plain ISO dates are UTC). Events are sorted chronologically; simultaneous events remain individually keyboard-accessible. Daily turns start at UTC midnight; weekly turns start Monday. At most 60 cycles fit one view. Null magnitudes stay marked as missing; zero is a small measured bead.

const serviceEvents = [
  { event: 'Run 01', at: '2026-09-28T02:00:00Z', service: 'API', requests: 12 },
  { event: 'Run 02', at: '2026-09-28T06:00:00Z', service: 'Workers', requests: 29 },
];

Props

Every prop EventHelixCard accepts, in the order you are likely to reach for them.

PropTypeDescription
titlestringOptional visible title. Omit to render no title. Also supplies the accessible name unless aria-label is set.
headerbooleanDefaults 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-labelstringAccessible chart name, independent of the visible title. Falls back to title, then a generic chart name.
dataRow[]One row per observation. Omit when using ranges.
heightnumberMinimum plot height, default 360. Dense data can expand or scroll to preserve geometry.
depthbooleanLit tiles, solid bars, or spheres. Data positions remain exact; loading keeps the same depth treatment.
colorstringOverride the palette with one CSS color.
aggregate'sum' | 'mean' | 'max'Resting headline summary; Strip defaults to mean, the others to sum.
headlinenumberOverride the resting headline.
deltanumberFractional change shown alongside the headline.
deltaTone'default' | 'inverse' | 'neutral'Use inverse when a decrease is good.
rangestringStatic period label.
ranges{ id, label, data, headline?, delta? }[]Period choices with their own data.
defaultRangestringInitial period id.
localestringLocale for numbers and dates; defaults to en-US.
formatValue(value: number) => stringCustom value formatter.
badgeReactNodeContent for the glass tab above the card.
classNamestringClass on the card frame.
styleCSSProperties | ChartStyleInline styles and scoped chart variables.
onSelectionChange(selection | null) => voidReports id, original row (or null for an absent day), value, and pinned state.
renderReadout(selection | null) => ReactNodeConsumer-owned readout, including when the header is hidden.
valueFormatIntl.NumberFormatOptionsFormats the headline, tiles, and axis, e.g. currency.
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.
numberStyle'count' | 'pop' | 'slide' | 'roll' | 'flow' | 'scramble'How the headline animates when its value changes. Count (default) counts to the new value.
loadingbooleanShows 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 | nullWhat 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.
motion'auto' | 'none'None turns off decorative motion; reduced motion does this automatically.
labeltext key of RowUnique event name.
datedate, string, or numeric key of RowEvent timestamp, interpreted in UTC.
valuenumeric key of RowNonnegative magnitude, encoded by bead size.
grouptext key of RowOptional category color and legend.
cycle'day' | 'week'One revolution per day (default) or week.
pitchnumberMinimum turn spacing, 26 to 100 pixels, default 54.
legendfalse | 'tiles' | 'inline' | 'list' | 'pills' | 'bars'Rounded-square legend with group inspection and pinning. Defaults to tiles; false removes it.
onKeyDownKeyboardEventHandler<HTMLElement>Keyboard handler on the card frame. Chart inspection also has its own keyboard handling.
legendSwatch'square' | 'dot' | 'line'Marker beside each group label, where a group legend is present. Defaults to square.