Lumen

Charts

Restrained, token-driven health data-viz — legible, accessible, theme-aware.

The data tier: a small, fixed vocabulary of chart primitives the product and the agent both render from. Restrained categorical colour on the cool --data-* ramp, a semantic health-status ramp for clinical state, tabular numerals, no chartjunk — and a hard rule that colour is never the only signal. Pure SVG on the tokens, so every chart re-themes Day↔Night and renders on any device.

Principles

  • Cool data ramp. Categorical series draw from --data-1 … --data-6; warm Solar is reserved for the primary/highlighted series.
  • Health-status, not decoration. Clinical state reads from the semantic ramp — in-range / borderline / out-of-range (aliases of success / warning / destructive) — paired always with a shape or a word, never hue alone (colour-blind-safe by construction, not by luck).
  • Reference ranges are always visible. A health value without its range, unit, and direction is unreadable. The primitives carry all three.
  • Tabular numerals. Values and axis labels set in Geist Mono so digits align and don't jitter.
  • No chartjunk. No decorative gradients, no 3D, no gridlines that out-shout the data. Grid, axis, and track read from the neutral seams (--chart-grid / --chart-axis / --chart-track), never a hue.
  • Calm. The data tier doesn't animate — motion budget is reserved for the ambient tier. A jittery biomarker reads as alarming.

Trend

Line/area over time with an optional reference band. The healthy zone is drawn behind the line in a whisper-quiet --chart-band; readings outside it get a ring marker (the shape cue) and the header says so in words. The latest reading is always dotted and called out.

Hemoglobin10.6g/dL
Hemoglobinfalling, latest 10.6 g/dL across 6 readings; 1 of 6 readings outside the 11–14 g/dL reference range
Ref 1114 g/dLOut of range
import { Trend } from 'lumen/react';

<Trend
  label="Hemoglobin"
  unit="g/dL"
  data={[13.2, 12.8, 12.1, 11.6, 11.0, 10.6]}
  referenceRange={[11.0, 14.0]}
  area
/>;

Without a reference range it's a plain sparkline — for trends that have no clinical band (weight, steps):

Resting heart rate71bpm
Resting heart raterising, latest 71 bpm across 7 readings

Ring

A single value on the halo — the brand's ring, doing data work. Two reads from one primitive: a biomarker gauge (a marker on a reference band, coloured by clinical status) and a score ring (an arc filling toward a goal). Status shows as colour and a word.

HemoglobinHemoglobin: 10.6 g/dL (reference 11–14 g/dL), out of range
10.6g/dL
HemoglobinOut of rangeRef 1114 g/dL
FerritinFerritin: 31 ng/mL (reference 30–120 ng/mL), borderline
31ng/mL
FerritinBorderlineRef 30120 ng/mL
Vitamin DVitamin D: 48 ng/mL (reference 30–80 ng/mL), in range
48ng/mL
Vitamin DIn rangeRef 3080 ng/mL
import { Ring } from 'lumen/react';

// biomarker gauge — status derives from the reference range
<Ring label="Hemoglobin" unit="g/dL" value={10.6} min={8} max={16} referenceRange={[11.0, 14.0]} />;

// score ring — an arc toward a goal, on Solar or the cool ramp
<Ring label="Iron protocol adherence" unit="%" value={86} variant="primary" />;
Iron protocol adherenceIron protocol adherence: 86 % of 100
86%
Iron protocol adherence
Sleep consistencySleep consistency: 71 % of 100
71%
Sleep consistency

Colour is never the only signal

Every status here is encoded twice — hue and shape or word. Out-of-range readings carry a ring marker; gauges and trends spell out “Out of range” / “Borderline” / “In range”. That's the data tier's hard accessibility gate: a colour-blind user, a greyscale print, or a glance in bright sun all still read the clinical state.

Progress

The simplest data-viz: a single value against a max. Determinate, announced via role="progressbar", and coloured semantically, never decorativelyprimary marks the focal goal, status hues say how it's going, data hues say which series it is. (A real package component — import { Progress } from 'lumen/react'.)

import { Progress } from 'lumen/react';

<Progress label="Iron protocol adherence" value={86} variant="success" />;

Identity = data-viz = life

The ring is the logo's halo doing data work — one motif, two jobs. The next signature is the particle / radial-iris hero (from the Living Lens study): the ambient tier rendering a single hero metric. It is deliberately separate from this data tier — eye-candy never blocks or obscures a value a user must read. Loading is separate too: the Loader beats its own vital rhythm.

On this page