Lane 8 page P1: the wiki's renderer, front page and groups (#734) #888

Merged
claude-bot merged 6 commits from build/lane8-p1-pages into main 2026-09-28 03:15:22 +00:00
Collaborator

Part of #734 (lane 8). Stacked on #884 (2b). Frontend only.

⚠️ The render check is still owed. It isn't done yet, so this PR doesn't merge until the shots have been looked at. A follow-up commit will carry the check and any fixes.

What it builds

  • wiki/wikiText.js and WikiText.jsx: the one renderer for the wiki's block syntax: :::gm, :::for, :::party, headings, lists, tables, quotes, code, [[links]], embeds and footnotes.
    • It renders only what the server has already filtered for the reader, and never filters by itself.
    • It isn't mounted yet; P2's article page is its first user.
  • wiki/entryGroups.js: the six browsing groups, with their types, lead lines, icons and per-group colours (WK-132).
  • wiki/PreviewCard.jsx: the compact "page at a glance" row that both pages use.
  • WIKI-1, the front page (pages/wiki/Front.jsx):
    • its own search, scoped to the wiki and rules;
    • "Recently revealed or updated", from 2b's Recent changes (D60);
    • "People you've met";
    • Browse by group;
    • for a GM, "Waiting for you" and the Health counts.
  • WIKI-2, a group (/wiki/g/:group): an A–Z list across the group's types, with type chips and Load more.
  • Contents: "The wiki" gains People, Places, Groups and Things.
  • Search: it gets an optional label, so the wiki's box is named for what it searches.
  • Deleted: WikiFront.jsx. WikiSearch.jsx stays until P2 replaces WikiArticle.jsx, which still imports it.

Departures

These all wait on pages or fields that don't exist yet:

  • No "All recent changes" or "full Health page" links. Those pages are P2 and P4.
  • "Waiting for you" lacks the drawing's session time and duplicate hint. GET /lore/proposals doesn't carry them.
  • "New {type}" doesn't prefill the type. That's P3's editor.

J6

J6's wiki act was edited without being run:

  • the search box's name;
  • search results, which are buttons in the shared Search;
  • the old page's Storyline leftovers, replaced by a wait on "Browse by group".

CI's journeys will verify it.

Checks

  • vitest: 186 files, 2644 passed. eslint: 0 errors.
  • coverage/lane6b.py: unclassified: none.

🤖 Generated with Claude Code

Part of #734 (lane 8). **Stacked on #884 (2b).** Frontend only. **⚠️ The render check is still owed.** It isn't done yet, so this PR doesn't merge until the shots have been looked at. A follow-up commit will carry the check and any fixes. ## What it builds - **`wiki/wikiText.js` and `WikiText.jsx`:** the one renderer for the wiki's block syntax: `:::gm`, `:::for`, `:::party`, headings, lists, tables, quotes, code, `[[links]]`, embeds and footnotes. - It renders only what the server has already filtered for the reader, and **never filters by itself.** - It isn't mounted yet; P2's article page is its first user. - **`wiki/entryGroups.js`:** the six browsing groups, with their types, lead lines, icons and per-group colours (WK-132). - **`wiki/PreviewCard.jsx`:** the compact "page at a glance" row that both pages use. - **WIKI-1, the front page (`pages/wiki/Front.jsx`):** - its own search, scoped to the wiki and rules; - "Recently revealed or updated", from 2b's Recent changes (D60); - "People you've met"; - Browse by group; - for a GM, "Waiting for you" and the Health counts. - **WIKI-2, a group (`/wiki/g/:group`):** an A–Z list across the group's types, with type chips and Load more. - **Contents:** "The wiki" gains People, Places, Groups and Things. - **Search:** it gets an optional `label`, so the wiki's box is named for what it searches. - **Deleted:** `WikiFront.jsx`. `WikiSearch.jsx` stays until P2 replaces `WikiArticle.jsx`, which still imports it. ## Departures These all wait on pages or fields that don't exist yet: - **No "All recent changes" or "full Health page" links.** Those pages are P2 and P4. - **"Waiting for you" lacks the drawing's session time and duplicate hint.** `GET /lore/proposals` doesn't carry them. - **"New {type}" doesn't prefill the type.** That's P3's editor. ## J6 **J6's wiki act was edited without being run:** - the search box's name; - search results, which are buttons in the shared Search; - the old page's Storyline leftovers, replaced by a wait on "Browse by group". CI's journeys will verify it. ## Checks - **vitest:** 186 files, 2644 passed. **eslint:** 0 errors. - **`coverage/lane6b.py`:** unclassified: none. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
WikiText (src/wiki/wikiText.js + WikiText.jsx) parses and renders the block
syntax wiki_text.py produces server-side (:::gm, :::for, :::party, footnotes,
[[links]]) -- built here for P2's article page, tested standalone since no P1
surface renders a full body yet.

