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

Skyline

Contributions

872872
OctDecJanFebMarAprMayJunJulAugSepOct
Taller and darker: more · Grey: no data · Outline: future day
Contributions
ObservationValue
2025-10-080
2025-10-091
2025-10-102
2025-10-113
2025-10-120
2025-10-130
2025-10-140
2025-10-155
2025-10-162
2025-10-174
2025-10-186
2025-10-197
2025-10-200
2025-10-210
2025-10-225
2025-10-236
2025-10-242
2025-10-252
2025-10-262
2025-10-270
2025-10-280
2025-10-291
2025-10-302
2025-10-313
2025-11-010
2025-11-021
2025-11-030
2025-11-040
2025-11-050
2025-11-061
2025-11-072
2025-11-083
2025-11-090
2025-11-103
2025-11-110
2025-11-123
2025-11-130
2025-11-141
2025-11-152
2025-11-164
2025-11-170
2025-11-180
2025-11-196
2025-11-208
2025-11-216
2025-11-227
2025-11-238
2025-11-240
2025-11-250
2025-11-265
2025-11-275
2025-11-285
2025-11-291
2025-11-302
2025-12-010
2025-12-023
2025-12-030
2025-12-041
2025-12-052
2025-12-063
2025-12-070
2025-12-080
2025-12-090
2025-12-103
2025-12-111
2025-12-122
2025-12-133
2025-12-145
2025-12-150
2025-12-160
2025-12-174
2025-12-185
2025-12-191
2025-12-202
2025-12-212
2025-12-220
2025-12-230
2025-12-241
2025-12-252
2025-12-263
2025-12-270
2025-12-281
2025-12-290
2025-12-300
2025-12-310
2026-01-011
2026-01-022
2026-01-033
2026-01-040
2026-01-050
2026-01-060
2026-01-073
2026-01-080
2026-01-091
2026-01-102
2026-01-113
2026-01-120
2026-01-130
2026-01-146
2026-01-158
2026-01-167
2026-01-179
2026-01-1810
2026-01-190
2026-01-200
2026-01-217
2026-01-227
2026-01-237
2026-01-243
2026-01-253
2026-01-263
2026-01-270
2026-01-280
2026-01-291
2026-01-302
2026-01-313
2026-02-010
2026-02-020
2026-02-030
2026-02-043
2026-02-050
2026-02-061
2026-02-072
2026-02-083
2026-02-090
2026-02-100
2026-02-113
2026-02-124
2026-02-131
2026-02-142
2026-02-152
2026-02-160
2026-02-173
2026-02-181
2026-02-192
2026-02-203
2026-02-210
2026-02-221
2026-02-230
2026-02-240
2026-02-250
2026-02-261
2026-02-272
2026-02-283
2026-03-010
2026-03-020
2026-03-030
2026-03-043
2026-03-050
2026-03-061
2026-03-072
2026-03-083
2026-03-090
2026-03-100
2026-03-115
2026-03-128
2026-03-137
2026-03-1410
2026-03-1512
2026-03-160
2026-03-170
2026-03-1810
2026-03-1910
2026-03-209
2026-03-215
2026-03-224
2026-03-230
2026-03-240
2026-03-250
2026-03-261
2026-03-272
2026-03-283
2026-03-290
2026-03-300
2026-03-310
2026-04-013
2026-04-020
2026-04-031
2026-04-042
2026-04-053
2026-04-060
2026-04-070
2026-04-082
2026-04-093
2026-04-100
2026-04-111
2026-04-122
2026-04-133
2026-04-140
2026-04-151
2026-04-162
2026-04-173
2026-04-180
2026-04-191
2026-04-200
2026-04-210
2026-04-220
2026-04-231
2026-04-242
2026-04-253
2026-04-260
2026-04-270
2026-04-280
2026-04-293
2026-04-300
2026-05-011
2026-05-022
2026-05-033
2026-05-040
2026-05-053
2026-05-065
2026-05-078
2026-05-087
2026-05-0910
2026-05-1012
2026-05-110
2026-05-120
2026-05-1313
2026-05-1413
2026-05-1512
2026-05-167
2026-05-176
2026-05-180
2026-05-190
2026-05-201
2026-05-211
2026-05-222
2026-05-233
2026-05-240
2026-05-250
2026-05-260
2026-05-273
2026-05-280
2026-05-291
2026-05-302
2026-05-313
2026-06-010
2026-06-020
2026-06-032
2026-06-043
2026-06-050
2026-06-061
2026-06-072
2026-06-080
2026-06-090
2026-06-101
2026-06-112
2026-06-123
2026-06-130
2026-06-141
2026-06-150
2026-06-160
2026-06-170
2026-06-181
2026-06-192
2026-06-203
2026-06-210
2026-06-220
2026-06-230
2026-06-243
2026-06-250
2026-06-261
2026-06-272
2026-06-283
2026-06-293
2026-06-300
2026-07-014
2026-07-026
2026-07-036
2026-07-049
2026-07-0512
2026-07-060
2026-07-070
2026-07-0814
2026-07-0915
2026-07-1015
2026-07-1110
2026-07-129
2026-07-130
2026-07-140
2026-07-152
2026-07-162
2026-07-172
2026-07-183
2026-07-190
2026-07-200
2026-07-213
2026-07-223
2026-07-230
2026-07-241
2026-07-252
2026-07-263
2026-07-270
2026-07-280
2026-07-292
2026-07-303
2026-07-310
2026-08-011
2026-08-022
2026-08-030
2026-08-040
2026-08-051
2026-08-062
2026-08-073
2026-08-080
2026-08-091
2026-08-100
2026-08-110
2026-08-120
2026-08-131
2026-08-142
2026-08-153
2026-08-160
2026-08-170
2026-08-180
2026-08-193
2026-08-200
2026-08-211
2026-08-222
2026-08-233
2026-08-240
2026-08-250
2026-08-263
2026-08-275
2026-08-284
2026-08-297
2026-08-3011
2026-08-310
2026-09-010
2026-09-0215
2026-09-0316
2026-09-0416
2026-09-0512
2026-09-0611
2026-09-070
2026-09-080
2026-09-093
2026-09-103
2026-09-112
2026-09-123
2026-09-130
2026-09-143
2026-09-150
2026-09-163
2026-09-170
2026-09-181
2026-09-192
2026-09-203
2026-09-210
2026-09-220
2026-09-232
2026-09-243
2026-09-250
2026-09-261
2026-09-272
2026-09-280
2026-09-290
2026-09-301
2026-10-012
2026-10-023
2026-10-030
2026-10-041
2026-10-050
2026-10-063
2026-10-070
Default01 / 02

