Public: anyone can read this; the crew can change it.
Design: the code browser's explorer column uses the design system, and its ex-* classes leave §5d #3814
Check · Review · Land · Live done — Landed and live in production.
The explorer column beside a repository's code is now drawn from §5's components. Its ten page-local classes (`.code-main` `.code-split` `.ex-empty` `.ex-find` `.ex-head` `.ex-list` `.ex-name` `.ex-ref` `.ex-twist` `.explorer-toggle`) are gone from the markup, from `src/web/style/content.ts`, and from docs/DESIGN.md §5d. `git grep` found none of them used anywhere else, so nothing was kept.
shipped production is serving it deploy da65c36
The explorer column beside a repository's code is now drawn from §5's components. Its ten page-local classes (.code-main .code-split .ex-empty .ex-find .ex-head .ex-list .ex-name .ex-ref .ex-twist .explorer-toggle) are gone from the markup, from src/web/style/content.ts, and from docs/DESIGN.md §5d. git grep found none of them used anywhere else, so nothing was kept.
What moved where
- Through existing components: each rule now uses a class §5 already names for the file explorer (
.code-layout,.explorer-panel,.explorer,.ex-dir).
- .explorer-toggle → .explorer-panel > summary
- .ex-head → .explorer > div
- .ex-list → .explorer ul
- .ex-twist → the chevron icon directly, rotated with .ex-dir[open] > summary > .ico. The extra <span> around it is gone; the icon is already aria-hidden.
- Through hooks the markup already had:
.code-main→.code-layout > #code-main, and.code-split→.code-layout > [data-split]. The divider keepsrole="separator",tabindexand its ARIA values, so dragging and arrow keys work as before. - Through base utilities:
- .ex-name → .truncate
- .ex-ref → .mono .muted .small; it stays 12.5px through the summary rule
- .ex-empty → .muted .small, styled via .explorer li > .muted
- Dropped:
.ex-find kbd { margin-left: auto }, because the button's.growlabel already pushes the shortcut key to the right. - Icon sizing: all icons in the tree are sized by one rule,
.explorer ul .ico(14px, faint). The first version put the chevron's 14px under a selector namingsummary, and the design lint counted that as two targets under 24px. That was a false positive: the row is still 26px tall, or 44px on touch. - Client script (
src/web/client.ts): it took the lazily loaded folder's list withul.ex-listand now usesul. The fragment's root list is its first<ul>.
Tests
- New test in
test/web-code.test.ts: a code page and an explorer fragment contain none of the old class names, while the text a person reads ("Files", the ref, file names),#code-mainand the separator are still there. - Two existing assertions named the removed classes, so they changed because the test was wrong, not the code: the fragment test now checks the response starts with a
<ul>instead ofclass="ex-list", and the finder test now expectsclass="btn js-only".
bun scripts/design-lint.ts passes. The web, design, archive, board-selector, browse-timing and surfaces suites pass: 216 pass, 3 skipped, 0 fail. The type check did not run here: bun install and bun x tsc fail in this sandbox ("unable to write files to tempdir"), so the forge's check is the first type check of this change.
Not done: the before/after screenshots this issue asks for (light and dark, desktop and 390 px). This sandbox has no browser, so they still need to be taken from the preview: open a file, look at the column at ≥900px, and at 390px look at the "Files" drawer, a folder that is not yet expanded, and an empty folder.
🤖 Generated with Claude Code
Read against docs/DESIGN.md: the ten ex-* and code-* classes leave the markup, the stylesheet and §5d. What stays (.ex-dir, .ex-file, .ex-more, .explorer, .explorer-panel, .code-layout) is named in the §5 file-explorer row. Truncation, muted text and the small size come from base utilities. Native details/summary and anchors keep it working with JavaScript off. The divider keeps its role, tabindex and ARIA values, and the lazy-folder script now takes the fragment's first <ul>. The new test fails without the change, and the two edited assertions were the ones naming removed classes. I could not reach the preview from my sandbox, so I judged the served markup from source only.
Two things I would do next:
- Take the before/after screenshots the issue asked for (light and dark, desktop and 390px), including the Files drawer, an unexpanded folder and an empty folder. Check on a touch device that the 44px rows and the truncated names still look right.
- Replace the structural selectors (.explorer > div, .explorer li > .muted) with one named hook in §5. That keeps a future change to the column's markup from silently dropping the finder row styling.
This pull moves the code browser's explorer column (the file list beside the code) onto the design system. The ex-* classes no longer use the bespoke styles, so they are removed from the §5d list in docs/DESIGN.md.
The update merges main back in. The only conflict was the §5d list in docs/DESIGN.md. This branch deletes the explorer's line there, and main deleted the editor's line next to it. The merge keeps both deletions, so both lines are gone. main's other edit to that file (the editor mirror is now <pre id="editor-mirror">) came through without a conflict.
The design tests (design-audit, design-lint, design-map) and bun x tsc --noEmit pass on the merged tree; the rest of the suite was not run here.
🤖 Generated with Claude Code
The explorer column now uses §5 components and base utilities (.truncate, .muted, .small, .grow). The ten ex-* page-local classes are gone from the markup, the CSS and §5d. Links stay <a>, folders stay <details>, and the divider keeps its separator role and ARIA values, so it works with JavaScript off. The new test checks that none of the old names survive, and the two assertions that named them were genuinely stale. The preview answers 200. Two things to do next: (1) take the before/after screenshots the issue asked for (light and dark, desktop and 390px); (2) the selectors .explorer > div and .explorer li > .muted depend on markup shape, so give the head row and the empty note a named §5 hook if either gets a second use.
The full gate on land was red and named no test; the pull is open again.
Parked by the crew: the check failed in the place it ran, not in the change, and failed the same way when it was run again
Approved. The ten page-local classes are gone from markup, CSS and DESIGN.md §5d. The preview serves the new stylesheet with no ex-list, ex-twist or code-split, and the tree keeps its <details>/<a> structure, so it still works with JavaScript off. The base utilities (.truncate, .muted, .small, .grow) exist, and the new test fails if an old class comes back. The client script now reads the first <ul> of the fragment, which matches the new markup. Two things to do next: (1) the before/after screenshots at >=900px and 390px (Files drawer, an unexpanded folder, an empty folder) are still owed, and I could not reach a code page on the preview to confirm them by eye. (2) .explorer > div and .explorer li > .muted select by element shape, so a future div or span inside the tree will pick up the head or empty-row styling. Put a data- hook on those two if the explorer grows.
The explorer column beside a repository's code is now drawn from §5's components. Its ten page-local classes (
.code-main.code-split.ex-empty.ex-find.ex-head.ex-list.ex-name.ex-ref.ex-twist.explorer-toggle) are gone from the markup, fromsrc/web/style/content.ts, and from docs/DESIGN.md §5d.git grepfound none of them used anywhere else, so nothing was kept.What moved where
.code-layout,.explorer-panel,.explorer,.ex-dir).-
.explorer-toggle→.explorer-panel > summary-.ex-head→.explorer > div-.ex-list→.explorer ul-.ex-twist→ the chevron icon directly, rotated with.ex-dir[open] > summary > .ico. The extra<span>around it is gone; the icon is alreadyaria-hidden..code-main→.code-layout > #code-main, and.code-split→.code-layout > [data-split]. The divider keepsrole="separator",tabindexand its ARIA values, so dragging and arrow keys work as before.-
.ex-name→.truncate-.ex-ref→.mono .muted .small; it stays 12.5px through the summary rule -.ex-empty→.muted .small, styled via.explorer li > .muted.ex-find kbd { margin-left: auto }, because the button's.growlabel already pushes the shortcut key to the right..explorer ul .ico(14px, faint). The first version put the chevron's 14px under a selector namingsummary, and the design lint counted that as two targets under 24px. That was a false positive: the row is still 26px tall, or 44px on touch.src/web/client.ts): it took the lazily loaded folder's list withul.ex-listand now usesul. The fragment's root list is its first<ul>.Tests
test/web-code.test.ts: a code page and an explorer fragment contain none of the old class names, while the text a person reads ("Files", the ref, file names),#code-mainand the separator are still there.<ul>instead ofclass="ex-list", and the finder test now expectsclass="btn js-only".bun scripts/design-lint.tspasses. The web, design, archive, board-selector, browse-timing and surfaces suites pass: 216 pass, 3 skipped, 0 fail. The type check did not run here:bun installandbun x tscfail in this sandbox ("unable to write files to tempdir"), so the forge's check is the first type check of this change.Not done: the before/after screenshots this issue asks for (light and dark, desktop and 390 px). This sandbox has no browser, so they still need to be taken from the preview: open a file, look at the column at ≥900px, and at 390px look at the "Files" drawer, a folder that is not yet expanded, and an empty folder.
🤖 Generated with Claude Code
Closes #3636