/* ============================================================================
theme.css — the stock theme (PLAN.md §7)
THIS FILE IS DELIBERATELY EMPTY OF RULES.
It is loaded last on every page, after the site's own stylesheet, so anything
it declares wins. The stock site needs to override nothing, so the stock copy
overrides nothing — an empty mount and a stock deployment must produce the
same pixels, and the simplest way to guarantee that is for the default to say
nothing at all.
It ships anyway, rather than being absent, for two reasons: the `` in
every page's head must resolve to a stylesheet rather than a 404, and this is
the file an operator copies out, edits and mounts back. What follows is the
whole reference they need.
----------------------------------------------------------------------------
HOW TO RECOLOUR THIS SITE
----------------------------------------------------------------------------
Copy this file into the directory bind-mounted at /app/brand, uncomment the
block below, change the values, and restart the container. No rebuild, no
image push. Every asset and every field resolves against the mount first and
the baked-in defaults second, per file, so overriding theme.css alone leaves
the logo, the icons and the text exactly as they are.
docker cp :/app/brand-default/theme.css ./brand/theme.css
$EDITOR ./brand/theme.css
docker compose restart
Only custom properties belong here. Every colour, radius, shadow and font in
the site is one, defined in a single file, and `scripts/checkTokens.mjs`
fails the build if a literal ever appears anywhere else — so there is no
corner of the design this file cannot reach. Ordinary CSS rules will work,
but they are the thing that breaks on the next release; properties are the
supported surface.
Names match the product's own `client/src/styles/theme.css` where the
concepts line up, so a theme written for a Runic Gateway deployment is
legible here and mostly portable.
----------------------------------------------------------------------------
:root {
--bg: #0e1318; Page ground
--bg-deep: #0b0f14; Header and footer ground
--panel-a: #192231; Panel gradient, top
--panel-b: #141a21; Panel gradient, bottom
--panel-flat: #11161d; Flat panels, code blocks
--line: #2a3544; Borders
--line-soft: #1d2733; Hairlines and dividers
--accent: #7f99bd; Links and interface emphasis
--ink: #eef3f8; Brightest text
--head: #e6edf6; Headings
--text: #c4cdd8; Body copy
--muted: #aeb8c4; Secondary copy
--dim: #6f7d8e; Captions and metadata
--gold: #c8a368; Emphasis, rules, the display face
--gold-deep: #946b3c; Gold borders. Too dark for text.
--gold-bright: #e4cb90; Highlights on gold
--portal: #15b4de; The live-state signal and diagram lines
--portal-deep: #0b6398; Glow fills. Too dark for text.
--portal-bright: #1bd6f1;
--danger: #ff4e43; Errors and destructive actions
--mode-live: #5fb98a; Status pill: running
--mode-maint: #e6c26a; Status pill: maintenance
--display: 'Cinzel Variable', Georgia, serif;
--sans: 'Inter Variable', system-ui, sans-serif;
--mono: ui-monospace, Consolas, monospace;
--radius-pill: 999px;
--radius-panel: 12px;
--radius-card: 10px;
--radius-input: 8px;
--measure: 68ch; Reading measure
--page-max: 1180px; Content column
--gutter: 24px;
--header-h: 68px;
}
The documentation pages carry a light theme as well, because §11 has the docs
honour the reader's preference while the marketing pages stay dark. Those
values are separate properties, so a light-mode change does not disturb the
dark one:
:root {
--light-bg: #f6f8fb;
--light-panel: #ffffff;
--light-line: #d6dee9;
--light-ink: #16202c;
--light-text: #33414f;
--light-muted: #5a6875;
--light-accent: #3c5f8f;
--light-gold: #7a5a24;
--light-portal: #0a5f80;
}
TWO THINGS THIS FILE CANNOT DO
----------------------------------------------------------------------------
The logo is artwork, not a colour. It is raster art shared with the product's
own site and the Android launcher icon, so no property recolours it — replace
`logo.png` in the mount instead, and the header mark, the favicon, the
install icons and every other size follow from that one file.
Contrast is not checked for you. The stock palette is held to WCAG AA against
the stock ground, and each value's measured ratio is recorded next to it in
`src/styles/tokens.css`. Change the ground without changing the ink and that
guarantee is gone, silently.
============================================================================ */