Hue is one look on every chart and every data component: the same card, the same type, one colour law and the same lit edge on every filled mark. A dashboard of Hue charts reads as one product. These rules are the design system behind Hue Charts and Hue Web Components, and the base huedraw.com and chromaticcoherence.ai expand on; the design itself is library/hue-charts/docs/design/DESIGN-SYSTEM.md. Take every value from tokens.json; write no literal of your own.
Content
- Titles are sentence case and name what is measured: "Sales by region", "Revenue by product". One line, in
title. - The context line gives the measure and the period: "Units, by quarter", "£ thousands, this quarter". Set it in
context. - A tick carries the unit its data names: a currency's symbol in the tick's stepped form ("£2k"), any other unit after a space ("250 kg", "4 %"). The values at the marks stay bare of a unit their axis says. A unit given only in the context stays off the ticks. Ticks take k, M and B from ten thousand.
- A delta gives the change and what it is against: "+4.2 % on Q3". The sign is in the words, so colour is never the only cue.
- No emoji, no exclamation marks, and no words on the picture that the data did not give.
Colour
- Every colour is the kernel's, read out from structure, or
ink at a stated share (grid, chip, a bullet's bands). Its value in tokens.json is the pin that holds it, written by scripts/inks.ts and refused at every commit if it drifts. The shadows alone are typed: a shadow is the card's want of light, not a colour it wears. Never type a colour into a chart, a component or a page. - Series take their ring's colours in order,
series-k-of-m: the kernel's seats on the ring from seed. The ring grows by a pair of seats every two series, so a chart of one to four series takes the ring of four (series-1-of-4 to series-4-of-4, its first n), five or six the ring of six, seven or eight the ring of eight. Series one is the seed's hue on every ring; the rest move as the ring grows. Beyond eight the library's law goes on; the tokens stop there. Never pick a series colour by hand, and never reorder them. - A series' words (its name at its end, a value in its colour) are its
series-k-of-m-text: the series ink where it stands 4.5:1 on card, else that ink moved in lightness until it does. Its lit edge is its series-k-of-m-edge. - A host's brand colour replaces
seed and is matched exactly; the compliance solve moves it only to hold 3:1, and says what it moved. rise and fall only where a mark means up or down: a delta chip, a candle, a waterfall's step. Never as series. Their words on a delta chip are rise-text and fall-text on rise-tint and fall-tint, at 4.5:1.- A scale of values runs
seq-1 (near the ground) to seq-5 (far from it): a heatmap's cells, a calendar's days. - Words on a mark (a tile's name, a cell's value, a slice's share) take whichever of
ink and card stands further from the mark. Where neither stands 4.5:1, as on a fill of middling lightness, the word stands on a plate of card, its box and 2 px round it, in ink. So on the light ground a cell of seq-3 takes card, and on the dark ground ink. - Neutrals:
card on page; ink for titles, figures and values; muted for labels, context and notes; faint for marks only, never words. grid for hairlines; base for the baseline and the zero line, at 3:1. band-1 to band-3 for a bullet's bands, poor to good. - Every word stands 4.5:1 on what it is set on, on both grounds. Every mark that carries a reading by its own colour stands 3:1 on
card: a line, a point, a bar, a slice, a tile, a candle, the baseline. Three fills carry theirs another way, and are not held to it: a stacked layer's fill (its line, in the series ink, carries it), a bullet's bands (told apart by their order, poor to good, and named in the key), and a scale's cells (their lightness is their value, near the ground at the low end by design; their values are in words on the cells and in the tooltip). The series stand 4.3:1 or more on the light card and 6.4:1 or more on the dark, at every seed and every series count. - Charts that draw observation (the index's own) keep their dark ground and their observed lightness in every theme. They take no lightness step and no lit edge.
- A colour a picture draws on
ink, or under it, wears its on-ink step (muted-on-ink, series-k-of-4-on-ink, series-k-of-4-edge-on-ink): its light-ground value moved in lightness until it stands 3:1 on ink and, for a seat or muted, on its tint, so on the light ground it is the colour itself. ink never moves (DESIGN-PICTURES-DARK.md).
Type
- One face, Inter, with tabular figures on every number:
headline (the card's figure), title, context, label (ticks and axis words), value (end labels, values on marks, tooltip figures, the delta), chip-text, note. - Text is measured by the face's own widths. Nothing is counted in characters, and nothing is set in a monospace.
- Tabular figures go on numbers only, never on words: Inter's tabular set widens the hyphen too ("Sign-ups").
The card
- Every chart sits in a card:
card surface, a 1 px line outline, radius-card, shadow-card, padding space-card (space-card-narrow below 400 px). A host whose container is already a card turns card off. The anatomy stays the same, with no surface, outline or shadow. Power BI does this by default. - From the top: the header (title and context on the left, the figure and its delta chip on the right); the plot (value ticks on its left, series names on its right); the key and the chips; the foot (notes and the source line); then the mark row and the controls row where they apply. A region a chart leaves empty collapses.
- The figure belongs to the host: given as text, or asked for by a rule the chart answers (last, total, share). No chart shows a figure nobody asked for.
Marks
- Columns and bars: the value end rounded
radius-bar, the baseline end square, whichever way the bar points. A stack rounds only its outer end. Bars fill size-band of their band, and a group's bars stand space-part apart. Crisp, the host's other shape, squares every corner and keeps the gaps. - Parts that touch stand
space-part apart with the card showing between them, never a stroke. - Lines:
stroke-line, round joins and caps, straight from point to point unless the chart asks for a curve: smooth is a monotone curve through the points, never past them, and step is steps. Points are hidden except the last (size-point, ringed in card) and on hover or focus. A line that crosses filled marks (a combo's) is cased in card, space-part clear on either side. - Areas: the line, and beneath it the series ink, from
opacity-area at the line to nothing at the base. A stacked area's layers, and a streamgraph's, fill in their series-k-of-m-edge, each carrying its line in the series ink. - Donut: the hole
size-hole, the whole in the centre in headline. A donut's slices and a gauge's arc are square at their corners in either shape. - Candles: the wick a hairline, the body in
rise or fall; a candle that closed up is hollow, its outline at stroke-edge, and one that closed down filled, so the shape says it as well as the ink. A body shorter than four times stroke-edge is drawn that tall about its middle, so the hollow always shows. - Tiles
radius-tile, cells radius-cell. - The lit edge: every filled mark carries
stroke-edge along its value end in its series-k-of-m-edge, its own ink lit by the kernel's light law. The value end is a column's top, a bar's far end, a negative bar's foot, an area's line, a tile's top and a slice's outer arc. There is none on a fill whose lightness is its value (seq-*) and none on charts that draw observation.
Grid and axes
- Horizontal hairlines in
grid at the value ticks; the baseline in base; no value axis line, no tick marks and no frame round the plot. A scatter keeps both grids; a chart laid across keeps vertical hairlines. - Four to six ticks a value axis, in
label, space-tick from the plot.
The chart names itself
Every chart of two series or more tells them apart by something besides colour, in this order:
- Names at the marks: a line or an area at its end, in its
series-k-of-m-text, names at least space-label apart, with a 1 px leader where one moved, at every width; stacked columns beside the last stack; a donut's, treemap's or funnel's parts on the parts; a scatter's groups at their points, a treemap's groups along their blocks and a Gantt's phases over their tasks. - The place: in grouped columns every series keeps its place in every group, the chips name them in that order, and the first group's bars carry their names where they fit.
- The pattern: for what neither tells apart, a dash for a line, a marker for a point or a fine hatch for a fill, only where it is needed.
- Refused: where even that cannot hold, the chart refuses the room and names the size it needs.
- Chips:
size-chip tall, chip-text in ink on chip, a size-chip-dot dot in the series ink, radius-chip, space-chip apart, one row under the plot, wrapping. They appear only where the chart does not name its series at their marks. A chip switches its series: when hidden, its dot turns hollow in faint and its words muted. Where the series are named at their marks, the name is the switch. - The key explains what marks or a scale mean, never series: mark meanings set like chips that are not pressable, or a
size-key-ramp ramp of seq-1 to seq-5 with its ends' values in label.
States and motion
- Hover and focus: the series stays and the rest go to
opacity-dim. The tooltip card (card, line, radius-tooltip, shadow-tooltip) shows the category and every series' value in drawn order, each with its dot. It stays while the pointer is over it, and Escape dismisses it. - Focus: a
stroke-focus ring in ink, 2 px off the mark; the arrow keys move from datum to datum. Pressed: ink at opacity-pressed behind the chip or name. - Empty: the header stays and the plot says "No data for this view" in
note. - Enter over
duration-enter on easing-enter, categories duration-stagger apart. A change of data morphs over duration-morph on easing-morph. Nothing moves when the reader asks for reduced motion.
Sites on Hue
Every site on Hue (huedraw.com, chromaticcoherence.ai, the team site) shares these rules through the site system, so the sites read as one family. The components Hero, Icons, Zones, Forms and Account show them.
- A zone is a part of a site that wears one product's colour: its seat on the ring of four (
series-k-of-4), that seat's edge (series-k-of-4-edge) and its tint (series-k-of-4-tint). The house wears ink, muted and ink-tint. - Each tint is the kernel's: the zone's ink over
card at 14 %, as rise-tint is, derived by scripts/inks.ts and pinned. A seat stands 3:1 on its tint on both grounds. No word stands on a tint, and an edge is never a mark. - The seat colours a zone's icons, the bar that leads its kickers and footer headings, the current menu item's underline and a link's underline. The tint is the ground of its icon tiles and its hero's picture. Words stay
ink and muted. - Every page opens on a hero of its own, and no two pages share a picture. A product page shows the product, one of the library's own charts in its own colours. Every other page draws its subject as blocks in its zone's family: its seat, its edge and
ink, with no other zone's seat. Only the home mixes zones, one block for each, and its picture cards may each stand in a seat of their own, one card a seat, the card wearing it. The house's other pages draw in ink and muted. - A composition's cut, gap or ring through a block is
ground, the colour the picture sits on. A chart sits inset in the cell and never scales up. The picture is decoration: the page's words carry its meaning. - A picture follows the theme. Where its seat, edge or
muted meets ink, that colour wears its on-ink step on every shape of it in the picture, a seat with its edge, and every two colours that meet stand 3:1 on both grounds, but a seat with its own edge and an edge with the ground. The site system's law (pictureContrastFaults) holds it. - A picture whose
ink stands for the unobserved (the prologue's room, piece 6's board) stands on observation's ground on both themes: its cell and ink the dark ground's card, its cuts that ground's ink, so its dark stays dark. - The icons are one set of line glyphs (
icons.json): a 24-unit grid and a 2-unit stroke, round caps and joins, each glyph meaning one thing. A site's own glyphs are drawn in the same frame. - An icon sits on a tile of its zone's tint at
radius-icon-tile: size-icon-small on size-icon-tile-small in an eyebrow and a menu item, size-icon on size-icon-tile on a card or a strip. No list repeats an icon. - The bar that leads a kicker and a footer heading is
size-zone-bar long and stroke-zone-bar tall, at radius-chip, in the zone's seat. - A members' form puts a real label over every field, never a placeholder in its place, its field on
card with a base edge and its words at 16 px; one solid button; a provider below a rule; and its answer beside it on chip, a refusal led by the said-wrong mark and never coloured. - An account gives each thing a member manages its own panel, its kicker in the zone. A money state is said as the store has it, never ahead of it, and a control the member may not use is not offered.
Science
What Hue Charts for science draws (library/hue-charts/docs/design/DESIGN-SCIENCE.md) stands on these tokens and four more rules.
- A waveform at four samples or more a pixel column takes
stroke-signal; fewer keep stroke-line. - A waveform at a physical scale stands on the mm grid: a line each millimetre in
grid, each five in grid-major. - A density's cells (persistence, the eye diagram) take the count steps,
count-1 (1) to count-5 (1,000 or more), by decade. A cell with any count is a mark, so count-1 stands 3:1 on card and on chip over the card. - Cursors and calipers stand on handles as the navigator's,
size-handle in base; measurements stand under the plot before the key, name in label and muted, value in value, with no pill. A strip chart's rows are size-row at least, their groups space-group apart; panes stand space-pane apart; a live waveform that overwrites leaves space-erase ahead of its pen; a density's cell is size-count-cell.
Expanding on it
A product adds its own layer on these tokens (a site's navigation, its marketing type) and does not redefine them. What every site on Hue shares stands in "Sites on Hue"; a site's own navigation and marketing type stay its own. A change to a value here is made here first, its colours through scripts/inks.ts, and shown on the boards before it is taken.