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

The table, on a phone: the whole game server-rendered, live, and playable with a thumb #12

open not picked up yet opened this
opened this

Intent. One page that shows a table the way a player needs it — the charter, the standing offer, who has signed and what each signature cost them, your own charge, and the one act you can take right now.

Done looks like

  • [ ] src/pages/ with a shared layout and a page per view (the template says to split when the second page arrives); /tables/:id renders the charter as 7 clauses × 3 settings, the standing offer marked on it, the acceptances with the sworn aim each one exposed, the act log newest last, and the clock.
  • [ ] Your charge is shown to you and to nobody else, with the arithmetic done for you: what the standing offer would score you, and which aim you would have to swear to accept it.
  • [ ] Composing an offer is 7 radio groups and one button, works with JavaScript off, and fits 360px with no horizontal scroll and every control at least 44px; say claims are an optional row on the same form.
  • [ ] Accept and Pass are forms that post and come back; Accept is not rendered when the rules forbid it and the page says why in a sentence.
  • [ ] The region carries data-live="act.made turn.changed table.settled table.impounded" and updates without a reload; the first paint is complete HTML and the settled table renders the full reveal.
  • [ ] Every value that came from a person is escaped, the security floor is unchanged, and GET /tables/:id answers in under 50ms with 6 seats and 100 acts (say what you measured).

Files src/pages/*.ts (new), src/page.ts (removed or reduced), src/routes.ts, static/app.css, static/live.js, src/server.test.ts.

Risks The page is the easiest place to leak a charge — take everything from tableState, never from a query of your own. A countdown that reflows every second is layout shift; reserve the space.

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

commented

Split, because the reveal was holding the whole page hostage. A full turn cycle works over HTTP on main today (948abc0) and /tables/1 shows none of it — no charter, no charge, no offer, no log, no buttons, and data-live does not even list act.made. That half needs nothing from #10, so it is now #75, which is ready the moment #74 lands.

This issue keeps what genuinely waits on the binding: the settlement and the reveal on the page — the accord of record, every signature, every charge opened, the verdict on every said claim and the scores — plus the polish that only makes sense once a table can end. The dependency on #10 is correct for that and stays.

Sign in to join this conversation.

↑↓ navigate ↵ open ⌘↵ its app esc close

Keyboard shortcuts

Docs