Replace the card-chooser selection pill with a shared boxel-ui SelectionMenu#5100
Conversation
Preview deploymentsHost Test Results 1 files ±0 1 suites ±0 1h 50m 19s ⏱️ - 2m 42s Results for commit 2746dc8. ± Comparison against earlier commit ed0f9c7. Realm Server Test Results 1 files ±0 1 suites ±0 10m 14s ⏱️ -25s Results for commit 2746dc8. ± Comparison against earlier commit ed0f9c7. |
There was a problem hiding this comment.
Pull request overview
Updates the bulk-selection dropdown trigger in the card-search “search result header” to read as a primary dropdown button (highlight fill + foreground, hover/open state deepening, external focus ring, and caret rotation) while keeping the existing BoxelDropdown + Menu behavior unchanged.
Changes:
- Restyles
.selection-dropdown-triggeras a primary/highlight button (tokens, sizing, spacing, transitions). - Separates hover/open fill deepening from keyboard focus (outline ring + offset, no focus-darken).
- Rotates the dropdown caret when
[aria-expanded='true']to match standard dropdown affordance.
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
…ionMenu The "N selected" bulk-selection trigger in the card chooser was a flat teal pill — a visual regression from the previous dropdown. Per the CS-11325 evaluation, BoxelSelect is the wrong primitive (it's a value-picker; this is an action menu), so this keeps BoxelDropdown + Menu and makes the trigger a proper primary dropdown button, then extracts the whole control into a reusable boxel-ui component so other surfaces (e.g. the workspace CardsGrid) can adopt it. - New generic, content-agnostic boxel-ui SelectionMenu: it owns the trigger (a primary BoxelButton with a selection checkmark, count, and a caret that flips on open) and the dropdown shell, while the consumer supplies the menu items via @Items. Select All / Deselect All and the inert count header stay in the app (built in SearchResultHeader), so selection semantics don't leak into the design system. - Move the shared SelectionCheckmark artwork into boxel-ui and reuse it in CardHeader, removing a duplicated inline SVG (advances CS-11333). - Keyboard focus shows a ring outside the trigger without darkening the fill (CS-11328); the trigger holds its position when the menu opens. No behavior change for the card chooser: same markup, data-test hooks, aria-label, and menu items. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
ed0f9c7 to
2746dc8
Compare
The "N selected" bulk-selection trigger in the card chooser was a flat teal pill — a visual regression from the previous dropdown (CS-11325). This makes it a proper primary dropdown control and extracts the whole thing into a reusable boxel-ui component so other surfaces (e.g. the workspace CardsGrid — CS-11366) can adopt it.
Decision (CS-11325)
BoxelSelectis the wrong primitive here — it's a value-picker, but this is an action menu (Select All / Deselect All). So this keepsBoxelDropdown+Menuand fixes the trigger, rather than reaching for a value-picker or polishing the flat pill.What's here
SelectionMenuin boxel-ui. It owns the trigger — a primaryBoxelButtonwith a selection checkmark, the count, and a caret that flips on open — and the dropdown shell. The consumer supplies the menu contents via@items, so Select All / Deselect All and the inert count header stay in the app (built inSearchResultHeader); app-specific selection semantics don't leak into the design system.@labelsets the trigger's accessible name.SelectionCheckmarkartwork moved into boxel-ui and reused inCardHeader, removing a byte-identical inline SVG (advances CS-11333).Scope / surface
Touches boxel-ui's public surface (new
SelectionMenu/SelectionCheckmarkexports) and host. No behavior change for the card chooser: same markup,data-test-*hooks, aria-label, and menu items. boxel-ui + host both passember-tsc(0 errors), eslint, and prettier; verified in-browser across resting / hover / open / keyboard-focus.Stacked on #5099 (CS-11313); auto-retargets to
mainwhen that merges. Follow-up: CS-11366 (bringSelectionMenuto the workspace CardsGrid).🤖 Generated with Claude Code