Skip to content

Design language v2: Steps 1-2 foundation migration - #166

Merged
AkashGoenka merged 25 commits into
site/design-language-v2from
site/design-language-v2-migration
Sep 6, 2026
Merged

Design language v2: Steps 1-2 foundation migration#166
AkashGoenka merged 25 commits into
site/design-language-v2from
site/design-language-v2-migration

Conversation

@AkashGoenka

@AkashGoenka AkashGoenka commented Sep 1, 2026

Copy link
Copy Markdown
Owner

Summary

Expands the design language v2 migration into the full site experience. The branch now includes the foundational token/field work plus the subsequent landing page, docs, demo, footer, notebook viewer, and measured design updates.

What changed

  • Centralized design tokens in site-astro/src/styles/tokens.css and removed duplicated stylesheet definitions.
  • Added the page-wide frost-to-ember field, responsive field treatment, section separators, seam styling, and consistent 1120px layout spacing.
  • Reworked the landing page and /demo/ around a clearer, static walkthrough of coldstart sessions, with responsive layouts and no hidden-content/typing dependencies.
  • Rebuilt the footer as a shared four-column navigation surface and improved cross-site discoverability.
  • Updated docs, blog, live, notebook, and how-it-works pages to share the visual system, typography ramp, contrast improvements, and temperature-coded accents.
  • Themed the notebook viewer to match the product palette while preserving its light reading surface.
  • Reconciled DESIGN.md with measured layout and contrast findings; removed superseded specimen work and stale design claims.
  • Added the initial migration steps: token consolidation, field/seam/separators, backdrop cleanup, and uniform section padding.

Verification

  • Site builds were run during the migration work.
  • Responsive behavior was checked at desktop and mobile widths, including horizontal-overflow checks.
  • The PR contains 25 commits and has no merge conflicts with site/design-language-v2.

This PR covers the current design-language v2 scope.

AkashGoenka and others added 25 commits September 2, 2026 00:12
…ss and docs.css

- Create site-astro/src/styles/tokens.css with NEW design language v2 tokens from DESIGN.md §2/§12
- Includes both new design values and legacy variables for backward compatibility during migration
- Import tokens.css from every page that uses landing.css or docs.css
- Remove duplicate :root declarations from landing.css and docs.css
- Remove --frost/--ember redeclaration from body.essay-page in docs.css (line 306)
- Set --wrap to 1120px (consolidated from inconsistent 1120px/1080px)
- No visual change - consolidation only

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
- Add field background (body::before) with frost→ember gradient to landing.css and docs.css
- Add vertical variant for <860px per DESIGN.md §12
- Remove dot-grid backdrop.css import from all pages (12 pages updated)
- Add full-bleed section separator: section + section {border-top: 1px solid var(--line)}
- Add seam CSS to landing.css (signature vertical line at column-6 gutter)
- Update section padding to 84px (from 76px)
- Both pages now render the continuous field background

Build passes successfully.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
A second specimen alongside /specimen/, built from the EpicInfographics
composition rules rather than from taste. Declares its composition pattern
(editorial spread, 4/8) in a comment, per that repo's prime rule.

Adds five signature devices where DESIGN.md 5 had one: the drafting grid,
the double-rule frame + registration crosses, Fig. numbering, dimension
lines with knockout labels, and the title-block footer.

Breaks 12 on exactly one point - radius 0 instead of 6/10px - which is the
experiment. Palette, near-white prose and the frost/ember ramp are unchanged.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
A repeating background pattern is the web's most common generated-site
tell, whatever it is made of. composition.md's 'the background must
participate' rule is written for a 1080px print canvas, where a drafting
grid is paper texture; it does not survive the move to a scrolling page.

Structure is now carried entirely by drawn, non-repeating linework - the
frame, the rails, the section rules, the dimension lines. The rail moves
from --line-soft to --line since it is now what holds the 4:8 split
visible. The frost/ember ramp is the only field left.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The first cut invented a 4/8 split from a print composition rule instead of
rendering the layout already settled in 4. This uses .split (5/7, sticky
argument left, artifact right) and .plain (cols 1-8) as specified.

