Ledger · Brand and style guide · v1.0

The system,
written down.

Ledger is a review instrument. It is used for long stretches by people making consequential decisions about other people’s work, so the identity is calm, warm and precise rather than loud. This document is the reference for anyone extending it.

Principles

Five rules that decide everything else

Evidence before judgment

The interface shows what it measured before it offers an opinion, and it separates the two visibly.

Calm over clever

A reviewer is here for twenty minutes at a time. Nothing should compete for attention with the work being reviewed.

Materials, not decoration

Depth comes from light and elevation. Effects earn their place by clarifying hierarchy, never by ornament.

Fairness is a design constraint

Scoring, empty states and error states are all shaped by the question of whether the candidate is being treated justly. That is not a compliance layer, it is the product.

Every state is designed

Missing, broken, loading and completed each get composed treatment. A blank container is an unfinished thought.

Identity

The mark

Three stacked rules inside a rounded square, referencing a ledger line and the stacked evidence a reviewer works through. It reads at 16px and holds up in a single colour.

Ledger
Primary lockup
Ledger
On dark
Mark alone

Rules

Clear space on all sides equals the height of the mark. Minimum mark size is 18px. The gradient runs from action primary hover to action primary at 150 degrees and never reverses. Do not outline the mark, rotate it, or place it on a busy photograph. On a coloured ground, use the solid navy or a knocked out white version rather than the gradient.

Colour

Named for function, verified for contrast

Tokens are named for the job they do rather than the colour they are, so a second theme is a token swap instead of a rewrite. Every ratio below was measured, not estimated. Six of these failed on the first audit and were corrected.

Surface

#F5F3EF
surface-page
App canvas. The ground everything sits on.
15.00:1 · AAAtext-primary on it
#FFFFFF
surface-raised
Cards and panels. One step above the page.
16.62:1 · AAAtext-primary on it
#FBFAF6
surface-sunken
Inset fields and score rollups.
15.91:1 · AAAtext-primary on it

Text

#211E18
text-primary
Headings and body.
16.62:1 · AAAvs white
#67625A
text-secondary
Supporting copy and descriptions.
6.05:1 · AAvs white
#736F67
text-tertiary
Metadata, labels, timestamps.
5.00:1 · AAvs white

Action

#34518F
action-primary
Primary buttons, selection, focus ring.
7.72:1 · AAAvs white
#5470B4
action-primary-hover
Hover, and the second gradient stop.
4.82:1 · AAvs white

Status

#3C7656
status-pass
Healthy, advance, deploys clean.
5.36:1 · AAvs white
#8D6227
status-caution
Needs review, hold, partial signal.
5.37:1 · AAvs white
#B4483D
status-fail
Thin signal, failed build, pass.
5.34:1 · AAvs white
#3F5A8A
status-info
Previously reviewed.
6.91:1 · AAvs white

Usage rules

One accent only. Action primary carries selection, primary buttons and the focus ring, and nothing else competes with it. Status colours mean status and are never used decoratively. Body copy never sits on a translucent surface. Container hairlines are deliberately below the three to one threshold, since the relevant criterion governs controls rather than decorative separators, and cards are already separated by fill and elevation. Form control borders do carry three to one.

Typography

A serif for people, a sans for the interface, mono for facts

Instrument Serif gives a candidate’s name the weight it deserves, since the page is about a person’s work. Instrument Sans carries the interface. JetBrains Mono handles every number and label, with tabular figures so columns do not shift as values change.

DisplayInstrument Serif 400
34px / 115%
tracking -2%Candidate names, page titles
Maya Chen
SectionInstrument Sans 600
13px / 140%
tracking -0.4%Card headers
Live preview
LedeInstrument Sans 400
15.5px / 160%
tracking -0.4%Summaries, intro copy
A shared canvas where every visitor sees each other’s cursors.
BodyInstrument Sans 400
13.5px / 170%
tracking -0.4%README and long form
Every local event is written to an outbox before it goes over the wire.
MetaJetBrains Mono 400
11.5px / 150%
tracking 0Counts, dates, repo paths
34 commits · 41 files
EyebrowJetBrains Mono 400
10.5px / 150%
tracking 14%Section labels
SIGNAL QUALITY

