Konjo Studio's data visualisation: what to draw, and the palette that survived validation.
Part of the Konjo design language. The laws in the spine apply here unless this chapter contradicts them. Studio-specific — see the dialect.
Studio has no chart library yet. Nothing in apps/studio/package.json renders a chart, so
this is a specification rather than a description of something shipped.
Whatever renders them, load the dataviz skill before writing the first line of chart code.
This chapter supplies Konjo's parameters; that skill supplies the method, the mark specs, and
the validator.
First: is it a chart?
Most numbers on an owner's dashboard are not. A single figure — this month's revenue, students active this week, classes taught — is a stat tile, and turning it into a chart makes it slower to read, not richer.
A stat tile's value is typography.metric 28/800, never typography.hero. This chapter
said "a hero number" for a while and it was wrong twice over: hero is 64/900, which
L4's loud-block budget counts per instance — so a Reports
page with four KPI cards spends a budget of one four times — and Studio never gets a hero
block at all (the dialect). metric is the register between the page title
(display 34/800) and a panel title (title 22/700): unmistakably a number, and not a hero.
A stat tile is three lines and no more: eyebrow label, metric value, caption hint.
The hint carries the comparison ("+12 vs last month"), and its sign is the only place a
success or error tone is legal on a tile.
Reach for a chart when the shape is the point: a trend over time, a comparison across classes, a distribution across ranks. If the person's question is "what is it right now", a number answers it.
The palette
Konjo's brand direction is ink and red, minimal, no rainbow. That holds for one and two series, which is most of what Studio needs:
| Series | Encoding |
|---|---|
| One | Ink. No legend — the chart's title names it. |
| Two | Ink and brand.red, both directly labelled. |
For three or more categorical series it does not hold, and this was verified rather than
argued. The palette carried in the old Studio brief — ink #1C1917, red #D62828, soft red
#F4978E — fails validation on three checks: ink sits outside the lightness band and below the
chroma floor (it reads as gray, not as an identity), and the soft red is 2.12:1 against the
chart surface. Muted, brand-toned alternatives fail the same way: the chroma floor and the
colourblind-separation floor both require genuinely chromatic hues, and "tasteful and desaturated"
is precisely what a deuteranope cannot separate.
So for three or more series, use the validated categorical theme, reordered so Konjo's red leads:
| Slot | Hue | Light |
|---|---|---|
| 1 | red | #e34948 |
| 2 | blue | #2a78d6 |
| 3 | yellow | #eda100 |
| 4 | aqua | #1baf7a |
| 5 | violet | #4a3aa7 |
Verified with the dataviz validator at three, four and five slots: all checks pass —
lightness band, chroma floor, colourblind separation, normal-vision separation, and contrast
against the chart surface.
Rules that come with it:
- Assign in fixed order, never cycled. A ninth series is never a generated hue — it folds into "Other", or the chart becomes small multiples.
- Colour follows the entity, not its rank. Filtering out a series must not repaint the survivors.
- Magnitude is one hue, light to dark. Never a rainbow ramp.
- Polarity is two hues with a neutral gray midpoint. Never a hue in the middle.
- Status colours are reserved. The
feedbackfamily means good/warning/error and is never reused as "series 4".
The red budget
A chart series painted red is the screen's red role. A dashboard with a red line and a red primary button has spent it twice. On a reports screen the chart usually wins, and the actions go quiet.
Marks
- Thin. 2px lines, thin bars with a 2px surface gap between adjacent fills.
- Recessive grid and axes —
border.hairline, and only the gridlines that are read. - Direct labels beat legends for four series or fewer; a legend is still present for two or more, so identity is never colour-alone.
- Never a number on every point. Label the ends, the peak, the thing being discussed.
- Text wears text tokens, never the series colour. Values and labels stay in
text.primary/text.secondary; the coloured mark beside them carries the identity.
Never
- A dual-axis chart. Two measures at different scales become two charts, small multiples, or one index against a common base. This is the single most common chart mistake and it has no legitimate use here.
- A pie chart with more than three slices — that is a bar chart.
- A 3D anything.
- A truncated y-axis on a bar chart. Bars encode magnitude from zero; lines may zoom.
- A chart with no empty state. A dojo with three students has a legitimate, ordinary, nearly-empty chart, and it must not look broken.
- Colour as the only carrier of meaning — see accessibility.
Every chart owes
- A title that says what is being measured and over what period.
- A hover layer: crosshair and tooltip on lines and areas, per-mark tooltip on bars and cells.
- An empty state, a loading state, and an error state — see states.
- A table view of the same data, reachable, for anyone who cannot read the chart.