LearnNewsExamplesServices
Frontmatter
id15250
titleKeyboard detach path: a11y parity for the multi-window choreography
stateOpen
labels
enhancementaiaccessibility
assignees[]
createdAt1:26 PM
updatedAt1:26 PM
githubUrlhttps://github.com/neomjs/neo/issues/15250
authorneo-fable-clio
commentsCount0
parentIssue15239
subIssues[]
subIssuesCompleted0
subIssuesTotal0
contentTrust
projected
quarantined0
signals[]
blockedBy[ ] 15245 Popup acquisition contract: platform defaults from the measured matrix, [ ] 15244 Dock tear-out: lift the proxy-to-popup opt-out into dock semantics
blocking[]

Keyboard detach path: a11y parity for the multi-window choreography

Open Backlog/active-chunk-6 enhancementaiaccessibility
neo-fable-clio
neo-fable-clio commented on 1:26 PM

Context

Epic #15239 leaf — D#15204 OQ8 [RESOLVED_TO_AC] (cycle-4): the keyboard path is a named leaf, never silently pending and never folded into G1/G4. The explicit detach command doubles as the always-works acquisition fallback (Axis-1's fourth option: fresh activation by definition — a keystroke IS a user activation). Unowned — self-select.

The Problem

The five-beat story is pointer-only as designed. Keyboard users need parity for: detaching an item to a popup, selecting a target (window + zone), transferring focus with the moved item, and returning it — and pointer users on a platform where the matrix (#15243) shows boundary-acquisition failing need the same command as the documented fallback.

The Architectural Reality

  • The dock model side is COMMAND-shaped already: detachItem (ADR 0029 §2.1 / ADR 0020) and transferItem are semantic operations — no pointer required; this leaf builds the interaction surface, not new model capability.
  • Focus transfer across real OS windows: window.focus() rides user activation (a keystroke provides it); the admission truth (windowOpen Boolean) applies to the command path identically.
  • Target selection UX composes with the shared #15207 affordance consumer (the §06 menu is the visual for cycle-through selection).
  • Blocked-by: #15244 (G1's dock detach semantics are the substrate the command drives) + #15245 (the fallback contract this implements).

The Fix

One PR: the keyboard command surface — detach (item → popup), target cycle (windows/zones with visible affordance highlighting through the shared consumer), commit, and return — plus focus-transfer discipline and the a11y announcements.

Acceptance Criteria (the graduated OQ8 disposition)

  • A focused dock tab can be detached to a real OS popup by keyboard alone; focus lands IN the new popup with the moved item.
  • Target selection is keyboard-cyclable across windows and zones, with the current candidate visibly highlighted through the shared affordance consumer (same visuals as pointer hover).
  • Commit and cancel are keyboard-complete; every terminal follows the #15240 outcome machine (cancel = zero model mutation).
  • The return path (popup item/stack → main) works by keyboard; focus returns with the item.
  • Screen-reader announcements cover detach, target change, commit, and return (named roles/labels; witnessed with an a11y snapshot).
  • The command doubles as the pointer-fallback on matrix-failed platforms (#15245's degradation target) — witnessed once as that fallback.

Out of Scope

Pointer gestures (G1–G4) · re-designing dock focus management wholesale (only the transfer discipline this path needs).

Related

Parent #15239 · blocked-by #15244 + #15245 · D#15204 (OQ8; Axis-1 explicit-command row) · ADR 0029 §2.1 / ADR 0020 (the command-shaped model ops).

Live latest-open sweep: latest 20 at 2026-07-16T10:56Z + last-step re-check 11:09Z; no equivalent. A2A claim sweep: no competing claim.

Origin Session ID: c5d7cd6b-4e01-45fd-aa59-5ccbc0e5f091 Retrieval Hint: "keyboard detach a11y parity explicit command focus transfer OQ8"