Balance and pretty

Headings use balanced wrapping so a title never leaves one orphan word. Body copy uses pretty wrapping to avoid short last lines.

Numbers align

All figures are tabular. A score changing from 9 to 10 must not shift the layout around it.

Space and form

Base eight, with radius tied to scale

Spacing

4
8
12
16
24
32
48
64

Every gap resolves to one of these. Card padding is 24, gaps between cards are 24, and rail internals use 16.

Radius

chip 6
control 9
card 14
panel 18
sheet 22

Radius scales with footprint. A uniform radius across every element is the clearest tell of a templated interface, because real objects do not share a corner treatment across scales.

Elevation

Depth from light, not outlines

Small

0 1px 2px rgba(34,30,20,.05)

Buttons, chips, small controls.

Medium

+ 0 14px 30px -14px rgba(38,42,72,.20)

Cards and rail panels.

Large

+ 0 36px 64px -22px rgba(38,42,72,.32)

Tour card, palette, floating sheets.

Motion

Motion explains state, it does not perform

Enter

cubic-bezier(.16,1,.3,1)
620ms · stagger 60ms

Exit

cubic-bezier(.4,0,1,1)
220ms

Move

cubic-bezier(.32,.72,0,1)
320ms

Rules

Entrances ease out and stagger so content is read in sequence. Exits are faster and sharper, because leaving content should get out of the way. Duration scales with distance travelled, so a toast animates briefly and a sheet takes longer. Reduced motion collapses every one of these to an instant state change, and content stays visible rather than stranded at zero opacity.

Material

Glass belongs on chrome

Where it goes

Toolbar, tour card, keyboard palette, toast. Surfaces that float above content and carry controls.

Where it never goes

Behind body copy, behind the evidence column, or on a hero. Legibility must never depend on what is behind a surface.

Construction

An opaque tint, a bevelled rim built from per side inset shadows, a darkened inner edge for figure and ground separation, and a specular sheen behind the content. Where the engine can displace a live backdrop, a runtime displacement map bends it near the edges and leaves the middle flat, with a chromatic split held under four percent. Support is detected by probing the engine, because the obvious feature query returns true in browsers that then paint nothing.

Voice

How the product speaks

Plain, specific, and never cheerful about a problem. The product is helping someone make a decision that affects a person’s career, so it does not perform enthusiasm.

SituationWe writeNot
Missing walkthroughNo walkthrough attached. You are inferring intent from code alone.Oops! Nothing here yet.
Failed buildThe deploy is not responding.Something went wrong.
Low score noteA low score needs a reason. What specifically fell short?Please provide additional feedback.
Verified stackFound in the repository.Verified! โœ…
Saved reviewReview saved for Maya. Advancing to next.Success! Your review has been submitted successfully.

Rules

Name the thing that happened, then say what it means for the reader. Second person for the reviewer, third person for the candidate. No exclamation marks. No emoji in product copy. Never apologise on behalf of a candidate, and never editorialise about their work in system text.

Application

Do and do not

Do

  • Let the accent appear once per view, on the primary action.
  • Vary radius and padding with the size of the component.
  • Give every new component its empty, loading and error state before it ships.
  • Keep numbers tabular and right aligned in any column.
  • Measure a new colour pairing before adding it.
  • Write the reason a state exists into the state matrix.

Do not

  • Introduce a second accent, or use a status colour decoratively.
  • Apply one uniform radius across every element.
  • Place text on a translucent surface.
  • Use a spinner where a skeleton would show the shape of what is coming.
  • Add motion that does not communicate a change of state.
  • Ship an empty container in place of a designed empty state.