The rail replaces 5's position:fixed seam: an absolute line inside the
section, measured in the same grid units as the columns, so it needs no
viewport arithmetic and cannot drift. Hidden on .plain, which has no
5/7 boundary to mark.

Kept from the first cut: Fig. numbering, dimension lines, title block,
radius 0. Dropped: the tiled grid and the 4/8 ratio.

Fixes found by rendering: Astro collapses template newlines, so the
terminal's white-space:pre ran the whole transcript onto one line - now one
div per line; h1 at 58px wrapped to six lines in a 5-column measure and
drove ~400px of dead space; ligatures off so --match is not an en dash.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Layout only. The copy is word-for-word identical to main (verified by
diffing the rendered text of both) - the ask was a layout change, and
changing the words at the same time would make it impossible to judge.

Two columns, one shape for every section: the argument on the left, the
artifact it is talking about on the right, at 5/7. The text column keeps a
single left edge down the whole page and the claim stays sticky while a
tall artifact scrolls past. Nothing is centred any more. Below 900px it
collapses to one column.

The background is now ONE page-scale ramp - frost on the left edge, ember
on the right - defined once in backdrop.css, so docs and blog get it too.
It replaces the per-section colour bands (.navsec/.phil/.faq on --ink-1,
.nb on a warm ground with two radial blobs) and the hero's own glow;
sections are now divided by a hairline over a continuous field. The 30px
dot grid that used to live in backdrop.css is gone - a repeating pattern
reads as templated, and it fought the ramp for the same layer.

Revert this one commit to get the current site back.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Reverts 43401f3's layout entirely. The landing page is back to the
version that was live: centred hero, single-column sections, the copy
and structure untouched.

The reason is measurement taken after that commit shipped. A DOM probe
across six dev-tool landing pages at 1440px found that nextjs.org,
vercel.com and railway.com use ZERO two-column grids; where a 2-col
grid exists elsewhere it is ~0.50 or an extreme sidebar ratio, and
nobody repeats an asymmetric split as a page spine. 5 of 6 centre some
text. The 5/7 spine applied to every section, and "nothing is ever
centred", were asserted in DESIGN.md 4/5 and never measured - 11
measured type and colour only.

Two things from 43401f3 are KEPT because they were not the problem:

- backdrop.css still carries the single page-wide frost-to-ember ramp,
  so home, docs and blog share one continuous field.
- The per-section colour bands are still gone: .navsec/.phil/.faq no
  longer sit on --ink-1, .nb has lost its warm ground and two radial
  blobs, and .hero::before's glow is gone. Sections are divided by a
  hairline over that continuous field instead of by a change of colour.

Also drops the macOS traffic-light dots from every terminal on the
site - 39 spans across five pages, plus the now-dead .tl rules in both
landing.css and docs.css. They are decoration borrowed from a screenshot
of someone else's window chrome.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
4 previously specified a 5/7 split spine, a sticky argument column and
"nothing is ever centered". None of it was measured - 11 measured type
and colour only, and its credibility transferred to an axis it never
touched. The spine was built (43401f3), looked wrong, and the DOM probe
run afterwards contradicted it.

4 is now the measurement: six dev-tool landing pages at 1440px, the
probe recorded inline. Half the class - nextjs.org, vercel.com,
railway.com - uses zero two-column grids. Nobody repeats an asymmetric
split as a spine. 5 of 6 centre some text. So: stacked full-width
sections, 500px prose measure (the measured band is 429-550px / 48-79
chars), centring allowed, a 2-col grid only as a per-section decision
and only at 50/50.

5's seam is retired. It was a hairline at the column-6 gutter, a device
that only exists if there is a column-6 gutter, and it was never built.
The signature device is now the field that actually shipped: one
page-scale frost-to-ember ramp in backdrop.css, singular rather than
tiled, replacing the per-section colour bands.

