Skip to content

Components: Add popup-family transactions and owner-relative focus restoration #4377

Open

Description

@JasonVMo

Goal

Implement the shared native policy needed beyond a flat nonmodal Callout/Menu composition. Part of #4274. Actual Menu and Popover delivery remains #4232 and #4236; do not duplicate those component-generation issues.

Observed baseline — 2026-10-15

The initial native-core milestone confirms individual presentation focus/close/reposition and owner-window retained-focus return. It does not provide family closure, policy-driven restoration, natural owner-relative Tab continuation, request-only veto, or precise light-dismiss classification. The MenuComposition story is a prerequisite demonstration, not a shipped Menu/Popover component.

Acceptance

  • Review the shared contract for family membership/attachment generations, child/sibling/ancestor closure, reentrant dismissal, and stale result/cleanup fencing.
  • Implement family-close/restoration transactions with one navigation owner per key and one native restoration executor. Test close/reopen, owner loss, nested popup input, Escape, and restoration races.
  • Provide natural owner-relative Tab/Shift+Tab continuation without cycling back into closing popups or restoring over a newer physical focus move.
  • Resolve disabled-but-discoverable MenuItem policy: focus eligibility, activation refusal, and accessibility-disabled state are separate axes. Integrate the reviewed choice with Components: Generate Menu #4232 rather than silently changing all disabled controls.
  • Keep pointer-open focus policy explicit (platform / always / never) and retain the flat default/always trigger-restoration regressions on all qualified hosts.
  • Record macOS Paper/Fabric and Windows/Win32 capability evidence and unsupported paths; do not claim root admission from a partial host implementation.

Prior art and evidence

Historical handoff: b55d6c9a3:packages/agentic/native-core/plans/modernization.md. Candidate wave-three 5f6e7af1252bcfe087dcd1672afaa4ceb7c5efbb contains macOS family work but narrower RNW coverage and a recorded Menu run of 1 passed / 0 failed / 12 skipped. Adapt selectively under current native/Apple contracts, not as already-qualified behavior. Preserve renderer adapters as thin event/view boundaries and shared behavior independent of renderer registries.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions