# 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. ```css :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. | Role | Size | Notes | | --- | --- | --- | | h1 | `clamp(2.1rem, 1.35rem + 3.5vw, 3.6rem)` | line-height 1.03, tracking -0.022em, weight 600 | | h2 | `clamp(1.45rem, 1.2rem + 1.1vw, 1.95rem)` | line-height 1.15, tracking -0.014em | | h3 | `1.12rem` | weight 600 | | Standfirst | `clamp(1.08rem, 1rem + 0.4vw, 1.28rem)` | line-height 1.5, `--ink-soft` | | Body | `clamp(1rem, 0.97rem + 0.16vw, 1.075rem)` | line-height 1.62 | | Eyebrow | mono `0.685rem` | tracking 0.15em, uppercase | | Table body | mono `0.795rem` | `tabular-nums` | | Table head | mono `0.665rem` | tracking 0.07em, uppercase, weight 500 | | Stat numeral | mono `1.85rem` | tracking -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.