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

Helix ribbons

Helix ribbons

3,8113,811
01234
Angle: phase in the cycle · Height: successive cycles · Width: magnitude · Concentric lanes separate series
Helix ribbons
ObservationValue
API · cycle 0 · phase 048
API · cycle 0 · phase 0.12559
API · cycle 0 · phase 0.2559
API · cycle 0 · phase 0.37552
API · cycle 0 · phase 0.542
API · cycle 0 · phase 0.62534
API · cycle 0 · phase 0.7529
API · cycle 0 · phase 0.87525
API · cycle 1 · phase 022
API · cycle 1 · phase 0.12524
API · cycle 1 · phase 0.2532
API · cycle 1 · phase 0.37546
API · cycle 1 · phase 0.560
API · cycle 1 · phase 0.62566
API · cycle 1 · phase 0.7559
API · cycle 1 · phase 0.87540
API · cycle 2 · phase 018
API · cycle 2 · phase 0.1255
API · cycle 2 · phase 0.258
API · cycle 2 · phase 0.37527
API · cycle 2 · phase 0.550
API · cycle 2 · phase 0.62566
API · cycle 2 · phase 0.7568
API · cycle 2 · phase 0.87555
API · cycle 3 · phase 037
API · cycle 3 · phase 0.12522
API · cycle 3 · phase 0.2517
API · cycle 3 · phase 0.37521
API · cycle 3 · phase 0.529
API · cycle 3 · phase 0.62537
API · cycle 3 · phase 0.7543
API · cycle 3 · phase 0.87549
Workers · cycle 0 · phase 064
Workers · cycle 0 · phase 0.12572
Workers · cycle 0 · phase 0.2563
Workers · cycle 0 · phase 0.37542
Workers · cycle 0 · phase 0.520
Workers · cycle 0 · phase 0.6258
Workers · cycle 0 · phase 0.7511
Workers · cycle 0 · phase 0.87526
Workers · cycle 1 · phase 044
Workers · cycle 1 · phase 0.12556
Workers · cycle 1 · phase 0.2558
Workers · cycle 1 · phase 0.37553
Workers · cycle 1 · phase 0.545
Workers · cycle 1 · phase 0.62538
Workers · cycle 1 · phase 0.7531
Workers · cycle 1 · phase 0.87526
Workers · cycle 2 · phase 021
Workers · cycle 2 · phase 0.12521
Workers · cycle 2 · phase 0.2528
Workers · cycle 2 · phase 0.37542
Workers · cycle 2 · phase 0.558
Workers · cycle 2 · phase 0.62567
Workers · cycle 2 · phase 0.7562
Workers · cycle 2 · phase 0.87544
Workers · cycle 3 · phase 022
Workers · cycle 3 · phase 0.1256
Workers · cycle 3 · phase 0.256
Workers · cycle 3 · phase 0.37522
Workers · cycle 3 · phase 0.546
Workers · cycle 3 · phase 0.62564
Workers · cycle 3 · phase 0.7568
Workers · cycle 3 · phase 0.87558
Search · cycle 0 · phase 056
Search · cycle 0 · phase 0.12554
Search · cycle 0 · phase 0.2544
Search · cycle 0 · phase 0.37529
Search · cycle 0 · phase 0.514
Search · cycle 0 · phase 0.6259
Search · cycle 0 · phase 0.7518
Search · cycle 0 · phase 0.87539
Search · cycle 1 · phase 061
Search · cycle 1 · phase 0.12572
Search · cycle 1 · phase 0.2566
Search · cycle 1 · phase 0.37547
Search · cycle 1 · phase 0.524
Search · cycle 1 · phase 0.62510
Search · cycle 1 · phase 0.7510
Search · cycle 1 · phase 0.87523
Search · cycle 2 · phase 040
Search · cycle 2 · phase 0.12553
Search · cycle 2 · phase 0.2557
Search · cycle 2 · phase 0.37554
Search · cycle 2 · phase 0.547
Search · cycle 2 · phase 0.62541
Search · cycle 2 · phase 0.7534
Search · cycle 2 · phase 0.87528
Search · cycle 3 · phase 021
Search · cycle 3 · phase 0.12519
Search · cycle 3 · phase 0.2525
Search · cycle 3 · phase 0.37538
Search · cycle 3 · phase 0.556
Search · cycle 3 · phase 0.62567
Search · cycle 3 · phase 0.7565
Search · cycle 3 · phase 0.87549
Default01 / 02

