refactor(ui): move floating selectors and menus to Astryx - #1673
Merged
Conversation
Astro-Han
force-pushed
the
refactor/1565-floating-controls
branch
from
July 31, 2026 03:08
0871f48 to
9b4b53e
Compare
Astro-Han
force-pushed
the
refactor/1565-floating-controls
branch
from
July 31, 2026 03:54
9b4b53e to
8a3d8ab
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Refs #1565.
This is the first half of logical PR 6. It moves Select/Combobox and Menu to Astryx as the single behavior and styling authority while preserving the append-only
@maka/uisurface.light-dark()values through the Electron 43 / Chrome 150 CSS target so scoped theme focus rings remain valid.nav+aria-current), not atablist/tab/tabpanelseam.The Dialog/AlertDialog/Toast half remains stacked as #1674 because both halves touch the same consumer files.
Verification
npm run format:checknpm run lintnpm run build:test && npm run typechecknpm --workspace @maka/ui test— 283 passednpm --workspace @maka/desktop test— 2,967 passed; console/a11y/copy checks cleannpm --workspace @maka/desktop run build:with-depsnpx playwright test --config e2e/playwright.config.ts e2e/floating-layers.spec.ts e2e/permission-mode-surface.spec.ts e2e/sidebar-navigation.spec.ts e2e/topbar-overflow.spec.ts— 11 passednode scripts/check-visual-contract.mjs --against origin/main --scopes scripts/visual-contract-scopes/pr6-floating-controls.json— 20 comparisons cleannpm run check:hit-test— 5 routes cleannpm --workspace @maka/desktop run build-storybooknpm --workspace @maka/desktop run smoke:storybook— 26 render/play checks passednpm testwas also attempted: scripts, UI, Desktop, and Storage passed; the unrelated Runtime Host timing teststartup failure uses the active shutdown deadline without releasing ownershipfailed under existing stale Host test processes. Remote CI is the merge authority.Root cause
The migration originally treated API-shape compatibility as sufficient. The real contract is semantic ownership: rendered option identity, event ordering, focus ownership, ARIA roles, viewport bounds, and scoped CSS evaluation must remain coherent across the whole interaction.
Two review findings exposed that boundary directly:
max-heightdeclaration. A real local viewport bound plus nearest-item scrolling restores the single invariant: the active option is visible.Review focus