Files
hallmark/site/css/components.css
T
YoussefandClaude Opus 4.7 2379a5ca78 Section 03 + easter egg fixes — slop panel theme-adapts · easter actually fires
- Section 03 "Without Hallmark" panel no longer hardcodes #fff bg; uses var(--color-paper) so Manifesto / Midnight / Terminal / Brutal don't show a jarring white box mid-page (the AI-slop tells are still carried by the gradient title, Inter, centred layout, pill CTA)
- Removed four dead per-theme .vs__col:first-child colour overrides (Manifesto / Sport / Brutal / Terminal) — they were painting the old CSS-mockup column, now clashing with the panel-based demo
- Easter egg fix: previous version showed for one frame and was dismissed by the next autorepeat keydown. Now swallows every key while open, auto-dismisses after 4.2s with a fade-out, threshold lowered to 12 so it triggers reliably
- Easter visual: solid #fff, system mono, #111 text, dark cursor — decoupled from theme so it reads as "the page steps in" not "another theme"
- Random punchline picked from 6 lines ("chill, designer.", "sixteen is plenty.", etc.)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-01 17:39:21 +01:00

2791 lines
71 KiB
CSS

/* Hallmark — components */
/* — Wordmark ——————————————————————————————————————— */
.wordmark {
font-family: var(--font-label);
font-weight: 500;
font-size: var(--text-sm);
letter-spacing: 0.22em;
text-transform: uppercase;
color: var(--color-ink);
}
[data-theme="manifesto"] .wordmark {
font-family: var(--font-display);
font-weight: 800;
letter-spacing: -0.02em;
text-transform: uppercase;
font-size: var(--text-md);
}
[data-theme="terminal"] .wordmark::before {
content: "$ ";
color: var(--color-accent);
}
/* — Banner (sticky top, thin, theme picker inline) ————————— */
.banner {
position: sticky;
top: 0;
z-index: var(--z-sticky);
display: flex;
align-items: center;
gap: var(--space-lg);
padding: 0 var(--page-gutter);
height: 44px;
background: color-mix(in oklch, var(--color-paper) 88%, transparent);
backdrop-filter: blur(14px) saturate(1.2);
-webkit-backdrop-filter: blur(14px) saturate(1.2);
border-block-end: var(--rule-hair) solid var(--color-rule);
font-family: var(--font-label);
font-size: 0.6875rem;
letter-spacing: var(--tracking-label);
text-transform: uppercase;
color: var(--color-ink);
}
/* Spacer pushes the picker + theme-name to the right */
.banner__spacer {
flex: 1 1 auto;
min-width: 0;
}
.banner__mark {
display: inline-flex;
align-items: baseline;
gap: 0.55rem;
text-decoration: none;
color: var(--color-ink);
}
.banner__name {
font-weight: 500;
letter-spacing: 0.22em;
}
.banner__ver {
font-size: 0.625rem;
color: var(--color-muted);
letter-spacing: 0.14em;
}
/* The active theme name — sits to the LEFT of the theme picker so the
page restructure registers as a deliberate event, not a passive repaint.
Smaller text + closer to the picker on desktop; hidden on narrow viewports. */
.banner__center {
font-family: var(--font-display);
font-weight: var(--display-weight, 500);
font-style: var(--display-style, normal);
font-size: 0.95rem;
letter-spacing: -0.005em;
text-transform: none;
color: var(--color-ink);
font-optical-sizing: auto;
transition: opacity var(--dur-short) var(--ease-out);
white-space: nowrap;
margin-inline-end: var(--space-xs);
}
[data-theme="manifesto"] .banner__center,
[data-theme="brutal"] .banner__center,
[data-theme="sport"] .banner__center {
text-transform: uppercase;
letter-spacing: -0.01em;
}
[data-theme="terminal"] .banner__center::before {
content: "$ ";
color: var(--color-accent);
}
[data-theme="terminal"] .banner__center {
font-family: var(--font-mono);
}
.banner__picker {
display: inline-flex;
align-items: center;
gap: 0.4rem;
}
.banner__dot {
appearance: none;
width: 16px;
height: 16px;
padding: 0;
background: var(--dot, var(--color-paper));
border: 1px solid var(--color-rule-2);
border-radius: 4px;
cursor: pointer;
position: relative;
transition: transform 100ms var(--ease-out),
border-color var(--dur-micro) var(--ease-out),
box-shadow var(--dur-micro) var(--ease-out);
}
.banner__dot::after {
content: "";
position: absolute;
inset: 3px;
background: var(--dot-edge, transparent);
border-radius: 2px;
opacity: 0.85;
}
@media (hover: hover) and (pointer: fine) {
.banner__dot:hover {
transform: translateY(-1px);
border-color: var(--color-ink);
}
}
.banner__dot:focus-visible {
outline: 2px solid var(--color-focus);
outline-offset: 2px;
}
.banner__dot[aria-pressed="true"] {
border-color: var(--color-ink);
box-shadow: 0 0 0 2px var(--color-paper), 0 0 0 3px var(--color-ink);
}
.banner__sep {
width: 1px;
height: 14px;
background: var(--color-rule);
margin-inline: 0.25rem;
}
/* Combined shuffle button: icon + T kbd hint inside a single pill.
Click randomises; the T inside reads as a keyboard hint, not a separate
pill. Replaces the old .banner__random + .banner__kbd combo. */
.banner__shuffle {
appearance: none;
display: inline-flex;
align-items: center;
justify-content: center;
gap: 0.4rem;
height: 26px;
padding: 0 0.6rem 0 0.55rem;
background: transparent;
border: 1px solid var(--color-rule);
border-radius: var(--radius-pill, 999px);
color: var(--color-muted);
cursor: pointer;
font-family: var(--font-label);
font-size: 0.625rem;
letter-spacing: 0.08em;
text-transform: uppercase;
transition: color var(--dur-micro) var(--ease-out),
border-color var(--dur-micro) var(--ease-out),
background var(--dur-micro) var(--ease-out),
transform 80ms var(--ease-out);
}
.banner__shuffle svg {
flex-shrink: 0;
display: block;
}
.banner__shuffle-key {
display: inline-block;
font-weight: 500;
letter-spacing: 0.04em;
color: var(--color-muted);
padding-inline-start: 0.4rem;
border-inline-start: 1px solid var(--color-rule);
margin-inline-start: 0.05rem;
height: 14px;
line-height: 14px;
}
@media (hover: hover) and (pointer: fine) {
.banner__shuffle:hover {
color: var(--color-ink);
border-color: var(--color-ink);
}
.banner__shuffle:hover .banner__shuffle-key {
color: var(--color-ink);
border-color: var(--color-ink);
}
.banner__shuffle:hover svg {
transform: rotate(15deg);
transition: transform 200ms var(--ease-out);
}
}
.banner__shuffle:active {
transform: scale(0.96);
transition-duration: 60ms;
}
.banner__shuffle:focus-visible {
outline: 2px solid var(--color-focus);
outline-offset: 2px;
}
@media (max-width: 60rem) {
.banner { gap: var(--space-md); }
.banner__center { font-size: 0.825rem; }
}
@media (max-width: 50rem) {
.banner__picker { gap: 0.28rem; }
.banner__dot { width: 14px; height: 14px; }
.banner__sep { display: none; }
}
/* Below 44rem: hide the dot grid (would overflow); keep mark + theme name + shuffle */
@media (max-width: 44rem) {
.banner__ver { display: none; }
.banner__picker { display: none; }
.banner__shuffle-key { display: none; }
.banner__shuffle { padding: 0 0.5rem; height: 24px; }
}
/* Below 26rem (very small phones): hide center label too — pure click-to-shuffle */
@media (max-width: 26rem) {
.banner__center { display: none; }
}
/* — Section label (01 / FOUNDATIONS) —————————————————— */
.section-label {
font-family: var(--font-label);
font-size: var(--text-xs);
font-weight: 400;
letter-spacing: var(--tracking-label);
text-transform: uppercase;
color: var(--color-muted);
display: flex;
align-items: baseline;
gap: var(--space-sm);
}
.section-label .num { color: var(--color-ink); font-weight: 500; }
.section-label .divider { color: var(--color-rule-2); font-weight: 300; }
[data-theme="terminal"] .section-label::before {
content: "> ";
color: var(--color-accent);
}
[data-theme="manifesto"] .section-label .num {
color: var(--color-accent);
font-family: var(--font-display);
font-weight: 800;
font-size: var(--text-md);
}
[data-theme="sport"] .section-label .num {
color: var(--color-accent);
font-weight: 700;
font-family: var(--font-display);
font-size: var(--text-md);
font-style: italic;
}
[data-theme="almanac"] .section-label {
font-family: var(--font-mono);
}
/* — Button (outlined default) ————————————————————————— */
.btn {
display: inline-flex;
align-items: center;
gap: var(--space-sm);
padding: var(--space-sm) var(--space-lg);
font-family: var(--font-label);
font-size: var(--text-sm);
font-weight: 500;
letter-spacing: 0.04em;
color: var(--color-ink);
background: transparent;
border: var(--rule-fine) solid var(--color-ink);
border-radius: var(--radius-pill, 0);
min-height: 44px;
/* explicit properties — never `transition: all` */
transition: transform 100ms var(--ease-out),
background-color var(--dur-micro) var(--ease-out),
color var(--dur-micro) var(--ease-out),
border-color var(--dur-micro) var(--ease-out);
cursor: pointer;
}
@media (hover: hover) and (pointer: fine) {
.btn:hover {
background: var(--color-ink);
color: var(--color-paper);
transform: translateY(-1px);
}
}
.btn:active { transform: translateY(1px); transition-duration: 60ms; }
/* — Inline link ————————————————————————————————————— */
.link {
color: var(--color-ink);
text-decoration: none;
background-image: linear-gradient(var(--color-accent), var(--color-accent));
background-repeat: no-repeat;
background-position: 0 100%;
background-size: 100% 1px;
padding-bottom: 0.08em;
transition: background-size var(--dur-short) var(--ease-out);
}
@media (hover: hover) and (pointer: fine) {
.link:hover { background-size: 100% 2px; }
}
[data-theme="terminal"] .link {
background: none;
text-decoration: underline;
text-underline-offset: 2px;
}
/* — Code block ——————————————————————————————————————— */
.code {
font-family: var(--font-mono);
font-size: var(--text-sm);
font-weight: 400;
color: var(--color-ink);
background: var(--color-paper-2);
border: var(--rule-hair) solid var(--color-rule);
border-radius: var(--radius-input, 0);
padding: var(--space-md) var(--space-lg);
overflow-x: auto;
white-space: nowrap;
line-height: 1.7;
display: flex;
align-items: center;
gap: var(--space-md);
position: relative;
box-shadow: var(--shadow-card, none);
}
.code .prompt { color: var(--color-muted); user-select: none; }
.code--block { white-space: pre; display: block; }
/* — Copy-to-clipboard button (silent success pattern) ————— */
.code__copy {
position: absolute;
top: 50%;
right: var(--space-sm);
transform: translateY(-50%);
font-family: var(--font-label);
font-size: 0.6875rem;
letter-spacing: 0.14em;
text-transform: uppercase;
color: var(--color-muted);
background: var(--color-paper);
border: var(--rule-hair) solid var(--color-rule);
border-radius: var(--radius-input, 0);
padding: 0.35rem 0.65rem;
cursor: pointer;
opacity: 0;
transition: opacity var(--dur-short) var(--ease-out),
color var(--dur-short) var(--ease-out),
border-color var(--dur-short) var(--ease-out);
min-height: 28px;
display: inline-flex;
align-items: center;
gap: 0.4rem;
}
.code:hover .code__copy,
.code:focus-within .code__copy,
.code__copy:focus-visible {
opacity: 1;
}
@media (pointer: coarse) {
.code__copy { opacity: 1; }
}
.code__copy:hover { color: var(--color-ink); border-color: var(--color-rule-2); }
.code__copy[data-state="copied"] {
color: var(--color-accent);
border-color: var(--color-accent);
opacity: 1;
}
.code__copy-default { display: inline; }
.code__copy-done { display: none; }
.code__copy[data-state="copied"] .code__copy-default { display: none; }
.code__copy[data-state="copied"] .code__copy-done { display: inline; }
[data-theme="terminal"] .code__copy {
background: var(--color-paper-2);
border-color: var(--color-rule);
}
[data-theme="manifesto"] .code__copy {
background: var(--color-paper);
color: var(--color-paper);
border-color: var(--color-paper);
font-weight: 500;
}
[data-theme="manifesto"] .code__copy:hover {
color: var(--color-paper);
background: var(--color-accent);
border-color: var(--color-accent);
}
[data-theme="terminal"] .code {
background: var(--color-paper-3);
border-color: var(--color-rule-2);
}
[data-theme="manifesto"] .code {
background: var(--color-ink);
color: var(--color-paper);
border-color: var(--color-ink);
}
[data-theme="manifesto"] .code .prompt { color: var(--color-accent); }
/* — Specimen card ——————————————————————————————————— */
.spec {
display: flex;
flex-direction: column;
gap: var(--space-lg);
padding: var(--space-xl) 0;
border-top: var(--rule-hair) solid var(--color-rule);
}
.spec__head {
display: flex;
align-items: baseline;
justify-content: space-between;
gap: var(--space-md);
}
.spec__name {
font-family: var(--font-display);
font-weight: var(--display-weight, 400);
font-style: var(--display-style, normal);
font-size: var(--text-xl);
letter-spacing: var(--tracking-tight);
color: var(--color-ink);
line-height: 1;
font-optical-sizing: auto;
}
.spec__num {
font-family: var(--font-label);
font-size: var(--text-xs);
color: var(--color-muted);
letter-spacing: var(--tracking-label);
}
.spec__rule {
font-family: var(--font-serif);
font-weight: 400;
font-size: var(--text-md);
line-height: var(--lh-snug);
color: var(--color-ink-2);
font-style: italic;
max-width: 40ch;
}
[data-theme="brutal"] .spec__rule,
[data-theme="manifesto"] .spec__rule,
[data-theme="terminal"] .spec__rule,
[data-theme="sport"] .spec__rule,
[data-theme="almanac"] .spec__rule {
font-style: normal;
font-family: var(--font-body);
font-weight: 500;
}
[data-theme="manifesto"] .spec__name { text-transform: uppercase; }
.spec__body { margin-top: var(--space-xs); }
/* — Swatches ——————————————————————————————————————— */
.swatch-row {
display: grid;
grid-template-columns: repeat(5, 1fr);
gap: var(--space-2xs);
height: 3rem;
}
.swatch {
display: flex;
align-items: flex-end;
padding: var(--space-2xs) var(--space-xs);
font-family: var(--font-label);
font-size: 0.625rem;
letter-spacing: 0.08em;
color: var(--color-paper);
text-transform: uppercase;
}
.swatch--light { color: var(--color-ink); }
/* — Type specimen ——————————————————————————————————— */
.type-spec { display: grid; gap: var(--space-xs); }
.type-spec__display {
font-family: var(--font-display);
font-size: var(--text-2xl);
font-weight: var(--display-weight, 400);
font-style: var(--display-style, normal);
line-height: var(--lh-tight);
letter-spacing: var(--tracking-display);
font-optical-sizing: auto;
}
.type-spec__body {
font-family: var(--font-serif);
font-style: italic;
font-size: var(--text-md);
line-height: var(--lh-normal);
color: var(--color-ink-2);
max-width: 32ch;
}
[data-theme="brutal"] .type-spec__body,
[data-theme="manifesto"] .type-spec__body,
[data-theme="terminal"] .type-spec__body,
[data-theme="sport"] .type-spec__body,
[data-theme="almanac"] .type-spec__body {
font-style: normal;
font-family: var(--font-body);
}
/* — Easing curve SVG ——————————————————————————————— */
.curve {
width: 100%;
height: 4.5rem;
color: var(--color-ink);
}
/* — Without / With panels (parity demo) —————————————————
Both panels render the same eyebrow + H1 + sub + CTA structure.
The `data-variant` attribute drives every visual difference. */
.vs__panel {
display: grid;
gap: 0.75rem;
padding: var(--space-xl);
min-height: 16rem;
background: var(--color-paper);
border: var(--rule-hair) solid var(--color-rule-2);
align-content: start;
}
.vs__panel-eyebrow {
font-size: 0.75rem;
margin: 0;
}
.vs__panel-title {
margin: 0;
font-size: 2rem;
line-height: 1.05;
}
.vs__panel-sub {
margin: 0;
font-size: 0.875rem;
line-height: 1.45;
}
.vs__panel-cta {
display: inline-flex;
align-items: center;
justify-self: start;
margin-top: 0.5rem;
font-size: 0.875rem;
}
/* — "Without Hallmark" — the slop stack —————————————————
The bg uses theme paper so the panel integrates on dark themes
(otherwise a pure-white card looks like a glitch on Manifesto /
Midnight / Terminal). The AI-slop tells are still carried by the
centred layout, Inter font, gradient title, and gradient pill. */
.vs__panel[data-variant="slop"] {
text-align: center;
align-content: center;
justify-items: center;
background: var(--color-paper);
border-color: var(--color-rule);
font-family: "Inter", system-ui, sans-serif;
}
.vs__panel[data-variant="slop"] .vs__panel-eyebrow {
color: var(--color-muted);
font-family: inherit;
font-weight: 500;
letter-spacing: 0;
text-transform: none;
}
.vs__panel[data-variant="slop"] .vs__panel-title {
font-family: inherit;
font-weight: 800;
letter-spacing: -0.025em;
background: linear-gradient(95deg, #8b5dff 0%, #c14de0 50%, #e04db4 100%);
-webkit-background-clip: text;
background-clip: text;
color: transparent;
max-width: 14ch;
}
.vs__panel[data-variant="slop"] .vs__panel-sub {
color: var(--color-muted);
font-family: inherit;
max-width: 28ch;
}
.vs__panel[data-variant="slop"] .vs__panel-cta {
justify-self: center;
padding: 0.55rem 1.4rem;
background: linear-gradient(95deg, #6366f1, #a855f7);
color: #fff;
border-radius: 9999px;
font-weight: 600;
letter-spacing: 0;
}
/* — "With Hallmark" — the considered version ————————————— */
.vs__panel[data-variant="hallmark"] {
text-align: left;
background: var(--color-paper);
border-color: var(--color-rule-2);
border-left: 2px solid var(--color-accent);
padding-left: calc(var(--space-xl) - 2px);
}
.vs__panel[data-variant="hallmark"] .vs__panel-eyebrow {
display: inline-flex;
align-items: center;
gap: 0.55em;
color: var(--color-muted);
font-family: var(--font-label);
font-size: var(--text-xs);
letter-spacing: var(--tracking-label);
text-transform: uppercase;
font-weight: 400;
}
.vs__panel[data-variant="hallmark"] .vs__panel-mark {
width: 6px;
height: 6px;
background: var(--color-accent);
display: inline-block;
}
.vs__panel[data-variant="hallmark"] .vs__panel-title {
font-family: var(--font-display);
font-weight: var(--display-weight, 400);
font-style: var(--display-style, normal);
letter-spacing: -0.02em;
color: var(--color-ink);
max-width: 14ch;
font-optical-sizing: auto;
}
.vs__panel[data-variant="hallmark"] .vs__panel-title em {
font-family: var(--font-serif);
font-style: italic;
font-weight: 400;
color: var(--color-ink);
}
.vs__panel[data-variant="hallmark"] .vs__panel-sub {
font-family: var(--font-body);
color: var(--color-ink-2);
max-width: 32ch;
}
.vs__panel[data-variant="hallmark"] .vs__panel-cta {
margin-top: var(--space-sm);
padding: 0.55rem 1.1rem;
background: var(--color-ink);
color: var(--color-paper);
font-family: var(--font-label);
font-size: var(--text-xs);
letter-spacing: var(--tracking-label);
text-transform: uppercase;
border-radius: 0;
}
/* — Install pane internals ——————————————————————————— */
/* Row label — "I · Run" */
.install-pane__label {
margin: 0;
font-family: var(--font-label);
font-size: var(--text-xs);
letter-spacing: var(--tracking-label);
text-transform: uppercase;
color: var(--color-muted);
display: flex;
align-items: baseline;
gap: 0.5rem;
}
.install-pane__step {
font-family: var(--font-display);
font-style: var(--display-style, normal);
font-weight: var(--display-weight, 500);
font-size: var(--text-md);
letter-spacing: 0.04em;
color: var(--color-ink);
font-optical-sizing: auto;
}
[data-theme="riso"] .install-pane__step,
[data-theme="brutal"] .install-pane__step,
[data-theme="manifesto"] .install-pane__step,
[data-theme="sport"] .install-pane__step {
text-transform: uppercase;
}
[data-theme="riso"] .install-pane__step { text-transform: lowercase; }
/* Row I — the install command, presented prominently */
.install-pane__cmd {
display: flex;
align-items: center;
gap: var(--space-md);
padding: var(--space-md) var(--space-lg);
background: var(--color-paper-2);
border: var(--rule-hair) solid var(--color-rule);
border-radius: var(--radius-input, 0);
font-family: var(--font-mono);
font-size: clamp(1rem, 1.6vw, 1.25rem);
color: var(--color-ink);
line-height: 1.5;
position: relative;
min-height: 56px;
transition: border-color var(--dur-micro) var(--ease-out);
}
@media (hover: hover) and (pointer: fine) {
.install-pane__cmd:hover { border-color: var(--color-ink); }
}
.install-pane__prompt {
color: var(--color-accent);
user-select: none;
flex-shrink: 0;
font-weight: 500;
}
.install-pane__cmd-text {
flex: 1;
font-weight: 400;
letter-spacing: 0;
user-select: all;
cursor: text;
}
.install-pane__copy {
flex-shrink: 0;
appearance: none;
display: inline-flex;
align-items: center;
justify-content: center;
min-height: 36px;
padding: 0.4rem 0.85rem;
background: var(--color-paper);
border: var(--rule-hair) solid var(--color-rule);
font-family: var(--font-label);
font-size: 0.6875rem;
letter-spacing: 0.14em;
text-transform: uppercase;
color: var(--color-muted);
cursor: pointer;
transition: color var(--dur-short) var(--ease-out),
border-color var(--dur-short) var(--ease-out),
background-color var(--dur-short) var(--ease-out);
}
.install-pane__copy:hover {
color: var(--color-ink);
border-color: var(--color-ink);
}
.install-pane__copy:focus-visible {
outline: 2px solid var(--color-focus);
outline-offset: 2px;
}
.install-pane__copy[data-state="copied"] {
color: var(--color-paper);
background: var(--color-accent);
border-color: var(--color-accent);
}
.install-pane__copy-default { display: inline; }
.install-pane__copy-done { display: none; }
.install-pane__copy[data-state="copied"] .install-pane__copy-default { display: none; }
.install-pane__copy[data-state="copied"] .install-pane__copy-done { display: inline; }
[data-theme="terminal"] .install-pane__cmd {
background: var(--color-paper-3);
border-color: var(--color-rule-2);
}
[data-theme="manifesto"] .install-pane__cmd {
background: var(--color-ink);
color: var(--color-paper);
border-color: var(--color-ink);
}
[data-theme="manifesto"] .install-pane__prompt { color: var(--color-accent); }
[data-theme="manifesto"] .install-pane__copy {
background: var(--color-accent);
color: var(--color-paper);
border-color: var(--color-accent);
font-weight: 500;
}
/* Row II — harness list */
.install-pane__harnesses {
list-style: none;
margin: 0;
padding: 0;
display: grid;
gap: var(--space-md);
}
.harness {
display: grid;
grid-template-columns: 11rem 1fr auto;
gap: var(--space-md) var(--space-lg);
align-items: baseline;
padding-block: var(--space-sm);
border-block-end: var(--rule-hair) solid var(--color-rule);
}
.harness:last-child { border-block-end: 0; }
@media (max-width: 38rem) {
.harness {
grid-template-columns: 1fr;
gap: 0.25rem;
padding-block: var(--space-md);
}
}
.harness__name {
font-family: var(--font-display);
font-weight: var(--display-weight, 500);
font-style: var(--display-style, normal);
font-size: var(--text-md);
letter-spacing: var(--tracking-tight);
color: var(--color-ink);
font-optical-sizing: auto;
}
[data-theme="riso"] .harness__name,
[data-theme="brutal"] .harness__name,
[data-theme="manifesto"] .harness__name,
[data-theme="sport"] .harness__name { text-transform: uppercase; }
[data-theme="riso"] .harness__name { text-transform: lowercase; }
.harness__path {
font-family: var(--font-mono);
font-size: var(--text-sm);
color: var(--color-ink-2);
background: transparent;
border: 0;
padding: 0;
letter-spacing: 0;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.harness__status {
font-family: var(--font-label);
font-size: var(--text-xs);
letter-spacing: var(--tracking-label);
text-transform: uppercase;
color: var(--color-muted);
display: inline-flex;
align-items: center;
gap: 0.4em;
}
.harness__status--ok { color: var(--color-accent); }
.harness__status--ok::before {
content: "";
display: inline-block;
width: 6px;
height: 6px;
background: var(--color-accent);
border-radius: 50%;
}
/* Row III — the next step */
.install-pane__next {
margin: 0;
font-family: var(--font-serif);
font-style: italic;
font-size: var(--text-md);
line-height: var(--lh-normal);
color: var(--color-ink-2);
max-width: 56ch;
}
.install-pane__next code {
font-family: var(--font-mono);
font-style: normal;
font-size: 0.875em;
color: var(--color-ink);
background: var(--color-paper-2);
padding: 0.05em 0.35em;
border: var(--rule-hair) solid var(--color-rule);
}
[data-theme="brutal"] .install-pane__next,
[data-theme="manifesto"] .install-pane__next,
[data-theme="terminal"] .install-pane__next,
[data-theme="sport"] .install-pane__next,
[data-theme="almanac"] .install-pane__next {
font-family: var(--font-body);
font-style: normal;
}
[data-theme="manifesto"] .install-pane__next { text-transform: uppercase; font-weight: 500; }
/* — Per-theme install-pane overrides ———————————————————— */
[data-theme="terminal"] .install-pane {
background: var(--color-paper-2);
}
[data-theme="brutal"] .install-pane,
[data-theme="manifesto"] .install-pane {
border-width: 2px;
}
[data-theme="atelier"] .install-pane,
[data-theme="salon"] .install-pane {
border: 0;
background: transparent;
box-shadow: none;
}
[data-theme="atelier"] .install-pane__row,
[data-theme="salon"] .install-pane__row {
padding-inline: 0;
}
[data-theme="atelier"] .install-pane__row + .install-pane__row,
[data-theme="salon"] .install-pane__row + .install-pane__row {
border-block-start: var(--rule-hair) solid var(--color-rule);
}
/* — Easter egg overlay ——————————————————————————————————
Hidden by default. Revealed when the user spams T faster than the
site can keep up — see js/main.js. Pure white full-screen, system
mono font, dark text — deliberately decoupled from the active
theme so it reads as the page itself stepping in. Auto-dismisses
after ~4.2s; while it's open, all keystrokes are swallowed. */
.easter {
position: fixed;
inset: 0;
z-index: 9999;
display: grid;
place-items: center;
padding: var(--space-xl);
background: #fff;
color: #111;
font-family: ui-monospace, "SF Mono", SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
font-size: 0.95rem;
line-height: 1.65;
animation: easter-fade-in 240ms ease-out both;
}
.easter[hidden] { display: none; }
.easter[data-state="closing"] {
animation: easter-fade-out 360ms ease-in forwards;
}
@keyframes easter-fade-in {
from { opacity: 0; }
to { opacity: 1; }
}
@keyframes easter-fade-out {
from { opacity: 1; }
to { opacity: 0; }
}
.easter__panel {
display: grid;
gap: 1.4rem;
max-width: 38rem;
width: 100%;
}
.easter__lines {
list-style: none;
margin: 0;
padding: 0;
display: grid;
gap: 0.45rem;
}
.easter__line {
margin: 0;
opacity: 0;
transform: translateY(6px);
animation: easter-line 360ms ease-out forwards;
}
.easter__line:nth-child(1) { animation-delay: 180ms; }
.easter__line:nth-child(2) { animation-delay: 380ms; }
.easter__line:nth-child(3) { animation-delay: 560ms; }
.easter__line:nth-child(4) { animation-delay: 720ms; }
.easter__line:nth-child(5) { animation-delay: 1000ms; }
@keyframes easter-line {
to { opacity: 1; transform: none; }
}
.easter__line--cmd {
font-size: 1rem;
font-weight: 500;
color: #111;
margin-block-end: 0.6rem;
letter-spacing: 0;
}
.easter__prompt,
.easter__arrow {
color: #b0b0b0;
user-select: none;
margin-inline-end: 0.5rem;
}
.easter__num {
color: #111;
font-weight: 600;
font-feature-settings: "tnum";
font-variant-numeric: tabular-nums;
}
.easter__line--punchline {
margin-block-start: 0.8rem;
font-size: clamp(1.75rem, 4.5vw, 2.5rem);
line-height: 1.1;
letter-spacing: -0.02em;
font-weight: 500;
color: #111;
}
.easter__line--punchline .easter__arrow {
font-size: 0.9rem;
vertical-align: 0.25em;
font-weight: 400;
}
.easter__cursor {
display: inline-block;
width: 0.42em;
height: 0.95em;
background: #111;
margin-inline-start: 0.18em;
vertical-align: -0.08em;
opacity: 0;
animation: easter-blink 1.05s steps(2) infinite;
animation-delay: 1.4s;
}
@keyframes easter-blink {
0%, 49% { opacity: 1; }
50%, 100% { opacity: 0; }
}
.easter__hint {
margin: 0;
padding-block-start: 1.2rem;
border-block-start: 1px solid #e5e5e5;
font-size: 0.7rem;
letter-spacing: 0.14em;
text-transform: uppercase;
color: #888;
display: flex;
flex-wrap: wrap;
gap: 0.6rem;
align-items: center;
}
@media (prefers-reduced-motion: reduce) {
.easter,
.easter[data-state="closing"],
.easter__line { animation: none; }
.easter__line { opacity: 1; transform: none; }
.easter__cursor { animation: none; opacity: 1; }
}
/* — Reveals ————————————————————————————————————————— */
.reveal {
opacity: 0;
transform: translateY(10px);
}
.reveal.is-in {
animation: reveal var(--dur-long) var(--ease-out) forwards;
animation-delay: calc(var(--i, 0) * 60ms);
}
@keyframes reveal { to { opacity: 1; transform: none; } }
/* Theme-specific reveal patterns */
[data-theme="brutal"] .reveal,
[data-theme="manifesto"] .reveal,
[data-theme="sport"] .reveal {
transform: translateX(-16px);
}
@keyframes reveal-sweep { to { opacity: 1; transform: none; } }
[data-theme="brutal"] .reveal.is-in,
[data-theme="manifesto"] .reveal.is-in,
[data-theme="sport"] .reveal.is-in {
animation: reveal-sweep var(--dur-long) var(--ease-out) forwards;
animation-delay: calc(var(--i, 0) * 60ms);
}
[data-theme="atelier"] .reveal,
[data-theme="salon"] .reveal,
[data-theme="newsprint"] .reveal {
transform: none; /* no spatial reveal — fade only */
}
[data-theme="atelier"] .reveal.is-in,
[data-theme="salon"] .reveal.is-in,
[data-theme="newsprint"] .reveal.is-in {
animation: reveal-fade calc(var(--dur-long) * 1.4) var(--ease-out) forwards;
animation-delay: calc(var(--i, 0) * 80ms);
}
@keyframes reveal-fade { to { opacity: 1; } }
[data-theme="terminal"] .reveal,
[data-theme="terminal"] .reveal.is-in {
transform: none;
opacity: 1;
animation: none;
}
@media (prefers-reduced-motion: reduce) {
.reveal { transform: none; animation-duration: 150ms !important; }
@keyframes reveal { to { opacity: 1; } }
*, *::before, *::after {
animation-duration: 150ms !important;
transition-duration: 150ms !important;
}
}
/* — View transitions ————————————————————————————————— */
::view-transition-old(root),
::view-transition-new(root) {
animation-duration: 280ms;
animation-timing-function: var(--ease-out);
}
/* ───────────── STUDIO — Fraunces italic display ───────────── */
[data-theme="studio"] .hero__display,
[data-theme="studio"] .section__title,
[data-theme="studio"] .foot__wordmark,
[data-theme="studio"] .hero__quote p,
[data-theme="studio"] .hero__salutation,
[data-theme="studio"] .spec__name,
[data-theme="studio"] .tell__name {
font-style: italic;
letter-spacing: -0.02em;
font-variation-settings: "opsz" 144, "SOFT" 30;
}
[data-theme="studio"] .banner__center {
font-style: italic;
letter-spacing: 0;
font-variation-settings: "opsz" 24;
}
[data-theme="studio"] .hero__lede,
[data-theme="studio"] .hero__letter-body,
[data-theme="studio"] .spec__rule,
[data-theme="studio"] .tell__why,
[data-theme="studio"] .hero__attrib,
[data-theme="studio"] .foot__tagline {
font-family: var(--font-body);
font-style: normal;
}
[data-theme="studio"] .hero__eyebrow,
[data-theme="studio"] .label,
[data-theme="studio"] .section-label {
font-feature-settings: "ss01";
}
/* ───────────── PASTEL — Geist sans display, soft surfaces ───────────── */
[data-theme="pastel"] .hero__display,
[data-theme="pastel"] .section__title,
[data-theme="pastel"] .foot__wordmark,
[data-theme="pastel"] .spec__name,
[data-theme="pastel"] .tell__name,
[data-theme="pastel"] .hero__quote p,
[data-theme="pastel"] .hero__salutation,
[data-theme="pastel"] .hero__qualifier {
font-family: var(--font-display);
font-style: normal;
font-weight: 600;
letter-spacing: -0.025em;
}
[data-theme="pastel"] .hero__display {
font-weight: 600;
letter-spacing: -0.035em;
}
[data-theme="pastel"] .hero__stat {
font-weight: 600;
letter-spacing: -0.04em;
}
[data-theme="pastel"] .hero__lede,
[data-theme="pastel"] .hero__letter-body,
[data-theme="pastel"] .spec__rule,
[data-theme="pastel"] .tell__why,
[data-theme="pastel"] .foot__tagline {
font-family: var(--font-body);
font-style: normal;
font-weight: 400;
color: var(--color-ink-2);
}
[data-theme="pastel"] .banner__center {
font-family: var(--font-display);
font-weight: 500;
font-size: 0.875rem;
letter-spacing: 0;
text-transform: none;
}
/* Pastel uses a subtle indigo on accent — never as a flood. */
[data-theme="pastel"] .hero__eyebrow .mark,
[data-theme="pastel"] .opening__eyebrow .mark {
background: var(--color-accent);
border-radius: 1px;
}
/* ───────────── RISO — bold lowercase, off-register print ───────────── */
[data-theme="riso"] .hero__display,
[data-theme="riso"] .hero__quote p,
[data-theme="riso"] .hero__salutation,
[data-theme="riso"] .hero__qualifier,
[data-theme="riso"] .hero__stat,
[data-theme="riso"] .section__title,
[data-theme="riso"] .foot__wordmark,
[data-theme="riso"] .spec__name,
[data-theme="riso"] .tell__name {
font-family: var(--font-display);
font-weight: 800;
font-style: normal;
text-transform: lowercase;
letter-spacing: -0.04em;
}
/* The riso off-register effect — a 2px cyan ghost behind the headline.
Subtle, not garish. Reduced-motion + browsers without text-shadow are fine. */
[data-theme="riso"] .hero__display,
[data-theme="riso"] .hero__quote p,
[data-theme="riso"] .hero__stat {
text-shadow: 2px 2px 0 var(--color-accent),
-2px 0 0 var(--color-accent-2, oklch(78% 0.18 95));
}
[data-theme="riso"] .hero__lede,
[data-theme="riso"] .hero__letter-body,
[data-theme="riso"] .spec__rule,
[data-theme="riso"] .tell__why,
[data-theme="riso"] .foot__tagline {
font-family: var(--font-serif);
font-style: italic;
font-weight: 400;
}
[data-theme="riso"] .hero__attrib,
[data-theme="riso"] .label,
[data-theme="riso"] .section-label,
[data-theme="riso"] .banner__center {
text-transform: lowercase;
letter-spacing: 0.02em;
}
[data-theme="riso"] .banner__center {
font-family: var(--font-display);
font-weight: 700;
font-size: var(--text-md);
}
/* Subtle paper grain — a tiny stipple via repeating radial-gradient.
Cheap, no image asset, and disappears under prefers-reduced-data. */
[data-theme="riso"] body::before {
content: "";
position: fixed;
inset: 0;
pointer-events: none;
z-index: 0;
background-image: radial-gradient(circle at 1px 1px, oklch(0% 0 0 / 0.045) 1px, transparent 0);
background-size: 3px 3px;
mix-blend-mode: multiply;
}
@media (prefers-reduced-data: reduce) {
[data-theme="riso"] body::before { display: none; }
}
[data-theme="riso"] .hero__photo-grid > span {
filter: contrast(1.05) saturate(1.4);
}
/* ───────────── HERO ARCHETYPES ─────────────
The hero slot picks one shape per theme, from the cookbook.
Each archetype is a different fingerprint — not a re-skin. */
.hero { display: grid; }
.hero__eyebrow {
display: inline-flex;
align-items: center;
gap: 0.6rem;
font-family: var(--font-label);
font-size: var(--text-xs);
letter-spacing: var(--tracking-label);
text-transform: uppercase;
color: var(--color-muted);
margin-bottom: var(--space-lg);
}
.hero__eyebrow .mark {
width: 6px; height: 6px;
background: var(--color-accent);
display: inline-block;
}
.hero__display {
font-family: var(--font-display);
font-weight: var(--display-weight, 400);
font-style: var(--display-style, normal);
font-size: var(--text-display);
line-height: var(--lh-tight);
letter-spacing: var(--tracking-display);
color: var(--color-ink);
font-optical-sizing: auto;
margin: 0;
}
.hero__display--small {
font-size: var(--text-display-s);
}
.hero__lede {
font-family: var(--font-serif);
font-style: italic;
font-size: var(--text-md);
line-height: var(--lh-normal);
color: var(--color-ink-2);
max-width: 56ch;
margin-block: var(--space-lg) 0;
}
[data-theme="brutal"] .hero__lede,
[data-theme="manifesto"] .hero__lede,
[data-theme="terminal"] .hero__lede,
[data-theme="sport"] .hero__lede,
[data-theme="almanac"] .hero__lede {
font-style: normal;
font-family: var(--font-body);
}
[data-theme="manifesto"] .hero__display,
[data-theme="brutal"] .hero__display,
[data-theme="sport"] .hero__display {
text-transform: uppercase;
}
.hero__link {
margin-top: var(--space-lg);
display: inline-block;
font-family: var(--font-label);
font-size: var(--text-sm);
letter-spacing: var(--tracking-label);
text-transform: uppercase;
}
/* H1 — Marquee. Display fills the fold, install code below. */
.hero--marquee {
padding-block: var(--space-2xl) var(--space-xl);
gap: var(--space-lg);
}
.hero--marquee .hero__display {
max-width: 18ch;
}
.hero--marquee .hero__cta {
margin-top: var(--space-xl);
display: grid;
gap: var(--space-sm);
max-width: 30rem;
}
.hero--marquee .hero__cta .label {
font-family: var(--font-label);
font-size: var(--text-xs);
letter-spacing: var(--tracking-label);
text-transform: uppercase;
color: var(--color-muted);
}
/* H2 — Split Diptych. Title left, proof right. */
.hero--split {
grid-template-columns: 7fr 5fr;
gap: var(--space-2xl);
padding-block: var(--space-2xl) var(--space-xl);
align-items: end;
}
@media (max-width: 60rem) {
.hero--split { grid-template-columns: 1fr; gap: var(--space-xl); align-items: start; }
}
.hero--split .hero__col { display: grid; gap: 0; }
.hero--split .hero__proof {
display: grid;
gap: var(--space-xs);
padding-block-start: var(--space-md);
border-block-start: var(--rule-hair) solid var(--color-rule);
}
.hero--split .hero__proof .label {
font-family: var(--font-label);
font-size: var(--text-xs);
letter-spacing: var(--tracking-label);
text-transform: uppercase;
color: var(--color-muted);
margin-bottom: var(--space-xs);
}
.hero__proof-line {
font-family: var(--font-body);
font-size: var(--text-sm);
color: var(--color-ink-2);
line-height: var(--lh-snug);
font-variant-numeric: tabular-nums;
}
.hero--split .hero__proof a { margin-top: var(--space-sm); }
/* H3 — Stat-Led. Giant number + qualifier. */
.hero--stat {
padding-block: var(--space-2xl) var(--space-xl);
gap: 0;
}
.hero__stat {
font-family: var(--font-display);
font-weight: var(--display-weight, 400);
font-style: var(--display-style, normal);
font-size: clamp(7rem, 22vw, 16rem);
line-height: 0.85;
letter-spacing: -0.04em;
color: var(--color-ink);
font-optical-sizing: auto;
display: block;
margin-block: var(--space-md) 0;
}
.hero__qualifier {
font-family: var(--font-display);
font-weight: var(--display-weight, 400);
font-style: var(--display-style, normal);
font-size: var(--text-2xl);
letter-spacing: var(--tracking-display);
color: var(--color-ink);
margin-block: var(--space-md) 0;
font-optical-sizing: auto;
}
[data-theme="manifesto"] .hero__stat,
[data-theme="sport"] .hero__stat {
color: var(--color-accent);
}
/* H4 — Quote-Led. Pull quote in italic display. */
.hero--quote {
padding-block: var(--space-2xl) var(--space-xl);
max-width: 56rem;
}
.hero__quote {
margin: 0;
padding: 0;
}
.hero__quote p {
font-family: var(--font-serif);
font-style: italic;
font-weight: 400;
font-size: clamp(2.25rem, 4vw + 1rem, 4.25rem);
line-height: 1.08;
letter-spacing: -0.015em;
color: var(--color-ink);
margin: 0;
}
.hero__attrib {
margin-block-start: var(--space-lg);
font-family: var(--font-label);
font-size: var(--text-xs);
letter-spacing: var(--tracking-label);
text-transform: uppercase;
color: var(--color-muted);
}
[data-theme="brutal"] .hero__quote p,
[data-theme="manifesto"] .hero__quote p,
[data-theme="terminal"] .hero__quote p,
[data-theme="sport"] .hero__quote p,
[data-theme="almanac"] .hero__quote p {
font-style: normal;
font-family: var(--font-display);
}
/* H5 — Letter. First-person greeting, paragraph body, signoff. */
.hero--letter {
padding-block: var(--space-2xl) var(--space-xl);
max-width: 52rem;
gap: 0;
}
.hero__salutation {
font-family: var(--font-display);
font-weight: var(--display-weight, 400);
font-style: italic;
font-size: clamp(2rem, 3vw + 1rem, 3.25rem);
line-height: 1.15;
letter-spacing: -0.01em;
color: var(--color-ink);
margin-block: var(--space-md) var(--space-lg);
font-optical-sizing: auto;
}
.hero__letter-body {
font-family: var(--font-serif);
font-size: var(--text-md);
line-height: var(--lh-relaxed);
color: var(--color-ink-2);
max-width: 60ch;
margin: 0;
}
[data-theme="brutal"] .hero__letter-body,
[data-theme="terminal"] .hero__letter-body,
[data-theme="sport"] .hero__letter-body,
[data-theme="almanac"] .hero__letter-body {
font-family: var(--font-body);
}
.hero__signoff {
margin-block: var(--space-xl) 0;
font-family: var(--font-serif);
font-size: var(--text-md);
font-style: italic;
color: var(--color-ink-2);
line-height: var(--lh-snug);
}
.hero__sign {
font-style: normal;
font-family: var(--font-display);
color: var(--color-ink);
letter-spacing: var(--tracking-display);
}
/* H6 — Photographic. Image area + small caption + text below. */
.hero--photo {
padding-block: var(--space-xl) var(--space-xl);
gap: var(--space-xl);
grid-template-columns: 1fr;
}
.hero__photo {
position: relative;
aspect-ratio: 16 / 7;
background: var(--color-paper-2);
border: var(--rule-hair) solid var(--color-rule);
overflow: hidden;
}
.hero__photo-grid {
position: absolute;
inset: 0;
display: grid;
grid-template-columns: repeat(3, 1fr);
grid-template-rows: repeat(3, 1fr);
gap: 1px;
background: var(--color-rule);
}
.hero__photo-grid > span {
background: linear-gradient(135deg,
color-mix(in oklch, var(--color-paper-3) 80%, var(--color-accent) 5%),
color-mix(in oklch, var(--color-neutral) 30%, var(--color-paper) 70%));
}
.hero__photo-grid > span:nth-child(2n) { background: linear-gradient(180deg, var(--color-paper-3), var(--color-paper-2)); }
.hero__photo-grid > span:nth-child(3n) { background: linear-gradient(45deg, var(--color-paper-2), var(--color-paper-3)); }
.hero__photo-grid > span:nth-child(5n) { background: linear-gradient(90deg, var(--color-paper-3), color-mix(in oklch, var(--color-accent) 10%, var(--color-paper))); }
.hero__photo-grid > span:nth-child(7n) { background: var(--color-neutral); }
.hero__photo-caption {
position: absolute;
left: var(--space-md);
bottom: var(--space-md);
font-family: var(--font-label);
font-size: var(--text-xs);
letter-spacing: var(--tracking-label);
text-transform: uppercase;
color: var(--color-paper);
background: color-mix(in oklch, var(--color-ink) 78%, transparent);
padding: 0.35rem 0.65rem;
}
.hero__photo-text { display: grid; gap: 0; }
/* H7 — Demo Video Clipped-by-viewport-edge.
Pure-CSS dashboard mockup that extends past the right page edge.
No real video — this is a custom-craft demonstration of the clip layout. */
.hero--clipped {
display: grid;
grid-template-columns: minmax(20rem, 1fr) 1.4fr;
gap: var(--space-2xl);
padding-block: var(--space-2xl) var(--space-xl);
align-items: center;
position: relative;
}
.hero--clipped .hero__copy { display: grid; gap: 0; }
.hero--clipped .hero__display { max-width: 16ch; margin: 0; }
.hero--clipped .hero__lede { max-width: 42ch; }
.hero--clipped .hero__cta { margin-top: var(--space-xl); }
.hero__mock {
width: calc(100% + 12vw); /* the clip — 12% spills past viewport */
max-width: none;
aspect-ratio: 16 / 10;
margin: 0;
border-radius: max(var(--radius-card, 0), 8px); /* always slightly rounded — it's a browser-frame mockup */
overflow: hidden;
box-shadow: 0 30px 60px -28px oklch(20% 0.02 260 / 0.28),
0 1px 2px oklch(20% 0.02 260 / 0.06);
background: var(--color-paper-2);
border: var(--rule-hair) solid var(--color-rule);
display: flex;
flex-direction: column;
transform: rotate(-0.4deg) translateY(-2px);
transform-origin: left center;
}
.hero__mock-chrome {
display: flex;
align-items: center;
gap: 6px;
padding: 10px 14px;
background: color-mix(in oklch, var(--color-paper-2) 100%, var(--color-rule) 12%);
border-block-end: var(--rule-hair) solid var(--color-rule);
}
.hero__mock-dot {
width: 9px; height: 9px;
border-radius: 50%;
background: color-mix(in oklch, var(--color-rule-2) 80%, transparent);
}
.hero__mock-url {
margin-inline-start: 12px;
font-family: var(--font-mono);
font-size: 0.7rem;
color: var(--color-muted);
letter-spacing: 0.02em;
}
.hero__mock-body {
flex: 1;
display: grid;
grid-template-columns: 56px 1fr;
background: var(--color-paper);
min-height: 0;
}
.hero__mock-rail {
display: flex;
flex-direction: column;
gap: 10px;
padding: 16px 12px;
background: color-mix(in oklch, var(--color-paper) 100%, var(--color-paper-2) 60%);
border-inline-end: var(--rule-hair) solid var(--color-rule);
}
.hero__mock-rail-item {
width: 28px; height: 28px;
border-radius: 6px;
background: color-mix(in oklch, var(--color-rule) 100%, transparent);
}
.hero__mock-rail-item.is-active {
background: var(--color-accent);
opacity: 0.85;
}
.hero__mock-main {
padding: 18px 22px;
display: flex;
flex-direction: column;
gap: 16px;
min-height: 0;
}
.hero__mock-row { display: flex; align-items: center; justify-content: space-between; gap: 12px; }
.hero__mock-row--head { padding-block-end: 4px; }
.hero__mock-bar {
height: 8px;
border-radius: 2px;
background: color-mix(in oklch, var(--color-rule) 80%, transparent);
flex: 1;
}
.hero__mock-bar--lg { height: 12px; max-width: 180px; }
.hero__mock-bar--sm { max-width: 80px; }
.hero__mock-bar--xs { height: 6px; max-width: 56px; }
.hero__mock-bar--short { max-width: 50%; }
.hero__mock-pill {
display: inline-block;
width: 64px; height: 22px;
border-radius: 999px;
background: var(--color-accent);
opacity: 0.18;
}
.hero__mock-grid {
display: grid;
grid-template-columns: 1fr 1fr 1.4fr;
grid-template-rows: 1fr;
gap: 12px;
flex: 1;
min-height: 0;
}
.hero__mock-card {
background: color-mix(in oklch, var(--color-paper) 100%, var(--color-paper-2) 60%);
border: var(--rule-hair) solid var(--color-rule);
border-radius: 8px;
padding: 12px;
display: flex;
flex-direction: column;
gap: 8px;
min-height: 0;
}
.hero__mock-card--accent {
background: color-mix(in oklch, var(--color-paper) 100%, var(--color-accent) 8%);
border-color: color-mix(in oklch, var(--color-accent) 40%, var(--color-rule));
}
.hero__mock-card--wide {
/* spans larger column already */
}
.hero__mock-stat {
font-family: var(--font-display);
font-weight: 600;
font-size: 1.75rem;
letter-spacing: -0.02em;
color: var(--color-ink);
font-variant-numeric: tabular-nums;
line-height: 1;
}
.hero__mock-spark {
flex: 1;
background:
linear-gradient(95deg,
transparent 0 6%,
var(--color-accent) 6% 7%,
transparent 7% 14%,
var(--color-accent) 14% 15%,
transparent 15% 28%,
var(--color-accent) 28% 29%,
transparent 29% 42%,
var(--color-accent) 42% 43%,
transparent 43% 60%,
var(--color-accent) 60% 61%,
transparent 61% 80%,
var(--color-accent) 80% 81%,
transparent 81% 100%);
opacity: 0.55;
border-radius: 4px;
min-height: 36px;
align-self: stretch;
}
.hero__mock-rows { display: flex; flex-direction: column; gap: 8px; }
@media (max-width: 60rem) {
.hero--clipped { grid-template-columns: 1fr; gap: var(--space-xl); }
.hero__mock { width: 100%; transform: none; aspect-ratio: 16 / 11; }
}
@media (prefers-reduced-motion: reduce) {
.hero__mock { transform: none; }
}
/* ───────────── FOOTER ARCHETYPES ───────────── */
.foot { display: grid; gap: var(--space-md); padding-block: var(--space-2xl) var(--space-xl); border-block-start: var(--rule-hair) solid var(--color-rule); }
/* Ft1 — Masthead. Wordmark + tagline + links + powered. */
.foot--masthead {
grid-template-columns: 1fr;
gap: var(--space-md);
align-items: start;
}
.foot__wordmark {
font-family: var(--font-display);
font-weight: var(--display-weight, 400);
font-style: var(--display-style, normal);
font-size: var(--text-3xl);
letter-spacing: var(--tracking-display);
color: var(--color-ink);
font-optical-sizing: auto;
line-height: 1;
}
[data-theme="manifesto"] .foot__wordmark,
[data-theme="brutal"] .foot__wordmark,
[data-theme="sport"] .foot__wordmark { text-transform: uppercase; }
.foot__tagline {
font-family: var(--font-serif);
font-style: italic;
font-size: var(--text-md);
color: var(--color-ink-2);
max-width: 50ch;
margin: 0;
line-height: var(--lh-snug);
}
[data-theme="brutal"] .foot__tagline,
[data-theme="manifesto"] .foot__tagline,
[data-theme="terminal"] .foot__tagline,
[data-theme="sport"] .foot__tagline,
[data-theme="almanac"] .foot__tagline {
font-style: normal;
font-family: var(--font-body);
}
.foot__links {
display: flex;
flex-wrap: wrap;
gap: var(--space-md);
margin-block-start: var(--space-md);
font-family: var(--font-label);
font-size: var(--text-sm);
letter-spacing: 0.04em;
}
.foot__powered {
margin-block-start: var(--space-lg);
font-family: var(--font-label);
font-size: var(--text-xs);
letter-spacing: var(--tracking-label);
text-transform: uppercase;
color: var(--color-muted);
}
.foot__powered-mark {
color: var(--color-ink);
font-weight: 500;
}
/* Ft2 — Inline. Single dense line. */
.foot--inline {
grid-template-columns: 1fr;
display: flex;
flex-wrap: wrap;
align-items: center;
gap: var(--space-md);
font-family: var(--font-label);
font-size: var(--text-xs);
letter-spacing: var(--tracking-label);
text-transform: uppercase;
color: var(--color-muted);
}
.foot__wordmark-small {
color: var(--color-ink);
font-weight: 500;
letter-spacing: 0.22em;
}
.foot__sep {
width: 1px; height: 12px; background: var(--color-rule-2);
}
/* Ft3 — Index columns. */
.foot--index {
grid-template-columns: repeat(4, 1fr);
gap: var(--space-xl);
}
@media (max-width: 60rem) {
.foot--index { grid-template-columns: repeat(2, 1fr); }
}
.foot__col-head {
font-family: var(--font-label);
font-size: var(--text-xs);
letter-spacing: var(--tracking-label);
text-transform: uppercase;
color: var(--color-muted);
margin-block-end: var(--space-sm);
padding-block-end: var(--space-xs);
border-block-end: var(--rule-hair) solid var(--color-rule);
}
.foot--index ul {
list-style: none;
margin: 0;
padding: 0;
display: grid;
gap: var(--space-2xs);
font-family: var(--font-body);
font-size: var(--text-sm);
color: var(--color-ink-2);
}
/* Ft4 — Dense colophon (monospace). */
.foot--dense {
font-family: var(--font-mono);
font-size: var(--text-xs);
line-height: 1.7;
color: var(--color-ink-2);
white-space: pre-wrap;
margin: 0;
padding-block: var(--space-md);
}
/* ───────────── SLOT REVEALS ─────────────
The slot fades when its archetype is replaced — supplements the
View Transition and gives a graceful enter on first paint. */
.slot[data-populating] > * {
animation: slot-in calc(var(--dur-long) * 0.7) var(--ease-out) forwards;
opacity: 0;
}
@keyframes slot-in { to { opacity: 1; } }
@media (prefers-reduced-motion: reduce) {
.slot[data-populating] > * { animation: none; opacity: 1; }
}
/* ───────────── QUIET — restraint as the design ─────────────
Override every "expressive" treatment on the page when Quiet is active.
No reveals, no per-theme display weight tricks, no shadow glows.
System fonts inherit naturally; just make sure nothing yells. */
[data-theme="quiet"] .reveal,
[data-theme="quiet"] .reveal.is-in,
[data-theme="quiet"] .slot[data-populating] > * {
opacity: 1;
transform: none;
animation: none;
}
[data-theme="quiet"] .hero__display,
[data-theme="quiet"] .hero__quote p,
[data-theme="quiet"] .hero__stat,
[data-theme="quiet"] .section__title,
[data-theme="quiet"] .foot__wordmark,
[data-theme="quiet"] .spec__name,
[data-theme="quiet"] .tell__name {
font-family: var(--font-display);
font-weight: 500;
font-style: normal;
text-transform: none;
letter-spacing: -0.015em;
text-shadow: none; /* override Riso's off-register if a user toggled */
}
[data-theme="quiet"] .hero__lede,
[data-theme="quiet"] .hero__letter-body,
[data-theme="quiet"] .spec__rule,
[data-theme="quiet"] .tell__why,
[data-theme="quiet"] .foot__tagline {
font-family: var(--font-body);
font-style: normal;
color: var(--color-neutral);
}
[data-theme="quiet"] .hero__salutation {
font-family: var(--font-body);
font-style: normal;
font-weight: 500;
font-size: var(--text-xl);
letter-spacing: 0;
}
[data-theme="quiet"] .hero__sign,
[data-theme="quiet"] .hero__signoff {
font-family: var(--font-body);
font-style: normal;
}
[data-theme="quiet"] .banner__center {
font-family: var(--font-display);
font-weight: 500;
font-size: var(--text-sm);
letter-spacing: 0;
text-transform: none;
}
[data-theme="quiet"] .banner {
background: color-mix(in oklch, var(--color-paper) 92%, transparent);
}
/* No reveal animation on Quiet — the page is intentionally still. */
[data-theme="quiet"] .hero,
[data-theme="quiet"] .hero > * {
animation: none !important;
}
/* Quiet's hero never shows the clipped mockup — even if forced. */
[data-theme="quiet"] .hero--clipped .hero__mock { display: none; }
[data-theme="quiet"] .hero--clipped { grid-template-columns: 1fr; }
/* ───────────── EXAMPLES RAIL — TILES ─────────────
Each tile in the horizontal scroll-snap rail. Cards inherit the
active theme's --radius-card, --rule-card, and --shadow-card so
switching themes restyles them along with everything else. */
.ex-card {
flex: 0 0 32rem;
scroll-snap-align: start;
display: grid;
grid-template-rows: auto auto;
text-decoration: none;
color: inherit;
background: var(--color-paper);
border: var(--rule-card, 1px) solid var(--color-rule);
border-radius: var(--radius-card, 0);
box-shadow: var(--shadow-card, none);
overflow: hidden;
position: relative;
transition: transform 120ms var(--ease-out),
border-color var(--dur-micro) var(--ease-out),
box-shadow var(--dur-short) var(--ease-out);
}
@media (max-width: 60rem) {
.ex-card { flex-basis: 22rem; }
}
@media (max-width: 36rem) {
.ex-card { flex-basis: 80vw; }
}
@media (hover: hover) and (pointer: fine) {
.ex-card:hover {
border-color: var(--color-ink);
transform: translateY(-2px);
}
}
.ex-card:focus-visible {
outline: 2px solid var(--color-focus);
outline-offset: 3px;
}
.ex-card__thumb {
display: block;
width: 100%;
aspect-ratio: 16 / 10;
background: var(--color-paper-2);
border-block-end: var(--rule-card, 1px) solid var(--color-rule);
overflow: hidden;
font-size: 0;
}
.ex-card__thumb img {
display: block;
width: 100%;
height: 100%;
object-fit: cover;
object-position: top left;
transition: transform 500ms cubic-bezier(0.2, 0.8, 0.2, 1);
}
@media (hover: hover) and (pointer: fine) {
.ex-card:hover .ex-card__thumb img { transform: scale(1.025); }
}
@media (prefers-reduced-motion: reduce) {
.ex-card__thumb img { transition: none; }
.ex-card:hover .ex-card__thumb img { transform: none; }
}
.ex-card__meta {
display: grid;
grid-template-areas:
"num name open"
"num brief brief";
grid-template-columns: 3rem 1fr auto;
align-items: baseline;
gap: var(--space-2xs) var(--space-md);
padding: var(--space-md) var(--space-lg);
}
.ex-card__num {
grid-area: num;
font-family: var(--font-label);
font-size: var(--text-sm);
letter-spacing: var(--tracking-label);
color: var(--color-muted);
font-feature-settings: "tnum";
}
.ex-card__name {
grid-area: name;
font-family: var(--font-display);
font-weight: var(--display-weight, 500);
font-style: var(--display-style, normal);
font-size: var(--text-lg);
letter-spacing: var(--tracking-tight);
color: var(--color-ink);
line-height: 1.05;
font-optical-sizing: auto;
}
.ex-card__brief {
grid-area: brief;
font-family: var(--font-body);
font-size: var(--text-sm);
color: var(--color-ink-2);
line-height: var(--lh-snug);
margin-block-start: 0.25em;
}
.ex-card__open {
grid-area: open;
font-family: var(--font-label);
font-size: var(--text-xs);
letter-spacing: var(--tracking-label);
color: var(--color-muted);
text-transform: uppercase;
transition: color var(--dur-micro) var(--ease-out),
transform var(--dur-short) var(--ease-out);
}
.ex-card:hover .ex-card__open {
color: var(--color-ink);
transform: translateX(2px);
}
[data-theme="riso"] .ex-card__name,
[data-theme="brutal"] .ex-card__name,
[data-theme="manifesto"] .ex-card__name,
[data-theme="sport"] .ex-card__name {
text-transform: uppercase;
}
[data-theme="riso"] .ex-card__name { text-transform: lowercase; }
/* ───────────── FOUNDATION VIZ — illustrations ─────────────
Eight different visual demos, one per spec card. Each one prefers
real demonstration over decoration: real type for F/01, real space
ratio for F/02, real motion for F/04, real states for F/05. */
.spec__viz {
display: grid;
gap: var(--space-md);
margin-block-start: var(--space-sm);
}
/* F/01 Type — three real specimens, baseline-aligned. */
.spec__viz--type {
gap: var(--space-md);
}
.spec__viz-row {
display: flex;
align-items: baseline;
justify-content: space-between;
gap: var(--space-md);
padding-block: var(--space-xs);
border-block-end: var(--rule-hair) solid var(--color-rule);
transition: padding-inline-start 220ms var(--ease-out);
}
.spec__viz-row > span {
flex: 0 1 auto;
color: var(--color-ink);
line-height: 1;
}
.spec__viz-row--display > span {
font-family: var(--font-serif);
font-style: italic;
font-weight: 400;
font-size: clamp(2rem, 4vw, 2.75rem);
letter-spacing: -0.02em;
}
.spec__viz-row--body > span {
font-family: var(--font-body);
font-weight: 300;
font-size: 1.5rem;
letter-spacing: -0.005em;
}
.spec__viz-row--mono > span {
font-family: var(--font-mono);
font-weight: 500;
font-size: 1.2rem;
letter-spacing: 0;
}
@media (hover: hover) and (pointer: fine) {
.spec__viz-row:hover {
padding-inline-start: var(--space-md);
}
}
.spec__viz-tag {
font-family: var(--font-label);
font-style: normal;
font-size: var(--text-xs);
letter-spacing: var(--tracking-label);
text-transform: uppercase;
color: var(--color-muted);
flex: 0 0 auto;
}
/* F/02 Colour — accent dot in a paper field, then small swatches. */
.spec__viz--colour {
position: relative;
aspect-ratio: 4 / 1;
background: var(--color-paper-2);
border: var(--rule-hair) solid var(--color-rule);
display: block;
padding: 0;
margin-block-end: var(--space-sm);
}
.spec__viz-dot {
position: absolute;
top: 28%;
left: 22%;
width: 14px;
height: 14px;
background: var(--color-accent);
border-radius: 50%;
}
.spec__viz-caption {
position: absolute;
right: var(--space-md);
bottom: var(--space-sm);
margin: 0;
font-family: var(--font-label);
font-size: var(--text-xs);
letter-spacing: var(--tracking-label);
text-transform: uppercase;
color: var(--color-muted);
max-width: 22ch;
text-align: right;
line-height: 1.4;
}
.spec__viz-swatches {
height: 2rem;
}
/* F/03 Space — symmetric (greyed) vs asymmetric (ink). */
.spec__viz--space {
display: grid;
grid-template-columns: 1fr 1fr;
gap: var(--space-md);
height: 5rem;
align-items: end;
}
.spec__viz-grid {
display: flex;
align-items: end;
justify-content: center;
gap: 0.4rem;
height: 100%;
padding-inline: var(--space-sm);
border-block-end: var(--rule-hair) solid var(--color-rule);
}
.spec__viz-grid--bad .vg-bar { background: var(--color-rule-2); }
.spec__viz-grid--good { justify-content: flex-start; gap: 0.55rem; }
.spec__viz-grid--good .vg-bar { background: var(--color-ink); }
.vg-bar { width: 8px; }
.vg-bar--xl { height: 88%; }
.vg-bar--md { height: 56%; }
.vg-bar--sm { height: 30%; }
.spec__viz-pair {
display: grid;
grid-template-columns: 1fr 1fr;
gap: var(--space-md);
margin: 0;
font-family: var(--font-label);
font-size: var(--text-xs);
letter-spacing: var(--tracking-label);
text-transform: uppercase;
color: var(--color-muted);
text-align: center;
}
/* F/04 Motion — a real fade+slide on click/hover. */
.spec__viz--motion {
display: grid;
grid-template-columns: auto 1fr;
gap: var(--space-md);
align-items: center;
}
.spec__viz-play {
appearance: none;
display: inline-flex;
align-items: center;
gap: 0.5rem;
padding: 0.45rem 0.85rem;
background: transparent;
border: var(--rule-hair) solid var(--color-rule);
font-family: var(--font-label);
font-size: var(--text-xs);
letter-spacing: var(--tracking-label);
text-transform: uppercase;
color: var(--color-ink);
cursor: pointer;
min-height: 32px;
transition: border-color var(--dur-micro) var(--ease-out),
background-color var(--dur-micro) var(--ease-out);
}
.spec__viz-play:hover { border-color: var(--color-ink); }
.spec__viz-play:focus-visible { outline: 2px solid var(--color-focus); outline-offset: 2px; }
.spec__viz-play-icon {
width: 0;
height: 0;
border-style: solid;
border-width: 5px 0 5px 8px;
border-color: transparent transparent transparent currentColor;
display: inline-block;
}
.spec__viz-stage {
position: relative;
height: 3rem;
background: var(--color-paper-2);
border: var(--rule-hair) dashed var(--color-rule);
overflow: hidden;
}
.spec__viz-block {
position: absolute;
top: 50%;
left: 12%;
width: 32px;
height: 32px;
background: var(--color-accent);
transform: translate(-12px, -50%);
opacity: 0;
}
.spec__viz-block.is-running {
animation: spec-motion-demo 420ms cubic-bezier(0.16, 1, 0.3, 1) forwards;
}
@keyframes spec-motion-demo {
from { transform: translate(-12px, -50%); opacity: 0; }
to { transform: translate(160px, -50%); opacity: 1; }
}
@media (prefers-reduced-motion: reduce) {
.spec__viz-block.is-running {
animation: none;
transform: translate(160px, -50%);
opacity: 1;
}
}
/* F/05 States — a real interactive button that reports its own state. */
.spec__viz--states {
display: grid;
gap: var(--space-sm);
}
.spec__viz-button {
appearance: none;
display: inline-flex;
align-items: center;
justify-content: center;
min-height: 44px;
padding: var(--space-sm) var(--space-lg);
font-family: var(--font-label);
font-size: var(--text-sm);
letter-spacing: 0.04em;
background: transparent;
border: var(--rule-fine) solid var(--color-ink);
color: var(--color-ink);
cursor: pointer;
transition: background-color 120ms var(--ease-out),
color 120ms var(--ease-out),
transform 80ms var(--ease-out);
align-self: start;
justify-self: start;
}
.spec__viz-button:hover { background: var(--color-paper-3); }
.spec__viz-button:active { transform: translateY(1px); }
.spec__viz-button:focus-visible {
outline: 2px solid var(--color-focus);
outline-offset: 2px;
}
.spec__viz-button[data-state="loading"] {
background: var(--color-paper-2);
color: var(--color-muted);
cursor: wait;
}
.spec__viz-state-readout {
margin: 0;
font-family: var(--font-mono);
font-size: var(--text-xs);
letter-spacing: 0.02em;
color: var(--color-muted);
}
.spec__viz-state-readout::before {
content: "→ state: ";
color: var(--color-rule-2);
}
/* F/06 Responsive — three frames showing same content reflowing. */
.spec__viz--responsive {
display: grid;
grid-template-columns: 1fr 1.6fr 2.4fr;
gap: var(--space-md);
align-items: end;
height: 5rem;
}
.vg-frame {
display: flex;
flex-direction: column;
gap: 4px;
padding: 8px;
background: var(--color-paper-2);
border: var(--rule-hair) solid var(--color-rule);
height: 100%;
justify-content: flex-start;
}
.vg-line {
height: 4px;
background: var(--color-rule-2);
border-radius: 1px;
width: 100%;
}
.vg-line--head {
background: var(--color-ink);
height: 6px;
width: 70%;
}
.vg-line--short { width: 40%; }
/* F/07 Copy — bad vs good column comparison. */
.spec__viz--copy {
display: grid;
grid-template-columns: 1fr 1fr;
gap: var(--space-md);
}
.spec__viz-copy-col {
display: grid;
gap: 0.4rem;
padding: var(--space-sm) var(--space-md);
border: var(--rule-hair) solid var(--color-rule);
background: var(--color-paper-2);
}
.spec__viz-copy-col[data-variant="good"] {
border-color: var(--color-rule-2);
background: var(--color-paper);
}
.spec__viz-copy-label {
margin: 0;
font-family: var(--font-label);
font-size: var(--text-xs);
letter-spacing: var(--tracking-label);
text-transform: uppercase;
color: var(--color-muted);
}
.spec__viz-copy-col[data-variant="good"] .spec__viz-copy-label {
color: var(--color-accent);
}
.spec__viz-copy-line {
margin: 0;
font-family: var(--font-body);
font-size: var(--text-sm);
line-height: 1.4;
}
.spec__viz-copy-col[data-variant="bad"] .spec__viz-copy-line {
color: var(--color-muted);
text-decoration: line-through;
text-decoration-color: var(--color-rule-2);
text-decoration-thickness: 1px;
}
.spec__viz-copy-col[data-variant="good"] .spec__viz-copy-line {
color: var(--color-ink);
}
/* F/08 Anti-patterns — 9-tile mini-grid of the named tells. */
.spec__viz--tells {
display: grid;
grid-template-columns: repeat(9, 1fr);
gap: var(--space-2xs);
height: 4.5rem;
}
@media (max-width: 50rem) {
.spec__viz--tells {
grid-template-columns: repeat(5, 1fr);
grid-auto-rows: 1fr;
height: auto;
}
}
.vt {
display: block;
background: var(--color-paper-2);
border: var(--rule-hair) solid var(--color-rule);
position: relative;
overflow: hidden;
aspect-ratio: 1;
}
.vt--purple {
background: linear-gradient(135deg, #6b4de0, #e04db4);
}
.vt--gradtext {
background: var(--color-paper);
}
.vt--gradtext::after {
content: "Aa";
position: absolute;
inset: 0;
display: grid;
place-items: center;
font-family: "Inter", sans-serif;
font-weight: 800;
font-size: 1.2rem;
background: linear-gradient(90deg, #8a3fe0, #e03f8a);
-webkit-background-clip: text;
background-clip: text;
color: transparent;
}
.vt--icontile {
background:
linear-gradient(var(--color-rule-2), var(--color-rule-2)) 0 0/100% 1px no-repeat,
linear-gradient(var(--color-rule-2), var(--color-rule-2)) 33.33% 0/1px 100% no-repeat,
linear-gradient(var(--color-rule-2), var(--color-rule-2)) 66.66% 0/1px 100% no-repeat,
var(--color-paper);
}
.vt--centered {
background: var(--color-paper);
}
.vt--centered::after {
content: "";
position: absolute;
inset: 25% 30%;
background:
linear-gradient(var(--color-ink), var(--color-ink)) 0 0/100% 30% no-repeat,
linear-gradient(var(--color-rule-2), var(--color-rule-2)) 0 50%/100% 14% no-repeat,
linear-gradient(var(--color-accent), var(--color-accent)) 25% 80%/50% 14% no-repeat;
}
.vt--glass {
background: linear-gradient(135deg, rgba(99, 102, 241, 0.15), rgba(168, 85, 247, 0.15));
backdrop-filter: blur(2px);
border-color: rgba(255, 255, 255, 0.3);
}
.vt--pill {
background: var(--color-paper);
}
.vt--pill::after {
content: "";
position: absolute;
inset: 38% 18%;
background: linear-gradient(90deg, #6366f1, #a855f7);
border-radius: 999px;
}
.vt--bigfeat {
background:
linear-gradient(var(--color-rule-2), var(--color-rule-2)) 50% 30%/30% 4px no-repeat,
linear-gradient(var(--color-rule-2), var(--color-rule-2)) 50% 50%/50% 4px no-repeat,
linear-gradient(var(--color-rule-2), var(--color-rule-2)) 50% 70%/40% 4px no-repeat,
var(--color-paper);
background-position: center 30%, center 50%, center 70%;
}
.vt--threecard {
background:
linear-gradient(var(--color-rule-2), var(--color-rule-2)) 0 25%/30% 50% no-repeat,
linear-gradient(var(--color-rule-2), var(--color-rule-2)) 35% 25%/30% 50% no-repeat,
linear-gradient(var(--color-rule-2), var(--color-rule-2)) 70% 25%/30% 50% no-repeat,
var(--color-paper);
}
.vt--moremore {
background: var(--color-ink);
color: var(--color-paper);
display: grid;
place-items: center;
font-family: var(--font-label);
font-size: var(--text-xs);
letter-spacing: 0.04em;
border-color: var(--color-ink);
}
@media (max-width: 50rem) {
.vt { aspect-ratio: 4 / 3; }
}
/* ───────────── SPORT — section title fix ─────────────
The italic display + tight tracking + uppercase + weight 700
produced cramped, almost-touching letterforms. Loosen the
tracking just for section titles, give a tiny pad for the
italic slant overhang, and bump line-height for breathing room. */
[data-theme="sport"] .section__title {
letter-spacing: -0.005em; /* loosened from -0.04em */
line-height: 1.12;
padding-inline-end: 0.15em; /* slack for italic slant overhang */
max-width: 26ch;
word-spacing: 0.04em;
}
[data-theme="sport"] .spec__name,
[data-theme="sport"] .tell__name {
letter-spacing: 0;
line-height: 1.05;
}
/* ───────────── SALON — true-centred section heads + fleuron ─────────────
Salon's existing grid override (in sections.css) was fine but the
eyebrow + title weren't perfectly stacked. Tighten the gap between
them, give the title a comfortable measure, and make the fleuron
read as a divider rather than a stray glyph. */
[data-theme="salon"] .section__head {
gap: var(--space-sm);
padding-block-end: var(--space-2xl);
}
[data-theme="salon"] .section-label {
display: inline-flex;
justify-content: center;
margin-inline: auto;
}
[data-theme="salon"] .section__title {
max-width: 32ch;
margin-inline: auto;
font-style: italic;
}
[data-theme="salon"] .section__head::after {
content: "❦";
display: block;
text-align: center;
color: var(--color-accent);
font-size: 1.1rem;
margin-block-start: var(--space-lg);
font-family: var(--font-serif);
line-height: 1;
opacity: 0.65;
}
/* Section 07 lead paragraph + outro — Salon centers all flowing prose */
[data-theme="salon"] .examples__intro,
[data-theme="salon"] .examples__outro {
text-align: center;
margin-inline: auto;
}
/* ───────────── NEWSPRINT — justified prose blocks ─────────────
Print discipline. Long-form copy gets justified + hyphenated where
the column is wide enough to render evenly. Headlines stay
left-aligned (only the prose justifies). */
[data-theme="newsprint"] .opening__sub,
[data-theme="newsprint"] .vs__caption,
[data-theme="newsprint"] .step__sub,
[data-theme="newsprint"] .foot__credits,
[data-theme="newsprint"] .foot__tagline {
text-align: justify;
hyphens: auto;
}
/* ───────────── BRUTAL / MANIFESTO — heavier card borders ─────────────
--rule-card is set to 2px on these themes (in tokens.css). The .tell
cards already use --rule-card. For other elements that have hairline
borders by default, give Brutal/Manifesto a touch more weight so the
theme's voice carries through. */
[data-theme="brutal"] .code,
[data-theme="manifesto"] .code {
border-width: 1.5px;
}