Usage

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

import { HelixRibbonsCard } from '@lilt-ui/charts';
import '@lilt-ui/charts/styles.css';
<HelixRibbonsCard data={cyclicRibbons} series="series" cycle="cycle" phase="phase" value="value" />

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

Supply an integer cycle and a phase from 0 inclusive to 1 exclusive, with nonnegative magnitude. Cycles must span at most 25 consecutive turns. Width interpolates between known samples; null values or gaps larger than maxGap break the ribbon. Concentric lanes separate series without shifting their measured phase. Beads preserve individual samples.

const cyclicRibbons = [
  {
    "series": "API",
    "cycle": 0,
    "phase": 0,
    "value": 48
  },
  {
    "series": "API",
    "cycle": 0,
    "phase": 0.125,
    "value": 59
  },
  {
    "series": "API",
    "cycle": 0,
    "phase": 0.25,
    "value": 59
  },
  {
    "series": "API",
    "cycle": 0,
    "phase": 0.375,
    "value": 52
  },
  {
    "series": "API",
    "cycle": 0,
    "phase": 0.5,
    "value": 42
  },
  {
    "series": "API",
    "cycle": 0,
    "phase": 0.625,
    "value": 34
  },
  {
    "series": "API",
    "cycle": 0,
    "phase": 0.75,
    "value": 29
  },
  {
    "series": "API",
    "cycle": 0,
    "phase": 0.875,
    "value": 25
  },
  {
    "series": "API",
    "cycle": 1,
    "phase": 0,
    "value": 22
  },
  {
    "series": "API",
    "cycle": 1,
    "phase": 0.125,
    "value": 24
  },
  {
    "series": "API",
    "cycle": 1,
    "phase": 0.25,
    "value": 32
  },
  {
    "series": "API",
    "cycle": 1,
    "phase": 0.375,
    "value": 46
  },
  {
    "series": "API",
    "cycle": 1,
    "phase": 0.5,
    "value": 60
  },
  {
    "series": "API",
    "cycle": 1,
    "phase": 0.625,
    "value": 66
  },
  {
    "series": "API",
    "cycle": 1,
    "phase": 0.75,
    "value": 59
  },
  {
    "series": "API",
    "cycle": 1,
    "phase": 0.875,
    "value": 40
  },
  {
    "series": "API",
    "cycle": 2,
    "phase": 0,
    "value": 18
  },
  {
    "series": "API",
    "cycle": 2,
    "phase": 0.125,
    "value": 5
  },
  {
    "series": "API",
    "cycle": 2,
    "phase": 0.25,
    "value": 8
  },
  {
    "series": "API",
    "cycle": 2,
    "phase": 0.375,
    "value": 27
  },
  {
    "series": "API",
    "cycle": 2,
    "phase": 0.5,
    "value": 50
  },
  {
    "series": "API",
    "cycle": 2,
    "phase": 0.625,
    "value": 66
  },
  {
    "series": "API",
    "cycle": 2,
    "phase": 0.75,
    "value": 68
  },
  {
    "series": "API",
    "cycle": 2,
    "phase": 0.875,
    "value": 55
  },
  {
    "series": "API",
    "cycle": 3,
    "phase": 0,
    "value": 37
  },
  {
    "series": "API",
    "cycle": 3,
    "phase": 0.125,
    "value": 22
  },
  {
    "series": "API",
    "cycle": 3,
    "phase": 0.25,
    "value": 17
  },
  {
    "series": "API",
    "cycle": 3,
    "phase": 0.375,
    "value": 21
  },
  {
    "series": "API",
    "cycle": 3,
    "phase": 0.5,
    "value": 29
  },
  {
    "series": "API",
    "cycle": 3,
    "phase": 0.625,
    "value": 37
  },
  {
    "series": "API",
    "cycle": 3,
    "phase": 0.75,
    "value": 43
  },
  {
    "series": "API",
    "cycle": 3,
    "phase": 0.875,
    "value": 49
  },
  {
    "series": "Workers",
    "cycle": 0,
    "phase": 0,
    "value": 64
  },
  {
    "series": "Workers",
    "cycle": 0,
    "phase": 0.125,
    "value": 72
  },
  {
    "series": "Workers",
    "cycle": 0,
    "phase": 0.25,
    "value": 63
  },
  {
    "series": "Workers",
    "cycle": 0,
    "phase": 0.375,
    "value": 42
  },
  {
    "series": "Workers",
    "cycle": 0,
    "phase": 0.5,
    "value": 20
  },
  {
    "series": "Workers",
    "cycle": 0,
    "phase": 0.625,
    "value": 8
  },
  {
    "series": "Workers",
    "cycle": 0,
    "phase": 0.75,
    "value": 11
  },
  {
    "series": "Workers",
    "cycle": 0,
    "phase": 0.875,
    "value": 26
  },
  {
    "series": "Workers",
    "cycle": 1,
    "phase": 0,
    "value": 44
  },
  {
    "series": "Workers",
    "cycle": 1,
    "phase": 0.125,
    "value": 56
  },
  {
    "series": "Workers",
    "cycle": 1,
    "phase": 0.25,
    "value": 58
  },
  {
    "series": "Workers",
    "cycle": 1,
    "phase": 0.375,
    "value": 53
  },
  {
    "series": "Workers",
    "cycle": 1,
    "phase": 0.5,
    "value": 45
  },
  {
    "series": "Workers",
    "cycle": 1,
    "phase": 0.625,
    "value": 38
  },
  {
    "series": "Workers",
    "cycle": 1,
    "phase": 0.75,
    "value": 31
  },
  {
    "series": "Workers",
    "cycle": 1,
    "phase": 0.875,
    "value": 26
  },
  {
    "series": "Workers",
    "cycle": 2,
    "phase": 0,
    "value": 21
  },
  {
    "series": "Workers",
    "cycle": 2,
    "phase": 0.125,
    "value": 21
  },
  {
    "series": "Workers",
    "cycle": 2,
    "phase": 0.25,
    "value": 28
  },
  {
    "series": "Workers",
    "cycle": 2,
    "phase": 0.375,
    "value": 42
  },
  {
    "series": "Workers",
    "cycle": 2,
    "phase": 0.5,
    "value": 58
  },
  {
    "series": "Workers",
    "cycle": 2,
    "phase": 0.625,
    "value": 67
  },
  {
    "series": "Workers",
    "cycle": 2,
    "phase": 0.75,
    "value": 62
  },
  {
    "series": "Workers",
    "cycle": 2,
    "phase": 0.875,
    "value": 44
  },
  {
    "series": "Workers",
    "cycle": 3,
    "phase": 0,
    "value": 22
  },
  {
    "series": "Workers",
    "cycle": 3,
    "phase": 0.125,
    "value": 6
  },
  {
    "series": "Workers",
    "cycle": 3,
    "phase": 0.25,
    "value": 6
  },
  {
    "series": "Workers",
    "cycle": 3,
    "phase": 0.375,
    "value": 22
  },
  {
    "series": "Workers",
    "cycle": 3,
    "phase": 0.5,
    "value": 46
  },
  {
    "series": "Workers",
    "cycle": 3,
    "phase": 0.625,
    "value": 64
  },
  {
    "series": "Workers",
    "cycle": 3,
    "phase": 0.75,
    "value": 68
  },
  {
    "series": "Workers",
    "cycle": 3,
    "phase": 0.875,
    "value": 58
  },
  {
    "series": "Search",
    "cycle": 0,
    "phase": 0,
    "value": 56
  },
  {
    "series": "Search",
    "cycle": 0,
    "phase": 0.125,
    "value": 54
  },
  {
    "series": "Search",
    "cycle": 0,
    "phase": 0.25,
    "value": 44
  },
  {
    "series": "Search",
    "cycle": 0,
    "phase": 0.375,
    "value": 29
  },
  {
    "series": "Search",
    "cycle": 0,
    "phase": 0.5,
    "value": 14
  },
  {
    "series": "Search",
    "cycle": 0,
    "phase": 0.625,
    "value": 9
  },
  {
    "series": "Search",
    "cycle": 0,
    "phase": 0.75,
    "value": 18
  },
  {
    "series": "Search",
    "cycle": 0,
    "phase": 0.875,
    "value": 39
  },
  {
    "series": "Search",
    "cycle": 1,
    "phase": 0,
    "value": 61
  },
  {
    "series": "Search",
    "cycle": 1,
    "phase": 0.125,
    "value": 72
  },
  {
    "series": "Search",
    "cycle": 1,
    "phase": 0.25,
    "value": 66
  },
  {
    "series": "Search",
    "cycle": 1,
    "phase": 0.375,
    "value": 47
  },
  {
    "series": "Search",
    "cycle": 1,
    "phase": 0.5,
    "value": 24
  },
  {
    "series": "Search",
    "cycle": 1,
    "phase": 0.625,
    "value": 10
  },
  {
    "series": "Search",
    "cycle": 1,
    "phase": 0.75,
    "value": 10
  },
  {
    "series": "Search",
    "cycle": 1,
    "phase": 0.875,
    "value": 23
  },
  {
    "series": "Search",
    "cycle": 2,
    "phase": 0,
    "value": 40
  },
  {
    "series": "Search",
    "cycle": 2,
    "phase": 0.125,
    "value": 53
  },
  {
    "series": "Search",
    "cycle": 2,
    "phase": 0.25,
    "value": 57
  },
  {
    "series": "Search",
    "cycle": 2,
    "phase": 0.375,
    "value": 54
  },
  {
    "series": "Search",
    "cycle": 2,
    "phase": 0.5,
    "value": 47
  },
  {
    "series": "Search",
    "cycle": 2,
    "phase": 0.625,
    "value": 41
  },
  {
    "series": "Search",
    "cycle": 2,
    "phase": 0.75,
    "value": 34
  },
  {
    "series": "Search",
    "cycle": 2,
    "phase": 0.875,
    "value": 28
  },
  {
    "series": "Search",
    "cycle": 3,
    "phase": 0,
    "value": 21
  },
  {
    "series": "Search",
    "cycle": 3,
    "phase": 0.125,
    "value": 19
  },
  {
    "series": "Search",
    "cycle": 3,
    "phase": 0.25,
    "value": 25
  },
  {
    "series": "Search",
    "cycle": 3,
    "phase": 0.375,
    "value": 38
  },
  {
    "series": "Search",
    "cycle": 3,
    "phase": 0.5,
    "value": 56
  },
  {
    "series": "Search",
    "cycle": 3,
    "phase": 0.625,
    "value": 67
  },
  {
    "series": "Search",
    "cycle": 3,
    "phase": 0.75,
    "value": 65
  },
  {
    "series": "Search",
    "cycle": 3,
    "phase": 0.875,
    "value": 49
  }
];

