Masthead map r2 and flat-nav spec r2: Ubuntu text links with orange hover and active, after Delvehold; questions ruled or deferred

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
Meta Vens 2026-10-02 15:31:34 +02:00
commit d5ef540184
2 changed files with 196 additions and 209 deletions

View file

@ -1,8 +1,10 @@
# Masthead campaign: the masthead on the ground, the pills gone
Imagination map, revision 1, written 2026-10-02 against `gamecult-site@e906f04`
and `GameCult-Quartz@ef43df0`. The Self admits the campaign, target, questions
and rulings; this file is the long form the cut specs point at.
Imagination map, revision 2, written 2026-10-02 against `gamecult-site@6d9daf7`
and `GameCult-Quartz@ef43df0`. Revision 1 put three options to the operator;
the operator dismissed the questions and ruled the nav direction, so this
revision carries rulings, not forks. The Self admits the campaign, target and
rulings; this file is the long form the cut specs point at.
## The operator's words, verbatim
@ -19,30 +21,32 @@ card on `/Thing`, no card site-wide, keep it):
> no card site-wide and let's get rid of those overused pill buttons while we're
> at it
Two rulings follow, for the Self to admit: **ground-behind-masthead** (the
masthead has no ground of its own; whatever the page paints runs up behind it,
and on `/Thing` that is the deck's hero) and **no-card-no-pills** (no masthead
card on any page; the nav is not pill buttons).
Asked what replaces the pills (revision 1 offered mono labels, Montserrat links
with a rule, or one typeset row):
## Where the campaign lives (question `campaign-home`)
> Ubuntu text links with brand orange hover, we've already done this with the
> Delvehold site
The masthead change is site-wide and has nothing to do with renaming Eve. The
`thing` campaign is homed in the Eve repo (`operator-home-eve-repo`) and its
target is the rename; folding a site redesign into it would make that target
lie about what the campaign protects.
## Rulings in force (`site-masthead`)
Options:
- **`operator-ground-behind-masthead`.** The masthead has no background
separate from the page; on `/Thing` the hero's ground and rays run up behind
it, masthead plus hero one screen.
- **`operator-no-card-no-pills`.** The masthead card is removed on every page
and the pill buttons are retired.
- **`operator-nav-ubuntu-links`.** Nav links are Ubuntu text links with brand
orange (`#ff8a2a`) hover and active state, following the Delvehold site's
`.delvehold-nav` layout (Delvehold `c43d504`, `custom.scss:115-131`).
Delvehold sets its links in the header font; the operator named Ubuntu, so
Ubuntu it is.
- **`self-masthead-pills-first`** (Standing, reversible). The campaign is homed
here, in `GameCult/gamecult-site`; the Thing target stays the rename. The
first cut retires the masthead's pills only; `.gamecult-repo-link` and
`.gamecult-action` follow in a later cut once the operator has seen the
masthead live.
- **new-campaign** (recommended): campaign `site-masthead`, homed in
`GameCult/gamecult-site`, target doc this file. Target, short: the masthead
sits directly on the page ground on every page; its nav is typeset, not
buttons; `/Thing`'s hero runs up behind it. Two cuts at most.
- **fold-into-thing**: the masthead cut becomes a cut of `thing`. Cheaper to
admit, but the Thing campaign's target and repo list then carry a site
redesign, and its Soul passes verify the brand on pages Eve never touched.
The `/Thing` fixes stay in `thing` either way (cut `deck-page-fixes`, spec in
the Eve repo beside the Thing map).
The `/Thing` fixes stay in `thing` (cut `deck-page-fixes`, spec in the Eve repo
beside the Thing map).
## Body facts
@ -56,29 +60,34 @@ site styles `.page-header > header`; the ritual-paper essays, the colossus post,
`Graph` and `Thing` all inherit this one rule. `tour` and `Pitch` hide the
header entirely (`1600-1603`) and are untouched by this campaign.
**B2. The pills.** `site/quartz/components/GameCultMasthead.tsx:321-329`
renders each route as `<a class="gamecult-nav-chip">` (`active` appended);
styles at `custom.scss:730-751`: 999px radius, 1px sky border at .16, sky fill
at .06, Montserrat 300 at .92rem, min-height 2.15rem; hover and active share
one state: orange fill .16, orange border .42, `#fff3e8` text. The nine routes
**B2. The pills.** `site/quartz/components/GameCultMasthead.tsx:181-188`
renders each route as `<a class="gamecult-nav-chip">` (`active` appended at
`184`; external routes get `target="_blank"` and `rel` at `185-186`); styles at
`custom.scss:730-751`: 999px radius, 1px sky border at .16, sky fill at .06,
Montserrat 300 at .92rem, min-height 2.15rem; hover and active share one
state: orange fill .16, orange border .42, `#fff3e8` text. The nine routes
(Studio, Tour, Projects, Pitch, Blog, Graph, Docs, Aetheria, Zyphos) sit in
`.gamecult-titlebar-links` (`flex-wrap: wrap; gap .6rem`), so on phones they
wrap into three rows of pills. Active-route selection (`pickActiveRoute`,
longest matching slug prefix) is sound and is kept.
`.gamecult-titlebar-links` (`722-728`: `flex-wrap: wrap; gap .6rem`), so on
phones they wrap into three rows of pills. Active-route selection
(`pickActiveRoute`, longest matching slug prefix) is sound and is kept.
**B3. The same pill recipe elsewhere.** `.gamecult-repo-link`
(`custom.scss:960`, the per-repo links on project cards) and
`.gamecult-action` (`custom.scss:2168`, the home page's call-to-action row,
`.gamecult-action` (`custom.scss:2172`, the home page's call-to-action row,
`GameCult/index.md:66-68, 105-107`) use the identical border, fill and radius.
The ritual-paper `PREPRINT` badge and page number (`225`, `525`) are mono
badges inside a scoped variant, not nav. See question `pill-scope`.
badges inside a scoped variant, not nav. Out of this cut under
`self-masthead-pills-first`.
**B4. The brand doc.** `docs/brand-design-language.md` names neither the card
nor the pills as deliberate; it names Montserrat-thin-at-scale, Ubuntu 300, the
IBM Plex Mono uppercase tracked label as "a signature of the identity", the
wash, and one accent. It warns that Montserrat 100 at 18px "produces grey
mush" and says to drop to a heavier weight when a heading must be small. The
pills set Montserrat 300 at .92rem, on the wrong side of that warning.
nor the pills as deliberate; it names Montserrat-thin-at-scale, Ubuntu 300 for
prose with `font-weight: 500` as "the emphasis step", the IBM Plex Mono
uppercase tracked label, the wash, and one accent. It warns that Montserrat 100
at 18px "produces grey mush" and says to drop to a heavier weight when a
heading must be small. The pills set Montserrat 300 at .92rem, on the wrong
side of that warning. Ubuntu 500 at .92rem, the ruled nav, is on the right
side of it and is a weight the site already loads (`quartz.config.ts:36`:
Ubuntu 300 400 500 700).
**B5. The masthead's other parts.** Title `GameCult` (Montserrat 200,
`clamp(2.1rem,4vw,3.3rem)`, uppercase, tracked .08em), tagline (Montserrat
@ -123,6 +132,15 @@ sites through `quartz-pages.yml@main` (gamecult-site, AetheriaLore, Delvehold,
GhostlightDungeon-site, Kalsa, Mimir, Zyphos, pombabranca-site, the engine's
own); an engine fix ships to all of them on their next deploy.
**B9. The precedent.** Delvehold `c43d504`, `site/quartz/styles/custom.scss:
115-131`, `.delvehold-nav`: a flex row that wraps, `gap: 0.4rem 1.2rem`; links
`color: var(--darkgray)`, `font-family: var(--headerFont)` (Montserrat there),
`font-size: 0.92rem`, `font-weight: 500`, `white-space: nowrap`; `a:hover` and
`a.active` take the accent colour (`--hold-purple`) and nothing else: no rule,
no underline, no fill. `DelveholdMasthead.tsx:27-32` computes `active` per
route and sets `class="active"` and `aria-current="page"` on it. Delvehold does
not set `text-decoration`; the engine's base `a` rule already has it `none`.
## The shape
### The masthead without the card
@ -141,7 +159,7 @@ Page types this touches, and what each looks like after:
radius, unchanged). The tagline is the home sidebar's.
- **Projects (`/Projects`)**: masthead on the wash above the breadcrumb-less
title and the overview sidebar on the left. The repo-link pills on the cards
are question `pill-scope`.
stay for now (`self-masthead-pills-first`).
- **Essays and other content pages**: masthead on the wash, then breadcrumbs,
title, meta, article card. The three ritual-paper essays paint their own
ground (`custom.scss:101-124`) and the masthead now sits on that ground
@ -153,87 +171,57 @@ Page types this touches, and what each looks like after:
- **`/Thing`**: masthead over the hero (below).
- **`tour`, `Pitch`**: header hidden; nothing changes.
### What replaces the pills (question `nav-treatment`)
### The nav: Ubuntu text links, orange on hover and active (ruled)
Three options, each in the brand's own terms. All keep `pickActiveRoute` and
the route list; all rename the class `gamecult-nav-chip` to `gamecult-nav-link`
so no "chip" survives in the DOM; all keep `aria-current="page"` as the
accessible active mark (new; the pills had only a class).
**A. Mono labels** (recommended). The brand doc's signature device: IBM Plex
Mono, uppercase, tracked, as a row of structural labels.
The Delvehold recipe (B9) with two substitutions, both named by the ruling:
the face is Ubuntu (`var(--bodyFont)`) instead of the header font, and the
accent is GameCult's orange `var(--secondary)` instead of Delvehold's purple.
Everything else is carried as is: wrap, gaps, size, weight, nowrap, the
colour-only active mark. `gamecult-nav-chip` is renamed `gamecult-nav-link` so
no "chip" survives in the DOM, and the active anchor gains
`aria-current="page"` as Delvehold's does (new here; the pills had only a
class).
```scss
.gamecult-titlebar-links { display: flex; flex-wrap: wrap; gap: 0.45rem 1.5rem; }
.gamecult-titlebar-links {
display: flex;
flex-wrap: wrap;
gap: 0.4rem 1.2rem;
min-width: 0;
align-items: flex-start;
}
.gamecult-nav-link {
padding: 0.35rem 0;
border-bottom: 1px solid transparent;
color: rgba(183, 199, 217, 0.84);
font-family: var(--codeFont);
font-size: 0.78rem;
color: var(--darkgray);
font-family: var(--bodyFont);
font-size: 0.92rem;
font-weight: 500;
letter-spacing: 0.14em;
text-transform: uppercase;
text-decoration: none;
white-space: nowrap;
}
.gamecult-nav-link:hover { color: var(--tertiary); }
.gamecult-nav-link.active { color: var(--secondary); border-bottom-color: var(--secondary); }
.gamecult-nav-link[target="_blank"]::after { content: " \2197"; } // ↗ on Aetheria, Zyphos
```
Active page: orange text with a 1px orange rule under the label. Hover: sky.
External routes carry a small ↗ so leaving the site is honest. Mobile: the row
wraps as today, into two or three rows of labels with a .45rem row gap; at
375px roughly four labels fit a row. Nothing is hidden, no scroll affordance
is needed. Why it is recommended: it is the one device the brand doc calls a
signature; it reads at small size by design, which Montserrat thin does not;
and it separates the nav from the Montserrat title above it so the masthead
has two voices (display title, mono labels) instead of one voice at two sizes.
**B. Montserrat text links with an orange rule.** The pills' type kept,
the pill removed.
```scss
.gamecult-titlebar-links { display: flex; flex-wrap: wrap; gap: 0.3rem 1.4rem; }
.gamecult-nav-link {
padding: 0.3rem 0;
color: #dce7f6;
font-family: var(--titleFont);
font-size: 1rem;
font-weight: 300;
letter-spacing: 0.02em;
text-decoration: none;
.gamecult-nav-link:hover,
.gamecult-nav-link:focus-visible,
.gamecult-nav-link.active {
color: var(--secondary);
}
.gamecult-nav-link:hover { color: var(--tertiary); }
.gamecult-nav-link.active { color: var(--dark); box-shadow: inset 0 -2px 0 var(--secondary); }
```
Active page: heading-white text over a 2px orange rule. Mobile: wraps. Risk:
Montserrat 300 at 16px is the size the brand doc says to avoid for the thin
face; the pills carried it at .92rem and the result was already soft.
**C. One typeset row under a hairline.** The nav becomes the masthead's bottom
edge, Montserrat 200 at 1.1rem on one line, with a 1px sky hairline above it
standing in for the card's edge.
```scss
.gamecult-titlebar-nav { border-top: 1px solid rgba(89, 183, 255, 0.12); padding-top: 0.6rem; }
.gamecult-titlebar-links { display: flex; flex-wrap: nowrap; gap: 0 1.25rem; overflow-x: auto; scrollbar-width: none; }
.gamecult-nav-link { flex: 0 0 auto; margin-top: -0.6rem; padding-top: 0.6rem; border-top: 2px solid transparent;
color: #dce7f6; font-family: var(--titleFont); font-size: 1.1rem; font-weight: 200; text-decoration: none; }
.gamecult-nav-link.active { color: var(--secondary); border-top-color: var(--secondary); }
```
Active page: a 2px orange rule sitting on the hairline above the label. Mobile:
no wrap; the row scrolls sideways, so Docs, Aetheria and Zyphos are off-screen
at 375px until the user drags, and a fade or chevron is needed to say so. Risk:
hidden routes on phones, and a hairline is a quiet return of "its own
background".
Weight: Ubuntu 500 is loaded (`quartz.config.ts:36`) and is the brand doc's
emphasis step, so Delvehold's 500 carries over unchanged. Active mark: colour
only, as Delvehold; `:focus-visible` is added so keyboard users see the same
orange that mouse users do. Mobile: the row wraps as today, with a .4rem row
gap; at 375px Ubuntu 500 at .92rem fits four to five labels a row, so the nine
routes take two or three rows. Nothing is hidden, no scroll affordance is
needed. Nothing marks external routes; Delvehold marks none and the ruling asks
for none.
### `/Thing`: the hero runs up behind the masthead
Mechanism, all inside the existing `body[data-slug="Thing"]` block and the
deck's own files; the engine is not edited:
deck's own files; the engine is not edited. This is cut `deck-page-fixes` of
the `thing` campaign, not this campaign's cut; it is mapped here because the
masthead's target (ground-behind-masthead) is only met on `/Thing` once it
lands.
- `.center` becomes a two-row grid, `grid-template-areas: "stack" "foot"`.
`.page-header` and `article` both take `grid-area: stack`; the header gets
@ -262,8 +250,8 @@ deck's own files; the engine is not edited:
reach-in guards gain `.thing-deck h1 { font-size: inherit }`.
- The HUD pill on phones (top-right, fixed) overlaps the masthead's community
icons until the first scroll; accepted in the Thing map r4 and unchanged.
- `body-under-scrollbar` is question `scrollbar-fix-home` below; it is not
in the `deck-page-fixes` file changes unless ruled `site-override`.
- `body-under-scrollbar` is deferred (below); it is not in the
`deck-page-fixes` file changes.
## The authority map
@ -274,8 +262,8 @@ deck's own files; the engine is not edited:
hero) owns what is behind the masthead. On `/Thing`, the slug block owns the
stacking and the inset, and `deck.css`/`deck.js` own the hero's clearance.
- **Inputs.** The route list and current slug; the page's tagline; the
brand tokens in `quartz.config.ts`; on `/Thing`, the measured masthead
height.
brand tokens in `quartz.config.ts` (`--bodyFont`, `--darkgray`,
`--secondary`); on `/Thing`, the measured masthead height.
- **Outputs.** One masthead DOM on every page; `aria-current="page"` on the
active route.
- **Derived state.** The active route is derived from the slug (unchanged).
@ -284,55 +272,49 @@ deck's own files; the engine is not edited:
gutters; it decides nothing on other pages.
- **Forbidden writers.** No rule paints a ground, border, radius or shadow on
`.page-header > header` or `.gamecult-titlebar`; no `.gamecult-nav-chip`
class or `999px` radius in the masthead; no slug-scoped masthead variant
(the ritual-paper essays, colossus post, Graph and Thing all get the one
masthead); no engine edit for the stacking (`renderPage.tsx`, `Header.tsx`
untouched); no site rule inside `.thing-deck`.
class, `999px` radius, border or fill in the masthead nav; no slug-scoped
masthead variant (the ritual-paper essays, colossus post, Graph and Thing all
get the one masthead); no engine edit for the stacking (`renderPage.tsx`,
`Header.tsx` untouched); no site rule inside `.thing-deck`; no change to
`.gamecult-repo-link` or `.gamecult-action` in this cut.
- **Shared paths.** Every page renders the one `GameCultMasthead` through
the engine's `Header`; `/Thing` uses the same slug-block mechanism as the
Graph and colossus pages; deploy is the same `Deploy Quartz` workflow.
- **Deletion line.** The card rule (`646-665`), the mobile card padding
(`1439-1441`) and the chip rules (`730-751`) are deleted before any nav
rule is written; the `gamecult-nav-chip` class is renamed in the component
in the same commit.
(`1439-1441` at `6d9daf7`; shifts with `deck-page-fixes`) and the chip rules
(`730-751`) are deleted before any nav rule is written; the
`gamecult-nav-chip` class is renamed in the component in the same commit.
## Questions (one fork each; the Self admits them)
## Questions
### `campaign-home`
Options: **new-campaign** (`site-masthead`, homed in gamecult-site) or
**fold-into-thing**. Recommended: new-campaign (reasons above).
Revision 1 put four forks to the operator. The operator dismissed them and
ruled the nav direction directly; the Self recorded the defaults as
`self-masthead-pills-first`. Their state:
### `nav-treatment`
Options: **mono-labels** (A), **montserrat-rule** (B), **typeset-row** (C).
Recommended: mono-labels. The spec `docs/masthead-cut-flat-nav.spec.json`
assumes A; under B or C the same deletions apply and the `adds` entry for the
nav rules is replaced by that option's block above.
### `pill-scope`
The operator pointed at the masthead. The same pill recipe also dresses
`.gamecult-repo-link` (project cards) and `.gamecult-action` (home CTAs).
Options: **masthead-only** (this cut) or **all-pill-recipe** (repo links
become mono labels in the card's own row; the CTAs become Montserrat 300 text
links with an orange rule, the primary one orange-filled square-cornered).
Recommended: masthead-only now, and `all-pill-recipe` as a second cut of the
same campaign once the masthead is seen live, since "overused" is a judgment
best made against the new masthead rather than the old one.
### `scrollbar-fix-home`
`html { width: 100vw }` is the engine's. Options: **engine** (delete the line
in `GameCult-Quartz/quartz/styles/base.scss:11`; one commit; ships to nine
sites on their next deploy) or **site-override** (`html { width: auto }` in
`custom.scss`; gamecult-site only; the other eight keep the bug). Recommended:
engine; the owner of the rule is the right place to fix it and the fix is a
deletion. Under `engine` the fix is its own one-line cut on the engine repo,
not part of `deck-page-fixes`.
- **`campaign-home`**: ruled, `self-masthead-pills-first`. The campaign is
`site-masthead`, homed in `GameCult/gamecult-site`.
- **`nav-treatment`**: ruled, `operator-nav-ubuntu-links`. None of revision
1's three options; Ubuntu text links on the Delvehold recipe (above).
- **`pill-scope`**: ruled, `self-masthead-pills-first`. Masthead only in this
cut; `.gamecult-repo-link` and `.gamecult-action` in a later cut once the
masthead is seen live.
- **`scrollbar-fix-home`**: deferred, unruled. `html { width: 100vw }` is the
engine's (`GameCult-Quartz/quartz/styles/base.scss:11`). Options remain
**engine** (delete the line; one commit; ships to nine sites on their next
deploy) or **site-override** (`html { width: auto }` in `custom.scss`;
gamecult-site only). Recommended: engine. Not in `flat-nav` and not in
`deck-page-fixes`; it waits for a ruling.
## Cut order
1. `thing` / `deck-page-fixes` (`F:\Projects\Eve\docs\thing-cut-deck-page-fixes.spec.json`):
the stacking, the inset, the header-leak guard. Independent of the masthead.
2. `site-masthead` / `flat-nav` (`docs/masthead-cut-flat-nav.spec.json`): card
and pills deleted, mono labels in, brand doc amended. Lands after 1 so the
two edits to the Thing block in `custom.scss` do not collide.
3. Optional, after the operator has seen 2 live: `all-pill-recipe` if so ruled;
the engine `width: 100vw` cut if ruled `engine`.
Not landed at `6d9daf7`; Hands is on it.
2. `site-masthead` / `flat-nav` (`docs/masthead-cut-flat-nav.spec.json`, r2):
card and pills deleted, Ubuntu links in, brand doc amended. Lands after 1 so
the two edits to the Thing block in `custom.scss` do not collide; the spec
carries `depends_on: ["deck-page-fixes"]`.
3. After the operator has seen 2 live: the other-pills cut
(`.gamecult-repo-link`, `.gamecult-action`) under `self-masthead-pills-first`,
mapped then; the engine `width: 100vw` cut if `scrollbar-fix-home` is ruled
`engine`.

