:root { --paper: #f6f4ef; --paper-dim: #efece3; --ink: #201f1d; --ink-soft: #6b675d; --line: #d9d3c4; --accent: #7a2e2e; --accent-soft: #7a2e2e14; /* Separate from --accent (brand/selection color) because .error and other genuinely-wrong-state text needs to stay legible as "something's wrong" even in a theme where --accent carries no color at all — see the Modern override below. */ --danger: var(--accent); --font-body: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif; --font-label: "Iowan Old Style", "Palatino Linotype", Georgia, serif; --border-width: 1px; --radius-sm: 2px; --radius-pill: 999px; --radius-circle: 50%; --plate-padding: 0.6em; --gap-grid: 1rem; } /* "Modern" — a second visual direction being compared against "Classic" above (see docs/plan.md's "Design system exploration" detour), in the International Typographic Style / Swiss design lineage. Sans-only, sharp corners, precise hairlines. Toggled via lib/settings.svelte.ts, not a settled decision. */ :root[data-theme="modern"] { --paper: #ffffff; --paper-dim: #eeeeee; --ink: #111111; --ink-soft: #6e6e6e; --line: #111111; --accent: var(--ink); --accent-soft: #11111114; --danger: #9c3b3b; --font-body: Helvetica, Arial, sans-serif; --font-label: Helvetica, Arial, sans-serif; --border-width: 1px; --radius-sm: 0; --radius-pill: 0; --radius-circle: 0; --plate-padding: 0.35em; --gap-grid: 1.25rem; } /* Labels lean on italics for contrast against body text in Classic's serif; Modern has no serif to contrast against, so it leans on tracked-out uppercase instead — the standard ITS caption treatment. */ :root[data-theme="modern"] .wall-label { font-style: normal; text-transform: uppercase; letter-spacing: 0.08em; font-size: 0.72em; } :root[data-theme="modern"] .wall-label .title { font-style: normal; } /* A modernist catalog page doesn't box every photo — alignment and whitespace carry the grid, not ruled frames around each cell. So Modern drops the matted box specifically on meme thumbnails (figure.plate in the grid views, .plate.pick in the picker) while leaving .plate.modal and .plate.card alone — those are bounded UI surfaces (a dialog, the sign-in card) that still need to read as distinct from what's behind them. */ :root[data-theme="modern"] figure.plate, :root[data-theme="modern"] .plate.pick { background: none; border: none; padding: 0; } *, *::before, *::after { box-sizing: border-box; } html, body, #app { height: 100%; margin: 0; } body { background: var(--paper); color: var(--ink); font-family: var(--font-body); font-size: 15px; line-height: 1.5; -webkit-font-smoothing: antialiased; } h1, h2, h3 { font-family: var(--font-label); font-weight: 500; letter-spacing: 0.01em; margin: 0 0 0.5em; } button, input, textarea, select { font-family: inherit; font-size: inherit; /* Browsers give