Repository navigation
Add Popover, Menu, MenuButton, and Dropdown for macOS, Windows, and Win32 - #4386
Merged
Merged
Conversation
Implement independent P2 prerequisites: disabled-focusable pressable/MenuItem targets with activation refusal and exactly-once release cleanup; Input outline/underline focus-visible treatment; modern Callout first/last focus strategies, observed dismissal causes, and duplicate/late-event fences. Keep legacy APIs stable and regenerate Windows bindings. This is a blocked prerequisite handoff, not completion of Popover, Menu, MenuButton, or Dropdown. Those components remain unimplemented and unexported behind their P0/P1/native gates. Record the remaining work and exact checks in menu-popover-plan.md section 12. Reconcile reviewed R1-R3 and track Win32 host followups in #4384. Owning tests pass (205 Framework Base, 484 components, 37 native-core plus 18 ownership/entrypoint checks); root TypeScript and Windows native builds pass. Native input-dependent cases are skipped, not qualified. Cache-cleared buildci is blocked by 11 Knip findings outside changed workspaces. Aggregate Storybook worker deadlines failed, then both affected contracts passed serial retry. Next macOS Fabric and Paper: regenerate/build both renderers, run the named native cases and VoiceOver/visual checks, complete the React-module and Office bridging-header qualification, then finish family/continuation/semantic prerequisites and component contract review. Next Windows Fabric: restore a physical-input-capable session, rerun Callout/shared-focus cases and UIA/Narrator, resolve the repository-check blockers, then continue native family/Tab/geometry/hover work before component delivery. Next Office Win32: qualify host readiness/focus/family/semantics, implement the capability-gated adapter and approved Tab close-and-return interim, and track native host additions in #4384. Do not dispatch undeclared commands or claim root admission. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 67c62cd2-5b14-47f2-adf0-4317407f2d2c
Implement the agentic Dropdown (#4224) under its reviewed contract: a combobox trigger that opens a list of ListboxItem options in single or multiple selection mode, with entry focus on the selection, type-ahead, Home and End, and selection accessibility actions. ListboxItem gains a value prop and an option context binding (LBI-006). Windows Fabric floors the list at the trigger width with an inner spacer because RNW portal layout replaces the content root's min dimensions. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: ad2750d4-2e4b-4196-856f-aa0dba06a6ad
Dropdown passes its native story cases on macOS Fabric and Paper, along with the Menu, MenuButton, MenuItem, Popover, Callout, FocusZone, and focus regression selectors. - Stop macOS Paper's legacy scrollers from insetting the Dropdown options: the list never requests a horizontal scroller and requests a vertical one only while its options overflow the viewport. - Add Tab and Shift+Tab story cases (DRP-009) and make the list-semantics and LongList cases use pointer actions after switching to the popup window, which makes the owner window key on macOS. - Record macOS qualification in the Dropdown SPEC and changeset. - Reduce menu-popover-plan.md to the remaining gates, the decisions that still apply, and PR notes with per-platform validation. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
… cap Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Mark Popover, Menu, MenuButton, Dropdown, MenuItem, ListboxItem, and Input implemented now that every requirement names realized evidence, and export the four new components and their public types from the package root. Remove menu-popover-plan.md; its remaining gates and PR notes move to the pull request. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
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. |
Popover, Menu, and Dropdown now read one platform popup host (common/popupHost) instead of five adapter files each, and share a presence latch (usePopupPresence). Menu and Dropdown share the list-popup trigger controller (usePopupTrigger), popup layout styles, and ref and handler composition helpers. Dropdown reuses Input's visual-state resolution. Behavior is unchanged. The macOS Callout placement regressions failed in CI because the owner window sat low on the hosted runner's small display, so native placement correctly flipped the popup above the anchor. The regressions now move the owner window to the top of its screen first and restore it after. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Jason Morse (JasonVMo)
enabled auto-merge (squash)
October 22, 2026 03:06
Vladimir Morozov (vmoroz)
approved these changes
Oct 22, 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
Adds the agentic Popover (#4236), Menu (#4232), MenuButton (#4231), and Dropdown (#4224) on macOS (Fabric and Paper), Windows Fabric, and Office Win32, built from owner-approved contracts. All four are exported from the
@fluentui-react-native/componentsroot along with their public types. Popover, Menu, MenuButton, Dropdown, MenuItem, ListboxItem, and Input are ratified asimplemented: every requirement names realized evidence.Summary
controlled or uncontrolled presence, entry focus on the first eligible content or a fallback surface stop, and focus
return on Escape or caller close.
submenuprop, hover-open with platform delays, type-ahead, Home and End, discoverable disabled rows (R2), and nativeTab continuation. MenuButton composes Button with a static chevron.
comboboxtrigger with Input's outline or underline chrome opens alistof ListboxItemoptions, with single or multiple selection, controlled or uncontrolled selection and presence, a placeholder, and a
count summary. ListboxItem gains a
valueprop that binds it to the list.firstandlastentry focus, truthful dismissal reasons,tabNavigationwith thetab-forwardandtab-backwardreasons, transparent content-drawn surfaces, nested-popupclose and light-dismiss rules, and Paper command ordering through UI-manager blocks. Windows Fabric gained rounded
popup windows with platform shadows, anchor-press handling, and a Tab message hook. New
/win32Callout andFocusZone adapters target the Office host's legacy registrations.
common/popupHost) insteadof five adapter files each, and share a presence latch (
usePopupPresence). Menu and Dropdown also share thelist-popup trigger controller (
usePopupTrigger), the popup layout styles, and the ref and handler composition helpers.Dropdown reuses Input's visual-state resolution. Behavior is unchanged.
disabledFocusablefor MenuItem, Input's variant focus treatment, and sharedtriggerExpandActionsthat declare Win32 Expand and Collapse.layout characters type as virtual keys.
Findings worth reviewing
flexGrowrows fill a fit-content popup to the window width. Menu and Dropdown size theircontent with a row wrapper that uses
overflow: 'scroll', and host nested popups in a wide absolute View.first/lastsearch stops at a focusable FocusZone, so Menu entry focus uses FocusZonecommands.
even while they are hidden. The Dropdown list therefore never requests a horizontal scroller and requests a vertical
one only while its options overflow. Before this, Paper options were 17 points narrower than the list and the list
was 17 points taller than its options. Fabric always uses overlay scrollers.
than
minWidth.window sat low enough that native placement correctly flipped the popup above the anchor, which put it 267 points
off. The regressions now move the owner window to the top of its screen first and restore it afterward.
surface, and does not restore focus after an assistive collapse. On Win32 it also keeps the raw Callout, because
requestFocus('first')is unsupported wheninitialFocusis'none'.switchToWindowmakes the owner window key, so story cases send keys before reading popup semantics,or act with the pointer inside the popup.
Deferred divergences and follow-ups
menu-submenu-intent: hover switching is delay-only; add a native pointer-travel signal.gapSpace, per-pixel transparency, classified dismissals, FocusZone Home and End, trigger restoration on close, Tab past the owner, and one pointer enter without a leave. Each lets an adapter drop a workaround.dropdown-token-strip: needs a reviewed Tag-based design.test:apple-integrationis a source probe; no Office runtime has run these components.Known pre-existing failures
lint-repo(Knip):knip.config.tsbuilds workspace keys with backslashes, so imported dependencies inunchanged packages read as unused. It passes on macOS.
components-input--focus-treatmentfailed before this work.stays responsive; reruns pass.
Verification
Shared popup controllers and CI fix (5f36f17), macOS, October 22, 2026
smoke --macos --mode stories-and-testsnative-modern-callout16/16.prep --macos --paper, thensmoke --macos --paperwith the same selectorsyarn workspace @fluentui-react-native/components test,lint,check:spec-contracts,report:spec-source-drift --offline --writeyarn workspace @fluentui-react-native/native-core testandlintyarn clean-lage-cachethenyarn lage buildciyarn change:checkandgit diff --check.Final commit (5cdbcad), macOS
yarn workspace @fluentui-react-native/components testcheck:spec-contractsandreport:spec-source-drift --offline --writeyarn clean-lage-cachethenyarn lage buildciValidation: macOS, October 21, 2026
macOS 27.0.1 (26A434), arm64, Xcode 26.4.1, Swift 6.3.1, RNmacOS 0.81.9 with the checked-in patch, Keyboard navigation
on (
AppleKeyboardUIMode=3). Storybook commands useyarn workspace @fluentui-react-native/agentic-components-storybookwithSTORYBOOK_SMOKE_TAG=story.storybook prep --macos,build --macos,smoke --macos --mode stories-and-testsnative-modern-callout16/16,native-callout2/2,native-modern-focuszone4/4,components-*--*focus*16/16; 199 stories rendered.prep --macos --paper,build --macos --paper, then the same selectors with--papernative-modern-calloutrun hit a driver pointer-move error; the rerun passed 16/16.yarn workspace @fluentui-react-native/native-core test:apple-integrationtest,lint,check:spec-contractsyarn clean-lage-cachethenyarn lage buildcistorybook bundle --macos, applint,yarn check-agent-instructions,yarn change:check,git diff --check.Validation: Windows Fabric and Office Win32, October 19 to 21, 2026
smoke --windows, Menu, MenuButton, MenuItem, Popover, Callout, and FocusZonenative-callout2/2,native-modern-callout16/16,native-modern-focuszone4/4.smoke --win32, Menu family, Popover, andnative-calloutdesktop-focuscases on Menu, MenuButton, MenuItem, Popover, ListboxItem, and Dropdownlintandtest;check:spec-contractsyarn clean-lage-cachethenyarn lage buildciWindows Fabric and Office Win32 rerun at 8e32a1a, October 21, 2026
smoke --windowsandsmoke --win32: Dropdown, Menu, MenuButton, MenuItem, Popover0xC0000409after 14 passing cases; the full retry passed without source changes.Not run
replaces the Windows and Win32 adapters with
common/popupHost.windows.tsand.win32.ts, and hosted CI disableskeyboard and physical clicks on those lanes. Rerun the popup-family
desktop-focuscases on the Windows machine.The four components are exported before VoiceOver, Narrator, and visual-matrix qualification. The RNmacOS patch is still a release gate.
Pull request checklist
This PR has considered (when applicable):