View file

@ -1,18 +1,19 @@
{
"campaign": "site-masthead",
"cut": "flat-nav",
"revision": 1,
"title": "The masthead sits on the page ground on every page: the card and its shadow deleted, the nav pills replaced by IBM Plex Mono tracked labels with an orange active rule, the brand doc amended",
"revision": 2,
"title": "The masthead sits on the page ground on every page: the card and its shadow deleted, the nav pills replaced by Ubuntu text links with orange hover and active, as on Delvehold; the brand doc amended",
"repo": "GameCult/gamecult-site",
"branch": "main",
"base": "e906f0445b5e05c5b892af122a09bd786b49875f",
"base": "90c2d94",
"depends_on": [],
"first": [
"Map: docs/masthead-campaign.md, sections 'The operator's words', 'Body facts' B1-B5, 'The shape' > 'The masthead without the card' and 'What replaces the pills', 'The authority map'. The operator's words, verbatim: 'no card site-wide and let's get rid of those overused pill buttons while we're at it'. Rulings assumed: site-masthead:ruling:operator-ground-behind-masthead and site-masthead:ruling:operator-no-card-no-pills.",
"Questions assumed: campaign-home = new-campaign (this spec's campaign slug); nav-treatment = mono-labels (option A in the map); pill-scope = masthead-only (.gamecult-repo-link and .gamecult-action are not touched here). Under nav-treatment B or C the deletions below stand and the nav rules in adds are replaced by that option's block in the map.",
"Land after thing/deck-page-fixes so the two edits to the body[data-slug=\"Thing\"] block in custom.scss do not collide; rebase onto its landing head and re-read the line numbers below (they are from e906f04 and shift by that cut's delta inside the Thing block only; everything this cut edits is above line 1148 or in another file).",
"Brand sources are canonical: site/quartz.config.ts configuration.theme (codeFont IBM Plex Mono, titleFont Montserrat; secondary #ff8a2a, tertiary #59b7ff, darkgray #b7c7d9, dark #eef5ff) and custom.scss. The brand doc docs/brand-design-language.md is a guide and is amended by this cut because it will otherwise be silent on a decision the operator made.",
"The masthead component is site/quartz/components/GameCultMasthead.tsx; the nav anchors are rendered at lines 321-329 with class gamecult-nav-chip and active appended. The engine's Header.css sets header { display:flex; align-items:center; margin:2rem 0; gap:1.5rem }, which the site must still beat for the masthead with display:block and its own margin.",
"Map: docs/masthead-campaign.md r2, sections 'The operator's words', 'Rulings in force', 'Body facts' B1-B5 and B9, 'The shape' > 'The masthead without the card' and 'The nav', 'The authority map'. The operator's words, verbatim: 'no card site-wide and let's get rid of those overused pill buttons while we're at it' and 'Ubuntu text links with brand orange hover, we've already done this with the Delvehold site'.",
"Rulings in force: operator-ground-behind-masthead, operator-no-card-no-pills, operator-nav-ubuntu-links, self-masthead-pills-first (masthead pills only; .gamecult-repo-link and .gamecult-action are not touched here). No question is open for this cut; scrollbar-fix-home is deferred and is not in this cut.",
"deck-page-fixes (thing campaign) landed at 8fb3dff and 90c2d94, so this cut has no dependency; the line numbers below are read from 90c2d94. That cut grew the body[data-slug=\"Thing\"] block (1148-) by 34 lines, which is why the $mobile numbers differ from r1. If main moves again before Hands starts, re-read by selector.",
"Precedent: Delvehold c43d504, site/quartz/styles/custom.scss:115-131 (.delvehold-nav: flex wrap, gap 0.4rem 1.2rem; a { color: var(--darkgray); font-size: 0.92rem; font-weight: 500; white-space: nowrap }; a:hover, a.active { color: accent }) and site/quartz/components/DelveholdMasthead.tsx:27-32 (class active and aria-current=\"page\" on the active route). Two substitutions, both ruled: font-family var(--bodyFont) (Ubuntu) for Delvehold's header font, and var(--secondary) #ff8a2a for Delvehold's purple. Ubuntu 500 is loaded (site/quartz.config.ts:36). Delvehold does not set text-decoration; the engine's base a rule has it none, so this cut does not set it either.",
"Brand sources are canonical: site/quartz.config.ts configuration.theme (body Ubuntu 300 400 500 700; secondary #ff8a2a, tertiary #59b7ff, darkgray #b7c7d9, dark #eef5ff) and custom.scss. The brand doc docs/brand-design-language.md is a guide and is amended by this cut because it will otherwise be silent on a decision the operator made.",
"The masthead component is site/quartz/components/GameCultMasthead.tsx; the nav anchor is rendered at lines 181-188 with class gamecult-nav-chip (active appended) at 184 and target/rel for external routes at 185-186. The engine's Header.css sets header { display:flex; align-items:center; margin:2rem 0; gap:1.5rem }, which the site must still beat for the masthead with display:block and its own margin.",
"Deploy is push to main -> workflow 'Deploy Quartz' -> GitHub Pages at gamecult.org; small commits; CI is the verifier. A local .\\scripts\\quartz\\quartz.ps1 build is optional on Starfire."
],
"deletes": [
@ -24,26 +25,27 @@
{
"path": "site/quartz/styles/custom.scss",
"lines": 22,
"note": "Lines 730-751, .gamecult-nav-chip and its :hover/.active rule: deleted whole (999px radius, sky border and fill, orange hover fill). Replaced by the .gamecult-nav-link rules in adds."
"note": "Lines 730-751, .gamecult-nav-chip and its :hover/.active rule: deleted whole (999px radius, sky border and fill, Montserrat 300, orange hover fill). Replaced by the .gamecult-nav-link rules in adds."
},
{
"path": "site/quartz/styles/custom.scss",
"lines": 3,
"note": "Lines 1439-1441 in the $mobile block, the card's phone padding: deleted; there is no card to pad."
"note": "The $mobile card padding rule, .page > #quartz-body .center > .page-header > header { padding: 0.95rem 0.95rem 1rem } (1473-1475): deleted; there is no card to pad."
}
],
"keeps_moves": [
"The masthead's structure and content are unchanged: title, tagline, community links (Patreon wordmark, GitHub, Discord with their sky glow), the nine routes and pickActiveRoute. Only the nav anchors' class and the surrounding styles change.",
".gamecult-titlebar, -top, -copy, -title, -tagline, -nav, -community, -wordmark and -icon rules (custom.scss 667-729, 753-811) and their $mobile variants (1443-1485) are unchanged.",
"The page-header margin-top rules (638, 1435) are unchanged; the masthead's distance from the top of the page is theirs.",
"The masthead's structure and content are unchanged: title, tagline, community links (Patreon wordmark, GitHub, Discord with their sky glow), the nine routes, their external target/rel, and pickActiveRoute. Only the nav anchor's class and aria, and the surrounding styles, change.",
".gamecult-titlebar, -top, -copy, -title, -tagline, -nav, -community, -wordmark and -icon rules (custom.scss 667-721, 753-811) and their $mobile variants are unchanged. .gamecult-titlebar-links (722-728) keeps its rule; only its gap changes.",
"The page-header margin-top rules (638, 1469) are unchanged; the masthead's distance from the top of the page is theirs.",
"The ritual-paper essays, the colossus post, Graph, Thing, tour and Pitch keep their slug blocks; none of them styled the card or the chips, so none changes here.",
".gamecult-repo-link (960) and .gamecult-action (2168) keep their pill recipe under pill-scope = masthead-only."
".gamecult-repo-link (960) and .gamecult-action (2206) keep their pill recipe under self-masthead-pills-first."
],
"adds": [
"GameCultMasthead.tsx lines 321-329: class becomes gamecult-nav-link (active appended as before), and the anchor carries aria-current={active ? \"page\" : undefined}. No other change to the component.",
"custom.scss, where the chip rules were (after .gamecult-titlebar-links at 722-728, whose gap becomes 0.45rem 1.5rem): .gamecult-nav-link { padding: 0.35rem 0; border-bottom: 1px solid transparent; color: rgba(183, 199, 217, 0.84); font-family: var(--codeFont); font-size: 0.78rem; font-weight: 500; letter-spacing: 0.14em; text-transform: uppercase; text-decoration: none; } .gamecult-nav-link:hover, .gamecult-nav-link:focus-visible { color: var(--tertiary); } .gamecult-nav-link.active { color: var(--secondary); border-bottom-color: var(--secondary); } .gamecult-nav-link[target=\"_blank\"]::after { content: \" \\2197\"; }",
"GameCultMasthead.tsx line 184: class becomes gamecult-nav-link (active appended as before), and the anchor carries aria-current={active ? \"page\" : undefined}. No other change to the component.",
"custom.scss 722-728: .gamecult-titlebar-links gap becomes 0.4rem 1.2rem (Delvehold's); display, flex-wrap, min-width, align-items stay.",
"custom.scss, where the chip rules were (730-751): .gamecult-nav-link { color: var(--darkgray); font-family: var(--bodyFont); font-size: 0.92rem; font-weight: 500; white-space: nowrap; } .gamecult-nav-link:hover, .gamecult-nav-link:focus-visible, .gamecult-nav-link.active { color: var(--secondary); } Nothing else: no padding, border, radius, fill, underline, transform or ::after.",
"custom.scss 646: the surviving header rule reads .page > #quartz-body .center > .page-header > header { display: block; margin: 0 0 1.2rem; } and nothing else.",
"docs/brand-design-language.md, a new section '## Masthead' after the Palette section (after line 84): the masthead sits directly on the page ground on every page, no card, border, radius or shadow; the nav is the mono-uppercase-tracked label device, active page in the orange accent with a 1px orange rule, hover in sky, external routes marked with an arrow; the title stays Montserrat 200 uppercase tracked. Six to ten lines; reference the rules by selector, not line number. Update the 'Written' line to name this revision's date."
"docs/brand-design-language.md, a new section '## Masthead' inserted before the '## Ritual Paper' heading (line 86, after the Palette section's closing paragraph): the masthead sits directly on the page ground on every page, no card, border, radius or shadow; the nav is Ubuntu 500 at 0.92rem in --darkgray, hover and active in the orange accent and nothing else (no rule, fill or underline), after the Delvehold site's nav; the active route also carries aria-current=\"page\"; the title stays Montserrat 200 uppercase tracked. Six to ten lines; reference the rules by selector, not line number. The 'Written' line (15) gains ', revised 2026-10-02'."
],
"file_changes": [
{
@ -60,31 +62,31 @@
"line": 722,
"end_line": 751
},
"change": ".gamecult-titlebar-links gap becomes 0.45rem 1.5rem; the .gamecult-nav-chip rules are replaced by the .gamecult-nav-link rules."
"change": ".gamecult-titlebar-links gap becomes 0.4rem 1.2rem; the .gamecult-nav-chip rules are replaced by the .gamecult-nav-link rules."
},
{
"location": {
"path": "site/quartz/styles/custom.scss",
"line": 1439,
"end_line": 1441
"line": 1473,
"end_line": 1475
},
"change": "the $mobile card padding rule deleted."
},
{
"location": {
"path": "site/quartz/components/GameCultMasthead.tsx",
"line": 321,
"end_line": 329
"line": 181,
"end_line": 188
},
"change": "class gamecult-nav-link (+ active); aria-current=\"page\" on the active route."
},
{
"location": {
"path": "docs/brand-design-language.md",
"line": 84,
"end_line": 84
"line": 86,
"end_line": 86
},
"change": "new '## Masthead' section inserted after the Palette section; the 'Written' line dated."
"change": "new '## Masthead' section inserted before '## Ritual Paper'; the 'Written' line (15) dated."
}
],
"authority_map": {
@ -92,28 +94,29 @@
"inputs": [
"the route list and the current slug (GameCultMasthead.tsx)",
"the page's tagline (gamecult.ts headerTagline)",
"the brand tokens: --codeFont, --titleFont, --secondary, --tertiary, --darkgray, --dark"
"the brand tokens: --bodyFont, --titleFont, --darkgray, --secondary"
],
"outputs": [
"one masthead DOM on every page with <a class=\"gamecult-nav-link\"> routes and aria-current=\"page\" on the active one",
"the masthead's type sitting on the page ground on /, /Projects, /Blog/*, the three ritual-paper essays, /Graph, the colossus post and /Thing"
],
"derived_state": [
"the active route, derived from the slug by pickActiveRoute (unchanged)",
"the external arrow, derived from target=_blank, which the component already sets for external routes"
"the active route, derived from the slug by pickActiveRoute (unchanged); its only marks are the active class and aria-current, both set in the component",
"the hover and active colour, derived from --secondary; no second orange is written"
],
"forbidden_writers": [
"no rule paints a background, border, border-radius or box-shadow on .page-header > header or on .gamecult-titlebar",
"no gamecult-nav-chip class in the component or the stylesheet; no 999px radius or sky fill in the .gamecult-nav-link rules",
"no gamecult-nav-chip class in the component or the stylesheet; no radius, border, fill, padding, underline or ::after in the .gamecult-nav-link rules",
"no slug-scoped masthead variant: every page gets the one masthead",
"no engine edit (Header.tsx keeps its bare header rule; the site beats it with display:block and margin)",
"no change to .gamecult-repo-link or .gamecult-action under pill-scope = masthead-only"
"no engine edit (Header.tsx keeps its bare header rule; the site beats it with display:block and margin; the base a rule supplies text-decoration none)",
"no change to .gamecult-repo-link or .gamecult-action under self-masthead-pills-first",
"no scrollbar fix (html width) in this cut; scrollbar-fix-home is deferred"
],
"shared_paths": [
"every page renders the one GameCultMasthead through the engine's Header",
"the same Deploy Quartz workflow and Pages origin"
],
"deletion_line": "the card declarations (646-665), the mobile card padding (1439-1441) and the chip rules (730-751) are deleted in the first commit, with the component's class rename in the same commit, before the .gamecult-nav-link rules and the brand doc section are written."
"deletion_line": "the card declarations (646-665), the mobile card padding (1473-1475) and the chip rules (730-751) are deleted in the first commit, with the component's class rename in the same commit, before the .gamecult-nav-link rules and the brand doc section are written."
},
"verification": {
"builds": [
@ -123,34 +126,34 @@
"tests": [
{
"name": "computed style of .page-header > header on /, /Projects, /Blog/small-ritual-of-reach, /Graph, the colossus post and /Thing",
"pins": "Pins operator-no-card-no-pills on every page type, including the scoped variants. Expect: computed style of .page > #quartz-body .center > .page-header > header on /, /Projects, /Blog/small-ritual-of-reach, /Graph, /Blog/the-sleeping-colossus-refuses-the-throne and /Thing: background-image none, background-color transparent, border-style none, border-radius 0px, box-shadow none, display block. operator-no-card-no-pills: no masthead card on any page type, including the scoped variants."
"pins": "Pins operator-no-card-no-pills on every page type, including the scoped variants. Expect: computed style of .page > #quartz-body .center > .page-header > header on /, /Projects, /Blog/small-ritual-of-reach, /Graph, /Blog/the-sleeping-colossus-refuses-the-throne and /Thing: background-image none, background-color transparent, border-style none, border-radius 0px, box-shadow none, padding 0px, display block."
},
{
"name": "screenshots of /, /Projects and /Blog/small-ritual-of-reach at 1440 and 375",
"pins": "Pins operator-ground-behind-masthead. Expect: screenshots of /, /Projects and /Blog/small-ritual-of-reach at 1440 and 375: the title, tagline, community icons and nav sit on the page's own wash (the ritual essay's violet ground shows through where the navy card was). operator-ground-behind-masthead: the page ground runs up behind the masthead."
"pins": "Pins operator-ground-behind-masthead. Expect: the title, tagline, community icons and nav sit on the page's own wash (the ritual essay's violet ground shows through where the navy card was); on /Thing, after deck-page-fixes, the hero's ground and rays run up behind the masthead."
},
{
"name": "computed styles of the .gamecult-nav-link anchors on /Projects, active and inactive",
"pins": "Pins nav-treatment = mono-labels as specified; the active page is told in the accent and to assistive tech. Expect: computed style of a .gamecult-nav-link on /Projects: font-family starts with IBM Plex Mono, font-size 12.48px, text-transform uppercase, letter-spacing about 1.75px, border-radius 0px, background-color transparent; the Projects link has class active, aria-current=\"page\", color rgb(255, 138, 42) and border-bottom-color rgb(255, 138, 42); the Studio link's color is rgba(183, 199, 217, 0.84). nav-treatment = mono-labels as specified; the active page is told in the accent and to assistive tech."
"pins": "Pins operator-nav-ubuntu-links. Expect: computed style of a .gamecult-nav-link on /Projects: font-family starts with Ubuntu, font-size 14.72px, font-weight 500, white-space nowrap, text-transform none, text-decoration-line none, border-radius 0px, border-style none, background-color transparent, padding 0px; the Projects link has class active, aria-current=\"page\" and color rgb(255, 138, 42); the Studio link's color is rgb(183, 199, 217) and on :hover (emulated) rgb(255, 138, 42)."
},
{
"name": "document.querySelectorAll('.gamecult-nav-chip').length is 0 on every page sampled; '.gamecult-nav-link' is 9; the Aetheria and Zyphos links' ::after content is the arrow",
"pins": "no chip survives; external routes are marked."
"name": "document.querySelectorAll('.gamecult-nav-chip').length is 0 on every page sampled; '.gamecult-nav-link' is 9; exactly one carries aria-current on /Projects and none on /Thing",
"pins": "no chip survives; the active page is told to assistive tech the way Delvehold tells it."
},
{
"name": "at 375 wide on /Projects: the nav wraps into at most three rows, no link is clipped, no horizontal scrollbar; the title is 1.9rem as before",
"pins": "mobile behaviour: wrap, nothing hidden."
"name": "at 375 wide on /Projects: the nav wraps into at most three rows, no link is clipped or broken mid-word, no horizontal scrollbar; the title is 1.9rem as before",
"pins": "mobile behaviour: wrap, nowrap labels, nothing hidden."
},
{
"name": "pickActiveRoute behaviour by sampling: / marks Studio, /Open-Source-Model marks Studio, /Projects/CultPong marks Projects, /Blog/project-thing marks Blog, /Thing marks nothing",
"pins": "the active route is derived exactly as before; the component change is class and aria only."
},
{
"name": "git diff base..head --stat: only site/quartz/styles/custom.scss, site/quartz/components/GameCultMasthead.tsx and docs/brand-design-language.md; custom.scss net lines negative",
"name": "git diff base..head --stat for this cut's commits: only site/quartz/styles/custom.scss, site/quartz/components/GameCultMasthead.tsx and docs/brand-design-language.md; custom.scss net lines negative",
"pins": "a subtraction cut: the card and chips leave, less comes back."
},
{
"name": "docs/brand-design-language.md has a '## Masthead' section that names the no-card and mono-label decisions and matches the live rules by selector",
"name": "docs/brand-design-language.md has a '## Masthead' section that names the no-card and Ubuntu-link decisions, the Delvehold precedent, and matches the live rules by selector",
"pins": "the brand doc is not silent on a decision the operator made."
}
],
@ -161,27 +164,31 @@
},
{
"pattern": "border-radius: 22px|box-shadow:\\s*\\n?\\s*0 20px 44px",
"scope": "site/quartz/styles/custom.scss: no match (the card's radius and shadow are gone; 22px elsewhere is .gamecult-overview-sidebar-inner at 1257 and stays)."
"scope": "site/quartz/styles/custom.scss: no match (the card's radius and shadow are gone; 22px elsewhere is .gamecult-overview-sidebar-inner at 1286 and stays)."
},
{
"pattern": "999px",
"scope": "the .gamecult-nav-link and .gamecult-titlebar* rules in site/quartz/styles/custom.scss: no match."
"pattern": "gamecult-nav-link[^{]*\\{[^}]*(border|background|padding|radius|text-transform|letter-spacing|::after|titleFont|codeFont)",
"scope": "site/quartz/styles/custom.scss, multiline: no match (the link is type and colour only, in the body font)."
},
{
"pattern": "page-header > header\\s*\\{[^}]*(background|border|box-shadow|padding)",
"scope": "site/quartz/styles/custom.scss, multiline: no match."
},
{
"pattern": "gamecult-repo-link|gamecult-action|width: auto|100vw",
"scope": "git diff base..head of this cut's commits: no match (other pills and the scrollbar fix are out of this cut)."
},
{
"pattern": "GameCult-Quartz|quartz/components/Header",
"scope": "git diff --name-only base..head: no engine file."
}
],
"operator": [
"look at https://gamecult.org/, /Projects and /Thing on a desktop and a phone and say whether the masthead on the ground reads as the site's, and whether the mono labels are the nav you meant when you said no pills"
"look at https://gamecult.org/, /Projects and /Thing on a desktop and a phone and say whether the masthead on the ground reads as the site's, and whether the Ubuntu links are the Delvehold treatment you meant"
]
},
"estimate": {
"lines_added": 30,
"lines_added": 22,
"lines_removed": 43,
"dependencies_added": [],
"dependencies_removed": [],
@ -192,11 +199,9 @@
},
"rulings": [
"site-masthead:ruling:operator-ground-behind-masthead",
"site-masthead:ruling:operator-no-card-no-pills"
"site-masthead:ruling:operator-no-card-no-pills",
"site-masthead:ruling:operator-nav-ubuntu-links",
"site-masthead:ruling:self-masthead-pills-first"
],
"questions": [
"campaign-home: new-campaign (recommended, assumed by this spec's slug) or fold-into-thing.",
"nav-treatment: mono-labels (recommended, assumed) or montserrat-rule or typeset-row; see the map for each option's CSS, mobile behaviour and active mark.",
"pill-scope: masthead-only (recommended, assumed) or all-pill-recipe (.gamecult-repo-link and .gamecult-action in a second cut of this campaign)."
]
"questions": []
}