pages/wiki/Front.jsx (WIKI-1) replaces WikiFront.jsx: search scoped to the
wiki and the rules (ui/Search gains a `label` prop so it can say so, rather
than inheriting the app bar's "Search this campaign"), Recently revealed or
updated (the top of Recent changes, D60), People you've met, Browse by group,
and a GM's Waiting for you + Wiki health counts.

pages/wiki/Group.jsx (WIKI-2) is a group browsed A to Z at /wiki/g/:group,
merging the group's built types (GET /lore filters by one entry_type; no
backend change this PR) with a chip to narrow and client-side "Load more".

entryGroups.js carries the six groups' types, colours and lead lines.
useContents.js adds People, Places, Groups and Things as Contents entries
(Events and Lore stay reachable only from Browse by group, matching the
drawing). campaigns.js gains fetchWikiRecent/fetchWikiHealth wrappers over
PR 2b's already-merged endpoints.

j6-what-happened.spec.js's wiki act is updated to match the new page (the
search box's name, its results being buttons not links) and stops asserting
the old page's leftover Storyline rendering, which the redesign already moved
off this page (D47). Not run here (never scripts/journeys.sh); flagged for a
check when journeys next run.

WikiSearch.jsx stays: WikiArticle.jsx (P2's) still imports it.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Render-check fixes for WIKI-1/WIKI-2, found comparing the built pages to
lane6b.html:

- Use the existing plural() helper (utils/when.js) so "The wiki · 1 page",
  "1 orphan" and "1 possible duplicate" read right in the singular, instead
  of always taking the drawing's plural literally (Front.jsx, Group.jsx).
- Drop "Review them in Suggested wiki updates" from Waiting for you when
  nothing is waiting — it had nowhere useful to send a GM, and its button
  padding read as a stray indent under "Nothing waiting."'s flush left edge.
- Wiki health's Fold sits under a Section's own <h2>, not directly under
  .doc the way Fold's usual shape does (Home's archived campaigns) — its own
  top rule and margin were doubling the heading's own gap. wiki-health-fold
  (Front.css) zeroes them, same as .doc > .fold:first-child already does for
  the other shape.

