Document 04 of 14 · DESIGN.md
Mockups of this direction, plus two alternates drawn to be argued with, are on the design canvas at https://claude.ai/artifact/88arHMUX5p2ekQXW6gDEVo (sources in docs/mockups/).
This is the seed for DESIGN_SYSTEM.md in the new repo. It settles the identity before the first template ships, for the same reason measureandbuy settled its look before the paint tool: the new-template skill will encode whatever pattern the first three templates carry, and thirty templates later a change is a retrofit.
The page is a desk. The templates are sheets lying on it. Everything the visitor does is what you would do at a studio counter: pick up a sheet, hold it to the light, ask for your name on it, pay, take it home. The site's job is to get out of the way of the paper.
That gives us three rules that decide most questions before they are asked:
The site ships one theme, light. The product is white paper, and a dark ground under a white sheet turns every preview into a lightbox. This is a decision, not an omission; record it in the new repo's DECISIONS.md.
The neutrals are pulled from a studio worktop, not from a cream-and-terracotta template.
| Token | Value | Job |
|---|---|---|
--desk |
#e8e5de |
The page ground. A cool putty grey, like the back of a cutting mat. Sheets sit on it. |
--desk-2 |
#dedad2 |
Slightly deeper desk for the footer and the customizer's stage. |
--sheet |
#ffffff |
Paper. Templates, cards, the form panel. |
--ink |
#17181a |
Registration black. Headings, body text, borders that matter. |
--ink-2 |
#4a4d52 |
Body text on white where full black is too heavy. |
--pencil |
#6b6f76 |
Meta text, captions, crop marks. Cool-biased grey, chosen not inherited. |
--rule |
#cfcbc2 |
Hairlines on the desk. |
--accent |
#b3261e |
Pressman's red. Price, buy button, proof stamp, selected chip, focus ring. Text-safe on the desk (about 5.3:1) and on white (about 6.6:1). |
--accent-2 |
#8e1c16 |
Hover and pressed state of the accent. |
--kraft |
#c9a97a |
The "free version" tag and paper-swatch chips. Never text. |
--kraft-ink |
#6e5330 |
Text on a kraft tag. |
--process-c --process-m --process-y |
#00a3e0 #e5007d #ffd400 |
The color bar and the registration mark only. Never text, never a button, never a background. |
Contrast is measured, not eyeballed, exactly as on measureandbuy: --ink-2 on --sheet, --pencil on --desk, --accent on both grounds, --kraft-ink on --kraft, white on --accent. Every pair passes 4.5:1 or it is not shipped. The trap measureandbuy hit three times applies here in reverse: anything dark placed on a white card inside the grey page must set its own colours; do not let a .desk a rule repaint links inside a sheet.
No template theme uses the site's own red (#b3261e): the "Studio" theme is oxblood, #8f2d2d, so a sheet on the template page never carries the same red as the buy button beside it. Inside a template, colours are the template's own and live in four variables the runtime can swap: --t-paper, --t-ink, --t-accent, --t-muted. A theme is a set of those four (plus optional extras the template declares). The site palette never leaks into a template and a template's palette never leaks into the site.
preload, font-display: swap, OFL.txt beside the file, never a Google Fonts <link>).ui-monospace, SFMono-Regular, Menlo, Consolas), tabular-nums, for prices, paper sizes, page counts, field counters, spec lists, order numbers. Every number on the site is mono. Same rule as measureandbuy.Templates carry their own type systems, at most two faces each, chosen from the approved list in data/fonts.md. A template never uses the site's display face by default, so the templates look like a collection of different things made by one studio rather than one design repeated.
These are the equivalents of measureandbuy's live diagram: the parts that make the site recognisably itself.
.sheet, that shows a template at its true aspect ratio (8.5:11, or 210:297 when A4 is selected) with a two-layer shadow (a tight contact shadow and a soft ambient one), a hairline edge, and four crop marks just outside the corners in --pencil. On hover it lifts 4px and the shadow deepens. Multi-page templates show a second sheet offset 6px behind. It is used everywhere a template appears: cards, the template page hero, the customizer, the homepage. One component, one look.studio.js in an iframe, with the theme chips wired. Type your name on the homepage and it sets in the display face on the certificate. Tap a chip on the template page and the sheet repaints. The product demonstrates itself in the first three seconds.--accent at 8% opacity, pointer-events: none. It is honest (this is a proof, you have not bought it yet), it is the brand, and it makes a screenshot worth less than $7. The customizer's print stylesheet hides the stage entirely.<button aria-pressed>. The light-ink theme is always present and always says "printer-friendly" under it.currentColor so header and footer variants come from CSS, which is the lesson measureandbuy learned about a mark that lived in five files.Motion, in total: the sheet lift, the chip select, a 200ms cross-fade on the sheet when a theme changes so it does not flash, and a simple slide between pages on multi-page previews. No scroll effects, no parallax, nothing that plays on load. prefers-reduced-motion turns all of it off.
--wrap 1200px. Header on the desk: mark + wordmark left, nav right (Templates, Help, License), and a search field in Phase 2 that filters catalog.json on the client. Footer on --desk-2: the categories, the legal four, the Associates-style compliance line is not needed here (no affiliate program), the Synergy attribution the way measureandbuy does it ("Made by" + logo, "© 2026 Synergy"), and the email signup.
The sheet frame at about 300px wide, then the title in Newsreader 22, then one mono line: category, page count, price, and the kraft FREE tag if there is a free version. The whole card is one link, hit-tested at five points the way measureandbuy's cards are.
Two columns above 980px: the live sheet with its chips on the left (about 55%), and on the right the H1, promise, the two CTAs with the price on the paid one, and the "what is inside" spec list. Below, full width: description, print notes, FAQ, related. On mobile the sheet comes first, then the CTAs, and a fixed bottom bar carries the price and "Make it yours" until the real buttons scroll into view.
grid-template-columns: 380px 1fr. Left column is a white panel with the field groups as <fieldset>s with real <legend>s: Text, Dates, Colors, Options, Logo, Paper size. Right column is the stage on --desk-2, the sheet centred and scaled to fit with transform: scale(), the proof over it, page thumbnails under it for multi-page templates.White card on the desk with the READY stamp, the order number in mono, two buttons (Letter, A4), "A link is in your email and works for a year", "Make another". The failed state is the same card with the stamp replaced by a plain sentence and the order number, never a spinner.
600px, white on the desk grey, the mark and wordmark, "Your invoice template is ready", the two buttons, the order number, one line of print advice, the Synergy footer. Inline CSS, no images that matter (the buttons are HTML). Same words on screen and in the email, so the two never disagree.
These are the design half of the Studio Standard and they go in the new-template skill:
.sheet sized in physical units (8.5in by 11in, or 210mm by 297mm under .a4), @page { size: Letter; margin: 0 } with the A4 variant switched by a class, and 0.5in safe margins on every edge because home printers cannot print to the edge and the reader will not know that.data/fonts.md, as static instances (one file per weight and style). A variable font on a template prints as Type 3 outlines with no embedded font program and four times the file size; the render proof in spikes/render/ showed it. Minimum 8pt for anything a person is meant to read, 0.5pt for the thinnest rule.data-max the runtime can measure against. A design that "just flows" cannot be guarded, so it is not a design we sell in v1. (This is why résumés wait for a second runtime; see CATALOG.md.)--t-* variables. A hard-coded hex in a template is a theme that cannot exist..desk a (class plus element) beats .button (bare class). Anything inside a white sheet on the grey page sets its own colour explicitly. Third time this shipped a bug on the sister site.ch on a wrapper resolves against the wrapper's font size, not the heading inside it. Put the measure on the heading.display: grid beats the UA [hidden] rule. Restate [hidden] { display: none } for any grid or flex container that toggles.appearance: none, an inline-SVG chevron at right 14px center, padding-right: 38px.scrollTo(0,0) before capturing a rect.html { scroll-behavior: smooth } makes scrollIntoView async, so hit-tests report zero unless the scroll is instant.