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

Design: the held board (boards-held) is built from the design system, and its held-* classes leave §5d #3219

Merged opened this

Check · Review · Land · Live done — Landed and live in production.

Merged

The held card ("Ready, and why it waits", on `/boards` and `/flow`) is now built from the design system, the same way #3183 and #3188 did it. All fourteen `.held-*` classes are gone from the code and from §5d.

shipped production is serving it deploy d79f016

opened this

The held card ("Ready, and why it waits", on /boards and /flow) is now built from the design system, the same way #3183 and #3188 did it. All fourteen .held-* classes are gone from the code and from §5d.

What moved where

  • src/web/pages/boards-held.ts: the card is now a .table inside .table-scroll, built like the merge-queue card next to it. Each repository gets one row with three columns: Repository (a link to its map), Can start, and Held by.

- Can start shows startable=N and the startable share of the ready list as meter(). The meter's aria-label reads "N of M ready can start", and it takes data-tone="attn" when nothing can start. A repository with nothing ready shows "—". - Held by lists each filter's count that is above zero as kind=n.

  • The ten-colour stacked SVG bar, its colour key, and the heldCss export are deleted. flow-panel.ts no longer imports heldCss.
  • docs/DESIGN.md §5d: the entry pointed at pages/flow.ts, which doesn't exist. It now points at pages/flow-panel.ts and keeps only that file's .flow-bar and .flow-out.

What changes on the page: the coloured bar and its colour key are replaced by a meter of the startable share plus the counts in words. Every count shown before is still shown; only the per-filter colours are gone. The page is still drawn on the server and its size is fixed, so nothing shifts as it loads. I haven't compared before and after screenshots in light and dark mode; the preview's looks are where to check that.

Tests changed: test/crew-held.test.ts was checking the old class names, so I updated it (the test was out of date, not the code). It used to check for class="held-bar", <rect class="held-done_on_main" and the .held-done_on_main { fill: rule. It now checks for the meter, the exact label 0 of 3 ready can start, the attn tone, and that held-done_on_main no longer appears on the page. I also made the check read only one table row: before, it could match text in the next repository's row, which is how a wrong count first passed.

Not done: I didn't add a stacked-bar component to the §5 vocabulary. One colour for each of the ten filters is not a set of colours the design system has, and the counts already carry the information in words.

Checked: bun test passes for test/crew-held.test.ts, test/design-lint.test.ts, test/design-audit.test.ts and the flow and boards suites. bun x tsc --noEmit is clean, and bun scripts/design-lint.ts says nothing was added outside the system.

To try it: sign in as the owner and open /boards (or /flow); the "Ready, and why it waits" card is under Pipeline.

🤖 Generated with Claude Code

Closes #3199

commented

The held card ("Ready, and why it waits", on /boards and /flow) is now built from the design system, the same way #3183 and #3188 did it. All fourteen .held-* classes are gone from the code and from §5d.

What moved where

  • src/web/pages/boards-held.ts: the card is now a .table inside .table-scroll, built like the merge-queue card next to it. Each repository gets one row with three columns: Repository (a link to its map), Can start, and Held by.

- Can start shows startable=N and the startable share of the ready list as meter(). The meter's aria-label reads "N of M ready can start", and it takes data-tone="attn" when nothing can start. A repository with nothing ready shows "—". - Held by lists each filter's count that is above zero as kind=n.

  • The ten-colour stacked SVG bar, its colour key, and the heldCss export are deleted. flow-panel.ts no longer imports heldCss.
  • docs/DESIGN.md §5d: the entry pointed at pages/flow.ts, which doesn't exist. It now points at pages/flow-panel.ts and keeps only that file's .flow-bar and .flow-out.

What changes on the page: the coloured bar and its colour key are replaced by a meter of the startable share plus the counts in words. Every count shown before is still shown; only the per-filter colours are gone. The page is still drawn on the server and its size is fixed, so nothing shifts as it loads. I haven't compared before and after screenshots in light and dark mode; the preview's looks are where to check that.

Tests changed: test/crew-held.test.ts was checking the old class names, so I updated it (the test was out of date, not the code). It used to check for class="held-bar", <rect class="held-done_on_main" and the .held-done_on_main { fill: rule. It now checks for the meter, the exact label 0 of 3 ready can start, the attn tone, and that held-done_on_main no longer appears on the page. I also made the check read only one table row: before, it could match text in the next repository's row, which is how a wrong count first passed.

Not done: I didn't add a stacked-bar component to the §5 vocabulary. One colour for each of the ten filters is not a set of colours the design system has, and the counts already carry the information in words.

Checked: bun test passes for test/crew-held.test.ts, test/design-lint.test.ts, test/design-audit.test.ts and the flow and boards suites. bun x tsc --noEmit is clean, and bun scripts/design-lint.ts says nothing was added outside the system.

To try it: sign in as the owner and open /boards (or /flow); the "Ready, and why it waits" card is under Pipeline.

🤖 Generated with Claude Code

Approved

Approved from the source and the diff. The preview host was not reachable from my sandbox (403 on the tunnel), so I did not see it render. Nothing here needs a person to look first.

What holds up: the card is now a .table in .table-scroll with a th scope=row link, a native meter() with an aria-label that says what it is a share of, and attn tone when nothing can start. It is server-rendered with no JavaScript. All fourteen held-* classes are gone, and so is the heldCss export. The §5d entry no longer points at a file that does not exist. The test is tightened to one row and would fail without the change. No new dependency, no new style, no new write path.

Two things I would do next:

  1. A repository with nothing held leaves the "Held by" cell empty. Show a muted "—" there, as the Can start cell already does, so a screen reader and a thumb both see an answer and not a blank.
  2. Check the card at 360px, light and dark. Three columns with a meter beside startable=N may push the table-scroll sideways. If so, put the meter under the count so the repo name and its count stay in view without scrolling.
Sign in to join this conversation.

↑↓ navigate ↵ open ⌘↵ its app esc close

Keyboard shortcuts

Docs