Research memo

Use for dense analyst-style reports: pricing comparisons, technical evaluations,
research write-ups. Read top to bottom, scanned for numbers. The identity is
“research memo, set properly”: serif for everything you read, monospace for
everything you compare, one petrol-teal accent that never competes with the
semantic colors. No third typeface. No pure mid-grey. No em dashes in copy.

Tokens

Define every color on bare :root, redefine only tokens in the two dark blocks,
reference tokens from components and never literals, and give body an explicit
token background. Dark is not an inversion: the accent lightens and the semantic
trio desaturates.

:root {
  --ground: #f2f4f4; --paper: #fbfcfc;
  --ink: #141d21; --ink-soft: #47585e; --ink-faint: #7a8b91;
  --rule: #d3dcdd; --rule-soft: #e4eaea;
  --accent: #0d5f66; --accent-soft: #e0eded;
  --warn: #8a5407; --warn-soft: #f6ecd9;
  --stop: #97231d; --stop-soft: #f7e4e2;
  --go: #17603e; --go-soft: #e0efe6;
  --serif: "Iowan Old Style", "Charter", "Palatino Linotype", Palatino, Georgia, ui-serif, serif;
  --mono: ui-monospace, "SF Mono", SFMono-Regular, "Cascadia Mono", Menlo, Consolas, monospace;
  --measure: 68ch; --pad: clamp(1.15rem, 4vw, 2.75rem);
}
@media (prefers-color-scheme: dark) {
  :root:not([data-theme="light"]) {
    --ground: #0e1518; --paper: #141d21;
    --ink: #e4ecec; --ink-soft: #a3b5b8; --ink-faint: #6e8287;
    --rule: #27363a; --rule-soft: #1d2a2e;
    --accent: #5fbfc2; --accent-soft: #14302f;
    --warn: #e0ac5c; --warn-soft: #2d2415;
    --stop: #e8877f; --stop-soft: #33201e;
    --go: #6cc394; --go-soft: #14291f;
  }
}
:root[data-theme="dark"] { /* repeat the dark tokens above verbatim */ }
body { background: var(--ground); color: var(--ink); font-family: var(--serif); margin: 0; }

System font stacks only: a linked webfont fails silently to a default. Avoid
Inter and Space Grotesk.

Type

Serif carries prose and headings. Mono carries every label, table, number,
caption, chip, and stat. Uppercase labels always take positive letter-spacing;
display sizes take tight negative tracking.

RoleSizeNotes
h1clamp(2.1rem, 1.35rem + 3.5vw, 3.6rem)line-height 1.03, tracking -0.022em, weight 600
h2clamp(1.45rem, 1.2rem + 1.1vw, 1.95rem)line-height 1.15, tracking -0.014em
h31.12remweight 600
Standfirstclamp(1.08rem, 1rem + 0.4vw, 1.28rem)line-height 1.5, --ink-soft
Bodyclamp(1rem, 0.97rem + 0.16vw, 1.075rem)line-height 1.62
Eyebrowmono 0.685remtracking 0.15em, uppercase
Table bodymono 0.795remtabular-nums
Table headmono 0.665remtracking 0.07em, uppercase, weight 500
Stat numeralmono 1.85remtracking -0.03em, line-height 1

Headings get text-wrap: balance, paragraphs text-wrap: pretty. Cap prose at
max-width: var(--measure); never cap tables or charts.

Layout

One centered column, max-width: 60rem, padding: 0 var(--pad) 6rem. The
wrapper is display: flex; flex-direction: column; gap: 3.25rem; each section
is a flex column with gap: 1.15rem. Spacing comes from gap, never per-element
margins. Wide content sits in a .scroller with overflow-x: auto so the body
never scrolls sideways.

Components

  • Masthead: mono kicker with dot-separated metadata, h1, standfirst, closed by a 2px solid var(--ink) rule. The only full-weight ink line on the page.
  • Section header: mono eyebrow naming the kind of content, 1px bottom rule, then h2. No 01 / 02 markers unless the content is sequential.
  • Verdict panel: --paper background, 1px border, 4px left border in a semantic color, mono uppercase label above the prose. Reserved for findings that change the decision.
  • Duo cards: grid-template-columns: repeat(auto-fit, minmax(15rem, 1fr)); mono accent title, optional stat numeral, body copy.
  • Data table: inside .scroller; first column left, the rest right-aligned; sticky thead on --paper; row hover tints --rule-soft; group rows use --rule-soft with uppercase mono labels; cell classes .win, .lose, .flag.
  • Bar chart: three-column grid per row (label, track, value); fill width from an inline --pct, max-width: 100%; .over swaps the fill to --stop. Full width equals the reference line.
  • Chips: mono uppercase 0.66rem, four semantic variants on the -soft backgrounds.
  • Steps: mono accent-chip marker plus prose, only where order is real.
  • Details/summary: for true but secondary material such as corrections and methodology.

Always

font-variant-numeric: tabular-nums on columnar numerals; a visible
:focus-visible outline in the accent with outline-offset: 3px; a
prefers-reduced-motion block that removes animation and transition; one
selector per spacing rule so type and element selectors never fight.