Files
hallmark/site/css/base.css
T
Youssef 2be80bb60c Differentiate all 12 themes — distinct paper, type, accent
The 8 newer themes were too clustered around oklch(94-96%, low-chroma,
warm-hue) — visually all "warm cream + serif" variants. Users couldn't
tell them apart so it felt like the picker was broken for those entries.

Spread the 12 paper colours across the OKLCH space so each theme owns
a distinct point (dark / saturated / desaturated / warm / cool):

- Specimen   warm oat        oklch(96 .018 80)
- Newsprint  salmon-pink     oklch(92 .045 50)  ← FT-pink
- Atelier    cool cream      oklch(94 .005 60)  ← low chroma luxury
- Garden     pale sage       oklch(95 .030 130)
- Salon      warm ivory      oklch(94 .030 65)
- Linen      desat. linen    oklch(89 .022 95)
- Midnight   cool charcoal   oklch(15 .022 250) ← was warm; now cool
- Terminal   green-black     oklch(11 .018 145)
- Almanac    cool pale       oklch(94 .008 245) ← cool, was warm
- Brutal     near-pure white oklch(98 .001 0)
- Manifesto  near-pure black oklch(10 .005 60)  ← inverse of Brutal
- Sport      crisp white     oklch(98 .003 250)

Display fonts now span category-level differences, not "different
serifs": Fraunces / The Future / Space Grotesk / Cormorant italic /
Playfair 900 / Crimson Pro / JetBrains Mono / Anton (added) /
IBM Plex Mono (Salon) / IBM Plex Sans Light / Bricolage Grotesque /
Bricolage Grotesque italic.

Signature structural moves added:
- Newsprint: drop cap on the lede in accent burgundy
- Linen:    barely-visible woven-cloth checkerboard (3% opacity)
- Almanac:  faint vertical grid lines across the page (graph paper)

Plus new fonts in @import (Playfair Display weights, Anton).
Plus swatch dots in the picker now mirror the new tokens.

Result: every theme is unmistakably distinct at first glance —
no more "did clicking that do anything?".
2026-04-27 23:28:18 +01:00

240 lines
7.2 KiB
CSS