Also reconciles 2, which still carried the two-radial-blob field CSS
that 12 rejects by name, and clears the stale seam references in 1, 6,
9 and 12.

The two specimen pages go with it. Both were built on 4's retired
layout, so they now demonstrate a system the spec no longer describes;
neither was ever approved. The spec is the artifact.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Replaces the JS-animated recall timeline with what 7 actually asked
for: two Claude Code panels, fully rendered on load. No typing effect,
no scroll triggers, no opacity:0 - verified 0 hidden elements on the
page (the one hit is the nav dropdown, which is meant to be closed).
It is screenshot-able and works with JS off.

The two panels are the same repo on two different days:

1. COLD - the recall hook searches the notebook, finds nothing, and the
   agent falls through to the index. One `coldstart find`, one
   `coldstart gs`, then the answer. The Stop hook writes the note.
2. WARM - a different session asks the same thing. The note matches,
   arrives with the prompt, and the answer costs zero tool calls.

All command output is real and unedited from this repo, elided with
`… +N lines` per 7. The question is a real one - whether "edited
together" is a dependency edge - and the answer is the true one: it
comes from `git log --name-status -M` in deriveCoChange, not the graph.

Chrome follows 7's table exactly (panel #1f1f1f, prompt chip #2e2e2e,
output box #1a1a1a on #383838, IN/OUT gutter at 34px, green dot on tool
calls, ember input bar). No traffic-light dots.

7's commentary rail is dropped with 4's split: the annotations are
centred captions between turn groups instead, which keeps them outside
the replica - the reason the rail existed - while collapsing properly
on mobile. Verified at 1440px and 390px; no horizontal page overflow at
either, the output boxes scroll inside themselves.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Three fixes, all measured.

TEXT CONTRAST. The field commit changed what text sits on and the greys
were never moved to compensate. Measured against the composited ground:
body copy at #8b9ab2 fell from 6.94:1 to 5.28:1 on the frost side, and
#7a8aa3 fell to 4.30:1 - BELOW the 4.5 AA floor for normal text. Both
also carry an R-B spread near 40, which DESIGN.md 11 measured as the
actual cause of the washed-out look: a blue-grey on a blue-black ground
has too little hue separation from its own background.

New ramp, near-neutral and measured on the worst ground:

  --text  #eef2f8   13.4:1   R-B -10
  --muted #c3c8d0    9.0:1   R-B -13
  --faint #a3a9b2    6.4:1   R-B -15

ONE DEFINITION. The ramp now lives in backdrop.css and nowhere else.
It was hand-copied into landing.css, docs.css and how.css and had
already drifted: body.essay-page carried a fixed --prose at 12.8:1 with
a comment saying "was #8b9ab2 at 6.9:1", so the blog was repaired and
docs and the landing page were left behind. backdrop.css is imported
last by every page shell, so its :root wins; the local copies are gone.

DOCS ALIGNMENT. .docs was 1200px/24px padding while .nav-in and .wrap
are 1120px/28px, so the docs content edge sat at 144px against the
nav's 188px - the logo read as indented against the sidebar. Now both
measure 188.

Also: pages/live/index.astro never imported backdrop.css, so /live/ was
the one page with no background field at all - exactly the failure the
notebook note on this file predicts. Fixed.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The panels asked "why does gs show files edited together" against
coldstart's own repo. That only demonstrates the tool to someone who
already uses it - a visitor who has never heard of coldstart cannot
tell whether the answer was hard to get.

Now it is "how does authentication work in this codebase?" on a
fictional Node/Express API. Session one has nothing written down and
goes looking: one find locates src/auth/session.ts, one gs shows who
calls createSession and verifySession and from which line, then it
answers - sessions in Redis, not JWTs, despite the variable being
called `token`. Session two, days later, asks "are we using JWTs for
login?" - different words, same subject - and the note arrives with the
prompt for zero tool calls, carrying the warning about the misleading
name that nobody had put in a comment.

