Skip to content

fix: the Extensions list gets its industry-standard treatment — grouped, noun-named, contained details, no escaping knobs - #512

Merged
alicoding merged 3 commits into
mainfrom
fix/extensions-list-review
Aug 29, 2026
Merged

fix: the Extensions list gets its industry-standard treatment — grouped, noun-named, contained details, no escaping knobs#512
alicoding merged 3 commits into
mainfrom
fix/extensions-list-review

Conversation

@alicoding

Copy link
Copy Markdown
Owner

Summary

Five hands-on-review findings against Settings > Extensions (orchestrator drove the live surface personally; the review was the design contract):

  1. Knob escaping its row — the Primer ToggleSwitch knob's own composited layer could paint outside its row (observed live: over the sticky search bar) once a row's disclosure was open and the pane scrolled. Fixed structurally: contain: paint + position: relative on .row (ExtensionsSection.module.css) scopes every descendant's paint to the row's own box and makes it the containing block — no magic z-index on the knob.
  2. Expanded details containment — kept the existing indent + subtle left rule, confirmed against Primer's own pattern (TreeView's TreeViewItemLevelLine uses the identical border-guide convention), and documented why.
  3. Grouped list, no repeated group word — three sections (Knowledge/Files/Drawing) via ActionList.Group + ActionList.GroupHeading, driven by a new AtlasNounGroup field shared by tray tools and tool-less nouns (diagram/sheet now honestly declare group: 'file', the same family Image already names). The collapsed row's own meta line drops the group word (kept in the expanded chips). Verified single-line at exactly 1000px viewport.
  4. Noun row titles — a new nounName field (AtlasToolShapeBase) separates the row's display title ("Card", "Pencil") from the command-verb label ("Add a card") still used by the palette/tray tooltips. extensionMeta.ts's toolRowSource reads nounName; tool-less nouns already used the noun for their single label field.
  5. Noise + honesty minors — (a) the decorative On/Off status text next to each switch (always aria-hidden in Primer's own markup) is hidden via a scoped [aria-hidden='true'] selector — zero accessible-name loss, bare switches only. (b) AtlasCreationTray's Annotate group trigger now derives its face icon from the first enabled tool in the group instead of a hardcoded paintbrush, so disabling that tool never leaves a stale glyph (verified via SVG path diff, not just a screenshot).

atlasNounRegistry.ts split along its own real seam (atlasBoardObjectContent.ts now owns the board-object content registry) to stay under the 500-line file limit — re-exported in full so every other importer is unaffected.

Test plan

  • settings-extensions.spec.ts updated: section headers, noun titles, single-line meta at 1000px, knob-containment via elementFromPoint at the search bar's coordinates (9/9 passing)
  • atlas-tool-exclusivity.spec.ts (annotate-group interaction) still green (6/6)
  • Full Vitest suite green (961/961)
  • tsc, eslint, check-loc.sh, check-comment-hygiene.sh, check-ui-copy.sh all clean
  • go generate ./internal/docsgen regenerated the noun-field-table docs for the new nounName field; go test ./internal/docsgen/... green
  • Screenshots reviewed at 1000×660: list top (grouped sections), expanded row mid-scroll (Sheet, contained + knob correctly inline), Drawing section with Pencil disabled (trigger glyph switches to Eraser)

🤖 Generated with Claude Code

https://claude.ai/code/session_012im1JxQQV2ahnXzZDdVmZq

…ped, noun-named, contained details, no escaping knobs

Five hands-on-review findings against Settings > Extensions:
- The toggle knob's own compositor layer could paint outside its row
  after scrolling with a disclosure open; contain: paint on the row
  scopes every descendant's paint (and gives it a containing block)
  so this can never happen structurally.
- The list groups into Knowledge/Files/Drawing sections (registry
  `group`, now shared by tray tools and tool-less nouns via the new
  AtlasNounGroup type) instead of repeating the group word on every
  row's own meta line.
- Row titles read as the noun ("Card", "Pencil") via a new nounName
  field, separate from the command-verb label ("Add a card") that
  still drives the palette/tray tooltips.
- The bare On/Off status text next to each switch is hidden (it was
  always aria-hidden in Primer's own markup, so nothing is lost for
  screen readers).
- The Annotate tray group's own collapsed trigger now derives its face
  icon from the first enabled tool in the group instead of a hardcoded
  paintbrush, so disabling that tool never leaves a stale glyph.

atlasNounRegistry.ts split along its own real seam (board-object
content registry vs. the tray-tool registry) to stay under the
500-line file limit, re-exported in full so no other importer moves.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012im1JxQQV2ahnXzZDdVmZq
@alicoding
alicoding enabled auto-merge (squash) August 29, 2026 01:28
alicoding and others added 2 commits August 29, 2026 01:06
…th ways

Primer's ActionList.Group is structurally unusable here: with list
semantics its <li role="presentation"> wrapper hoists the heading and
inner <ul role="group"> into the outer list in the accessibility tree
(aria-required-children); without list semantics every Item renders as
a <button>, nesting the row's own switch inside an interactive
(nested-interactive). A section as its own h3-labeled ActionList keeps
the same rendered chrome and passes the WCAG gate.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012im1JxQQV2ahnXzZDdVmZq
@alicoding
alicoding merged commit 46f73dd into main Aug 29, 2026
30 checks passed
@alicoding
alicoding deleted the fix/extensions-list-review branch August 29, 2026 05:29
alicoding added a commit that referenced this pull request Aug 29, 2026
Resolves the two overlaps by taking main's structure wholesale and
re-applying this branch's deltas in their new homes: the third-party
noun path re-lands on main's split registry (its content half now
lives in atlasBoardObjectContent.ts, widened to open string kinds
there); the installed-plugins mount and third-party row exclusion
re-land on the treatment's per-section ExtensionsSection; plugin
nouns declare nounName (the treatment's noun-title convention). This
branch's own gesture-types extraction is dropped -- main's split
already brought the registry under the file limit.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012im1JxQQV2ahnXzZDdVmZq
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant