Repository navigation
Modernize native-core desktop primitives and track remaining qualification - #4381
Merged
Merged
Conversation
…ndoff Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Prevent entry preferences from redirecting explicit Windows FocusZone commands. Add live-target refusal and detach/cancellation stories, deduplicate compatible Storybook runtime dependencies, and record the remaining modernization gates. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Make the modern Callout and FocusZone real phased components: hooks, live targets, command channels, imperative handles, and slots run in the first phase, and a hook-free directComponent render phase merges render-time pass-through props. Remove the inner hook-owning components, delete the FocusZoneHost wrapper, restore legacy FocusZone to main, and make the shared CalloutHost a hook-free native binding without the stacked-slot style workaround. Move the new macOS Paper Callout commands to Swift with RCT_EXTERN_METHOD and keep the extern registration free of generated Swift types through a narrow property protocol. Derive the placement edge from the hint in shared Swift, make main-actor isolation explicit, and give notification observers a single owner. On Windows, use a dedicated explicit-command focus flag and an auto-revoked light-dismiss subscription that legacy remounts retain. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Fabric passes all 11 native Callout/FocusZone cases; Paper cases are blocked by the Desktop Driver's missing enabled state for Paper views. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Treat macOS elements without AXEnabled (React Native Paper views that are not disabled) as enabled. - Diagnose locked or switched-out login sessions before launch, attach, window discovery, and new physical input. - Record window notifications, element descriptors, and a command journal on one clock; expose them through furn/window-events, publish window-closed events, and settle window listing while notifications arrive. - Activate through AXFrontmost instead of cooperative workspace activation, journal activation details, and name the occluder of intercepted clicks. - Share failure evidence capture that reads window events first and captures secondary windows, and use it for Storybook wdio callbacks. - Give attached WebdriverIO sessions explicit wait defaults so waitUntil polls until its timeout. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…detach React Native macOS routes host focus() through TextInputState, which records any focused View as the focused text input until a TextInput clears it. A View focused through requestFocus() stayed recorded after unmounting, so a later ScrollView touch dispatched blur to its removed tag and Paper raised a RedBox. Focus targets now clear the record without dispatching on blur and genuine detach. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Separate the modern Callout dismissal status so Paper's per-event delivery cannot reorder it, and record full Paper and Fabric story runs and the cross-story focus finding in the modernization plan. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Fix the RNW host crash on every Windows Callout mount: InputLightDismissAction does not support weak references, so the auto_revoke subscription faulted at popup creation. Use explicit tokens, give each mount its own popup, window, and subscriptions, and report a shown presentation's dismissal once. Mirror macOS dismissal and focus behavior on Windows: dismiss on outside pointer input through the owner island's pointer source and a UI-thread message hook, dismiss focused content on Escape, honor legacy dismissBehaviors, and return keyboard input to the owner after a focused presentation closes. Treat owned popups as active while their owner is the foreground window so a FocusZone inside Callout content can enter and navigate, and keep the requested gap when placement flips. Retry a Windows Desktop Driver subtree read when a closing popup island disappears while the window root remains live. Include every native-core story on Windows and add authored cases for light-dismiss/rearm, Escape on both facades, a flat Menu composition, and Windows anchor geometry. Windows passes 18/18 native cases across 170 stories; Win32 passes 7/7 across 152 stories, including legacy Callout popup operations. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…iliation Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Replace useFocusablePressable's focusOnPress boolean with a pointerFocus mode. The default follows the platform: Windows and Win32 focus a pressed target, and macOS follows AppKit by leaving keyboard focus in place. always and never select one behavior on every platform. Tab maps its tablist exception to never. The FocusZone stories made macOS items click-focusable by calling host focus() directly, which left unmounted Views in React Native's focused-input record and raised a Paper RedBox on a later ScrollView tap. They now use pointerFocus always and a focus target. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…u work Fabric hosts the Paper RCTFocusZone without a React tag, and RCTView throws building focus and key events without one. Opening a Callout whose content starts with a FocusZone aborted the app when AppKit selected the zone as the popup's first key view, and every key bubbling through the zone was dropped, so Escape never dismissed the popup. A tagless zone now sends resign and key messages past RCTView, and the Fabric wrapper continues bubbled keys up the responder chain instead of returning them to the zone. Menu composition's trigger uses the pointer-focus mode: the default case asserts each platform's convention and a new story asserts trigger restoration with always. Record the macOS Fabric and Paper rerun in the plan. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Windows and Win32 focus stories failed because an Input never took focus after a physical click. Input focus works: an absolute pointing device on the console, such as a remote or virtual-machine viewer, moved the cursor back shortly after each injected move, and the helper pressed without coordinates 50 ms later, so the press landed under the restored cursor and activated another window. Confirm that pointer placement reaches its target and retry it before any press, inject each element click as one coordinate-carrying SendInput batch, and carry coordinates on explicit pointer presses and releases. Add Input coverage for native focus from a physical click. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…Fabric FocusZone fixes Both Menu composition cases pass on Windows with the platform-default and always pointer-focus modes; Win32's only authored failure is tracked as #4373. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
… regression Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This was referenced Oct 16, 2026
Contributor
Bundle size reportTree-shaken, minified production esbuild bundles with React and React Native runtimes externalized.
The job is advisory: size changes are reported but do not fail the pull request. Bundle or analysis errors still fail. |
Contributor
Author
|
30-minute pipeline follow-up completed at 2026-10-15 18:01 PDT (2026-10-16 01:01 UTC), at head 81859da. All 18 reported checks passed, including JS, Android, Windows, Win32, Windows Storybook, Win32 Storybook, bundle size, publishing dry run, repository links, CodeQL, and all macOS/iOS lanes. The PR and CodeQL workflow runs both completed successfully. No pipeline failure needed a follow-up fix or push. The local Windows-only Knip baseline remains documented in the PR; the actual JS PR CI job passed. |
Jason Morse (JasonVMo)
enabled auto-merge (squash)
October 16, 2026 03:48
anuagragith
approved these changes
Oct 16, 2026
Andrew Dewar (Dewsk)
approved these changes
Oct 16, 2026
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.
Platforms Impacted
Description of changes
Deliver the native-core modernization milestone already accumulated on this branch, and replace its cross-machine handoff with repository-owned follow-ups.
packages/agentic/native-core/plans/modernization.md, repair every inbound reference, and retain durable contracts and qualification limits in the README.components-button--focus-management / releases pressed feedback after an intervening key without a stale activationon Win32, with an explicit Components: Win32 Button does not report onPressOut after Space with an intervening key #4373 skip reason. Keep its Windows Fabric/macOS assertions and every other Win32 case enabled.Related issues: #4373 (not fixed; remove the quarantine when its native press-out regression is fixed), #4344 (Windows native Callout exclusion removed; other catalog exclusions remain), #4345 (driver hardening), and #4347 (focus regression infrastructure). These broader issues and all newly filed qualification gates remain open; this PR does not claim their full acceptance or production/root admission.
Verification
30-minute CI follow-up: At 18:01 PDT on October 15, 2026 (01:01 UTC on October 16), all 18 reported checks passed at head
81859dabc, including every Windows/Win32, macOS/iOS, JS/Android, Storybook, publishing, link, bundle-size, and CodeQL check. PR workflow run38829974672and CodeQL run38829974596both completed successfully. No follow-up pipeline fix or push was needed.Executed for this submission on Windows:
yarn workspace @fluentui-react-native/components format --checkyarn workspace @fluentui-react-native/components lintyarn workspace @fluentui-react-native/components buildyarn workspace @fluentui-react-native/components test --testNamePattern Button— story type-check and 52 selected Jest tests; 424 unrelated tests skipped by the name filter, 6 snapshots passed.yarn check-agent-instructionsyarn change:checkyarn workspace @fluentui-react-native/agentic-components-storybook storybook bundle --win32yarn workspace @fluentui-react-native/agentic-components-storybook storybook test --win32 --story components-button--focus-management --list— all 7 cases remain discoverable.$env:STORYBOOK_SMOKE_STORY = 'components-button--focus-management'; yarn workspace @fluentui-react-native/agentic-components-storybook storybook smoke --win32 --mode stories-and-tests— 1 native-state case passed; 5 input-dependent cases capability-skipped; exactly the intervening-key case skipped with its Components: Win32 Button does not report onPressOut after Space with an intervening key #4373 quarantine reason. All owned channel/Metro/driver listeners closed afterward. This run verifies quarantine/reporting, not input qualification.yarn clean-lage-cacheyarn lage buildci --continue— 170 tasks passed, 1 failed (root lint-repo, 11 previously recorded Knip unused-dependency findings in untouched packages). Formatting, constraints, dependency alignment, lockfile lint, all package tests/builds/lints, and instruction checks passed.Earlier native qualification is recorded by the branch's existing commits and retained in the follow-up issues: Windows full authored catalog 44/44 and native subset 19/19; Win32 legacy native subset 7/7 with only #4373 failing in the full authored catalog; macOS Fabric/Paper full smoke 178 stories, 38 passed / 5 skipped each. These are prior executed results, not new macOS runs in this Windows session. iOS/Android native qualification was not run locally.
Pull request checklist
This PR has considered (when applicable):