/* Hallmark — base: fonts, reset, body */
/* — The Future (Together AI's typeface) ——————————————— */
@font-face {
font-family: "The Future";
font-style: normal;
font-weight: 300;
font-display: swap;
src: url("../fonts/the-future-light.woff2") format("woff2");
}
@font-face {
font-family: "The Future";
font-style: normal;
font-weight: 400;
font-display: swap;
src: url("../fonts/the-future-regular.woff2") format("woff2");
}
@font-face {
font-family: "The Future";
font-style: normal;
font-weight: 500;
font-display: swap;
src: url("../fonts/the-future-medium.woff2") format("woff2");
}
@font-face {
font-family: "The Future";
font-style: normal;
font-weight: 700;
font-display: swap;
src: url("../fonts/the-future-bold.woff2") format("woff2");
}
@font-face {
font-family: "The Future Mono";
font-style: normal;
font-weight: 300;
font-display: swap;
src: url("../fonts/the-future-mono-light.woff2") format("woff2");
}
@font-face {
font-family: "The Future Mono";
font-style: normal;
font-weight: 400;
font-display: swap;
src: url("../fonts/the-future-mono-regular.woff2") format("woff2");
}
@font-face {
font-family: "The Future Mono";
font-style: normal;
font-weight: 500;
font-display: swap;
src: url("../fonts/the-future-mono-medium.woff2") format("woff2");
}
@font-face {
font-family: "The Future Mono";
font-style: normal;
font-weight: 700;
font-display: swap;
src: url("../fonts/the-future-mono-bold.woff2") format("woff2");
}
/* — Google Fonts — all theme display & alt faces ——————————— */
@import url("https://fonts.googleapis.com/css2?family=Fraunces:ital,opsz,wght@0,9..144,300..900;1,9..144,300..900&family=Playfair+Display:ital,wght@0,400..900;1,400..900&family=Instrument+Serif:ital@0;1&family=Cormorant+Garamond:ital,wght@0,300..700;1,300..700&family=Crimson+Pro:ital,wght@0,200..900;1,200..900&family=Newsreader:ital,opsz,wght@0,6..72,200..800;1,6..72,200..800&family=DM+Serif+Display:ital@0;1&family=Anton&family=Space+Grotesk:wght@300;400;500;600;700&family=Bricolage+Grotesque:opsz,wght@12..96,200..800&family=Plus+Jakarta+Sans:ital,wght@0,200..800;1,200..700&family=Hanken+Grotesk:ital,wght@0,100..900;1,100..900&family=IBM+Plex+Sans:ital,wght@0,300;0,400;0,500;0,600;1,400;1,500&family=IBM+Plex+Mono:ital,wght@0,300;0,400;0,500;0,600;1,400&family=JetBrains+Mono:ital,wght@0,400;0,500;0,700;1,400&display=swap");
/* — Reset ———————————————————————————————————————————— */
*, *::before, *::after { box-sizing: border-box; }
html { -webkit-text-size-adjust: 100%; }
body, h1, h2, h3, h4, p, figure, blockquote, dl, dd {
margin: 0;
}
img, picture, svg, video { display: block; max-width: 100%; height: auto; }
button, input, select, textarea {
font: inherit;
color: inherit;
}
button { background: none; border: 0; padding: 0; cursor: pointer; }
a { color: inherit; text-decoration: none; }
ul, ol { margin: 0; padding: 0; list-style: none; }
:focus { outline: none; }
:focus-visible {
outline: 2px solid var(--color-focus);
outline-offset: 3px;
border-radius: 2px;
}
/* — Theme transitions — targeted so type swap feels intentional —— */
html,
body,
.nav,
.opening__title,
.opening__sub,
.section__title,
.spec__name,
.spec__rule,
.tell,
.tell__viz,
.tell__meta,
.tell__name,
.tell__why,
.step__head,
.step__sub,
.install__body,
.foot,
.foot__credits,
.code,
.swatch,
.section__head,
.vs,
.vs__col,
.vs__caption,
hr.rule,
.themer,
.themer__btn {
transition:
background-color var(--dur-short) var(--ease-out),
color var(--dur-short) var(--ease-out),
border-color var(--dur-short) var(--ease-out);
}
/* — Body ————————————————————————————————————————————— */
html {
background: var(--color-paper);
color: var(--color-ink);
}
body {
font-family: var(--font-body);
font-weight: 400;
font-size: var(--text-base);
line-height: var(--lh-relaxed);
letter-spacing: var(--tracking-normal);
font-feature-settings: "ss01", "ss02", "cv01";
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
min-height: 100dvh;
padding-inline: max(var(--page-gutter), env(safe-area-inset-left));
padding-block-end: env(safe-area-inset-bottom);
overflow-x: hidden;
}
/* — Selection ——————————————————————————————————————— */
::selection {
background: var(--color-accent);
color: var(--color-paper);
}
/* — Typography primitives ——————————————————————————— */
h1, h2, h3, h4 {
font-family: var(--font-display);
font-weight: var(--display-weight, 400);
font-style: var(--display-style, normal);
line-height: var(--lh-tight);
letter-spacing: var(--tracking-display);
color: var(--color-ink);
font-optical-sizing: auto;
font-variation-settings:
"opsz" var(--display-optical, 48),
"SOFT" var(--display-soft, 0);
}
h1 { font-size: var(--text-display); }
h2 { font-size: var(--text-display-s); }
h3 { font-size: var(--text-xl); font-weight: 500; line-height: var(--lh-snug); letter-spacing: var(--tracking-tight); font-style: normal; font-variation-settings: normal; }
h4 { font-size: var(--text-md); font-weight: 500; line-height: var(--lh-snug); letter-spacing: var(--tracking-tight); font-style: normal; font-variation-settings: normal; }
p { max-width: var(--measure); }
strong { font-weight: 500; }
em { font-style: italic; }
code, kbd, samp, pre {
font-family: var(--font-mono);
font-size: 0.9em;
font-feature-settings: "tnum";
}
/* — Utility: label (small caps numbering) —————————— */
.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);
}
/* — Utility: rule (hairline divider) ———————————————— */
.rule {
border: 0;
border-top: var(--rule-hair) solid var(--color-rule);
margin: 0;
}
.rule-strong {
border-top-color: var(--color-rule-2);
border-top-width: var(--rule-fine);
}
/* — Utility: serif (editorial emphasis) ———————————— */
.serif {
font-family: var(--font-serif);
font-weight: 400;
font-optical-sizing: auto;
font-variant-numeric: oldstyle-nums;
}
.serif-italic {
font-family: var(--font-serif);
font-style: italic;
font-weight: 400;
}
/* — Utility: tabular numbers ————————————————————————— */
.tnum { font-variant-numeric: tabular-nums; }
/* — Utility: container ————————————————————————————————— */
.container {
max-width: var(--page-max);
margin-inline: auto;
width: 100%;
}
/* — Orange square (the accent mark) ——————————————————— */
.mark {
display: inline-block;
width: 0.55em;
height: 0.55em;
background: var(--color-accent);
vertical-align: 0.04em;
transition: background-color var(--dur-short) var(--ease-out);
}