The invented-repo trade is stated on the page, not hidden. A line under
the hero says the repo and its output are invented and that only the
command shapes and output format are real, because a terminal reads as
captured output unless the page says otherwise. DESIGN.md 7 is updated
to record the trade rather than keep its "real, unedited output" rule
that this now breaks.

Format stays static HTML. A GIF would lose selectable text, indexing,
and reader control, and would be several megabytes at legible width;
the case for one is off-site (README, npm, social) where the page's own
CSS cannot render, which is what 10 already scopes.

Note for the next editor: Astro compiles the whole template as a JS
template literal, so a `${...}` inside terminal output is interpolated
and fails the build with "token is not defined". HTML-entity escaping
does NOT help - the entity is decoded before the literal is emitted.
Write the output without the construct.

Verified 1440px and 390px: no horizontal overflow, no hidden content.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Correcting a claim the product does not make. The warm panel said
"Zero tool calls. No find, no gs, no reads." That is wrong about how
agents behave: an agent handed a note still opens the file to confirm
before it answers, and one that does not is not an agent you should
trust. What the note removes is the SEARCH - working out which file -
not the verification.

The warm session now shows what actually happens: the note arrives, the
agent says it will confirm, runs one Read against the exact file the
note named, and answers from what it just saw. The tally reads "One
read instead of a search" and says plainly that the checking still
happens. The section heading moves from "It already has the answer" to
"It starts at the right file", and the closing line now says neither
session is free - what changes is how much of the work goes into
finding the file rather than answering the question.

The same overclaim was on two other pages and is fixed there too:
index.astro said the next agent "gets it for free", live/index.astro
said a question is "answered for free from a note".

This is a better demo as well as a truer one. A developer who has
watched an agent work does not believe "zero tool calls", so the claim
was costing credibility with exactly the audience the page is for.

