Graphite & Teal

The Countersign design system — light-first cool neutrals, graphite-navy ink, one deep-teal accent that means live, functional green/amber/red that mean pass/warn/breach, and mono for every number on the record.

DESIGN.md · version alpha
source of truth · src/index.css
format · VoltAgent/awesome-design-md

Overview

what the system is for, and the three ideas it runs on

Atmosphere. A dense, quiet instrument panel for a consequential decision. Light-first cool neutrals and graphite-navy ink; nothing decorative competes with the data.

One accent with one meaning. Deep teal marks live, active, traceable — never decoration. Green/amber/red are reserved for pass / warn / breach and never mix with teal.

The record is monospaced. Every figure a reader compares is mono with tabular figures, so digits align down a column and a changing value never reflows its neighbours.

Depth by surface, not shadow. Light leans on a strengthened hairline; dark leans on a four-step surface ladder plus a faint top edge. Shadows are reserved for true overlays.

Colors

every value is a CSS token; re-skinning is a token swap

Light · default

Accent — signature teal

accent#0f7d8c
accent-hover#0b6573
accent-softteal / 10%
accent-text#0a6675

Surfaces & lines

bg / panel#ffffff
panel-2#f4f6f9
border#dfe3ea
border-strong#d3d9e2

Ink

text#0f2436
text-dim#51607a
text-faint#66727f

Functional — pass / warn / breach

good#16a34a
warn#d9930a
bad#e03131

Dark · graphite ladder

Accent — brighter for near-black

accent#2bb8cc
accent-hover#4dccdd
accent-softteal / 16%
accent-text#57cfe0

Surface ladder

bg · canvas#0a0b0d
panel · s1#111315
panel-2 · s2#16181b
border-strong#31353d

Ink

text#f3f5f6
text-dim#8b929d
text-faint#777e8a

Functional

good#2ea043
warn#d6a02b
bad#e5484d

Typography

Inter (cv11) + Geist Mono · six steps: 11 / 12 / 13 / 15 / 18 / 22 · weight ceiling 600
page-title · 22/600 · −0.024em
Agentic credit analysis
section-title · 18/600 · −0.014em
Approval required
card-title · 18/600 · −0.014em
What would change this decision?
step-title · 15/600 · −0.008em
Test covenant compliance
body · 13/400 · tracking 0
The agent reached a consequential action and paused. It will not sign off on its own.
field-label · 12/500 · sentence case
Total leverage
eyebrow · mono 11/500 · +0.06em
Human-in-the-loop · Revision 2
mono-data · 12/400 · tnum
$22.6M · 17.6%   leverage 4.26x vs ≤ 4.00x   memo CAM-2026-0417
mono-badge · 11/600 · +0.06em
PASS   BREACH   94%   AUTO · POLICY

Layout

4px grid · dense by padding, never by shrinking type
2

hairline gaps, icon nudges

4

chip padding, tight gaps

8

the default gap between siblings

12

control padding, card inner gap

16

card padding — the system runs tight here

24

section separation

32

major region separation

Shell: nav rail (60px collapsed / 190px open) | document panel | agent canvas + composer. The document panel hides below 1100px. Density comes from tight padding on a strict grid — the type floor stays at 11px.

Elevation & Depth

light = hairline · dark = surface ladder + edge · shadows are for overlays only

card resting · hairline only, no shadow

shadow-md · overlays only (palette, toast, modal)

inset edge highlight · dark ladder

Shapes

containers exceed controls · 12 / 8 / 6 · dashed = sandbox

radius · 12px · panels, major containers

radius-sm · 8px · cards, buttons

radius-xs · 6px · inputs, chips

pill · 999px · status tags only, never buttons

dashed strong · sandbox frame

3px spine · attribution

Components

the gate’s three verbs, chips, pills, badges — both themes

Light

Project Atlas ESCALATE
APPROVE ESCALATE DECLINE ESCALATE 94% 86% 70%
Max Total Leverage 4.26x breaches the ≤ 4.00x covenant — cannot auto-approve.needs human
Reviewer send-back (rev 1): re-verify the EBITDA adjustments.needs human

Dark

