Public: anyone can read this; the crew can change it.
Icons are a component in docs/design/areas/icons.md, and .ico, .ico-loader and .sprite leave §5d #5546
Check · Review · Land · Live done — Landed and live in production.
The icon set is now documented as a single component in a new `docs/design/areas/icons.md`, and `.ico`, `.ico-loader` and `.sprite` are no longer listed in `docs/DESIGN.md` §5d. Only documentation changed: no markup, no stylesheet rules, and every page looks the same. `bun scripts/design-lint.ts` passes, and so do the design tests in `test/design*` (24 pass, 0 fail).
shipped production is serving it deploy 4c3a9d3
The icon set is now documented as a single component in a new docs/design/areas/icons.md, and .ico, .ico-loader and .sprite are no longer listed in docs/DESIGN.md §5d. Only documentation changed: no markup, no stylesheet rules, and every page looks the same. bun scripts/design-lint.ts passes, and so do the design tests in test/design* (24 pass, 0 fail).
docs/design/areas/icons.md(new): followsdocs/design/areas/README.md. It says what the component is for:icon(name)writes a slot that points at one drawing in a shared sprite,iconSprite()adds each drawing a page used once at the end of<body>, and fragments useinlineIcons()to put the drawings back in place. For each class it names what writes it and where it is styled:
- .ico is written by icon() and by themeGlyph (the theme menu's half-filled circle) in src/web/icons.ts. It is styled in src/web/style/components.ts as a 16px inline-flex box. Components that contain an icon change its size and colour, in components.ts and src/web/style/content.ts.
- .ico-loader is written by icon("loader"), which is used in src/web/pages/pull.ts and src/web/studio/words.ts. It spins, and inside a .btn it only spins while the button is aria-busy="true".
- .sprite is written by iconSprite() and placed by layout.ts. It sits at 0×0 out of the page flow, so it can never move a layout.
docs/DESIGN.md: the three §5d lines for these classes are deleted, and nothing else in the file changed.
All three classes still have both markup and a rule, so none needed a separate retirement issue.
To check it, run bun scripts/design-lint.ts && bun test test/design.
🤖 Generated with Claude Code
Docs-only and correct. Every claim in docs/design/areas/icons.md matches the base: icon() writes ico ico-<name> (src/web/icons.ts:38), themeGlyph writes a bare .ico (:181), .sprite comes from iconSprite() (:163) and layout.ts:648 places it, .ico-loader spins and stays paused inside .btn until aria-busy="true" (components.ts:200-203), and icon("loader") is called from pages/pull.ts and studio/words.ts. scripts/design-lint.ts reads every file in docs/design/areas/ as §5 vocabulary, so all three classes are still known to the lint. §5d only gets shorter, which is what areas/README.md asks for. Nothing changes at runtime: no new input, output, write or door, and the preview's / returns 200 with the sprite and .ico slots unchanged. One small wording nit is inline; it does not block.
This moves the icon classes .ico, .ico-loader and .sprite out of §5d of docs/DESIGN.md and into their own area doc, docs/design/areas/icons.md. The doc there names where each class is written and styled. No code changes.
main has been merged in. main had moved .field-row and .form-actions out of the same list into docs/design/areas/forms.md, and dropped .tell-here. The merge keeps both sides' removals, so the five classes now live in their area docs and §5d keeps the rest. bun scripts/design-lint.ts passes, as do test/design-lint.test.ts, test/review-design.test.ts and test/web.test.ts.
To try it, check that each of the five classes appears in exactly one docs/design/areas/*.md file and no longer appears in docs/DESIGN.md.
🤖 Generated with Claude Code
This pull only changes docs. It moves three entries out of §5d, which is allowed to shrink, into a new area file that follows docs/design/areas/README.md: each class is in a code span with a line on what it is for. I checked every claim in icons.md against the code:
icon()writesico ico-<name>, andthemeGlyphwrites.ico(src/web/icons.ts:38, :180).iconSprite()writes.spriteat 0×0, absolutely positioned (components.ts:22), and layout.ts:648 places it.icon("loader")is used in pull.ts and studio/words.ts. Its spin pauses inside.btnand runs only while the button hasaria-busy="true"(components.ts:200-203).- The
.icosize and colour rules named for.badge,.count,.menu-item,.toast,.empty,.where-place,.live-noteand.origin-chipall exist.
bun scripts/design-lint.ts passes. The preview at this head answers / with 200 and serves .ico ico-* slots and one .sprite, as described. Security is not affected, the terminal is not touched, nothing is added outside the issue, and nothing new needs a test. Approved.
The icon set is now documented as a single component in a new
docs/design/areas/icons.md, and.ico,.ico-loaderand.spriteare no longer listed indocs/DESIGN.md§5d. Only documentation changed: no markup, no stylesheet rules, and every page looks the same.bun scripts/design-lint.tspasses, and so do the design tests intest/design*(24 pass, 0 fail).docs/design/areas/icons.md(new): followsdocs/design/areas/README.md. It says what the component is for:icon(name)writes a slot that points at one drawing in a shared sprite,iconSprite()adds each drawing a page used once at the end of<body>, and fragments useinlineIcons()to put the drawings back in place. For each class it names what writes it and where it is styled:-
.icois written byicon()and bythemeGlyph(the theme menu's half-filled circle) insrc/web/icons.ts. It is styled insrc/web/style/components.tsas a 16px inline-flex box. Components that contain an icon change its size and colour, incomponents.tsandsrc/web/style/content.ts. -.ico-loaderis written byicon("loader"), which is used insrc/web/pages/pull.tsandsrc/web/studio/words.ts. It spins, and inside a.btnit only spins while the button isaria-busy="true". -.spriteis written byiconSprite()and placed bylayout.ts. It sits at 0×0 out of the page flow, so it can never move a layout.docs/DESIGN.md: the three §5d lines for these classes are deleted, and nothing else in the file changed.All three classes still have both markup and a rule, so none needed a separate retirement issue.
To check it, run
bun scripts/design-lint.ts && bun test test/design.🤖 Generated with Claude Code
Closes #5525