Masthead map r4: one column, sidebars gone, wash home-only, composite deleted; six cut specs

Map revision 4 against 535d170 for ruling operator-chromeless-column: the
sidebars go site-wide, the masthead aligns to one column token, the wash dims
off the home page through one intensity token, the composite branch is
deleted. Cut specs: wash-home-only, composite-delete, sidebars-gone,
column-align, plus community-hit-gap and doc-tree-flat for Soul's two
findings. Target r3 proposal: one-column and wash-home-only invariants.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
Meta Vens 2026-10-02 19:07:04 +02:00
commit 1dfa2c7c93
7 changed files with 1391 additions and 1 deletions

View file

@ -1,4 +1,4 @@
# Masthead campaign: the masthead on the ground, the pills gone, no cards
# Masthead campaign: the masthead on the ground, the pills gone, no cards, one column
Imagination map, revision 2, written 2026-10-02 against `gamecult-site@90c2d94`
and `GameCult-Quartz@ef43df0`. Revision 1 put three options to the operator;
@ -8,6 +8,9 @@ rulings; this file is the long form the cut specs point at. Revision 3
(2026-10-02, against `410485e`, after `lean-masthead`) is the section
"Cards: inventory and cuts" at the end: the campaign's scope grew from the
masthead to every card surface on the site.
Revision 4 (2026-10-02, against `535d170`) is the section "One column" at the
end: the sidebars go, the masthead aligns to one column, the wash dims off the
home page and the composite branch is deleted.
## The operator's words, verbatim
@ -579,3 +582,278 @@ resolution closing this one, and buys only a nicer name. Retitle instead: the
campaign and target r2 titles become "Site chrome: the masthead on the ground,
the pills gone, no cards", and this file's heading already reads so. If the
Self prefers a clean slug, the cuts above are unchanged and move to it.
## One column: sidebars gone, masthead aligned, wash dimmed, composite deleted (map revision 4, 2026-10-02, against `535d170`)
Written after `home-flat`, `dead-card-css`, `sidebars-lists` (narrowed),
`project-pages` and `blog-asides` landed; `dossier-flat` and `ritual-sheet` are
admitted and may land beside these cuts. Line numbers are from `custom.scss` at
`535d170` (2559 lines); every spec says to re-read by selector.
### The operator's words, verbatim
With screenshots of `/`, `/Blog` and `/Docs/Architecture-and-Evidence`:
> nix the unused composite component. The masthead now feels misaligned on the
> homepage and project page. I'd rather it be aligned like it is on the pages
> with sidecars, except I also want those sidecars all gone, they're cramping
> the style. Blog page elements should also be chromeless. Also that background
> wash gets too bright on pages that aren't the homepage.
Admitted as `site-masthead:ruling:operator-chromeless-column`. Also in force:
`operator-no-cards-except-floats`, `operator-no-card-no-pills`,
`self-masthead-pills-first`, and the follow-up `full-width-content` ("the
masthead always fills the screen, and the content should do the same, where
reasonable").
The Self adds a heads-up, not a ruling: the operator is weighing a cheap WebGL
shader (a subset of Aetheria's volumetric cloud shader) in place of the CSS
wash. So the home-versus-elsewhere difference is one intensity value a shader
could read as a uniform, no per-page wash rule is added, and the CSS wash stays
as the no-WebGL and reduced-motion fallback.
### Body facts
**C1. Why the masthead is misaligned on `/` and `/Projects`.** Both pages carry
`cssclasses: gamecult-studio-page`, and `.gamecult-studio-page { max-width:
72rem; margin-inline: auto }` (`2013-2017`) centres the article inside
`.center`, while `.page-header` (the masthead) spans `.center` whole. `.page`
is `max-width: 1680px` (`33-37`), so at 1660 wide the article starts 240px in
from the masthead. On pages with sidebars `.center` is a 300px-narrower grid
column and the article has no cap of its own, so masthead and article share
edges. The operator's "aligned like the pages with sidecars" is that: one
column, nothing centred inside it.
**C2. The sidebars.** `quartz.layout.ts` places, on content pages, left:
`DesktopOnly(TableOfContents)`; right: `GameCultOverviewSidebar` and
`Backlinks` under per-slug conditions; on folder pages, left:
`GameCultOverviewSidebar`. The engine renders `<div class="left sidebar">` and
`<div class="right sidebar">` regardless (`renderPage.tsx:247-262`), so with
empty lists both divs are empty. The site already handles that with
`:empty { display: none }` (`52-55`) and two `:has(... :empty)` grid blocks
(`57-87`) that collapse the engine's three-column grid. After the cut every
sidebar is empty on every page, so the conditional grid becomes one
unconditional rule and the `:has` machinery is dead.
**C3. What the sidebars carry.** The TOC: three pages set `enableToc: true`
(Architecture-and-Evidence, dossier, stichting); the engine hid it below
`$desktop` anyway. Backlinks: the engine's list of inbound links on standard
content pages. The overview sidebar: `sidebarGroups` frontmatter on `index.md`
(Studio, Praxis, Participate), `Docs/Architecture-and-Evidence.md`
(Architecture, Proof), `Pitch.md`, `tour.md`; on `/Blog` a post list built by
the engine's `buildAutoIndexSidebarData`. Everything the groups link is
reachable from the masthead nav (Projects, Blog, Aetheria), the home page's
action row and body links, and the Projects atlas. The `/Blog` post list is the
blog index itself. Nothing moves inline; all of it drops.
**C4. The masthead tagline rides on the sidebar code.** `gamecult.ts:467-508`
builds `headerTagline: currentTaglineText ?? sidebar?.tagline`. Pages with
their own quoted first line (19 of 67: home, Docs/index, Graph, Thing, ten
project pages, Architecture-and-Evidence, Bifrost, two posts) show it; every
other page shows the nearest section index's tagline through
`findSidebarOverviewNote` (page, then `Section/index`, then `index`). Blog
pages get the literal `"Recent notes, fiction, experiments, and other escaped
materials."` from `buildAutoIndexSidebarData`'s `sidebarTagline` option,
duplicated in `GameCultCompositeContent.tsx:177`. The tagline chain is masthead
content and stays; only its carrier is renamed. The Blog literal becomes the
quoted first line of `Blog/index.md`, so content owns it and both copies go.
**C5. The composite branch.** `GameCultCompositeContent.tsx` is the page body
for every content and folder page (`quartz.config.ts:85-90`); only its
`compositeSections` branch (`buildSectionContent`, `getCompositeSections`, the
`sections.length > 0` render, `showCompositeJump`) is dead: no content file sets
`compositeSections`. Its CSS is `1744-1891` and the mobile block `2202-2223`.
`.gamecult-composite-overview > h2, > ul { display: none }` (`1754-1757`) is
also dead: `tour.md` carries the class, but its `<h2>`s are inside
`.gamecult-vn-source-card` divs, never direct children of the article, and the
file has no top-level `##` or list. `showCompositeJump: false` sits in
`index.md`, `Pitch.md`, `tour.md`. `rebaseSharedSourceElement` is not
composite: it serves `contentSource` pages and stays.
**C6. The wash.** `body` (`10-29`) layers three radials, orange .18, violet
.16, sky .14, over the navy gradient. The ritual essays paint their own ground
(`119-124`): yellow .15, cobalt .22, violet .19, brighter than the site's.
tour/Pitch cover the body with the VN and hide `.page::before`; `/Thing`'s hero
paints its own `.hero-bg` in `deck.css` (Eve) and is not the site's wash.
Removing the article card exposed more of the body wash on every page.
**C7. `/Thing`'s frame.** `--thing-frame: calc(1680px + 2 * var(--thing-inset))`
(`1045`) is the outer width of `.page` elsewhere, so the masthead and footer on
`/Thing` are the same box as everywhere else while the deck is full-bleed
(`.page { max-width: none; padding: 0 }`). The literal `1680px` is the only
other copy of the page width.
**C8. Other width caps.** Ritual essays: `article { max-width: 980px; margin:
2rem auto 4rem }` (`148-156`), a second centred-inside-the-column cap of the
C1 kind. `article h1` and `.ritual-paper-titleblock` 760px (`241`, `253`) and
the tagline's `68ch` (`690`) are type measures on a heading and a one-liner,
not body chrome. `.integrated-dossier-page` sets no width.
### The shape
**One column.** `body { --gamecult-column: 72rem }`, the studio pages' current
measure (1152px), becomes `.page`'s `max-width`; `.page`'s gutters stay
outside it. `#quartz-body` is one column at every width:
```scss
.page > #quartz-body {
grid-template-columns: minmax(0, 1fr);
grid-template-areas: "grid-header" "grid-center" "grid-footer";
}
.page > #quartz-body > .sidebar { display: none; }
```
The masthead (`.page-header`), the article and the site `footer` are each the
column's full width on every page, so their edges meet at the column's edges
with no centring inside it. `.gamecult-studio-page`'s cap and the ritual
`980px` are deleted; the ritual paper takes the column (its two text columns
are its measure). `/Thing` keeps the deck full-bleed and takes
`--thing-frame: calc(var(--gamecult-column) + 2 * var(--thing-inset))` for its
masthead and footer; tour/Pitch keep their full-screen block minus the two
sidebar-hider lines. `full-width-content`: the column is the site's one width,
content runs to its edges, and the brand doc gains `## Layout` naming the
token; the remaining 760px and 68ch caps are type measures and are named there
as such. Changing the site's width is then one number.
**No sidebar.** `quartz.layout.ts` places nothing left or right;
`GameCultOverviewSidebar.tsx` is deleted; `Plugin.TableOfContents()` leaves
the transformers with the nine `enableToc` frontmatter lines; `sidebarGroups`
blocks are deleted from the four files; the sidebar data model in
`gamecult.ts` (link, group, data types, the group extractors, summary, active
link, `sidebarSource`, `buildAutoIndexSidebarData`) is deleted and
`findSidebarOverviewNote` becomes `findSectionNote`, feeding only the tagline.
All sidebar, TOC, backlinks and overview CSS goes, including the slug blocks'
grid overrides (ritual `127-141`, `570-583`; colossus `1100-1111`) that exist
only to beat the engine's three-column grid.
**Wash.** One token, `body { --gamecult-wash: 0.5 }` and
`body[data-slug="index"] { --gamecult-wash: 1 }`; every radial alpha in the
body ground and in the ritual ground is `calc(<its alpha> * var(--gamecult-wash))`
(`rgb(255 138 42 / calc(0.18 * var(--gamecult-wash)))`). Sass emits a colour
function whose argument is a `var()` as plain CSS; Hands confirms the calc
survives in the built stylesheet. No other page rule touches the wash. The CSS
wash is the fallback if a shader ever paints the ground; the shader would read
`--gamecult-wash` as its intensity uniform. 0.5 is a first number for the
operator to tune.
**Composite.** The branch, its CSS, the dead overview hider and the
`showCompositeJump` lines go; the file is renamed `GameCultContent.tsx` so its
name stops claiming what it no longer does; `quartz.config.ts` imports the new
name.
### The authority map
- **Owner.** `custom.scss` `body` owns the site's two layout tokens,
`--gamecult-column` and `--gamecult-wash`, and the one grid rule;
`quartz.layout.ts` owns what is placed on a page (nothing beside the
centre); `gamecult.ts` owns the tagline chain; content frontmatter owns a
page's own tagline (`Blog/index.md` now owns the blog's); `GameCultContent.tsx`
owns the article body.
- **Inputs.** The slug (home or not, for the wash); the page's and its
section index's first quoted line (tagline); the two tokens.
- **Outputs.** One centred column of `--gamecult-column` on every page, the
masthead, article and footer at its edges; the ground at full intensity on
`/` and half elsewhere.
- **Derived state.** The masthead's width, the footer's width and the Thing
frame are derived from `--gamecult-column`; no rule centres content inside
the column (`.gamecult-studio-page` and the ritual `980px` are no longer
owners). The grid is no longer derived from sidebar emptiness (`:has`,
`:empty`); it is one rule. Every ground radial's alpha is derived from
`--gamecult-wash`. The tagline is derived from content, not from sidebar
data. `enableToc`, `sidebarGroups`, `sidebarSource`, `showCompositeJump`,
`compositeSections` are read by nothing and are deleted, not left inert.
- **Forbidden writers.** No `left`/`right` entry in either layout; no
`max-width` with `margin: auto` on an article or page class; no literal
page width (`1680px`, `72rem`) outside the token; no `grid-template-*` for
`#quartz-body` outside the one rule and the tour/Pitch full-screen block;
no `:has(... sidebar ...)` or `:empty` grid rule; no radial alpha outside the
token's multiplication; no `data-slug` wash rule beyond the home line; no
`composite` string in the site source; no engine edit.
- **Shared paths.** Every page type (home, Projects, posts, Docs, folder
listings, ritual essays, colossus post, dossier, Graph, Thing, tour/Pitch)
renders through the one grid rule and the same Deploy Quartz workflow;
`/Thing`'s masthead and footer use the same token through `--thing-frame`.
- **Deletion line.** Per cut, the deletes land before any add: the composite
branch and its CSS; the sidebar placements, component, data model and CSS
with the slug-block grid overrides; the `:has`/`:empty` grid rules; the
studio-page and ritual caps and the literal page widths; the literal radial
alphas.
### Questions
None are forks. Two decisions the operator should see live rather than rule
on: the column at 72rem (one token; the follow-up's "where reasonable" is
answered by the studio pages' own measure) and the wash at 0.5 (one number).
The information the sidebars carried drops (C3); nothing is moved inline.
### Cut order (smallest risk first; all based on `535d170`)
0. `community-hit-gap` and `doc-tree-flat` (below, Soul's findings): one rule
each, independent of everything; either order, any time.
1. `wash-home-only` (`docs/masthead-cut-wash-home-only.spec.json`): the token
and the two grounds. Independent. Its ritual lines (`119-124`) sit beside
`ritual-sheet`'s token deletes (`104-117`); whichever lands second rebases
a few lines.
2. `composite-delete` (`docs/masthead-cut-composite-delete.spec.json`): the
branch, rename, CSS, hider, frontmatter. Independent.
3. `sidebars-gone` (`docs/masthead-cut-sidebars-gone.spec.json`): layouts,
component, data model, TOC transformer, frontmatter, all sidebar CSS and the
slug-block grid overrides, the one grid rule. After `composite-delete`
(same frontmatter blocks, same component file).
4. `column-align` (`docs/masthead-cut-column-align.spec.json`): the column
token, `.page`, the two caps, `--thing-frame`, the brand doc's `## Layout`.
After `sidebars-gone` (the column only makes sense once nothing sits beside
it). Resolves `full-width-content`.
### Target r3 proposal
Keep r2's six invariants. Add:
- `one-column`: every page is one centred column of `--gamecult-column`; the
masthead, article and site footer share its edges; no layout places a
sidebar and no rule centres a narrower box inside the column. A full-bleed
surface (the Thing deck, the VN on tour/Pitch) may escape the column; its
masthead and footer do not.
- `wash-home-only`: the ground's radial intensity is one token,
`--gamecult-wash`, 1 on `/` and lower elsewhere; no page rule sets a radial
alpha of its own. The CSS wash is the fallback ground if a shader ever
paints it.
`not_in_scope` r3: the pills (unchanged); the engine `pre`/`code` frame
(unchanged); the Thing deck's and Sai player's own chrome (unchanged); the
shader (a separate campaign if ruled); `scrollbar-fix-home`. The width-caps
entry leaves `not_in_scope`: `column-align` resolves `full-width-content`.
`canonical_implementations` r3 adds: the tokens `--gamecult-column` and
`--gamecult-wash` on `body` in `custom.scss`; the one `#quartz-body` grid
rule; `quartz.layout.ts` with empty `left`/`right`; `GameCultContent.tsx`;
`docs/brand-design-language.md ## Layout`.
### Soul's findings after home-flat and dead-card-css (two more cuts)
**`github-hit-overlap`** (`site-masthead:finding:cut-home-flat.s1.github-hit-overlap`,
Low). At 360 and 375 the title is 1.9rem, so each community box is 0.92em
(27.97px) and the row gap 0.35em (10.64px): neighbour centres are 38.6px apart
while each `::after` hit area is 44px wide, so Discord's hit area covers the
right 5.4px of GitHub's (22 of 121 sampled taps on GitHub opened Discord).
Cut `community-hit-gap` (`docs/masthead-cut-community-hit-gap.spec.json`):
a gap floor, not clipped hit areas. Clipping to the midpoint would keep the
row tight but shrink the target below 44px exactly where fingers are, and it
needs a second geometry (half-gap offsets) that must agree with the first.
The floor states the invariant once: `--gamecult-hit: 44px` on the row, read
by the `::after` box and by `gap: max(0.35em, calc(var(--gamecult-hit) + 1px
- 0.92em))`. At desktop sizes the calc is negative and the em gap wins
unchanged; at 1.9rem the gap is 17px and centres are 45px apart. One line.
**`doc-tree-cards-unowned`**
(`site-masthead:finding:cut-dead-card-css.s1.doc-tree-cards-unowned`, Medium,
pre-existing). Map r3 row 26 listed `.gamecult-doc-tree-*` as dead because no
built page carries the classes; `repo-doc-tree.js` builds them at runtime into
the tour's Sai card after the doc-tree choice: a filled, bordered pitch box and
a grid of filled, bordered repo boxes. The map was wrong; they are live. Cut
`doc-tree-flat` (`docs/masthead-cut-doc-tree-flat.spec.json`): under
`no-cards` the pitch is an aside and takes a left rule in its own amber with no
fill; the repo boxes are rows and each takes `border-top: 1px solid
var(--gamecult-rule)`. The Sai card they sit in is the player's float chrome
(row 23) and is untouched; a card inside a float is still a card. The one-rule
and no-cards invariants are unchanged; this is the inventory corrected.

View file

@ -0,0 +1,196 @@
{
"campaign": "site-masthead",
"cut": "column-align",
"revision": 1,
"title": "Column align: one width token --gamecult-column (72rem) is .page's max-width everywhere; the studio-page and ritual caps that centred content inside the column go; /Thing's frame reads the token",
"repo": "GameCult/gamecult-site",
"branch": "main",
"base": "535d170",
"depends_on": [
"sidebars-gone"
],
"first": [
"Map: docs/masthead-campaign.md, section 'One column' (map revision 4), facts C1, C7, C8 and the paragraph 'One column'. Ruling: operator-chromeless-column ('aligned like it is on the pages with sidecars'). Follow-up: site-masthead:follow_up:full-width-content, which this cut resolves. Based on 535d170; after sidebars-gone every page is one grid column and custom.scss is about 300 lines shorter. Re-read by selector.",
"The misalignment (C1): .page is max-width 1680px (33-37) and .gamecult-studio-page centres the article at 72rem inside it (2013-2017), so on / and /Projects the masthead (full .center width) and the article (72rem, centred) have different left edges. The ritual essays do the same with article { max-width: 980px; margin: 2rem auto 4rem } (148-156). The fix is not to centre the masthead too; it is to make the column the content's width, so nothing is centred inside it.",
"Mechanism: body { --gamecult-column: 72rem; } (1152px, the studio pages' current measure). .page { max-width: var(--gamecult-column); } keeps its gutters (padding 0 1.2rem 2.5rem; the engine's #quartz-body padding below $desktop and the mobile 0.7rem stay). Then .page-header, article and the engine footer are each the column's full width and share its edges. .gamecult-studio-page loses max-width and margin-inline (its --gamecult-studio-copy token stays). The ritual article loses max-width: 980px and its margin becomes 2rem 0 4rem; the paper's measure is its own two text columns (column-count: 2 at 540) and the 760px caps on article h1 and .ritual-paper-titleblock stay as type measures. .page > #quartz-body .center, footer { max-width: none } (89-92) says what the engine's max-width: 100% already says in one column; delete it and confirm .center still equals the grid column.",
"/Thing: the deck stays full-bleed (.page { max-width: none; padding: 0 } in the Thing block is untouched); --thing-frame becomes calc(var(--gamecult-column) + 2 * var(--thing-inset)) so the masthead and footer boxes on /Thing are the same box as .page everywhere else. No other literal page width remains.",
"Why 72rem and not the engine's or 1680: the follow-up asks that content fill the width 'where reasonable'; 72rem is the measure the studio pages already chose for prose and media side by side, prose at 1152px is already wide, and the token makes the site's width one number to change after the operator sees it. Not a fork.",
"Brand doc: a '## Layout' section after '## Surfaces': the site is one centred column, --gamecult-column (72rem) on body, .page's max-width; the masthead, article and footer share its edges on every page; nothing is centred inside it; a full-bleed surface (the Thing deck, the VN on tour/Pitch) may escape the column while its masthead and footer keep the frame; the remaining caps (760px on the ritual h1 and title block, 68ch on the tagline) are type measures, not chrome. This is the Layout section the follow-up asked for."
],
"deletes": [
{
"path": "site/quartz/styles/custom.scss",
"lines": 1,
"note": ".page max-width: 1680px (35) replaced by the token (counted as 1 removed, 1 added)."
},
{
"path": "site/quartz/styles/custom.scss",
"lines": 4,
"note": ".page > #quartz-body .center, .page > #quartz-body footer { max-width: none } (89-92) deleted whole."
},
{
"path": "site/quartz/styles/custom.scss",
"lines": 1,
"note": "ritual article max-width: 980px (150) deleted; margin (151) becomes 2rem 0 4rem."
},
{
"path": "site/quartz/styles/custom.scss",
"lines": 2,
"note": ".gamecult-studio-page max-width: 72rem and margin-inline: auto (2015-2016) deleted; the rule keeps --gamecult-studio-copy."
},
{
"path": "site/quartz/styles/custom.scss",
"lines": 1,
"note": "--thing-frame: calc(1680px + ...) (1045) replaced by the token form (1 removed, 1 added)."
}
],
"keeps_moves": [
".page keeps position: relative and padding 0 1.2rem 2.5rem; the mobile .page padding 0 0.7rem 1.8rem stays; the engine's #quartz-body padding below $desktop stays.",
"The Thing block keeps --thing-inset, .page max-width none / padding 0, the stack grid, the header and footer rules; only the frame's literal changes.",
"article h1 and .ritual-paper-titleblock 760px, the tagline's 68ch, .gamecult-studio-page > p 76ch: type measures, unchanged.",
"The tour/Pitch block (.page max-width none, 100svh) is unchanged."
],
"adds": [
"custom.scss body: --gamecult-column: 72rem; beside --gamecult-rule and --gamecult-wash, with a one-line comment: the site's one column; .page's max-width; the masthead, article and footer share its edges.",
"custom.scss .page: max-width: var(--gamecult-column);",
"custom.scss ritual article: margin: 2rem 0 4rem;",
"custom.scss Thing block: --thing-frame: calc(var(--gamecult-column) + 2 * var(--thing-inset));",
"docs/brand-design-language.md: '## Layout' section after '## Surfaces' (about 10 lines, content in first[5])."
],
"file_changes": [
{
"location": {
"path": "site/quartz/styles/custom.scss",
"line": 10,
"end_line": 37
},
"change": "body declares --gamecult-column; .page max-width reads it."
},
{
"location": {
"path": "site/quartz/styles/custom.scss",
"line": 89,
"end_line": 92
},
"change": "center/footer max-width none deleted."
},
{
"location": {
"path": "site/quartz/styles/custom.scss",
"line": 148,
"end_line": 156
},
"change": "ritual article: 980px cap deleted; margin block only."
},
{
"location": {
"path": "site/quartz/styles/custom.scss",
"line": 1045,
"end_line": 1045
},
"change": "--thing-frame reads the token."
},
{
"location": {
"path": "site/quartz/styles/custom.scss",
"line": 2013,
"end_line": 2017
},
"change": "studio page cap and centring deleted."
},
{
"location": {
"path": "docs/brand-design-language.md",
"line": 111,
"end_line": 112
},
"change": "Layout section inserted after Surfaces."
}
],
"authority_map": {
"owner": "custom.scss body owns the site's width through --gamecult-column; .page is the only rule that applies it as a width; the Thing block derives its frame from it.",
"inputs": [
"--gamecult-column",
"the gutters (.page padding; the engine's #quartz-body padding below $desktop; --thing-inset on /Thing)"
],
"outputs": [
"on every page the masthead, the article and the site footer have the same left and right edges, the column's; on /Thing the deck is full-bleed and the masthead and footer keep the column's frame"
],
"derived_state": [
"the masthead's, article's and footer's widths are derived from the column; .gamecult-studio-page and the ritual article are no longer owners of a width",
"--thing-frame is derived from --gamecult-column and --thing-inset; no literal page width exists",
"full-width-content is resolved: the column is the one width; the 760px and 68ch caps are type measures named in the brand doc"
],
"forbidden_writers": [
"no max-width with an auto margin on an article, page class or .center (the Thing footer's margin-inline: auto centres the frame in the full-bleed page and is the one exception; the ritual h1 and title block centre a heading, not a box)",
"no literal 1680px or 72rem outside the token declaration; no second width token",
"no change to the grid rule, the sidebars (gone), the wash, the pills, the masthead markup or the engine"
],
"shared_paths": [
"every page's .page reads the same token; /Thing reads it through --thing-frame; the same Deploy Quartz workflow"
],
"deletion_line": "The two caps, the centring, the center/footer override and the two literal widths are deleted in the first commit; the token and the three reads are written in the same commit so the build never has no width."
},
"verification": {
"builds": [
"Deploy Quartz green on the landing commit: gh run list -R GameCult/gamecult-site -w \"Deploy Quartz\" -L 1"
],
"tests": [
{
"name": "at 1440 on nine page types the rects of .page-header, .center > article and #quartz-body > footer share left and right edges within 1px and are 1152px wide",
"pins": "Pages: /, /Projects, /Blog, /Blog/hello-world, /Docs/Architecture-and-Evidence, a ritual essay, the colossus post, /dossier, /Graph. the operator's complaint: masthead and content aligned on every page, the home and project pages included."
},
{
"name": "at 375 on the same pages: the same three rects share edges and scrollWidth equals innerWidth",
"pins": "one column on phones, no overflow."
},
{
"name": "at 1920 on /Thing: .center > article is viewport-wide (full-bleed deck); .page-header and #quartz-body > footer are 1152px plus two gutters wide and share edges with each other",
"pins": "the deck escapes the column; its chrome keeps the frame."
},
{
"name": "at 1440 on a ritual essay: article width equals .center width; the paper's two text columns render; article h1 is still centred at 760px",
"pins": "the 980px cap is gone; type measures stay."
},
{
"name": "git diff base..head --stat: custom.scss and docs/brand-design-language.md only; custom.scss net about -5",
"pins": "one token, three reads, two caps and one override deleted."
}
],
"negative": [
{
"pattern": "1680px",
"scope": "site/quartz/styles/custom.scss: no match."
},
{
"pattern": "72rem",
"scope": "site/quartz/styles/custom.scss: exactly one match, the --gamecult-column declaration."
},
{
"pattern": "max-width:[^;]*;[^}]*margin(-inline)?:[^;]*auto",
"scope": "site/quartz/styles/custom.scss, multiline: matches only the Thing footer rule and the ritual article h1 / .ritual-paper-titleblock rules."
},
{
"pattern": "gamecult-action|gamecult-repo-link|gamecult-titlebar|gamecult-nav-link|GameCult-Quartz|sidebar|--gamecult-wash",
"scope": "git diff base..head changed lines: no match."
}
],
"operator": [
"open / and /Projects and say whether the masthead now sits on the content; then say whether 72rem is the width you want (one number on body)"
]
},
"estimate": {
"lines_added": 15,
"lines_removed": 9,
"dependencies_added": [],
"dependencies_removed": [],
"formats_added": [],
"formats_removed": [],
"targets_added": [],
"targets_removed": []
},
"rulings": [
"site-masthead:ruling:operator-chromeless-column"
],
"questions": []
}

View file

@ -0,0 +1,123 @@
{
"campaign": "site-masthead",
"cut": "community-hit-gap",
"revision": 1,
"title": "Community hit gap: the community row's gap is never smaller than the distance that keeps neighbouring 44px hit areas apart, so no two hit areas cross at any title size",
"repo": "GameCult/gamecult-site",
"branch": "main",
"base": "535d170",
"depends_on": [],
"first": [
"Finding: site-masthead:finding:cut-home-flat.s1.github-hit-overlap (Low). At 360 and 375 wide the title is 1.9rem, so each community box is 0.92em = 27.97px wide and the row gap 0.35em = 10.64px; neighbour centres are 38.6px apart while each ::after hit area is 44px wide, so Discord's hit area covers the right 5.4px of GitHub's and 22 of 121 sampled taps on GitHub open Discord.",
"Rules: .gamecult-titlebar-community (custom.scss 725-733: gap 0.35em, font-size var(--gamecult-title-size)); .gamecult-nav-wordmark::after, .gamecult-nav-icon::after (754-763: width and height max(100%, 44px), centred). --gamecult-title-size is clamp(2.1rem, 4vw, 3.3rem) (645) and 1.9rem under $mobile (1351).",
"Chosen: a gap floor, not clipped hit areas. Clipping each hit area to the midpoint keeps the row tight but makes the target smaller than 44px (WCAG 2.5.8's floor) exactly where fingers are, and it needs a second geometry (half-gap offsets) that must agree with the first. A gap floor keeps every target 44px square and states the invariant in one place: neighbouring centres are at least the hit size apart. One line changes.",
"Mechanism: the hit size becomes a token on the row, --gamecult-hit: 44px, read by the ::after rule (max(100%, var(--gamecult-hit))) and by the gap: gap: max(0.35em, calc(var(--gamecult-hit) + 1px - 0.92em)). At desktop sizes 0.92em exceeds 44px, the calc is negative and 0.35em wins, so nothing changes; at 1.9rem the gap becomes 17.03px, centres are 45px apart, and the hit areas do not touch. 0.92em is the box width named in .gamecult-nav-icon (750); the wordmark is wider, so its neighbour distance is larger still.",
"Not this cut: the glyph sizes, the glow, the title size, the wordmark's own width, and anything outside the community row."
],
"deletes": [
{
"path": "site/quartz/styles/custom.scss",
"lines": 1,
"note": "gap: 0.35em (728) replaced by the floored gap (1 removed, 1 added)."
},
{
"path": "site/quartz/styles/custom.scss",
"lines": 2,
"note": "width/height max(100%, 44px) (760-761) replaced by the token form (2 removed, 2 added)."
}
],
"keeps_moves": [
"The community row's wrap, align-items, margin-left: auto, flex and em font-size: unchanged.",
"The ::after position, centring transform and content: unchanged; the comment above it gains the gap sentence.",
"The box and glyph sizes (0.92em, 0.62em, 2.44em x 0.34em) and the hover glow: unchanged."
],
"adds": [
"custom.scss .gamecult-titlebar-community: --gamecult-hit: 44px; and gap: max(0.35em, calc(var(--gamecult-hit) + 1px - 0.92em));",
"custom.scss ::after: width: max(100%, var(--gamecult-hit)); height: max(100%, var(--gamecult-hit));",
"custom.scss comment above the ::after rule, one sentence: the row's gap is floored so neighbouring hit areas never cross (centres at least --gamecult-hit + 1px apart)."
],
"file_changes": [
{
"location": {
"path": "site/quartz/styles/custom.scss",
"line": 721,
"end_line": 763
},
"change": "community row: hit token and floored gap; ::after reads the token; comment extended."
}
],
"authority_map": {
"owner": "custom.scss .gamecult-titlebar-community owns the hit size and the neighbour distance; the ::after rule derives its box from the same token.",
"inputs": [
"--gamecult-title-size (the em base)",
"--gamecult-hit"
],
"outputs": [
"at every width each community link has a 44px-square hit area and no two hit areas overlap"
],
"derived_state": [
"the gap at small title sizes is derived from the hit size and the box width; at large sizes the em gap wins unchanged",
"the hit box is derived from --gamecult-hit; 44px appears once"
],
"forbidden_writers": [
"no media query, no per-width gap literal, no clipping of the ::after boxes, no change to glyph or box sizes",
"no change outside .gamecult-titlebar-community and the two ::after lines"
],
"shared_paths": [
"the same masthead on every page; the same Deploy Quartz workflow"
],
"deletion_line": "The literal 44px (twice) and the bare 0.35em gap are replaced in one commit; nothing else is added."
},
"verification": {
"builds": [
"Deploy Quartz green on the landing commit: gh run list -R GameCult/gamecult-site -w \"Deploy Quartz\" -L 1"
],
"tests": [
{
"name": "at 360x740 and 375x812 on /: no two adjacent community links' ::after hit rects intersect, and each is at least 44px wide and tall",
"pins": "Rect from getComputedStyle(el, '::after') width/height around the element's centre. the finding: no cross, no shrink."
},
{
"name": "the finding's probe rerun: 121 points sampled across GitHub's hit area at 375 all elementFromPoint to the GitHub anchor",
"pins": "0 of 121 open Discord (was 22)."
},
{
"name": "at 1440 on /: the community row's computed gap equals 0.35em of the title size (the floor is inactive) and the row's width is unchanged from base",
"pins": "desktop byte-identical."
},
{
"name": "git diff base..head --stat: custom.scss only, net about +3",
"pins": "one token, one floored gap."
}
],
"negative": [
{
"pattern": "44px",
"scope": "site/quartz/styles/custom.scss: exactly one match, the --gamecult-hit declaration."
},
{
"pattern": "gamecult-titlebar-community[^{]*\\{[^}]*gap: 0\\.35em;",
"scope": "site/quartz/styles/custom.scss, multiline: no match (the gap is the floored expression)."
},
{
"pattern": "gamecult-nav-link|sidebar|composite|--gamecult-wash|--gamecult-column",
"scope": "git diff base..head changed lines: no match."
}
],
"operator": []
},
"estimate": {
"lines_added": 5,
"lines_removed": 3,
"dependencies_added": [],
"dependencies_removed": [],
"formats_added": [],
"formats_removed": [],
"targets_added": [],
"targets_removed": []
},
"rulings": [
"site-masthead:ruling:operator-nav-three-links-quiet-icons"
],
"questions": []
}

View file

@ -0,0 +1,194 @@
{
"campaign": "site-masthead",
"cut": "composite-delete",
"revision": 1,
"title": "Composite delete: the compositeSections branch of the page body, its CSS, the dead overview hider and the showCompositeJump frontmatter go; the file becomes GameCultContent.tsx",
"repo": "GameCult/gamecult-site",
"branch": "main",
"base": "535d170",
"depends_on": [],
"first": [
"Map: docs/masthead-campaign.md, section 'One column' (map revision 4), fact C5. Ruling: operator-chromeless-column ('nix the unused composite component'). Line numbers from 535d170; re-read by selector.",
"What is live: site/quartz/components/GameCultCompositeContent.tsx is the pageBody for ContentPage and FolderPage (site/quartz.config.ts 85-90). Its base path (resolveGameCultSourceFile, rebaseSharedSourceElement for contentSource pages, stripTopTagline, the Blog AutoIndexFolder, the folder fallback) renders every page and stays.",
"What is dead, prove each before cutting: (a) no file under GameCult/ sets compositeSections (rg -l compositeSections GameCult returns nothing), so getCompositeSections always returns [] and the sections.length > 0 branch (lines 228-266) never renders; (b) .gamecult-composite-* CSS (custom.scss 1744-1891 and the mobile block 2202-2223) styles only that branch, except .gamecult-composite-overview; (c) .gamecult-composite-overview > h2, > ul (1754-1757) hides nothing: tour.md carries the class (line 62) but its <h2>s sit inside .gamecult-vn-source-card divs and the file has no top-level ## heading or list, so in the built /tour HTML article.gamecult-composite-overview has zero direct h2 or ul children; (d) showCompositeJump is read only by the dead branch (index.md 5, Pitch.md 5, tour.md 5).",
"Rename: with the branch gone the file's name lies. git mv to GameCultContent.tsx, the component to GameCultContent, and the import in quartz.config.ts follows. The Options type (fallback: content | folder) stays.",
"Imports that become unused in the file and go with the branch: ComponentChildren stays (baseContent), normalizeHastElement and resolveGameCultReferenceSlug leave (used only by buildSectionContent/getCompositeSections). resolveGameCultReferenceSlug stays exported from gamecult.ts (resolveGameCultSourceFile uses it).",
"Not this cut: the AutoIndexFolder sidebarTagline/sidebarSummary options in the same file and anything sidebar; cut sidebars-gone takes them. .quartz-build/ is the ignored build staging; never edit it."
],
"deletes": [
{
"path": "site/quartz/components/GameCultCompositeContent.tsx",
"lines": 118,
"note": "CompositeSection type (28-34), buildSectionContent (69-137), getCompositeSections (139-166), the sections/showCompositeJump reads (203-204) and the sections.length > 0 render (228-266); imports normalizeHastElement and resolveGameCultReferenceSlug. The sections.length === 0 guard collapses: the three fallback returns become the body."
},
{
"path": "site/quartz/styles/custom.scss",
"lines": 148,
"note": "1744-1891 whole: body[data-slug=\"tour\"] .gamecult-composite-sections, .gamecult-composite-page, .gamecult-composite-overview (dead hider), -jump, -sections, -section, -divider, -shell, -shell.has-media, -media (4 rules), -copy, -header, -header h2, the min-width trio, -body rules, and the @container block."
},
{
"path": "site/quartz/styles/custom.scss",
"lines": 22,
"note": "2202-2223 inside @media ($mobile): the five .gamecult-composite-* rules deleted; .gamecult-feature-grid and the rules after it stay."
},
{
"path": "GameCult/tour.md",
"lines": 2,
"note": "cssclasses: - gamecult-composite-overview (61-62) deleted whole (the class has no other value)."
},
{
"path": "GameCult/index.md",
"lines": 1,
"note": "showCompositeJump: false (line 5)."
},
{
"path": "GameCult/Pitch.md",
"lines": 1,
"note": "showCompositeJump: false (line 5)."
},
{
"path": "GameCult/tour.md",
"lines": 1,
"note": "showCompositeJump: false (line 5)."
}
],
"keeps_moves": [
"git mv site/quartz/components/GameCultCompositeContent.tsx site/quartz/components/GameCultContent.tsx; the default export's inner component is GameCultContent; quartz.config.ts line 4 imports GameCultContent and lines 85-90 call it.",
"rebaseSharedSourceElement, resolveGameCultSourceFile, stripTopTagline, the Blog AutoIndexFolder instance, the folder fallback and the article class list: unchanged.",
"docs/gamecult-quartz-extraction-plan.md mentions the composite page as history; untouched."
],
"adds": [],
"file_changes": [
{
"location": {
"path": "site/quartz/components/GameCultCompositeContent.tsx",
"line": 1,
"end_line": 271
},
"change": "composite branch deleted; file renamed GameCultContent.tsx; component renamed."
},
{
"location": {
"path": "site/quartz.config.ts",
"line": 4,
"end_line": 90
},
"change": "import and the two pageBody calls use GameCultContent."
},
{
"location": {
"path": "site/quartz/styles/custom.scss",
"line": 1744,
"end_line": 1891
},
"change": "all composite rules and the @container block deleted."
},
{
"location": {
"path": "site/quartz/styles/custom.scss",
"line": 2202,
"end_line": 2223
},
"change": "mobile composite rules deleted."
},
{
"location": {
"path": "GameCult/tour.md",
"line": 5,
"end_line": 62
},
"change": "showCompositeJump and the cssclasses block deleted."
},
{
"location": {
"path": "GameCult/index.md",
"line": 5,
"end_line": 5
},
"change": "showCompositeJump deleted."
},
{
"location": {
"path": "GameCult/Pitch.md",
"line": 5,
"end_line": 5
},
"change": "showCompositeJump deleted."
}
],
"authority_map": {
"owner": "GameCultContent.tsx owns the article body of every content and folder page; it has one shape, article.popover-hint around the page's own tree (or the Blog index, or the folder listing).",
"inputs": [
"the page's htmlAst, or its contentSource file's",
"the fallback option from quartz.config.ts"
],
"outputs": [
"one article per page; no composite wrapper, jump nav, section shell or divider exists in any built page"
],
"derived_state": [
"compositeSections and showCompositeJump are read by nothing and are deleted from content, not left inert",
"the class gamecult-composite-overview is emitted by nothing and styled by nothing"
],
"forbidden_writers": [
"no composite string in site/ or GameCult/ after the cut (the extraction-plan doc under docs/ is history and exempt)",
"no change to the base render path, the Blog AutoIndexFolder options, the sidebar code, the masthead or the engine"
],
"shared_paths": [
"ContentPage and FolderPage emitters share the one component; the same Deploy Quartz workflow"
],
"deletion_line": "The branch and its CSS are deleted in the first commit; the rename is the second; nothing is added."
},
"verification": {
"builds": [
"Deploy Quartz green on 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": "before the cut, on the built /tour: document.querySelectorAll('article.gamecult-composite-overview > h2, article.gamecult-composite-overview > ul').length is 0",
"pins": "the hider is proven dead before it is deleted."
},
{
"name": "after the cut, on /, /Projects, /tour, /Blog, /Docs/Architecture-and-Evidence, /Blog/hello-world: document.querySelector('[class*=\"composite\"]') is null and the article count is 1",
"pins": "no composite DOM survives and every page still renders one article."
},
{
"name": "/tour still plays: .sai-player is present and the VN source cards are in the DOM",
"pins": "the tour page did not depend on the class."
},
{
"name": "git diff base..head --stat: the rename, quartz.config.ts, custom.scss, tour.md, index.md, Pitch.md only; custom.scss net about -170, the component about -118",
"pins": "The diff shows GameCultCompositeContent.tsx renamed to GameCultContent.tsx with similarity. a subtraction cut with one rename."
}
],
"negative": [
{
"pattern": "composite|Composite",
"scope": "rg -i over site/ and GameCult/ (not docs/, not .quartz-build/): no match."
},
{
"pattern": "showCompositeJump|compositeSections",
"scope": "rg over the whole repo except docs/ and .quartz-build/: no match."
},
{
"pattern": "sidebar|Sidebar|gamecult-titlebar|GameCult-Quartz",
"scope": "git diff base..head changed lines: no match (the sidebar options in the same file are the next cut's)."
}
],
"operator": []
},
"estimate": {
"lines_added": 3,
"lines_removed": 293,
"dependencies_added": [],
"dependencies_removed": [],
"formats_added": [],
"formats_removed": [],
"targets_added": [],
"targets_removed": []
},
"rulings": [
"site-masthead:ruling:operator-chromeless-column"
],
"questions": []
}

View file

@ -0,0 +1,119 @@
{
"campaign": "site-masthead",
"cut": "doc-tree-flat",
"revision": 1,
"title": "Doc tree flat: the runtime-built pitch box and repo boxes inside the tour's Sai card become a left-ruled aside and top-ruled rows; map r3 wrongly listed them dead",
"repo": "GameCult/gamecult-site",
"branch": "main",
"base": "535d170",
"depends_on": [],
"first": [
"Finding: site-masthead:finding:cut-dead-card-css.s1.doc-tree-cards-unowned (Medium, pre-existing). On /tour, after the player takes the doc-tree choice, the Sai DOM card shows a filled, bordered pitch box and a grid of filled, bordered repo boxes. GameCult/static/interactive/gamecult-compound/repo-doc-tree.js builds them at runtime into [data-gamecult-doc-tree] (element names at lines 23-99: section.gamecult-doc-tree-pitch, header.gamecult-doc-tree-header, div.gamecult-doc-tree-repos, details.gamecult-doc-tree-repo with a summary and div.gamecult-doc-tree-repo-body, ul.gamecult-doc-tree-list). Map r3 row 26 called the gamecult-doc-tree-* rules dead because no built page carries the classes; the script does. Ruling: operator-no-cards-except-floats.",
"Rules (custom.scss, by selector): .gamecult-doc-tree-pitch (1671-1677: margin, padding, 1px amber border, 8px radius, amber fill); .gamecult-doc-tree-pitch h3 (1679-1687, amber label); .gamecult-doc-tree-repos (1689-1696, the scrolling grid); .gamecult-doc-tree-repo (1698-1702: 1px sky border, 8px radius, dark fill); summary (1704-1711); count/path/overflow (1713-1718); list, li, a, path (1720-1742). Nothing in the Sai player's own CSS styles these classes.",
"Classification under no-cards: the pitch is an aside (text), so it takes the site's aside treatment, one left rule in its accent and no fill; the repo boxes are rows in a list, so each takes the top rule, like the blog index and the folder listing. The Sai card they sit in is the player's own float chrome (map r3 row 23) and is untouched; a card inside a float is still a card.",
"The amber rgba(255,198,120,...) is the pitch's own accent, kept on its h3 and its left rule; the repo rows take --gamecult-rule (inherited from body through the Sai card). No literal hairline survives (one-rule-token).",
"Not this cut: repo-doc-tree.js, the Sai player, the tour's VN source cards, anything outside the gamecult-doc-tree-* rules."
],
"deletes": [
{
"path": "site/quartz/styles/custom.scss",
"lines": 3,
"note": ".gamecult-doc-tree-pitch: border (1674), border-radius (1675), background (1676) deleted; margin stays; padding becomes left-only."
},
{
"path": "site/quartz/styles/custom.scss",
"lines": 3,
"note": ".gamecult-doc-tree-repo: border (1699), border-radius (1700), background (1701) deleted whole, replaced by the top rule."
}
],
"keeps_moves": [
".gamecult-doc-tree-pitch keeps margin 0.85rem 0; its h3 rule is unchanged (the amber label names the aside).",
".gamecult-doc-tree-repos keeps its grid, gap, max-height and scroll; summary keeps its flex row and cursor; count/path/overflow, list, li, a and path rules unchanged.",
"repo-doc-tree.js and the Sai player's CSS: untouched."
],
"adds": [
"custom.scss .gamecult-doc-tree-pitch: padding: 0 0 0 0.85rem; border-left: 2px solid rgba(255, 198, 120, 0.62); (the aside treatment, as .gamecult-evidence-note).",
"custom.scss .gamecult-doc-tree-repo: border-top: 1px solid var(--gamecult-rule); (the list-row treatment, as .gamecult-blog-card). The grid's gap stays 0.45rem so rows read as separate rules in the two-column grid."
],
"file_changes": [
{
"location": {
"path": "site/quartz/styles/custom.scss",
"line": 1671,
"end_line": 1702
},
"change": "pitch: box deleted, left rule and left padding written; repo: box deleted, top rule written."
}
],
"authority_map": {
"owner": "custom.scss owns the doc tree's grouping through the aside left rule and --gamecult-rule; repo-doc-tree.js owns the markup.",
"inputs": [
"--gamecult-rule (inherited from body)",
"the script's class names"
],
"outputs": [
"on /tour after the doc-tree choice: a left-ruled pitch aside and top-ruled repo rows inside the Sai card, no fill, border box or radius on either"
],
"derived_state": [
"the repo rows' separator is derived from --gamecult-rule; the pitch's accent is its own amber, kept on the label and the rule"
],
"forbidden_writers": [
"no background, border (other than the one left or top rule), border-radius or box-shadow on .gamecult-doc-tree-pitch or .gamecult-doc-tree-repo",
"no change to the script, the Sai player chrome, the VN source cards or anything outside the gamecult-doc-tree-* rules"
],
"shared_paths": [
"the same aside and row treatments as the evidence note and the blog index; the same Deploy Quartz workflow"
],
"deletion_line": "The two boxes are deleted before the two rules are written, in one commit."
},
"verification": {
"builds": [
"Deploy Quartz green on the landing commit: gh run list -R GameCult/gamecult-site -w \"Deploy Quartz\" -L 1"
],
"tests": [
{
"name": "on /tour at 1440 after the doc-tree choice: the pitch has only a 2px amber left rule and each repo row only a 1px top rule at --gamecult-rule; no fill, radius or other border on either",
"pins": "Computed: .gamecult-doc-tree-pitch border-left 2px, other borders 0, background-color transparent, border-radius 0; every .gamecult-doc-tree-repo border-top 1px at the token's colour, other borders 0, background-color transparent, border-radius 0. the finding's two boxes are gone; the aside and rows carry one rule each."
},
{
"name": "the repo details still open and close and the list scrolls inside .gamecult-doc-tree-repos",
"pins": "the script's behaviour did not depend on the boxes."
},
{
"name": "git diff base..head --stat: custom.scss only, net about -4",
"pins": "subtraction with two rules written in place."
}
],
"negative": [
{
"pattern": "gamecult-doc-tree-(pitch|repo)\\s*\\{[^}]*(box-shadow|border-radius|background|border:)",
"scope": "site/quartz/styles/custom.scss, multiline: no match."
},
{
"pattern": "rgba\\(89, 183, 255, 0\\.1\\)",
"scope": "site/quartz/styles/custom.scss, the doc-tree rules: no match."
},
{
"pattern": "sai-|gamecult-vn-source|repo-doc-tree",
"scope": "git diff base..head changed lines and --name-only: no match."
}
],
"operator": [
"play /tour to the doc tree and say whether the shelf still reads as a shelf without its boxes"
]
},
"estimate": {
"lines_added": 3,
"lines_removed": 7,
"dependencies_added": [],
"dependencies_removed": [],
"formats_added": [],
"formats_removed": [],
"targets_added": [],
"targets_removed": []
},
"rulings": [
"site-masthead:ruling:operator-no-cards-except-floats"
],
"questions": []
}

View file

@ -0,0 +1,347 @@
{
"campaign": "site-masthead",
"cut": "sidebars-gone",
"revision": 1,
"title": "Sidebars gone: no layout places a sidebar; the overview component, sidebar data model, TOC transformer, sidebar frontmatter and every sidebar, TOC, backlinks and grid-override rule go; one grid rule stays",
"repo": "GameCult/gamecult-site",
"branch": "main",
"base": "535d170",
"depends_on": [
"composite-delete"
],
"first": [
"Map: docs/masthead-campaign.md, section 'One column' (map revision 4), facts C2, C3, C4 and the paragraph 'No sidebar'. Ruling: operator-chromeless-column ('I also want those sidecars all gone'). Based on 535d170; after composite-delete the page body is GameCultContent.tsx and tour.md's frontmatter is one line shorter. Re-read by selector.",
"Placements (site/quartz.layout.ts): content layout left = DesktopOnly(TableOfContents) (59-64), right = GameCultOverviewSidebar and Backlinks under slug conditions (65-80); list layout left = GameCultOverviewSidebar() (97). Both become left: [], right: []. isIntegratedDossierPage is then unused and goes; isGraphPage, isThingPage, isStandardContentPage, isBlogArticle stay (beforeBody uses them). Plugin.TableOfContents() leaves site/quartz.config.ts transformers (line 78): its only consumer was the TOC component.",
"The engine still renders <div class=\"left sidebar\"> and <div class=\"right sidebar\"> (GameCult-Quartz renderPage.tsx 247-262); both are empty on every page after this cut. The engine is not edited. The site's conditional grid (:empty display none 52-55; the two :has(... :empty) blocks 57-87) is replaced by one unconditional rule written where 52 was: .page > #quartz-body { grid-template-columns: minmax(0, 1fr); grid-template-areas: \"grid-header\" \"grid-center\" \"grid-footer\"; } and .page > #quartz-body > .left.sidebar, .page > #quartz-body > .right.sidebar { display: none; } (that selector, specificity (1,3,0), beats the engine's mobile .sidebar.left { display: flex }; the plain .sidebar form would not).",
"The tagline chain (gamecult.ts 467-508) stays: headerTagline is the page's own quoted first line, else the nearest section index's. Only the carrier changes: findSidebarOverviewNote becomes findSectionNote (same candidates, no sidebarSource lookup) and the context is { headerTagline } only. The Blog literal 'Recent notes, fiction, experiments, and other escaped materials.' moves into GameCult/Blog/index.md as its first body line, *\"...\"*, so extractTopTagline reads it for /Blog and every post; the two code copies (gamecult.ts 498 and the sidebarTagline/sidebarSummary options in GameCultContent.tsx) go. Verify the /Blog article does not also print the line (AutoIndexFolder renders the description intro and the list, not the body tree); if it does, stripTopTagline on the Blog tree is the fix, not a second literal.",
"Delete from gamecult.ts: the buildAutoIndexSidebarData import (6); GameCultSidebarLink, GameCultSidebarGroup, GameCultSidebarData (8-26); the sidebar field of GameCultPageContext (30); FrontmatterSidebarLink, FrontmatterSidebarGroup (33-43); isSidebarLinkActive (154-169); collectLinks (253-277); extractOverviewSummary (279-305); extractOverviewGroups (307-342); extractFrontmatterOverviewGroups (344-408); extractOverviewData (450-465); the sidebar build in buildGameCultPageContext (491-507). resolveGameCultSourceFile loses its field parameter (only contentSource remains; no content sets sidebarSource). isOverviewSlug and overviewCandidates stay under findSectionNote.",
"Content: delete the sidebarGroups blocks from GameCult/index.md (6-51), GameCult/Docs/Architecture-and-Evidence.md (6-29), GameCult/Pitch.md (8-28), GameCult/tour.md (6-60 at base; one less after composite-delete), and every enableToc line (nine files: rg -l enableToc GameCult). Nothing the groups linked moves inline: the masthead nav, the home action row and body links, and the Projects atlas already reach all of it, and /Blog is the post list (map C3).",
"CSS, all in custom.scss, by selector: the :empty and :has grid rules (52-87); .page > #quartz-body .left.sidebar (94-101); the ritual block's grid override and its left/right sidebar rules (127-141) and its five .right.sidebar .toc rules (158-195) and its max-width 760px grid override and right-sidebar hide (570-583); .left.sidebar:has(.gamecult-overview-sidebar) (625-629).",
"CSS, continued: the colossus block's grid override and sidebar hide (1100-1111); .page > #quartz-body .right.sidebar (1128-1135); .toc, .backlinks and their h3 (1137-1159); every .gamecult-overview-* rule (1161-1274); the @media not ($desktop) block holding the left sidebar, overview sidebar and right sidebar rules (1312-1330, the whole block); the .page > #quartz-body grid-template-areas rule inside @media ($mobile) (1333-1340); .gamecult-overview-sidebar-inner inside @media ($mobile) (1384-1386); the two sidebar lines of the tour/Pitch hider selector list (1412-1413). The tour/Pitch block's own grid-template-columns/rows/areas (1402-1409) stay: that block owns the full-screen page.",
"Pills, masthead markup, the engine, the wash and the width caps: untouched (column-align takes the caps)."
],
"deletes": [
{
"path": "site/quartz.layout.ts",
"lines": 26,
"note": "import GameCultOverviewSidebar (5); isIntegratedDossierPage (10); content layout left (59-64) and right (65-80) blocks; list layout left entry (97). Replaced by left: [], right: [] in both layouts."
},
{
"path": "site/quartz.config.ts",
"lines": 1,
"note": "Plugin.TableOfContents(), (78)."
},
{
"path": "site/quartz/components/GameCultOverviewSidebar.tsx",
"lines": 61,
"note": "deleted whole (git rm)."
},
{
"path": "site/quartz/components/gamecult.ts",
"lines": 235,
"note": "the sidebar data model, extractors, active-link test, sidebarSource lookup and the sidebar build listed in first[5]; findSidebarOverviewNote rewritten as findSectionNote; the context returns { headerTagline }."
},
{
"path": "site/quartz/components/GameCultContent.tsx",
"lines": 2,
"note": "the sidebarTagline and sidebarSummary options of the Blog AutoIndexFolder instance (the engine's defaults are then unused by anything on this site)."
},
{
"path": "site/quartz/styles/custom.scss",
"lines": 311,
"note": "the rules listed in first[7]: 52-87 (36), 94-101 (8), 127-141 (15), 158-195 (38), 570-583 (14), 625-629 (5), 1100-1111 (12), 1128-1135 (8), 1137-1159 (23), 1161-1274 (114), 1312-1330 (19), 1333-1340 (8), 1384-1386 (3), 1412-1413 (2); the tour/Pitch selector list keeps its footer, page-header and page-footer lines."
},
{
"path": "GameCult/index.md",
"lines": 47,
"note": "sidebarGroups block (6-51) and enableToc: false (4)."
},
{
"path": "GameCult/Docs/Architecture-and-Evidence.md",
"lines": 25,
"note": "sidebarGroups block (6-29) and enableToc: true (4)."
},
{
"path": "GameCult/Pitch.md",
"lines": 22,
"note": "sidebarGroups block (8-28) and enableToc: false (4)."
},
{
"path": "GameCult/tour.md",
"lines": 56,
"note": "sidebarGroups block (6-60 at base) and enableToc: false (4)."
},
{
"path": "GameCult",
"lines": 5,
"note": "the remaining enableToc lines: dossier.md, stichting.md and the three other files rg -l enableToc GameCult names."
}
],
"keeps_moves": [
"gamecult.ts keeps: ExtractedTagline, taglinePattern, stripSurroundingQuotes, isElement, topLevelElements/normalizeText, normalizeGameCultSlug, resolveGameCultReferenceSlug, fileBySlug, resolveGameCultSourceFile (contentSource only), isOverviewSlug, overviewCandidates, extractTopTagline, stripTopTagline, stripTopHeading, buildGameCultPageContext.",
"The masthead reads gamecult.headerTagline exactly as before (GameCultMasthead.tsx 103); sitePageContext.ts is unchanged.",
"The engine's TableOfContents, Backlinks, DesktopOnly and AutoIndexFolder components and their styles: untouched in GameCult-Quartz; the site simply places none of the first three.",
"custom.scss keeps .page > #quartz-body .center, footer { max-width: none } (89-92) for column-align to judge; the tour/Pitch block keeps its full-screen grid; the Thing block is untouched.",
"Breadcrumbs, ArticleTitle, ContentMeta, GameCultArticleMeta in beforeBody: unchanged."
],
"adds": [
"custom.scss at the old line 52, one rule: .page > #quartz-body { grid-template-columns: minmax(0, 1fr); grid-template-areas: \"grid-header\" \"grid-center\" \"grid-footer\"; } followed by .page > #quartz-body > .left.sidebar, .page > #quartz-body > .right.sidebar { display: none; } with a one-line comment: the site is one column; the engine renders empty sidebar divs that no layout fills.",
"quartz.layout.ts: left: [], right: [] in defaultContentPageLayout and defaultListPageLayout.",
"gamecult.ts: export function findSectionNote(currentSlug, allFiles) returning the first overviewCandidates match with an htmlAst, resolved through resolveGameCultSourceFile (contentSource); buildGameCultPageContext ends with return { headerTagline: currentTaglineText ?? extractTopTagline(sectionNote?.htmlAst)?.text }.",
"GameCult/Blog/index.md: the body line *\"Recent notes, fiction, experiments, and other escaped materials.\"* after the frontmatter (the tagline mechanism every other section index uses)."
],
"file_changes": [
{
"location": {
"path": "site/quartz.layout.ts",
"line": 1,
"end_line": 99
},
"change": "sidebar import, dossier predicate and all left/right placements deleted; left: [], right: []."
},
{
"location": {
"path": "site/quartz.config.ts",
"line": 78,
"end_line": 78
},
"change": "TableOfContents transformer deleted."
},
{
"location": {
"path": "site/quartz/components/GameCultOverviewSidebar.tsx",
"line": 1,
"end_line": 61
},
"change": "file deleted."
},
{
"location": {
"path": "site/quartz/components/gamecult.ts",
"line": 1,
"end_line": 509
},
"change": "sidebar data model and extractors deleted; findSectionNote; context is { headerTagline }."
},
{
"location": {
"path": "site/quartz/components/GameCultContent.tsx",
"line": 170,
"end_line": 180
},
"change": "Blog AutoIndexFolder loses sidebarTagline and sidebarSummary."
},
{
"location": {
"path": "site/quartz/styles/custom.scss",
"line": 52,
"end_line": 101
},
"change": ":empty, :has grid blocks and .left.sidebar deleted; the one grid rule and sidebar hide written."
},
{
"location": {
"path": "site/quartz/styles/custom.scss",
"line": 127,
"end_line": 195
},
"change": "ritual grid override, sidebar rules and toc rules deleted."
},
{
"location": {
"path": "site/quartz/styles/custom.scss",
"line": 570,
"end_line": 583
},
"change": "ritual mobile grid override and right-sidebar hide deleted."
},
{
"location": {
"path": "site/quartz/styles/custom.scss",
"line": 625,
"end_line": 629
},
"change": "overview :has rule deleted."
},
{
"location": {
"path": "site/quartz/styles/custom.scss",
"line": 1100,
"end_line": 1111
},
"change": "colossus grid override and sidebar hide deleted."
},
{
"location": {
"path": "site/quartz/styles/custom.scss",
"line": 1128,
"end_line": 1274
},
"change": "right sidebar, toc, backlinks and overview rules deleted."
},
{
"location": {
"path": "site/quartz/styles/custom.scss",
"line": 1312,
"end_line": 1340
},
"change": "not-desktop sidebar block and mobile grid areas deleted."
},
{
"location": {
"path": "site/quartz/styles/custom.scss",
"line": 1384,
"end_line": 1386
},
"change": "mobile overview inner padding deleted."
},
{
"location": {
"path": "site/quartz/styles/custom.scss",
"line": 1412,
"end_line": 1413
},
"change": "tour/Pitch sidebar hider lines deleted."
},
{
"location": {
"path": "GameCult/index.md",
"line": 4,
"end_line": 51
},
"change": "enableToc and sidebarGroups deleted."
},
{
"location": {
"path": "GameCult/Docs/Architecture-and-Evidence.md",
"line": 4,
"end_line": 29
},
"change": "enableToc and sidebarGroups deleted."
},
{
"location": {
"path": "GameCult/Pitch.md",
"line": 4,
"end_line": 28
},
"change": "enableToc and sidebarGroups deleted."
},
{
"location": {
"path": "GameCult/tour.md",
"line": 4,
"end_line": 60
},
"change": "enableToc and sidebarGroups deleted."
},
{
"location": {
"path": "GameCult/Blog/index.md",
"line": 5,
"end_line": 6
},
"change": "tagline body line added."
},
{
"location": {
"path": "GameCult/dossier.md",
"line": 4,
"end_line": 4
},
"change": "enableToc deleted (and in stichting.md and the other three files rg names)."
}
],
"authority_map": {
"owner": "quartz.layout.ts owns what a page places: nothing beside the centre. custom.scss owns the page grid through one rule. gamecult.ts owns the masthead tagline chain; content owns each tagline, Blog/index.md the blog's.",
"inputs": [
"the page's and its section index's first quoted line",
"the engine's grid areas grid-header, grid-center, grid-footer"
],
"outputs": [
"no sidebar, TOC, backlinks or overview DOM on any page; every page a single grid column at every width",
"the masthead tagline identical to today on every page"
],
"derived_state": [
"the grid is no longer derived from sidebar emptiness (:has, :empty); it is one rule; the slug blocks no longer override it",
"the tagline is derived from content, never from sidebar data; the Blog tagline has one owner, Blog/index.md",
"enableToc, sidebarGroups, sidebarSource, sidebarTagline and sidebarSummary are read by nothing and are deleted, not left inert"
],
"forbidden_writers": [
"no left or right entry in either layout; no component under site/quartz/components named or styled as a sidebar",
"no grid-template-* for #quartz-body outside the one rule and the tour/Pitch full-screen block; no :has or :empty grid rule",
"no change to the engine, the pills, the masthead markup, the wash, .page's width or any width cap"
],
"shared_paths": [
"every page type renders through the one grid rule; ContentPage and FolderPage share GameCultContent; the same Deploy Quartz workflow"
],
"deletion_line": "The placements, the component, the data model, the TOC transformer, the frontmatter and all sidebar CSS are deleted first; the one grid rule, findSectionNote and the Blog tagline line are written after."
},
"verification": {
"builds": [
"Deploy Quartz green on the landing commit: gh run list -R GameCult/gamecult-site -w \"Deploy Quartz\" -L 1",
"optional: .\\scripts\\quartz\\quartz.ps1 build succeeds locally (TypeScript must compile with the removed exports)"
],
"tests": [
{
"name": "on eleven page types at 1440 and 375: no element inside either .sidebar div, no .toc, .backlinks or .gamecult-overview-sidebar, and both .sidebar divs are display none",
"pins": "Pages: /, /Projects, /Blog, /Blog/hello-world, /Docs, /Docs/Architecture-and-Evidence, a ritual essay, the colossus post, /dossier, /Graph, /Thing. Probe: document.querySelectorAll('.sidebar > *, .toc, .backlinks, .gamecult-overview-sidebar').length is 0. nothing beside the centre on any page type."
},
{
"name": "on the same pages at 1440, 1000 and 375: getComputedStyle(#quartz-body).gridTemplateColumns is a single track and .center's width equals #quartz-body's content width",
"pins": "one column at every width, including the engine's tablet and mobile grids."
},
{
"name": "the masthead tagline text on /, /Projects, /Projects/CultLib, /Blog, /Blog/hello-world, /Docs, /Docs/Bifrost, /Graph and /Thing equals the text recorded from the deployed site before the cut",
"pins": "the tagline chain survived its carrier's rename; the Blog literal has one owner."
},
{
"name": "/Blog's article prints the tagline sentence zero times",
"pins": "the Blog/index.md body line is masthead content, not index content."
},
{
"name": "git diff base..head --stat: layout, config, the deleted component, gamecult.ts, GameCultContent.tsx, custom.scss, Blog/index.md and the nine enableToc files only",
"pins": "custom.scss net about -300, gamecult.ts net about -225. a subtraction cut with one rule and one function written."
}
],
"negative": [
{
"pattern": "sidebar|Sidebar|\\.toc\\b|backlinks|TableOfContents|Backlinks|DesktopOnly",
"scope": "rg over site/ (not .quartz-build/): matches only the two selector lines of the new display-none rule and the tour/Pitch block's comment-free selector list, which no longer names sidebars; i.e. the only matches are the display-none rule."
},
{
"pattern": "enableToc|sidebarGroups|sidebarSource|sidebarTagline|sidebarSummary",
"scope": "rg over site/ and GameCult/: no match."
},
{
"pattern": "grid-template-areas",
"scope": "site/quartz/styles/custom.scss: exactly three matches, the one grid rule, the Thing block's stack/foot and the tour/Pitch block."
},
{
"pattern": ":has\\(|:empty",
"scope": "site/quartz/styles/custom.scss: no match."
},
{
"pattern": "gamecult-action|gamecult-repo-link|gamecult-titlebar|gamecult-nav-link|GameCult-Quartz|1680px|72rem|--gamecult-wash",
"scope": "git diff base..head changed lines: no match."
}
],
"operator": [
"open /Docs/Architecture-and-Evidence and /Blog on a laptop and say whether anything the sidebars carried is missed; the map recommends dropping all of it"
]
},
"estimate": {
"lines_added": 24,
"lines_removed": 791,
"dependencies_added": [],
"dependencies_removed": [],
"formats_added": [],
"formats_removed": [],
"targets_added": [],
"targets_removed": []
},
"rulings": [
"site-masthead:ruling:operator-chromeless-column"
],
"questions": []
}

View file

@ -0,0 +1,133 @@
{
"campaign": "site-masthead",
"cut": "wash-home-only",
"revision": 1,
"title": "Wash home only: one intensity token --gamecult-wash multiplies every ground radial's alpha; 1 on / and 0.5 elsewhere; the ritual ground follows the same token",
"repo": "GameCult/gamecult-site",
"branch": "main",
"base": "535d170",
"depends_on": [],
"first": [
"Map: docs/masthead-campaign.md, section 'One column' (map revision 4), facts C6 and the paragraph 'Wash'. Ruling: operator-chromeless-column ('that background wash gets too bright on pages that aren't the homepage'). Line numbers from 535d170; re-read by selector.",
"Surfaces: body (10-29) paints three radials over the navy gradient: orange rgba(255,138,42,.18), violet rgba(109,96,255,.16), sky rgba(89,183,255,.14). The three ritual essays' body block (103-124) paints its own ground: yellow rgba(255,178,30,.15), cobalt rgba(49,88,255,.22), violet rgba(91,54,184,.19) over its own gradient. tour/Pitch cover the body with the VN; /Thing's hero paints .hero-bg in the Eve deck.css and is not the site's wash; the .page::before grid overlay (39-50) is not the wash and is untouched.",
"Mechanism: one token on body, --gamecult-wash: 0.5, and one home override, body[data-slug=\"index\"] { --gamecult-wash: 1; }. Each radial's alpha becomes calc(<its literal> * var(--gamecult-wash)) in modern colour syntax, e.g. rgb(255 138 42 / calc(0.18 * var(--gamecult-wash))). The literals keep their current values so the home page is byte-for-byte the same wash and every other page is half.",
"The Self's heads-up (not a ruling): the operator may later paint the ground with a WebGL shader. The CSS wash stays as the fallback; the shader would read --gamecult-wash as its intensity. So: no per-page wash rule anywhere, no second token, no class toggled by script.",
"Sass: dart-sass emits rgb()/rgba() whose argument contains var() or calc() as plain CSS. Confirm in the built stylesheet (public/index.css after a build, or the deployed CSS) that the calc survives; if Sass rewrote it, use the rgb(... / calc()) form, which it never evaluates. Do not reach for Sass math or a mixin."
],
"deletes": [
{
"path": "site/quartz/styles/custom.scss",
"lines": 3,
"note": "body 10-29: the three literal alphas .18, .16, .14 leave as literals; each radial is rewritten in one line with the calc alpha (counted as 3 removed, 3 added)."
},
{
"path": "site/quartz/styles/custom.scss",
"lines": 3,
"note": "ritual body block 119-124: the three literal alphas .15, .22, .19 leave as literals; each radial rewritten with the calc alpha."
}
],
"keeps_moves": [
"body keeps the navy linear-gradient, color, and --gamecult-rule; the ritual block keeps its own linear-gradient and every --ritual-paper-* token.",
".page::before (the grid overlay), the tour/Pitch VN ground, the Thing deck's .hero-bg: untouched.",
"docs/brand-design-language.md 'The ground is a wash, not a flat fill' (69-84): the scss block is updated to the calc form and one sentence names the token."
],
"adds": [
"custom.scss body: --gamecult-wash: 0.5; declared beside --gamecult-rule, with a one-line comment: the ground's radial intensity; 1 on the home page.",
"custom.scss, directly after the body rule: body[data-slug=\"index\"] { --gamecult-wash: 1; }",
"custom.scss body radials: rgb(255 138 42 / calc(0.18 * var(--gamecult-wash))), rgb(109 96 255 / calc(0.16 * var(--gamecult-wash))), rgb(89 183 255 / calc(0.14 * var(--gamecult-wash))).",
"custom.scss ritual radials: rgb(255 178 30 / calc(0.15 * var(--gamecult-wash))), rgb(49 88 255 / calc(0.22 * var(--gamecult-wash))), rgb(91 54 184 / calc(0.19 * var(--gamecult-wash))).",
"docs/brand-design-language.md, in 'The ground is a wash, not a flat fill': the code block shows the calc form, and one sentence: the radials' intensity is --gamecult-wash on body, 1 on / and 0.5 elsewhere; a page never sets its own radial alpha; the CSS wash is the fallback ground if a shader ever paints it."
],
"file_changes": [
{
"location": { "path": "site/quartz/styles/custom.scss", "line": 10, "end_line": 29 },
"change": "body: --gamecult-wash declared; three radial alphas become calc(literal * var(--gamecult-wash)); home override rule added after the body rule."
},
{
"location": { "path": "site/quartz/styles/custom.scss", "line": 119, "end_line": 124 },
"change": "ritual ground: three radial alphas become calc(literal * var(--gamecult-wash))."
},
{
"location": { "path": "docs/brand-design-language.md", "line": 69, "end_line": 84 },
"change": "wash section: calc form in the code block; one sentence naming --gamecult-wash and the fallback role."
}
],
"authority_map": {
"owner": "custom.scss body owns the ground's intensity through --gamecult-wash; the slug decides only whether the page is home.",
"inputs": [
"body[data-slug] (index or not)",
"the six literal alphas, unchanged"
],
"outputs": [
"the home ground exactly as today; every other page's radials at half alpha, the ritual essays included"
],
"derived_state": [
"every radial alpha on the site is derived from --gamecult-wash; no page rule sets a radial alpha of its own",
"a future shader's intensity uniform would be derived from the same token; the CSS wash is its fallback"
],
"forbidden_writers": [
"no body[data-slug=...] rule touching background or --gamecult-wash other than the one home line",
"no second wash token, no class, no script, no media query for the dimming",
"no change to .page::before, the tour/Pitch VN ground, the Thing deck, the masthead or the engine"
],
"shared_paths": [
"the same body rule every page inherits; the ritual block inherits the token from body; the same Deploy Quartz workflow"
],
"deletion_line": "The six literal alphas are replaced in the same commit the token is declared; nothing else is added."
},
"verification": {
"builds": [
"Deploy Quartz green on the landing commit: gh run list -R GameCult/gamecult-site -w \"Deploy Quartz\" -L 1",
"the built stylesheet contains calc(0.18 * var(--gamecult-wash)) verbatim (Sass passed it through)"
],
"tests": [
{
"name": "on / getComputedStyle(document.body).getPropertyValue('--gamecult-wash') is 1 and the first radial's resolved colour in background-image is rgba(255, 138, 42, 0.18)",
"pins": "the home page is unchanged."
},
{
"name": "on /Projects, /Blog, /Blog/hello-world, /Docs/Architecture-and-Evidence, /Graph and /Thing the token is 0.5 and the first radial resolves to rgba(255, 138, 42, 0.09)",
"pins": "one token dims every non-home page."
},
{
"name": "on a ritual essay the cobalt radial resolves to rgba(49, 88, 255, 0.11)",
"pins": "the scoped ground follows the same token."
},
{
"name": "git diff base..head --stat: custom.scss and docs/brand-design-language.md only; custom.scss net about +5",
"pins": "one token, one override, six rewritten lines."
}
],
"negative": [
{
"pattern": "radial-gradient\\([^)]*rgba?\\([^)]*\\b0\\.(1[0-9]|2[0-9])\\)",
"scope": "site/quartz/styles/custom.scss, the body rule and the ritual body block: no match (every radial alpha goes through calc)."
},
{
"pattern": "data-slug=\"[^\"]*\"\\][^{]*\\{[^}]*--gamecult-wash",
"scope": "site/quartz/styles/custom.scss, multiline: exactly one match, the index override."
},
{
"pattern": "gamecult-titlebar|gamecult-nav-link|sidebar|composite|GameCult-Quartz",
"scope": "git diff base..head changed lines and --name-only: no match."
}
],
"operator": [
"open / then /Blog and say whether 0.5 is the right dimming; it is one number on body"
]
},
"estimate": {
"lines_added": 11,
"lines_removed": 6,
"dependencies_added": [],
"dependencies_removed": [],
"formats_added": [],
"formats_removed": [],
"targets_added": [],
"targets_removed": []
},
"rulings": [
"site-masthead:ruling:operator-chromeless-column"
],
"questions": []
}