Project Atlas ESCALATE
APPROVE ESCALATE DECLINE ESCALATE 94% 86% 70%
Max Total Leverage 4.26x breaches the ≤ 4.00x covenant — cannot auto-approve.needs human
Reviewer send-back (rev 1): re-verify the EBITDA adjustments.needs human

Component specimens

assembled from real product data

Light

Total leverage4.26x94% Adj. EBITDA$22.6M · 17.6%94% Liquidity$14.2M86%
Extract financials
2Compute risk score
Benchmark peers
4Test covenants
0.26x over
$4.2M room
human-in-the-loop · revision 2
Approval required

On the proposed revised structure · APPROVE

/s/ Countersign · CAM-2026-0417
Prepared by · credit analyst
Countersigned by · human reviewer

Dark

Total leverage4.26x94% Adj. EBITDA$22.6M · 17.6%94% Liquidity$14.2M86%
Extract financials
2Compute risk score
Benchmark peers
4Test covenants
0.26x over
$4.2M room
human-in-the-loop · revision 2
Approval required

On the proposed revised structure · APPROVE

/auto/ clean-approval policy
Auto-countersigned · supervised
Countersigned by · human reviewer

Motion

one curve, two durations — announce, then rest
--ease-out
cubic-bezier(.22, 1, .36, 1) — every transition in the system uses this one curve.
--dur-1 · 0.16s
Hover, focus, colour and border changes.
--dur-2 · 0.24s
Entrances, expands, state changes with layout.
exceptions
0.06s on button press, and linear for slider-follow — motion that tracks a finger must not ease.

Announce, then rest. Attention effects fire a bounded number of times and stop; a decision surface that keeps pulsing reads as unresolved. prefers-reduced-motion zeroes durations and animation delays.

Do’s and Don’ts

the rules that keep it coherent — including what was tried and rejected

Do keep teal scarce. Live, active, focus, provenance, identity — never decoration, never a functional state.

Do let green/amber/red carry meaning. Pass, warn, breach. They never mix with teal and never mark liveness.

Do set every compared number in mono with tabular figures. 11px is the type floor; 600 is the weight ceiling.

Do frame tinted elements with a solid colour in dark. Alpha borders vanish on graphite, and ghost buttons on a tint need a solid panel fill.

Do treat a dashed hairline as sandbox. The what-if panel and term amendments are scratchpads, not the record.

Don’t pair a border with a shadow. Light separates with a hairline; shadows are for overlays only.

Don’t shout in small type. Uppercase is reserved for status tokens and a handful of eyebrows — not field labels.

Don’t add a second accent, a serif “document voice”, glass surfaces, theme-reveal transitions, or decorative progress rules. All were tried and rejected.

Responsive Behavior

a desk instrument first — it degrades by dropping context, not by shrinking type

≤ 1100px — the document panel hides. Provenance citation needs the source visible, so the click-through warns instead of failing silently.

Nav rail collapses to a ~60px icon rail with hover tooltips; the state persists.

Fixed-count rows use container queries, not viewport queries — the gate metrics and the financial cards respond to their own container width, so they behave correctly inside any column.

Type never shrinks to fit. The 11px floor holds at every width; layouts reflow instead.

Iteration Guide

how to change this system without breaking it

Re-skinning is a token swap. Change the values in :root and :root[data-theme="dark"] in src/index.css. No component markup changes.

Adding a colour? It must answer “what state does this mean?” If it has no semantic job, it does not belong — use an existing ink or surface step.

Adding a size? Use one of the six type steps and one of the seven spacing steps. New in-between values are how a system becomes eye-tuned rather than systematic.

Check both themes and recompute contrast. Dark and light fail differently: alpha borders die in dark, and faint ink fails AA in light.

Known Gaps

honest limits of the current system

Uppercase is still broader than reference systems. Roughly twenty eyebrow roles share one disciplined recipe; top systems scope caps to one to three roles. A further cut is available.

No focus-visible specimen on this page. Focus rings exist app-wide (3px accent-soft) but are not catalogued here.

The header is dense. Brandmark, shortcut hints, theme, autonomy, speed, status and two buttons share one row; it works at desktop width but has no small-screen treatment.

No component states matrix. Specimens show resting state; hover, disabled and loading are defined in CSS but not laid out side by side.