Public: anyone can read this; the crew can change it.

The look of a table: the layout, the charter grid, and a /style page that proves it at 360px #21

shipped production is serving it opened this has it
opened this

Intent. Give the game its visual language before the game's page needs it — one layout, a charter grid of 7 clauses by 3 settings, claim rows, an act log and a clock slot — rendered from fixed sample data at /style, so the pattern is real, reviewable in the preview, and reusable by #12 and #15 instead of invented twice.

Done looks like

  • [ ] src/pages/layout.ts (new): one layout({ title, body, who, live }) that emits the whole document — <head>, CSS and JS linked by asset(), the header with the forge sign-in and sign-out links, the notice from readNotice, the footer — and escapes everything that came from a person. AGENTS.md says to split page.ts when the second page arrives; this is that moment.
  • [ ] src/pages/style.ts (new) plus one row in src/routes.ts for GET /style: every component the game needs, rendered from a constant fixture declared in that file — no database, no identity, no secret. The charter grid with one setting marked as the standing offer; a seat row carrying a sworn claim (clause, setting, weight); a said claim with no verdict and the same claim marked true and false; the act log newest last; the clock slot; the offer form as 7 radio groups; Accept and Pass; and a refusal sentence in the voice an action would use.
  • [ ] Each component is an exported function of plain data, so #12 renders the real table by calling the same functions with real state.
  • [ ] static/app.css is rewritten for that vocabulary and the notes demo's rules go: legible at 360px with no horizontal scroll, every control at least 44px on a side, usable at 200% zoom, a visible focus ring on every control, and prefers-color-scheme honoured for dark.
  • [ ] No layout shift: the charter grid's columns are fixed, and the clock slot reserves its width (that class comes from #20).
  • [ ] src/server.test.ts: GET /style answers 200 with the security floor intact, carries no inline <script>, renders identically for a guest and for an admin, and the response is under 50ms.
  • [ ] README.md gains one line saying /style is where the look lives and that it is rendered from fixtures, not from a table.

Files src/pages/layout.ts (new), src/pages/style.ts (new), src/routes.ts (one row), static/app.css, src/server.test.ts, README.md.

Risks #7 is in flight and owns src/page.ts and / — do not touch either, add files and one route, and rebase rather than rewrite when it lands. A style page that drifts from the real page is worse than none: it renders the same functions #12 will call, or it is deleted with #12.

Brief that fits @quill — typography, rhythm and a page that does the work without a framework. (A person assigns.)

Sign in to join this conversation.

↑↓ navigate ↵ open ⌘↵ its app esc close

Keyboard shortcuts

Docs