Public: anyone can read this; the crew can change it.
The browse view's and the studio change page's merge boxes draw §5's components, and the merge-* classes leave their markup #4410
Check · Review · Land · Live done — Landed and live in production.
The browse view's merge box and the studio's wall card are now drawn with §5's components, and the four `merge-*` classes no longer appear in either one's HTML. This changes markup only: the stylesheet rules and docs/DESIGN.md are untouched, and removing those rules is still left to #3867.
shipped production is serving it deploy a5359e9
The browse view's merge box and the studio's wall card are now drawn with §5's components, and the four merge-* classes no longer appear in either one's HTML. This changes markup only: the stylesheet rules and docs/DESIGN.md are untouched, and removing those rules is still left to #3867.
- Browse view (
mergeElsewhereinsrc/web/pages/browse.ts): the box is now acard()with anattntone and themtspacing utility, holding onerow()inside<ul class="list setting-list">.
- The row's lead is the origin's icon, its title is "Merge on <host>.", its meta is the same sentence as before, and its trail is the same outline btn() "Open on the origin".
- .setting-list is §5's way to let a row's sentence wrap and drop its controls below it on a phone, which is what .merge-box/.merge-form used to do.
- This box has no form; it was and still is a single link.
- Studio change page (
wallCardinsrc/web/studio/change.ts, which the pull page also uses): the card'sheadnow holds the shieldicon()and the headline in<strong>. The body holds the explanation as<p class="muted small">and the existing.wall-cellslist. I used a card head rather than a row because a<ul>can't sit inside a row's<span>meta. Nothing is posted from this card. - Tests:
- test/web-browse.test.ts adds a test that renders a live pull. It checks that none of merge-box, merge-form, merge-headline or merge-sub appear, that the box is a toned card around a .setting-list row, and that the title, the whole sentence and the "Open on the origin" link are all there.
- test/policy.test.ts adds checks to the existing wall test: no merge-* names, the headline inside .card-head, and the explanation sentence still present.
No existing test was changed. bun x tsc --noEmit, bun scripts/design-lint.ts, and the browse, policy, studio and pull test files all pass.
To try it: open a live browse of an origin's pull (/origins/:id/r/:owner/:name/pulls/:n) and a pull whose head loosens contract.json.
🤖 Generated with Claude Code
Both merge boxes now use §5 components: card() with attn tone, one row() inside ul.list.setting-list for browse, and card head + muted small body for the wall. The merge-* classes are gone from the markup. The row wraps and drops the outline link under it on a phone. There is one link and no mutation, so the no-JS and keyboard paths are unchanged. The preview answers 200 and the tests assert the new markup. Two things I would do next: (1) land #3867 to delete the now-dead .merge-box rules in style/content.ts:236-253; (2) the wall extra class "wall" has no rule left of its own, so drop it or give it one if nothing styles it. I did not check the live-pull and wall pages on a 360px phone in the preview screenshots.
The browse view's merge box and the studio's wall card are now drawn with §5's components, and merge-box, merge-form, merge-headline and merge-sub no longer appear in either one's HTML. This changes markup only: the stylesheet rules and docs/DESIGN.md are untouched, and removing those rules is still left to #3867. The work is commit 43be20de, already pushed to the branch, which is level with the remote.
- Browse view (
mergeElsewhereinsrc/web/pages/browse.ts): the box is now acard()with anattntone and themtspacing utility, holding onerow()inside<ul class="list setting-list">.
- The row's lead is the origin's icon, its title is "Merge on <host>.", its meta is the same sentence as before, and its trail is the same outline btn() "Open on the origin".
- .setting-list is §5's way to let a row's sentence wrap and drop its controls below it on a phone, which is what .merge-box/.merge-form used to do.
- This box has no form; it was and still is a single link.
- Studio change page (
wallCardinsrc/web/studio/change.ts, which the pull page also uses): the card'sheadnow holds the shieldicon()and the headline in<strong>. The body holds the explanation as<p class="muted small">and the existing.wall-cellslist. I used a card head rather than a row because a<ul>can't sit inside a row's<span>meta. Nothing is posted from this card. - Tests:
- test/web-browse.test.ts adds a test that renders a live pull. It checks that none of the four merge- names appear, that the box is a toned card around a .setting-list row, and that the title, the whole sentence and the "Open on the origin" link are all there.
- test/policy.test.ts adds checks to the existing wall test: no merge- names, the headline inside .card-head, and the explanation sentence still present.
No existing test was changed. bun x tsc --noEmit, bun scripts/design-lint.ts, and the browse, policy, studio and pull test files all pass.
To try it: open a live browse of an origin's pull (/origins/:id/r/:owner/:name/pulls/:n) and a pull whose head loosens contract.json.
🤖 Generated with Claude Code
The browse view's merge box and the studio's wall card are now drawn with §5's components, and the four
merge-*classes no longer appear in either one's HTML. This changes markup only: the stylesheet rules and docs/DESIGN.md are untouched, and removing those rules is still left to #3867.mergeElsewhereinsrc/web/pages/browse.ts): the box is now acard()with anattntone and themtspacing utility, holding onerow()inside<ul class="list setting-list">.- The row's lead is the origin's icon, its title is "Merge on <host>.", its meta is the same sentence as before, and its trail is the same outline
btn()"Open on the origin". -.setting-listis §5's way to let a row's sentence wrap and drop its controls below it on a phone, which is what.merge-box/.merge-formused to do. - This box has no form; it was and still is a single link.wallCardinsrc/web/studio/change.ts, which the pull page also uses): the card'sheadnow holds the shieldicon()and the headline in<strong>. The body holds the explanation as<p class="muted small">and the existing.wall-cellslist. I used a card head rather than a row because a<ul>can't sit inside a row's<span>meta. Nothing is posted from this card.-
test/web-browse.test.tsadds a test that renders a live pull. It checks that none ofmerge-box,merge-form,merge-headlineormerge-subappear, that the box is a toned card around a.setting-listrow, and that the title, the whole sentence and the "Open on the origin" link are all there. -test/policy.test.tsadds checks to the existing wall test: nomerge-*names, the headline inside.card-head, and the explanation sentence still present.No existing test was changed.
bun x tsc --noEmit,bun scripts/design-lint.ts, and the browse, policy, studio and pull test files all pass.To try it: open a live browse of an origin's pull (
/origins/:id/r/:owner/:name/pulls/:n) and a pull whose head loosenscontract.json.🤖 Generated with Claude Code
Closes #4399