shell is the federation host: every remote mounts inside it, so a regression here is a regression in all 20 members at once. It was sequenced last in the plan for that reason.
Two real surfaces, not three.
shell/src/JumboPopdown.svelte:111 ships <div class="panel" role="menu"> over <button role="menuitem"> children. The role triad is correct — but there is no keydown handler anywhere on the panel. Every item is its own tab stop (N tab stops, not one), ArrowDown/ArrowUp/Home/End/typeahead all do nothing, and the only Escape handler is a document listener that sets open = false and drops focus to <body> — the focused <button> is unmounted with the panel and nothing catches focus.
shell/src/WorkspaceSwitcher.svelte:120 ships <ul class="menu" role="listbox"> over <li><Button role="option" aria-selected>. Same three defects: N tab stops, zero arrow keys, document-level Escape that drops focus to <body>. Its trigger already carries aria-haspopup="listbox", which makes it the federation's own reference for the trigger half.
shell/DevelopersMenu is a phantom entry in the census. It declares no role of its own — grep 'role=' in that file matches a code comment on line 12 (// role="menu"/"menuitem" — rather than inventing a second one) and a role="status" on a Chip. It composes JumboPopdown, so it inherits whatever keyboard JumboPopdown has. The nine-surface count includes one surface that does not exist; the real number is eight.
Containment constraint specific to this member: shell's production bundle was measured clean (every shell/src selector hashed, the only unhashed ones federal from packages/theme). Any CSS added here must stay scoped, and there must be no <style global>.
Plan: https://github.com/lossless-group/augment-it/blob/rebuild/turbo-rsbuild/context-v/plans/Build-Selector-And-Close-The-Keyboard-Contract.md
Loop: https://github.com/lossless-group/augment-it/blob/rebuild/turbo-rsbuild/context-v/loops/Adopt-Selector-In-One-Member.md
shellis the federation host: every remote mounts inside it, so a regression here is a regression in all 20 members at once. It was sequenced last in the plan for that reason.Two real surfaces, not three.
shell/src/JumboPopdown.svelte:111ships<div class="panel" role="menu">over<button role="menuitem">children. The role triad is correct — but there is no keydown handler anywhere on the panel. Every item is its own tab stop (N tab stops, not one), ArrowDown/ArrowUp/Home/End/typeahead all do nothing, and the only Escape handler is adocumentlistener that setsopen = falseand drops focus to<body>— the focused<button>is unmounted with the panel and nothing catches focus.shell/src/WorkspaceSwitcher.svelte:120ships<ul class="menu" role="listbox">over<li><Button role="option" aria-selected>. Same three defects: N tab stops, zero arrow keys,document-level Escape that drops focus to<body>. Its trigger already carriesaria-haspopup="listbox", which makes it the federation's own reference for the trigger half.shell/DevelopersMenuis a phantom entry in the census. It declares no role of its own —grep 'role='in that file matches a code comment on line 12 (// role="menu"/"menuitem" — rather than inventing a second one) and arole="status"on a Chip. It composesJumboPopdown, so it inherits whatever keyboardJumboPopdownhas. The nine-surface count includes one surface that does not exist; the real number is eight.Containment constraint specific to this member: shell's production bundle was measured clean (every
shell/srcselector hashed, the only unhashed ones federal frompackages/theme). Any CSS added here must stay scoped, and there must be no<style global>.Plan: https://github.com/lossless-group/augment-it/blob/rebuild/turbo-rsbuild/context-v/plans/Build-Selector-And-Close-The-Keyboard-Contract.md
Loop: https://github.com/lossless-group/augment-it/blob/rebuild/turbo-rsbuild/context-v/loops/Adopt-Selector-In-One-Member.md