cx-itnr cx-zacj: unify composer popup surfaces
What changed
Composer chips, pickers, menus, and popovers now share one surface contract. Base UI surfaces and the remaining custom model/context/slash surfaces use the same glass material, edge, shadow, open motion, keyboard-only focus ring, viewport scroll containment, and highlight-following behavior. The implicit Default effort is represented by the chip and no longer appears as a menu row.
The gallery adds popup-surface, which opens the access menu, verifies the shared glass surface, moves the highlight, closes with Escape, and opens the reasoning menu without moving the composer anchors.
Proof
Matching base/head gallery renders (same entry, width, and theme):
- Access menu: before (base) · after (head)
- Reasoning menu: before (base) · after (head)
- Folder/location menu: before (base) · after (head)
- Unified interaction play: head popup-surface
Gallery checks remain strict: 0 px anchor movement, 0 layout shift, and no frame over 33 ms.
Changelog
Changed: unified composer popup material, focus, placement scrolling, and motion across chips, pickers, menus, and popovers.
Scope
Beads: cx-itnr, cx-zacj (shadow/material scope folded in because cx-zacj had not started).
Web only; no fleet build is required.
Showcase
Need help on this PR? Tag @codesmith-bot with what you need. Autofix is disabled.
Summary by cubic
Unifies the composer's chips, pickers, menus, and popovers onto one shared glass popup surface contract: the same material, border, shadow, open motion, scroll containment, and keyboard-only focus ring. Also removes the implicit "Default" effort from the menu so the chip alone represents that level.
- Legacy composer menus (slash, model, effort, access) now use the shared
ui-popupsurface instead of their own styling; nested model picker submenus get the same material. - The glass backs off to an opaque surface under
prefers-reduced-transparencyordata-reduce-transparency. - The effort menu no longer lists a "Default" row; the chip keeps the implicit level and real levels stay selectable.
- Initial effort menu focus stays inside the reasoning group, so arrow keys land on an actionable level.
- Model picker keyboard navigation scrolls the active row into view while focus stays on the chip.
- Adds a gallery scenario that opens the access menu, verifies the glass material, moves the highlight, closes with Escape, then opens the effort menu.
[!NOTE]
Medium Risk
Touches shared ui-popup styling used beyond the composer and changes effort selection UX (no Default row), but changes are mostly visual/interaction with accessibility fallbacks for reduced transparency.
Overview
Unifies composer popups (slash commands, model/context menus, effort/access menus) onto the shared ui-popup glass surface: semi-transparent fill, backdrop blur, updated shadow/border tokens, scroll containment, and keyboard-only focus rings on virtual-focus rows. Opaque fallbacks apply under prefers-reduced-transparency and data-reduce-transparency.
Effort picker no longer lists the implicit “Default” level as a menu row—the chip still represents it—and initial focus stays in the reasoning group so arrow keys land on real levels. Model picker keyboard navigation now scrolls the active row into view while focus remains on the chip.
Adds a gallery popup-surface scenario that opens menus, asserts glass styling, exercises highlight + Escape, and opens the effort menu. Layer baseline metadata is updated for the new stacking behavior.
Reviewed by Cursor Bugbot for commit 4896b5a32ebb5477de37576ec1eb57415b485369. Bugbot is set up for automated code reviews on this repo. Configure here.
Showcase

