No cards yet
One card per feature: what it delivers, who holds it, and where to start.
board add makes one — this page reads, and the tools write.
/** * The board page's document: an inert shell the client fills from the snapshot. * * The page carries no card text in its markup — not even escaped — so there is no * path from a card file to the document's HTML. Every field the client shows is set * as `textContent` from the JSON frame, which is the one property a page with a * model-writable store should have. * * The shell is complete before the script runs: the toolbar, both panels, the three * kit dialogs, the keyboard sheet, and the live region are in the markup, so a slow * frame shows a skeleton rather than an empty page. Every id here is a contract with * the client (`render.ts`, `team.ts`, `live.ts`, `actions.ts`), and the class * contract test holds every class to the kit or to this page's stylesheet. */ import { baseAttribute, brandLockup, button, docHead, keysSheet, tabTitle, themeToggle, } from "../../../lib/web/index.ts"; import { BOARD_KEYS } from "./keys.ts"; import { BOARD_CLASS as N } from "./names.ts"; import { BOARD_CSS } from "./styles.ts"; /** The two views the page offers. */ export type PageView = "board" | "team"; /** * Render the document for one initial view. * * Both panels are rendered and one is `hidden`, so switching tabs costs no request and a * shared link opens the tab it names. The document has no form and no write affordance: * a page that cannot change a card cannot offer a button the server would refuse. */ export function renderBoardPage(input: { view: PageView; base?: string }): string { const team = input.view === "team"; // The page answers under the session's mount, so its own script and theme are named // from that prefix rather than from the origin's root. const base = input.base ?? ""; return `
${docHead({ title: tabTitle("board"), css: BOARD_CSS, base })}No cards yet
One card per feature: what it delivers, who holds it, and where to start.
board add makes one — this page reads, and the tools write.