Usage

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

import { SkylineCard } from '@lilt-ui/charts';
import '@lilt-ui/charts/styles.css';
<SkylineCard title="Contributions" data={yearContributions} date="date" value="commits" />

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. surface="ghost" controls only the visual frame. See Card composition.

Data

One row per UTC day. Bounds default to the observed dates and span at most ten years. Height and color both carry the value. Null days stay a low grey slab, measured zero keeps a tinted slab, and days after today lie flat as outlines. Duplicate days are rejected; aggregate them first.

const yearContributions = [
  { date: '2025-10-08', commits: 4 },
  { date: '2025-10-09', commits: 11 },
  // …one row per day
];

Props

Every prop SkylineCard 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 320px. 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.
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.
datedate, string, or numeric key of RowUTC date per day; numbers are milliseconds since the Unix epoch.
valuenumeric key of RowHeight, color, and headline.
fromstring | number | DateInclusive UTC bounds. Defaults to the first and last observed dates.
tostring | number | DateInclusive UTC bounds. Defaults to the first and last observed dates.
todaystring | number | DateUTC cutoff for future days; defaults to today.
weekStartsOn0 | 1Sunday (0) or Monday (1, default).
domain[number, number]Fixed value domain that must contain every value. Defaults to zero through the largest.
risenumberHow many cell lengths the largest value rises above the floor, default 5.
gapnumberSpace between neighbouring prisms as a share of a cell, 0 to 0.6, default 0.2.
onKeyDownKeyboardEventHandler<HTMLElement>Keyboard handler on the card frame. Chart inspection also has its own keyboard handling.