Props

Every prop HelixRibbonsCard 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 390px. Dense data may expand within the scrollable viewport.
depthbooleanLit tiles, solid bars, or spheres. Data positions remain exact; loading keeps the same depth treatment.
colorstringOverride the palette with one CSS color.
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.
seriestext key of RowSeries label; each series retains one track.
cyclenumeric key of RowSafe integer cycle number. A view spans at most 25 consecutive turns.
phasenumeric key of RowFraction of a cycle, from 0 inclusive to 1 exclusive.
valuenumeric key of RowNonnegative numeric measurement. Null or undefined is missing.
yawnumberCamera rotation around the vertical axis, in degrees from -180 to 180. Default 25.
elevationnumberCamera elevation, 10 to 70 degrees. Default 20.
thicknessnumberMaximum ribbon width, 3 to 26 pixels. Default 13.
maxGapnumberLargest gap between samples, measured in cycles, 0.05 to 1. Default 0.3.
aggregate'sum' | 'mean' | 'max'Fallback resting summary. A family-defined summary (such as located point count, hierarchy total, or mean signed value) takes precedence. Use headline to override that summary.
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.
legendfalse | 'tiles' | 'inline' | 'list' | 'pills' | 'bars'Layout for the group legend where the data produces groups. False hides it; defaults to tiles.