Atelier
You are designing in the Atelier language. This is not a template to copy. It is a set of convictions, proportions, and taste lines that produce craft-obsessed, quiet, editorial pages. The output should feel unmistakably from the same studio but never identical to a prior run.
Core conviction
The most powerful designs are those that disappear. Every element must earn its place. Every interaction should feel inevitable. The studio voice is restraint, typography, and obsessive attention to detail. "We don't decorate; we clarify."
Two things you must never do:
- Do not reproduce the exact copy. The tagline, project names, descriptions, and section headers in the reference are specific to that page. Invent your own that match the voice.
- Do not reproduce the exact layout. The reference uses hero → philosophy → work grid → contact → footer. You may use any structure that serves the content, including single-page narrative, masonry, split-screen, scroll-telling, or editorial flow.
Voice
The tone is editorial, warm, precise, and slightly literary. It borrows from independent magazines and architecture monographs. The studio writes like it designs: cut everything that doesn't do work.
Rules:
- One clear proposition, stated simply.
- Avoid marketing superlatives ("best", "leading", "award-winning"). Earn trust through restraint.
- Paragraphs are short. Three sentences is long.
- Section transitions are soft, not shouted. No "WELCOME TO THE FUTURE OF..." energy.
- The best sentence is the one you almost cut.
Composition
Not a recipe, but tendencies:
- The hero is vertical, generous, and breathing. Headline is serif, large (clamp 3.5rem → 7rem+), split across 2-3 short lines. Subhead is sans-serif body copy under 600px wide.
- Sections are separated by generous vertical space (8rem padding minimum).
- Content alternates between tight (philosophy copy, hero body) and expansive (work cards, contact CTAs).
- No sidebars, no two-column body text. Two-column grids are for headline+caption pairings, not reading flow.
- Cards are correct only when the content is card-shaped: discrete projects, case studies, or modular collections. Otherwise flatten into typographic rhythm.
Refuse:
- Centered hero text as a reflex. Editorial left-align or off-balance alignments read as more considered.
- Pill-shaped tags, gradient badges, glowing CTAs. Those belong to SaaS, not ateliers.
- Icons as section headers. Use type or a single thin rule.
- Full-width image banners that trade craft for spectacle.
Color
The palette is a conversation between warm paper and quiet ink. It breathes across light and dark.
Commitment level: Whisper. Near-neutral surfaces, one accent color doing the work. The accent appears sparingly — a single rule, a card tag, a hover state — and earns its presence.
CSS custom properties — define these on :root and [data-theme="dark"]:
:root {
--bg: #ffffff;
--bg-warm: #f9f9f8;
--ink: #1d1d1b;
--ink-muted: #6b6b66;
--border: #e5e5e2;
--accent: #9a7348; /* vary this per project */
}
[data-theme="dark"] {
--bg: #0f0f0e;
--bg-warm: #161615;
--ink: #f5f5f0;
--ink-muted: #8a8a85;
--border: #2a2a28;
--accent: #c9a87c;
}
Always use these variables throughout — never hardcode hex values in the stylesheet. This makes dark mode and accent variation trivial.
Rules:
- The accent hue should sit in the warm-earth range: brass, ochre, clay, terracotta, muted olive, dusty rose. Never blue, purple, or cyan — those belong to other rooms.
- Never saturate the accent further. It is brass, not gold. Terracotta, not orange.
- Dark mode inverts contrast but preserves warmth. The dark accent shifts toward amber-gold.
- All
color and background-color transitions are 0.3s ease. Theme switches should feel like the page exhales, not snaps.
- Respect
prefers-contrast: more — push --ink toward pure black/white and harden focus outlines.
- Vary the accent hue between projects by changing
--accent on :root. Everything downstream updates automatically.
Typography
This is a two-font system. One serif for voice, one sans for everything else.
Serif: Instrument Serif (Google Fonts, italic available). Used for headlines only — h1, h2, h3. Italic on h2 by taste. This is the studio's handwriting.
Sans: Inter (Google Fonts, weights 300/400/500). Everything else: body, navigation, labels, buttons, form fields, footer.
Scale (serif headlines):
- h1:
clamp(3.5rem, 8vw, 7rem) — hero headword
- h2:
clamp(2rem, 4vw, 3.5rem) italic — section anchors
- h3:
1.25rem or 1.5rem — card titles, sub-heads
Sans rhythm:
- Body:
1.125rem, line-height 1.7, max-width 540px for hero prose, wider for section body
- Nav:
0.875rem, weight 500, letter-spacing: 0.02em
- Labels/meta:
0.75rem, letter-spacing: 0.1em, uppercase
- Card body:
0.9375rem, line-height: 1.6
Rules:
- Headline letter-spacing is
-0.02em — tight but not crushed.
- Body measure: 60-70 characters for reading prose, contained by max-width not column count.
- Never use more than two weights of Inter on one page. 300 + 500, or 400 alone, or 300 + 400.
- Load only the weights you use. No speculative loading.
- Vary the serif between projects.
Instrument Serif can be swapped for Playfair Display, Cormorant Garamond, Lora, or EB Garamond. Keep the editorial character, change the personality.
- Vary the sans between projects.
Inter can become DM Sans, Work Sans, Source Sans 3, or system-ui. The sans should feel neutral and invisible.
Motion
Motion in Atelier is slow, deliberate, and ambient. It suggests rather than declares.
Entrance:
- Hero headline and subtext fade in with a 1s
cubic-bezier(0.22, 1, 0.36, 1) ease-out. Stagger by 150ms per element.
- Below-fold sections reveal on scroll via
IntersectionObserver. Elements translate up 20px, opacity 0 → 1, over 0.8s with the same curve.
Ambient background:
Use one of these techniques for the hero background. Pick a different one per project. Simpler options are always acceptable — the atmosphere is the goal, not the technique.
| Option |
Technique |
Complexity |
Notes |
| A |
CSS gradient with subtle keyframe shift |
Low |
Safest. Always works. |
| B |
SVG filter + feTurbulence animation |
Low-Medium |
No WebGL needed. |
| C |
2D Canvas Perlin/simplex noise |
Medium |
Reliable, self-contained. |
| D |
WebGL FBM fragment shader |
High |
Only use if you can write correct GLSL. See guardrails below. |
WebGL guardrails (Option D only):
- Request context with
{ powerPreference: "low-power", antialias: false, alpha: false, preserveDrawingBuffer: false }.
- Time uniform multiplier:
~0.06. Mouse influence: subtle, not reactive.
- Pause the render loop via
IntersectionObserver when the canvas is off-screen.
- If the context fails to initialize, fall back silently to Option A. Always write this fallback.
- Do not attempt reaction-diffusion or domain warping unless you are certain the GLSL is correct. Broken shaders are worse than no shader.
For all options:
- The background fades vertically into the next section's
--bg or --bg-warm so it doesn't hard-stop.
- On
prefers-reduced-motion: use a static gradient. No animation of any kind.
- On
prefers-contrast: more: also use a static gradient.
Scroll indicator:
- A small animated element at the bottom of the hero — something unique per project. Label: "Explore" or "Scroll" in tiny uppercase tracking. This is the only decorative animation beyond the background.
Hover:
- Cards lift 2px (
translateY(-2px)) with a soft shadow. No scale, no glowing borders, no overlays that slide.
- Card image placeholder gets a subtle gradient overlay on hover. Inner SVG scales to 1.05.
- Navigation links shift from
--ink-muted to --ink on hover. 0.3s ease.
Rules:
- Never use
ease-in-out. Always cubic-bezier(0.22, 1, 0.36, 1) — decelerates gently.
- Never bounce, never elastic, never spring. This is not playful.
- Respect
prefers-reduced-motion globally. Kill all animations, transitions, and background effects. All scroll-observed elements show immediately at full opacity.
Interaction
Focus management:
:focus-visible outline: 2px solid var(--accent), outline-offset: 2px. Never outline: none without a replacement.
- Mobile menu traps focus and closes on Escape.
Form behavior:
- Contact form simulates submission with a 900ms delay. On submit: disable fields, show "Sending…" in the button (
aria-disabled="true"), then hide the form and show an inline success state with a checkmark.
- The success message receives programmatic focus (
tabIndex="-1", then .focus()) for screen readers.
role="status" and aria-live="polite" on the success container.
Theme toggle:
- Icon swaps between sun and moon. Preference stored in
localStorage under a consistent key (e.g., atelier-theme).
- On first visit with no stored preference, read
prefers-color-scheme.
- Listen for OS theme changes via
matchMedia and apply them only when no manual override exists.
- Apply theme via
data-theme attribute on <html>, not a class, so CSS variables cascade cleanly.
Rules:
- Touch targets minimum 44×44px. Use padding to reach this if the visual element is smaller — never sacrifice layout for tap target size.
- Form labels are always visible. Placeholders are for format hints only, never substitute for labels.
Navigation
Desktop:
- Fixed, transparent at page top. On scroll past 50px, gains
backdrop-filter: blur(12px), a 1px bottom border in --border, and a subtle box-shadow.
- Logo: studio name in serif (h1 or strong element), left-aligned, links to
#top.
- Nav links: right-aligned, Inter weight 500, small-caps tracking. Three to five links maximum.
Mobile (below 768px):
- Hamburger replaces nav links. Animate three lines → X on open (
transform + opacity, no layout shift).
- Mobile menu: full-screen overlay,
position: fixed, z-index above all content. Serif nav links at large scale, vertically centered.
- Lock body scroll when open (
overflow: hidden on <body>). Restore on close or Escape.
Rules:
- One CTA button in the nav. Examples: "Start a Project", "Work With Us", "Get in Touch". Pick one; don't vary within a project.
- Vary nav link names between projects. The reference uses Philosophy / Work / Contact. You might use About / Services / Journal / Contact, or Work / Process / Studio / Contact.
Layout sections (not a template)
Use 3–5 of these in any order. Never repeat the same type twice. The page should feel curated, not exhaustive.
- Hero — proposition, evidence, one action. Serif headline, sans body, generous vertical space, ambient background effect.
- Philosophy / Manifesto — headline + copy pairing, often two-column. A thin accent rule above the headline. The writing carries the section.
- Work / Projects — 2–6 cards in a grid. Each card: image placeholder (aspect-ratio 4/3), a tag in
--accent, a title, a one-sentence description.
- Services / Capabilities — what the studio does, stated plainly. Three-column list or alternating text blocks.
- Process — numbered steps, each with a title and 1–2 sentences. Sparse by design: four steps maximum, no sub-steps, no connecting arrows. The numbers are typographic, not functional. Think printed manual, not app onboarding.
- Journal / Writing — if included, typographic-first. Cards only if articles are genuinely discrete and scannable.
- Contact / CTA — short, warm, centered or left-aligned. Headline, one sentence, a form or email link. Form fields: name, email, message — nothing else.
- Footer — copyright in
<time datetime="...">, 2–4 social links with aria-label, no sitemap, no newsletter signup.
Footer rule: the footer's background must differ from the section directly above it. Alternate between --bg and --bg-warm so the page closes on a distinct visual note.
Performance guardrails
This is a single HTML file. No build step, no framework, no dependencies beyond Google Fonts. Keep it that way.
- Fonts: Load via
<link rel="preconnect" href="https://fonts.googleapis.com"> and the standard Google Fonts stylesheet. Use font-display: swap. Never block render on web fonts.
- Images: All image placeholders are inline SVG or CSS — no external image requests.
- JS: No external scripts. All behavior is self-contained in a single
<script> block at the end of <body>.
- Scroll/resize handlers: Throttle via
requestAnimationFrame. Mouse move uses a dirty flag updated on mousemove, consumed on the next frame — not per-frame recalculation.
- Section performance: Below-fold sections get
content-visibility: auto with a reasonable contain-intrinsic-size. Cards use contain: layout style paint.
- File size target: Under 25KB uncompressed (excluding fonts, which are external). If you're over, remove something — don't compress the philosophy.
- Privacy: No analytics, no tracking, no third-party scripts beyond Google Fonts. The restraint extends to the network.
Print stylesheet
Include a @media print block that:
- Hides: nav, background effect, scroll indicator, mobile menu, social links, theme toggle.
- Sets sections to
break-inside: avoid.
- Removes all animations and transitions.
- Forces
--ink to black, --bg to white.
Accessibility checklist
Every output must satisfy all of these before it is complete.
Structure:
- Landmark roles:
role="navigation", role="main", role="contentinfo" on footer
- Sections have
aria-labelledby pointing to their h2
- Heading hierarchy is sequential (h1 → h2 → h3, no skips)
Interactive elements:
- All buttons have
type attribute (type="button" or type="submit")
aria-label on icon-only buttons (hamburger, theme toggle, social links)
:focus-visible outline on all interactive elements
- Touch targets ≥ 44×44px
Mobile menu:
role="dialog" and aria-modal="true" on overlay
- Focus trapped inside when open
- Closes on Escape
aria-expanded on hamburger button reflects state
Form:
- Labels always visible, associated via
for/id
aria-required="true" on required fields
- Success state:
role="status", aria-live="polite", receives focus programmatically
Decorative elements:
aria-hidden="true" on background canvas/SVG and decorative SVGs
- Meaningful images (if any) have descriptive
alt text
Motion and contrast:
prefers-reduced-motion: all animations off, background effect replaced with static gradient, scroll-observed elements visible immediately
prefers-contrast: more: hardened outlines, --ink pushed toward pure black/white
What to vary between projects
These are the levers. Pull them differently each time:
- Serif font family (from the approved list or similar editorial serif)
- Sans font family (from the approved list or
system-ui)
- Accent hue: change
--accent on :root — warm-earth range only
- Number and names of nav links (3–5)
- Number, order, and types of sections (3–5, never repeat a type)
- Hero headline copy (2–3 lines, always editorial in voice)
- Philosophy/manifesto copy
- Project names, tags, and descriptions
- Contact CTA text and form field labels
- Background effect technique (Options A–D from the motion table)
- Card count (2–6)
- Whether to include a Journal or Process section
- Footer background (
--bg or --bg-warm, must differ from the section above)
What to never vary
- The restraint. Nothing should feel decorative.
- The color commitment level. Whisper, always.
- The editorial voice. Warm, precise, unsentimental.
- The two-font system. One serif, one sans.
- The motion character. Slow, ambient, deliberate.
- The performance model. Single HTML file, no framework, no bloat.
- The accessibility baseline. Every item in the checklist.
- The CSS variable system. Always
var(--token), never hardcoded hex.
1---2name: atelier-skill3description: A boutique design language for studio portfolios and craft-driven landing pages. Minimalist, typographic, editorial — with warm restraint, serif voice, and ambient motion.4---56# Atelier78You are designing in the Atelier language. This is not a template to copy. It is a set of convictions, proportions, and taste lines that produce craft-obsessed, quiet, editorial pages. The output should feel unmistakably from the same studio but never identical to a prior run.910## Core conviction1112The most powerful designs are those that disappear. Every element must earn its place. Every interaction should feel inevitable. The studio voice is restraint, typography, and obsessive attention to detail. "We don't decorate; we clarify."1314Two things you must never do:1516* **Do not reproduce the exact copy.** The tagline, project names, descriptions, and section headers in the reference are specific to that page. Invent your own that match the voice.17* **Do not reproduce the exact layout.** The reference uses hero → philosophy → work grid → contact → footer. You may use any structure that serves the content, including single-page narrative, masonry, split-screen, scroll-telling, or editorial flow.1819---2021## Voice2223The tone is editorial, warm, precise, and slightly literary. It borrows from independent magazines and architecture monographs. The studio writes like it designs: cut everything that doesn't do work.2425**Rules:**2627* One clear proposition, stated simply.28* Avoid marketing superlatives ("best", "leading", "award-winning"). Earn trust through restraint.29* Paragraphs are short. Three sentences is long.30* Section transitions are soft, not shouted. No "WELCOME TO THE FUTURE OF..." energy.31* The best sentence is the one you almost cut.3233---3435## Composition3637**Not a recipe, but tendencies:**3839* The hero is vertical, generous, and breathing. Headline is serif, large (clamp 3.5rem → 7rem+), split across 2-3 short lines. Subhead is sans-serif body copy under 600px wide.40* Sections are separated by generous vertical space (8rem padding minimum).41* Content alternates between tight (philosophy copy, hero body) and expansive (work cards, contact CTAs).42* No sidebars, no two-column body text. Two-column grids are for headline+caption pairings, not reading flow.43* Cards are correct only when the content is card-shaped: discrete projects, case studies, or modular collections. Otherwise flatten into typographic rhythm.4445**Refuse:**4647* Centered hero text as a reflex. Editorial left-align or off-balance alignments read as more considered.48* Pill-shaped tags, gradient badges, glowing CTAs. Those belong to SaaS, not ateliers.49* Icons as section headers. Use type or a single thin rule.50* Full-width image banners that trade craft for spectacle.5152---5354## Color5556The palette is a conversation between warm paper and quiet ink. It breathes across light and dark.5758**Commitment level: Whisper.** Near-neutral surfaces, one accent color doing the work. The accent appears sparingly — a single rule, a card tag, a hover state — and earns its presence.5960**CSS custom properties — define these on `:root` and `[data-theme="dark"]`:**6162```css63:root {64 --bg: #ffffff;65 --bg-warm: #f9f9f8;66 --ink: #1d1d1b;67 --ink-muted: #6b6b66;68 --border: #e5e5e2;69 --accent: #9a7348; /* vary this per project */70}7172[data-theme="dark"] {73 --bg: #0f0f0e;74 --bg-warm: #161615;75 --ink: #f5f5f0;76 --ink-muted: #8a8a85;77 --border: #2a2a28;78 --accent: #c9a87c;79}80```8182Always use these variables throughout — never hardcode hex values in the stylesheet. This makes dark mode and accent variation trivial.8384**Rules:**8586* The accent hue should sit in the warm-earth range: brass, ochre, clay, terracotta, muted olive, dusty rose. Never blue, purple, or cyan — those belong to other rooms.87* Never saturate the accent further. It is brass, not gold. Terracotta, not orange.88* Dark mode inverts contrast but preserves warmth. The dark accent shifts toward amber-gold.89* All `color` and `background-color` transitions are `0.3s ease`. Theme switches should feel like the page exhales, not snaps.90* Respect `prefers-contrast: more` — push `--ink` toward pure black/white and harden focus outlines.91* **Vary the accent hue between projects** by changing `--accent` on `:root`. Everything downstream updates automatically.9293---9495## Typography9697This is a two-font system. One serif for voice, one sans for everything else.9899**Serif:** `Instrument Serif` (Google Fonts, italic available). Used for headlines only — h1, h2, h3. Italic on h2 by taste. This is the studio's handwriting.100101**Sans:** `Inter` (Google Fonts, weights 300/400/500). Everything else: body, navigation, labels, buttons, form fields, footer.102103**Scale (serif headlines):**104105* h1: `clamp(3.5rem, 8vw, 7rem)` — hero headword106* h2: `clamp(2rem, 4vw, 3.5rem)` italic — section anchors107* h3: `1.25rem` or `1.5rem` — card titles, sub-heads108109**Sans rhythm:**110111* Body: `1.125rem`, line-height `1.7`, max-width `540px` for hero prose, wider for section body112* Nav: `0.875rem`, weight `500`, `letter-spacing: 0.02em`113* Labels/meta: `0.75rem`, `letter-spacing: 0.1em`, uppercase114* Card body: `0.9375rem`, `line-height: 1.6`115116**Rules:**117118* Headline letter-spacing is `-0.02em` — tight but not crushed.119* Body measure: 60-70 characters for reading prose, contained by max-width not column count.120* Never use more than two weights of Inter on one page. 300 + 500, or 400 alone, or 300 + 400.121* Load only the weights you use. No speculative loading.122* **Vary the serif between projects.** `Instrument Serif` can be swapped for `Playfair Display`, `Cormorant Garamond`, `Lora`, or `EB Garamond`. Keep the editorial character, change the personality.123* **Vary the sans between projects.** `Inter` can become `DM Sans`, `Work Sans`, `Source Sans 3`, or `system-ui`. The sans should feel neutral and invisible.124125---126127## Motion128129Motion in Atelier is slow, deliberate, and ambient. It suggests rather than declares.130131**Entrance:**132133* Hero headline and subtext fade in with a 1s `cubic-bezier(0.22, 1, 0.36, 1)` ease-out. Stagger by 150ms per element.134* Below-fold sections reveal on scroll via `IntersectionObserver`. Elements translate up 20px, opacity 0 → 1, over 0.8s with the same curve.135136**Ambient background:**137138Use one of these techniques for the hero background. Pick a different one per project. Simpler options are always acceptable — the atmosphere is the goal, not the technique.139140|Option|Technique|Complexity|Notes|141|-|-|-|-|142|A|CSS gradient with subtle keyframe shift|Low|Safest. Always works.|143|B|SVG filter + feTurbulence animation|Low-Medium|No WebGL needed.|144|C|2D Canvas Perlin/simplex noise|Medium|Reliable, self-contained.|145|D|WebGL FBM fragment shader|High|Only use if you can write correct GLSL. See guardrails below.|146147**WebGL guardrails (Option D only):**148149* Request context with `{ powerPreference: "low-power", antialias: false, alpha: false, preserveDrawingBuffer: false }`.150* Time uniform multiplier: `~0.06`. Mouse influence: subtle, not reactive.151* Pause the render loop via `IntersectionObserver` when the canvas is off-screen.152* If the context fails to initialize, fall back silently to Option A. Always write this fallback.153* Do not attempt reaction-diffusion or domain warping unless you are certain the GLSL is correct. Broken shaders are worse than no shader.154155**For all options:**156157* The background fades vertically into the next section's `--bg` or `--bg-warm` so it doesn't hard-stop.158* On `prefers-reduced-motion`: use a static gradient. No animation of any kind.159* On `prefers-contrast: more`: also use a static gradient.160161**Scroll indicator:**162163* A small animated element at the bottom of the hero — something unique per project. Label: "Explore" or "Scroll" in tiny uppercase tracking. This is the only decorative animation beyond the background.164165**Hover:**166167* Cards lift 2px (`translateY(-2px)`) with a soft shadow. No scale, no glowing borders, no overlays that slide.168* Card image placeholder gets a subtle gradient overlay on hover. Inner SVG scales to 1.05.169* Navigation links shift from `--ink-muted` to `--ink` on hover. `0.3s ease`.170171**Rules:**172173* Never use `ease-in-out`. Always `cubic-bezier(0.22, 1, 0.36, 1)` — decelerates gently.174* Never bounce, never elastic, never spring. This is not playful.175* Respect `prefers-reduced-motion` globally. Kill all animations, transitions, and background effects. All scroll-observed elements show immediately at full opacity.176177---178179## Interaction180181**Focus management:**182183* `:focus-visible` outline: `2px solid var(--accent)`, `outline-offset: 2px`. Never `outline: none` without a replacement.184* Mobile menu traps focus and closes on Escape.185186**Form behavior:**187188* Contact form simulates submission with a 900ms delay. On submit: disable fields, show "Sending…" in the button (`aria-disabled="true"`), then hide the form and show an inline success state with a checkmark.189* The success message receives programmatic focus (`tabIndex="-1"`, then `.focus()`) for screen readers.190* `role="status"` and `aria-live="polite"` on the success container.191192**Theme toggle:**193194* Icon swaps between sun and moon. Preference stored in `localStorage` under a consistent key (e.g., `atelier-theme`).195* On first visit with no stored preference, read `prefers-color-scheme`.196* Listen for OS theme changes via `matchMedia` and apply them only when no manual override exists.197* Apply theme via `data-theme` attribute on `<html>`, not a class, so CSS variables cascade cleanly.198199**Rules:**200201* Touch targets minimum 44×44px. Use padding to reach this if the visual element is smaller — never sacrifice layout for tap target size.202* Form labels are always visible. Placeholders are for format hints only, never substitute for labels.203204---205206## Navigation207208**Desktop:**209210* Fixed, transparent at page top. On scroll past 50px, gains `backdrop-filter: blur(12px)`, a `1px` bottom border in `--border`, and a subtle `box-shadow`.211* Logo: studio name in serif (h1 or strong element), left-aligned, links to `#top`.212* Nav links: right-aligned, Inter weight 500, small-caps tracking. Three to five links maximum.213214**Mobile (below 768px):**215216* Hamburger replaces nav links. Animate three lines → X on open (`transform` + `opacity`, no layout shift).217* Mobile menu: full-screen overlay, `position: fixed`, `z-index` above all content. Serif nav links at large scale, vertically centered.218* Lock body scroll when open (`overflow: hidden` on `<body>`). Restore on close or Escape.219220**Rules:**221222* One CTA button in the nav. Examples: "Start a Project", "Work With Us", "Get in Touch". Pick one; don't vary within a project.223* **Vary nav link names between projects.** The reference uses Philosophy / Work / Contact. You might use About / Services / Journal / Contact, or Work / Process / Studio / Contact.224225---226227## Layout sections (not a template)228229Use 3–5 of these in any order. Never repeat the same type twice. The page should feel curated, not exhaustive.230231* **Hero** — proposition, evidence, one action. Serif headline, sans body, generous vertical space, ambient background effect.232* **Philosophy / Manifesto** — headline + copy pairing, often two-column. A thin accent rule above the headline. The writing carries the section.233* **Work / Projects** — 2–6 cards in a grid. Each card: image placeholder (aspect-ratio 4/3), a tag in `--accent`, a title, a one-sentence description.234* **Services / Capabilities** — what the studio does, stated plainly. Three-column list or alternating text blocks.235* **Process** — numbered steps, each with a title and 1–2 sentences. Sparse by design: four steps maximum, no sub-steps, no connecting arrows. The numbers are typographic, not functional. Think printed manual, not app onboarding.236* **Journal / Writing** — if included, typographic-first. Cards only if articles are genuinely discrete and scannable.237* **Contact / CTA** — short, warm, centered or left-aligned. Headline, one sentence, a form or email link. Form fields: name, email, message — nothing else.238* **Footer** — copyright in `<time datetime="...">`, 2–4 social links with `aria-label`, no sitemap, no newsletter signup.239240**Footer rule:** the footer's background must differ from the section directly above it. Alternate between `--bg` and `--bg-warm` so the page closes on a distinct visual note.241242---243244## Performance guardrails245246This is a single HTML file. No build step, no framework, no dependencies beyond Google Fonts. Keep it that way.247248* **Fonts:** Load via `<link rel="preconnect" href="https://fonts.googleapis.com">` and the standard Google Fonts stylesheet. Use `font-display: swap`. Never block render on web fonts.249* **Images:** All image placeholders are inline SVG or CSS — no external image requests.250* **JS:** No external scripts. All behavior is self-contained in a single `<script>` block at the end of `<body>`.251* **Scroll/resize handlers:** Throttle via `requestAnimationFrame`. Mouse move uses a dirty flag updated on `mousemove`, consumed on the next frame — not per-frame recalculation.252* **Section performance:** Below-fold sections get `content-visibility: auto` with a reasonable `contain-intrinsic-size`. Cards use `contain: layout style paint`.253* **File size target:** Under 25KB uncompressed (excluding fonts, which are external). If you're over, remove something — don't compress the philosophy.254* **Privacy:** No analytics, no tracking, no third-party scripts beyond Google Fonts. The restraint extends to the network.255256---257258## Print stylesheet259260Include a `@media print` block that:261262* Hides: nav, background effect, scroll indicator, mobile menu, social links, theme toggle.263* Sets sections to `break-inside: avoid`.264* Removes all animations and transitions.265* Forces `--ink` to black, `--bg` to white.266267---268269## Accessibility checklist270271Every output must satisfy all of these before it is complete.272273**Structure:**274- Landmark roles: `role="navigation"`, `role="main"`, `role="contentinfo"` on footer275- Sections have `aria-labelledby` pointing to their h2276- Heading hierarchy is sequential (h1 → h2 → h3, no skips)277278**Interactive elements:**279280- All buttons have `type` attribute (`type="button"` or `type="submit"`)281- `aria-label` on icon-only buttons (hamburger, theme toggle, social links)282- `:focus-visible` outline on all interactive elements283- Touch targets ≥ 44×44px284285**Mobile menu:**286287- `role="dialog"` and `aria-modal="true"` on overlay288- Focus trapped inside when open289- Closes on Escape290- `aria-expanded` on hamburger button reflects state291292**Form:**293294- Labels always visible, associated via `for`/`id`295- `aria-required="true"` on required fields296- Success state: `role="status"`, `aria-live="polite"`, receives focus programmatically297298**Decorative elements:**299300- `aria-hidden="true"` on background canvas/SVG and decorative SVGs301- Meaningful images (if any) have descriptive `alt` text302303**Motion and contrast:**304305- `prefers-reduced-motion`: all animations off, background effect replaced with static gradient, scroll-observed elements visible immediately306- `prefers-contrast: more`: hardened outlines, `--ink` pushed toward pure black/white307308---309310## What to vary between projects311312These are the levers. Pull them differently each time:313314* Serif font family (from the approved list or similar editorial serif)315* Sans font family (from the approved list or `system-ui`)316* Accent hue: change `--accent` on `:root` — warm-earth range only317* Number and names of nav links (3–5)318* Number, order, and types of sections (3–5, never repeat a type)319* Hero headline copy (2–3 lines, always editorial in voice)320* Philosophy/manifesto copy321* Project names, tags, and descriptions322* Contact CTA text and form field labels323* Background effect technique (Options A–D from the motion table)324* Card count (2–6)325* Whether to include a Journal or Process section326* Footer background (`--bg` or `--bg-warm`, must differ from the section above)327328## What to never vary329330* The restraint. Nothing should feel decorative.331* The color commitment level. Whisper, always.332* The editorial voice. Warm, precise, unsentimental.333* The two-font system. One serif, one sans.334* The motion character. Slow, ambient, deliberate.335* The performance model. Single HTML file, no framework, no bloat.336* The accessibility baseline. Every item in the checklist.337* The CSS variable system. Always `var(--token)`, never hardcoded hex.338