Also moves that panel's terminal output into frontmatter. Astro parses
`{...}` in markup as an expression, so `JSON.stringify({ uid: user.id })`
fails the build the same way `${...}` did - and real source output is
full of braces. Frontmatter strings are immune to both; the file now
carries a comment saying so.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The viewer was a generic blue-and-white document reader (--accent
#1f4fd8, --ground #eaeef3) — it had never been brand at all, so a note
opened from coldstartmcp.dev and the same note opened from `kb view`
looked like two different products.

Themed at the source rather than skinning the site copy, so the local
`kb view` output changes too. Three calls, recorded in the file header:

- It stays LIGHT-grounded. The site is dark, but this is a long-form
  reading surface for note prose, and dark is worse for that. Uniformity
  comes from hue, not from inverting the page.
- `--file` is frost and `--flow` is ember: a file note is a fixed exact
  address, a flow note is a path through the code. The note graph now
  reads as the site's own two-temperature system.
- The freshness scale stays a green/amber/red traffic light — that is
  status, not brand. `--changed` moved redder so it doesn't collide with
  the new ember `--flow`.

The top bar is deliberately dark against the light body, carrying the
site's frost→ember hairline. That is the one place the viewer looks like
the site nav, and it costs the reading surface nothing.

Contrast on --ground: ink 15.3, ink-soft 8.7, muted 5.0, faint 3.9. The
old muted/faint measured 4.0 and 2.1 — both were below AA.

Also corrects the file header, which claimed the template was generated
and must not be hand-edited. There is no generator: scripts/kb-viewer/
holds only build-site-page.mjs, which bakes this template for the site.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The footer was one row of five links, duplicated in landing.css and
docs.css. Meanwhile /demo/, /live/, /notebook/, /graph/, /vs/vector-rag,
three how-it-works pages and three docs pages were reachable only from
the nav dropdown — so the site's own IA had no second entry point, and
no internal-linking surface at all.

Now four columns (See it work / Understand it / Reference / Project)
beside an identity block, over a base rule carrying the tagline and a
frost/ember key. Sentence-case column headings, not tracked-out
uppercase.

Both duplicated copies were deleted; the rules live in one new file,
styles/footer.css, reached through an @import at the top of
backdrop.css. Every page that renders <Footer /> already imports
backdrop.css — verified, the two sets match exactly — so this adds no
per-page import for a new page to silently forget, which is how /live/
shipped without its backdrop.

One trap worth naming: the columns were <nav> elements at first, and the
global `nav{position:sticky;border-bottom:1px solid var(--line)}` rule
from landing.css applied to them, boxing and pinning each column. They
are plain divs.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The page had a question, then four explanatory paragraphs per panel
telling you what you were about to see — roughly 110 words of narration
before the first terminal line. A caption track for something that
should be self-evident.

Both section leads and three of the four captions are gone. The one
caption kept explains `fresh`, which is a term a reader cannot infer.
The hero setup is one sentence, the closing two.

Nothing about the simulated session changed.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Measured first. On /docs/ the DOM had 16 frost elements and zero ember;
on /blog/ effectively none either. The site had a two-colour system and
was spending only one of them outside the home page.

The rule applied: frost marks the navigational chrome — nav, kickers,
active states, links. Ember marks the artifact the sentence is about —
inline code, commands, file names, note fields. So:

- Inline code in prose is ember on docs and blog (docs.css `p code`,
  `.essay-article code`) and in the home FAQ, matching what
  `.keynote code` in landing.css already did. /docs/ went 0 -> 18 warm
  elements, /docs/notebook/ to 30.
- Blog kickers are temperature-coded by topic: Memory, Codebase memory,
  Codebase notes and Design are ember, the rest frost.
- The /live/ notebook card kicker is ember.

Both brand colours clear AA on the composited grounds: frost 7.07/7.42,
ember 6.45/6.77 (frost side / ember side).

Two things found on the way:

- Residual hardcoded greys survived the text-ramp change — #8b9ab2 and
  #7a8aa3 in the nav dropdown, copy buttons and terminal title bars.
  Those are the washed-out blue-greys the ramp was meant to kill. Now on
  --faint.
- /live/ still advertised "2 tool calls -> 0". That is the claim already
  corrected in prose on this page and on /demo/: a recalled note removes
  the search, not the reads. It now reads "a search, then one read".

Blog cards drop the reading time — at three segments the longest kicker
wrapped and pushed that card's title out of alignment with its row. The
reading time is still on the post itself.

Verified in the browser across 12 pages: no horizontal overflow at 1440
or 390, footer grid identical under both stylesheets, no console errors.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The demo page opened with the auth question set as its headline, then
repeated it inside the first panel two screens later - so the page's own
title was a line of the simulated session, and a reader arriving cold had
to work out that the question was the example rather than the point.

The hero now says what the page is: a walkthrough of what coldstart
changes inside a session. The question stays where it belongs, in the
panel. The standalone .disclaim paragraph is gone; the "example repo"
honesty it carried is folded into the one sub line, because a terminal
still reads as captured output unless the page says otherwise.

Landing: the link into this page now names it the same way.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The section was one 130-word paragraph carrying 13 inline code chips,
followed by two visually identical .flags tables. Scanning the frost mono
key column read as six flags, but three of them (Upgrading, Removing,
Codex hook trust) were lifecycle prose wearing a flag row.

- Cut the wall paragraph to two sentences (13 chips -> 2). The per-client
  file mapping was a table pretending to be a clause; it is now a table.
- Added h3 subsection heads so the two tables are labelled and can't be
  read as one list. Sans, not the Newsreader display face - an h3 here is
  a shelf label, not another headline.
- Upgrade/uninstall commands moved into a terminal block, the section's
  existing idiom for commands, instead of long ember chips mid-sentence.
- Codex hook trust is troubleshooting, not setup; it's a callout now.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@AkashGoenka
AkashGoenka merged commit 0b03991 into site/design-language-v2 Sep 6, 2026
3 checks passed
@AkashGoenka
AkashGoenka deleted the site/design-language-v2-migration branch September 6, 2026 19:07
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant