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

Cluster constellation

Cluster constellation

3030
x [10, 88]y [13, 88]z [17, 78]
Supplied XYZ positions · Links are undirected · Inspect a node to reveal its neighbours
Cluster constellation
ObservationValue
Node 112 · x: 22 · y: 37 · z: 30
Node 229 · x: 85 · y: 36 · z: 78
Node 346 · x: 36 · y: 64 · z: 59
Node 463 · x: 29 · y: 30 · z: 43
Node 580 · x: 79 · y: 48 · z: 73
Node 617 · x: 37 · y: 69 · z: 39
Node 734 · x: 33 · y: 16 · z: 17
Node 851 · x: 71 · y: 47 · z: 53
Node 968 · x: 43 · y: 82 · z: 35
Node 1085 · x: 34 · y: 14 · z: 30
Node 1122 · x: 66 · y: 35 · z: 78
Node 1239 · x: 50 · y: 88 · z: 59
Node 1356 · x: 29 · y: 25 · z: 43
Node 1473 · x: 64 · y: 26 · z: 73
Node 1590 · x: 56 · y: 79 · z: 39
Node 1627 · x: 23 · y: 36 · z: 17
Node 1744 · x: 67 · y: 32 · z: 53
Node 1861 · x: 60 · y: 66 · z: 35
Node 1978 · x: 16 · y: 33 · z: 31
Node 2015 · x: 73 · y: 46 · z: 78
Node 2132 · x: 59 · y: 66 · z: 59
Node 2249 · x: 11 · y: 20 · z: 43
Node 2366 · x: 80 · y: 49 · z: 73
Node 2483 · x: 54 · y: 78 · z: 38
Node 2520 · x: 10 · y: 13 · z: 17
Node 2637 · x: 86 · y: 39 · z: 53
Node 2754 · x: 47 · y: 88 · z: 35
Node 2871 · x: 14 · y: 21 · z: 31
Node 2988 · x: 88 · y: 27 · z: 78
Node 3025 · x: 40 · y: 83 · z: 59
Default01 / 02

Usage

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

import { ClusterConstellationCard } from '@lilt-ui/charts';
import '@lilt-ui/charts/styles.css';
<ClusterConstellationCard data={spatialCloud} label="name" x="x" y="y" z="z" value="value" connections="links" group="group" />

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 unique labels, finite XYZ coordinates and arrays of neighbouring labels. Links are undirected and deduplicated; self-links and unknown endpoints are rejected. Positions come from your data rather than a random force simulation. Node area carries magnitude. Missing positions stay in the table. The headline counts located nodes.

