Masthead campaign map: no card site-wide, mono-label nav replaces the pills, /Thing hero behind the masthead; cut flat-nav spec

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
Meta Vens 2026-10-02 15:17:49 +02:00
commit 6d9daf787e
2 changed files with 540 additions and 0 deletions

338
docs/masthead-campaign.md Normal file
View file

@ -0,0 +1,338 @@
# 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.
## The operator's words, verbatim
With a screenshot of `/Thing`, an arrow drawn from the masthead down into the
deck's hero:
> any reason the masthead has its own background separate from the page
> background? I feel like it could easily take up that same space (as indicated
> by this crude red arrow)
Asked what the masthead card does once the hero runs behind it (glass card, no
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).
## Where the campaign lives (question `campaign-home`)
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.
Options:
- **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).
## Body facts
**B1. The card.** `site/quartz/styles/custom.scss:646-665`,
`.page > #quartz-body .center > .page-header > header`: `display:block`,
`margin 0 0 1rem`, padding `1rem 1.15rem 1.05rem`, a 1px sky border at .12,
radius 22px, a gradient fill (orange radial at 82% 50% over a 135deg navy
gradient at .95-.98 alpha), a 20px/44px drop shadow and an inset hairline.
The mobile variant at `1439-1441` only changes the padding. Nothing else on the
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
(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.
**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/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`.
**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.
**B5. The masthead's other parts.** Title `GameCult` (Montserrat 200,
`clamp(2.1rem,4vw,3.3rem)`, uppercase, tracked .08em), tagline (Montserrat
200, .88rem, lifted from the page's first italic line or the section's
sidebar tagline by `gamecult.ts:505`), and three community links (Patreon
wordmark, GitHub, Discord) as SVGs with a sky drop-shadow glow. All of these
already read as type on a ground; none depends on the card.
**B6. The frame.** `renderPage.tsx:271-290`: `.page > #quartz-body` is the
grid; `.center` is one grid item holding `.page-header` (the masthead and
`.popover-hint` with breadcrumbs, title, meta), `article`, `<hr>`,
`.page-footer`; the site `footer` is a sibling of `.center` in `grid-footer`.
The engine's `Header.css` sets a bare `header { display:flex; align-items:
center; margin: 2rem 0; gap: 1.5rem }`, which the site rule in B1 overrides for
the masthead and which also reaches every `<header class="xhead">` inside the
deck (Soul finding `engine-header-leak`).
**B7. The Thing page today.** `custom.scss:1148-1179` zeroes `.page` padding
and max-width, re-insets `.page-header` to 1680px / 1.2rem, strips the article
card, hides the `<hr>`. The deck hero `.thing-deck .stage` (`deck.css:479`) is
`100svh` tall with its own ground `var(--inv)` `#03070d` and `overflow:hidden`,
`.hero-bg` (orange radial) and `.rays` (sky conic, centred at 55%) absolutely
inside it; `.hero-in` is flex-centred. The stage starts below the masthead, so
a seam shows where `#03070d` begins under the wash. The site ground's top stop
is also `#03070d`, so with the masthead over the stage there is no seam left to
hide. `.stage` has `position:relative` and no `z-index`, so its children's
`z-index` (burst 3, flash 4) compete with anything laid over it. `deck.js`
already measures on resize (`sizeCanvas`, `sizeBurst`).
**B8. Soul findings on `/Thing`** (`thing:verdict:cut-deck-site-page.s1`):
`engine-header-leak` (Medium): eyebrows centred over left-aligned h2s and 32px
of extra top margin from the engine `header` rule; `base.scss h1 { font-size }`
reaches the hero h1, masked by its children. `chrome-edges` (Low): the site
footer's links start at x 0 on `/Thing` at 1440 and 375 (19 and 27 on
`/Projects`); the masthead sits at 19.2 instead of 27.2 at 375 because `.page`
.7rem plus `#quartz-body` 1rem are both zeroed and only 1.2rem is given back.
`body-under-scrollbar` (Low, pre-existing, every page): `GameCult-Quartz
base.scss:8-12` sets `html { overflow-x: hidden; width: 100vw }`; `100vw`
includes the scrollbar, so with a classic scrollbar the body is 15px wider than
the client area and centred content sits 7.5px off. The engine serves nine
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.
## The shape
### The masthead without the card
The title, tagline, community links and nav sit directly on the page ground.
The card rule is deleted, not emptied: what remains of
`.page > #quartz-body .center > .page-header > header` is the two lines that
beat the engine's `header` rule, `display: block; margin: 0 0 1.2rem`. The
`.gamecult-titlebar*` flex rules are unchanged. The mobile padding rule goes
with the card. The sky glow on the community SVGs stays; it was never the
card's.
Page types this touches, and what each looks like after:
- **Home (`/`)**: masthead on the wash, then the home article card (24px
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`.
- **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
instead of on a navy card over it, which is the first time the variant reads
whole from the top of the page.
- **Graph**: single column; masthead on the wash above the SPA shell.
- **The sleeping-colossus post**: single column, `.popover-hint` hidden;
masthead on the wash above the article.
- **`/Thing`**: masthead over the hero (below).
- **`tour`, `Pitch`**: header hidden; nothing changes.
### What replaces the pills (question `nav-treatment`)
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.
```scss
.gamecult-titlebar-links { display: flex; flex-wrap: wrap; gap: 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 { 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 { 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".
### `/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:
- `.center` becomes a two-row grid, `grid-template-areas: "stack" "foot"`.
`.page-header` and `article` both take `grid-area: stack`; the header gets
`z-index: 5` (above the stage's burst canvas at 3 and flash at 4),
`align-self: start`, `justify-self: center`, `width: 100%`,
`max-width: 1680px`, `box-sizing: border-box`; `.page-footer` takes `foot`.
The stage therefore starts at the top of the page and the masthead is laid
over it; masthead plus hero is one screen because the stage is still
`100svh`.
- The hero content clears the masthead: `.thing-deck .stage { padding-top:
var(--masthead-h, 9rem) }` (the stage is `box-sizing: border-box` and
flex-centres `.hero-in` in the space that remains). `deck.js` sets
`--masthead-h` on the deck root from `document.querySelector('.page-header')
.offsetHeight` at init and on resize, next to `sizeCanvas`; the CSS fallback
covers a script-less load. The reduced-motion stage
(`deck.css:681`) takes `padding-top: calc(var(--masthead-h, 9rem) + 96px)`.
- The masthead's inset on this page is one variable, `--thing-inset`, equal
to what every other page gets from `.page` plus `#quartz-body`: `1.2rem`
on desktop, `2.2rem` below `$desktop` (1200px), `1.7rem` at `$mobile`
(800px). `.page-header` and the site `footer` both take `padding-inline:
var(--thing-inset)`, and the footer also takes `max-width: 1680px;
margin-inline: auto; box-sizing: border-box`. This is the `chrome-edges`
fix.
- `engine-header-leak`: `.thing-deck .xhead` adds `align-items: stretch;
margin: 0` so the engine's `header` rule has nothing left to decide; the
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`.
## The authority map
- **Owner.** `custom.scss` owns the masthead's look (one `header` rule, the
`.gamecult-titlebar*` rules, the `.gamecult-nav-link` rules);
`GameCultMasthead.tsx` owns the masthead's content and the active route;
the page's own ground (the body wash, a scoped variant's wash, or the Thing
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.
- **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).
`--masthead-h` is display-only, derived from layout by `deck.js`.
`--thing-inset` is derived from the breakpoint and mirrors the site's
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`.
- **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.
## Questions (one fork each; the Self admits them)
### `campaign-home`
Options: **new-campaign** (`site-masthead`, homed in gamecult-site) or
**fold-into-thing**. Recommended: new-campaign (reasons above).
### `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`.
## 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`.

View file

@ -0,0 +1,202 @@
{
"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",
"repo": "GameCult/gamecult-site",
"branch": "main",
"base": "e906f0445b5e05c5b892af122a09bd786b49875f",
"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.",
"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": [
{
"path": "site/quartz/styles/custom.scss",
"lines": 18,
"note": "Lines 646-665, the masthead card: position, align-items, padding, border, border-radius 22px, the radial+linear background, box-shadow, overflow are deleted. The rule survives as two declarations only: display: block; margin: 0 0 1.2rem (what beats the engine's header rule)."
},
{
"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."
},
{
"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."
}
],
"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 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."
],
"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\"; }",
"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."
],
"file_changes": [
{
"location": {
"path": "site/quartz/styles/custom.scss",
"line": 646,
"end_line": 665
},
"change": "the card rule reduced to display: block; margin: 0 0 1.2rem."
},
{
"location": {
"path": "site/quartz/styles/custom.scss",
"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."
},
{
"location": {
"path": "site/quartz/styles/custom.scss",
"line": 1439,
"end_line": 1441
},
"change": "the $mobile card padding rule deleted."
},
{
"location": {
"path": "site/quartz/components/GameCultMasthead.tsx",
"line": 321,
"end_line": 329
},
"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
},
"change": "new '## Masthead' section inserted after the Palette section; the 'Written' line dated."
}
],
"authority_map": {
"owner": "custom.scss owns the masthead's look: one header rule that beats the engine's, the .gamecult-titlebar* rules and the .gamecult-nav-link rules. GameCultMasthead.tsx owns the masthead's content and the active route. The page's own ground (the body wash, a scoped variant's wash, the Thing hero) owns what is behind the masthead; the masthead paints none.",
"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"
],
"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"
],
"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 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"
],
"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."
},
"verification": {
"builds": [
"Deploy Quartz on GameCult/gamecult-site green for the landing commit: gh run list -R GameCult/gamecult-site -w \"Deploy Quartz\" -L 1",
"optional: .\\scripts\\quartz\\quartz.ps1 build succeeds locally"
],
"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."
},
{
"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."
},
{
"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."
},
{
"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": "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": "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",
"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",
"pins": "the brand doc is not silent on a decision the operator made."
}
],
"negative": [
{
"pattern": "gamecult-nav-chip",
"scope": "site/: no match in any file."
},
{
"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)."
},
{
"pattern": "999px",
"scope": "the .gamecult-nav-link and .gamecult-titlebar* rules in site/quartz/styles/custom.scss: no match."
},
{
"pattern": "page-header > header\\s*\\{[^}]*(background|border|box-shadow|padding)",
"scope": "site/quartz/styles/custom.scss, multiline: no match."
},
{
"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"
]
},
"estimate": {
"lines_added": 30,
"lines_removed": 43,
"dependencies_added": [],
"dependencies_removed": [],
"formats_added": [],
"formats_removed": [],
"targets_added": [],
"targets_removed": []
},
"rulings": [
"site-masthead:ruling:operator-ground-behind-masthead",
"site-masthead:ruling:operator-no-card-no-pills"
],
"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)."
]
}