Also confirmed, not fixed here: every heading in this build (Wiki's and
already-shipped pages like This week and Storyline alike) renders in a
fallback sans-serif rather than the kit's display face — dist/assets/files/
never gets the fontsource woff2 files Vite's CSS references, so the browser
404s (masked as the SPA's index.html) on every @font-face src. Confirmed
environmental with This week/Storyline shots from the same build; nothing
in src/pages/wiki/* or src/wiki/* to fix for it.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Point 1 of the render-check round was only half environmental: the missing
font file is real and being filed separately, but the *size* was never the
font. Every already-rebuilt page puts the kit's typography scope on its own
Doc — Storyline's <Doc className="qb qb-story">, This week's "qb qb-week",
Settings' "qb qb-set" and so on — because ui/base.css scopes h1-h4's
font-size and font-family (and Tailwind's preflight, loaded first in
index.css, otherwise resets every heading to inherit the body's) to `.qb`.
Front.jsx and Group.jsx never carried it, so "Wiki", "Browse by group",
"People" and the rest of the wiki's headings rendered at body size and
weight regardless of whether the display font itself loaded.

Every <Doc> in both files now carries className="qb qb-wiki", matching the
pattern. Checked for side effects before applying: `.qb` also sets
background/color (var(--paper)/var(--ink), already set the same way one
level up by .app, so redundant but harmless — same as every other page),
the body font/line-height (nothing in Front.css or src/wiki/* sets its own,
and WikiText.css already documents riding on `.qb .prose` for its own block
spacing), and -webkit-font-smoothing. No rule in Front.css, WikiText.css or
PreviewCard.jsx fights any of it.

Confirmed against a rendered Storyline page from the same build
(font-env-storyline_dana_light_1440.png in the scratchpad): Wiki's "Wiki"
and "Browse by group" now match Storyline's "Storyline" and "The story" in
scale and weight. Re-ran axe on WIKI-1 and WIKI-2 (both roles, both themes,
12 scans) — still 0 violations.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Author
Collaborator

The render check is done, and I looked at the shots myself. It checked WIKI-1 and WIKI-2 as Dana and as Priya, in light and dark, at 2560, 1440, 1024 and 390, on a real seeded stack.

Fixed:

  • Page title and section headings rendered at body size. The pages' Docs lacked the kit's .qb typography scope, and Tailwind's preflight resets headings. They now use className="qb qb-wiki", as Storyline and This week do.
  • Plurals: "1 pages", "1 orphans" and "0 possible duplicate".
  • "Waiting for you · 0" offered a review link when there was nothing to review.
  • Wiki health showed a doubled Fold rule and gap under its own heading.

Axe: 12 scans (both pages, both roles, both themes) found 0 violations. vitest passed (2648), and eslint reports 0 errors.

Found along the way: production images ship no web fonts at all. That's filed as #891 and fixed in #892. Until it merges, the shots show the fallback typeface everywhere, not just here.

**The render check is done, and I looked at the shots myself.** It checked WIKI-1 and WIKI-2 as Dana and as Priya, in light and dark, at 2560, 1440, 1024 and 390, on a real seeded stack. **Fixed:** - **Page title and section headings rendered at body size.** The pages' `Doc`s lacked the kit's `.qb` typography scope, and Tailwind's preflight resets headings. They now use `className="qb qb-wiki"`, as Storyline and This week do. - **Plurals:** "1 pages", "1 orphans" and "0 possible duplicate". - **"Waiting for you · 0"** offered a review link when there was nothing to review. - **Wiki health** showed a doubled `Fold` rule and gap under its own heading. **Axe:** 12 scans (both pages, both roles, both themes) found 0 violations. vitest passed (2648), and eslint reports 0 errors. **Found along the way:** production images ship no web fonts at all. That's filed as #891 and fixed in #892. Until it merges, the shots show the fallback typeface everywhere, not just here.
claude-bot changed target branch from build/lane8-2b-feeds to main 2026-09-28 01:55:41 +00:00
Merge main into build/lane8-p1-pages
All checks were successful
CI / Summarisation accuracy eval harness (stub provider) (pull_request) Successful in 1m56s
CI / Backend lint (ruff) (pull_request) Successful in 1m4s
CI / Bot tests and audit (pull_request) Successful in 3m47s
CI / Feedback site tests (pull_request) Successful in 1m32s
CI / Bot/backend version sync (pull_request) Successful in 43s
CI / Does this change touch the recording path? (pull_request) Successful in 35s
CI / Synthetic session harness (no GPU, no LLM) (pull_request) Has been skipped
CI / Docker image build (pull_request) Successful in 1m8s
CI / Backend migration, tests, and audit (pull_request) Successful in 19m40s
CI / Frontend tests, audit, and build (pull_request) Successful in 22m41s
CI / End-to-end journeys (desktop, phone, keyboard-only) (pull_request) Successful in 19m8s
77b4c06eaf
Sign in to join this conversation.
No description provided.