const spatialCloud = [
  {
    "name": "Node 1",
    "x": 22,
    "y": 37,
    "z": 30,
    "value": 12,
    "group": "Platform",
    "links": [
      "Node 4",
      "Node 7"
    ]
  },
  {
    "name": "Node 2",
    "x": 85,
    "y": 36,
    "z": 78,
    "value": 29,
    "group": "Experience",
    "links": [
      "Node 5",
      "Node 8"
    ]
  },
  {
    "name": "Node 3",
    "x": 36,
    "y": 64,
    "z": 59,
    "value": 46,
    "group": "Growth",
    "links": [
      "Node 6",
      "Node 9"
    ]
  },
  {
    "name": "Node 4",
    "x": 29,
    "y": 30,
    "z": 43,
    "value": 63,
    "group": "Platform",
    "links": [
      "Node 7",
      "Node 10"
    ]
  },
  {
    "name": "Node 5",
    "x": 79,
    "y": 48,
    "z": 73,
    "value": 80,
    "group": "Experience",
    "links": [
      "Node 8",
      "Node 11"
    ]
  },
  {
    "name": "Node 6",
    "x": 37,
    "y": 69,
    "z": 39,
    "value": 17,
    "group": "Growth",
    "links": [
      "Node 9",
      "Node 12"
    ]
  },
  {
    "name": "Node 7",
    "x": 33,
    "y": 16,
    "z": 17,
    "value": 34,
    "group": "Platform",
    "links": [
      "Node 10",
      "Node 13"
    ]
  },
  {
    "name": "Node 8",
    "x": 71,
    "y": 47,
    "z": 53,
    "value": 51,
    "group": "Experience",
    "links": [
      "Node 11",
      "Node 14"
    ]
  },
  {
    "name": "Node 9",
    "x": 43,
    "y": 82,
    "z": 35,
    "value": 68,
    "group": "Growth",
    "links": [
      "Node 12",
      "Node 15"
    ]
  },
  {
    "name": "Node 10",
    "x": 34,
    "y": 14,
    "z": 30,
    "value": 85,
    "group": "Platform",
    "links": [
      "Node 13",
      "Node 16"
    ]
  },
  {
    "name": "Node 11",
    "x": 66,
    "y": 35,
    "z": 78,
    "value": 22,
    "group": "Experience",
    "links": [
      "Node 14",
      "Node 17"
    ]
  },
  {
    "name": "Node 12",
    "x": 50,
    "y": 88,
    "z": 59,
    "value": 39,
    "group": "Growth",
    "links": [
      "Node 15",
      "Node 18"
    ]
  },
  {
    "name": "Node 13",
    "x": 29,
    "y": 25,
    "z": 43,
    "value": 56,
    "group": "Platform",
    "links": [
      "Node 16",
      "Node 19"
    ]
  },
  {
    "name": "Node 14",
    "x": 64,
    "y": 26,
    "z": 73,
    "value": 73,
    "group": "Experience",
    "links": [
      "Node 17",
      "Node 20"
    ]
  },
  {
    "name": "Node 15",
    "x": 56,
    "y": 79,
    "z": 39,
    "value": 90,
    "group": "Growth",
    "links": [
      "Node 18",
      "Node 21"
    ]
  },
  {
    "name": "Node 16",
    "x": 23,
    "y": 36,
    "z": 17,
    "value": 27,
    "group": "Platform",
    "links": [
      "Node 19",
      "Node 22"
    ]
  },
  {
    "name": "Node 17",
    "x": 67,
    "y": 32,
    "z": 53,
    "value": 44,
    "group": "Experience",
    "links": [
      "Node 20",
      "Node 23"
    ]
  },
  {
    "name": "Node 18",
    "x": 60,
    "y": 66,
    "z": 35,
    "value": 61,
    "group": "Growth",
    "links": [
      "Node 21",
      "Node 24"
    ]
  },
  {
    "name": "Node 19",
    "x": 16,
    "y": 33,
    "z": 31,
    "value": 78,
    "group": "Platform",
    "links": [
      "Node 22",
      "Node 25"
    ]
  },
  {
    "name": "Node 20",
    "x": 73,
    "y": 46,
    "z": 78,
    "value": 15,
    "group": "Experience",
    "links": [
      "Node 23",
      "Node 26"
    ]
  },
  {
    "name": "Node 21",
    "x": 59,
    "y": 66,
    "z": 59,
    "value": 32,
    "group": "Growth",
    "links": [
      "Node 24",
      "Node 27"
    ]
  },
  {
    "name": "Node 22",
    "x": 11,
    "y": 20,
    "z": 43,
    "value": 49,
    "group": "Platform",
    "links": [
      "Node 25",
      "Node 28"
    ]
  },
  {
    "name": "Node 23",
    "x": 80,
    "y": 49,
    "z": 73,
    "value": 66,
    "group": "Experience",
    "links": [
      "Node 26",
      "Node 29"
    ]
  },
  {
    "name": "Node 24",
    "x": 54,
    "y": 78,
    "z": 38,
    "value": 83,
    "group": "Growth",
    "links": [
      "Node 27",
      "Node 30"
    ]
  },
  {
    "name": "Node 25",
    "x": 10,
    "y": 13,
    "z": 17,
    "value": 20,
    "group": "Platform",
    "links": [
      "Node 28",
      "Node 1"
    ]
  },
  {
    "name": "Node 26",
    "x": 86,
    "y": 39,
    "z": 53,
    "value": 37,
    "group": "Experience",
    "links": [
      "Node 29",
      "Node 2"
    ]
  },
  {
    "name": "Node 27",
    "x": 47,
    "y": 88,
    "z": 35,
    "value": 54,
    "group": "Growth",
    "links": [
      "Node 30",
      "Node 3"
    ]
  },
  {
    "name": "Node 28",
    "x": 14,
    "y": 21,
    "z": 31,
    "value": 71,
    "group": "Platform",
    "links": [
      "Node 1",
      "Node 4"
    ]
  },
  {
    "name": "Node 29",
    "x": 88,
    "y": 27,
    "z": 78,
    "value": 88,
    "group": "Experience",
    "links": [
      "Node 2",
      "Node 5"
    ]
  },
  {
    "name": "Node 30",
    "x": 40,
    "y": 83,
    "z": 59,
    "value": 25,
    "group": "Growth",
    "links": [
      "Node 3",
      "Node 6"
    ]
  }
];

Props

Every prop ClusterConstellationCard 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 360px. 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.
labeltext key of RowUnique nonempty observation label, retained through inspection and pinning.
xnumeric key of RowFirst spatial coordinate on an independent linear scale.
ynumeric key of RowSecond spatial coordinate on an independent linear scale.
znumeric key of RowThird spatial coordinate on an independent linear scale.
valuenumeric key of RowNonnegative numeric measurement. Null or undefined is missing.
connectionsarray-of-text key of RowArray of existing node labels. Connections are undirected; duplicates and self-links are rejected.
grouptext key of RowOptional categorical color key.
yawnumberCamera rotation around the vertical axis, in degrees from -180 to 180. Default 35.
elevationnumberCamera elevation, 10 to 70 degrees. Default 25.
sizenumberMaximum cube half-edge or sphere size as a fraction of the normalized plot, 0.025 to 0.18. Default 0.09.
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.