From 8cbb776ea280b19c9ac8c81fc4a019d84daf5b89 Mon Sep 17 00:00:00 2001 From: atomiks Date: Thu, 30 Oct 2025 18:34:55 +1100 Subject: [PATCH 1/3] [popups] Enable scroll lock on touch when modal --- .../react/src/combobox/positioner/ComboboxPositioner.tsx | 3 +-- packages/react/src/menu/root/MenuRoot.tsx | 9 +++------ packages/react/src/popover/root/PopoverRoot.tsx | 3 +-- .../react/src/select/positioner/SelectPositioner.tsx | 2 +- 4 files changed, 6 insertions(+), 11 deletions(-) diff --git a/packages/react/src/combobox/positioner/ComboboxPositioner.tsx b/packages/react/src/combobox/positioner/ComboboxPositioner.tsx index eeed547d00e..5276914049a 100644 --- a/packages/react/src/combobox/positioner/ComboboxPositioner.tsx +++ b/packages/react/src/combobox/positioner/ComboboxPositioner.tsx @@ -54,7 +54,6 @@ export const ComboboxPositioner = React.forwardRef(function ComboboxPositioner( const modal = useStore(store, selectors.modal); const open = useStore(store, selectors.open); const mounted = useStore(store, selectors.mounted); - const openMethod = useStore(store, selectors.openMethod); const triggerElement = useStore(store, selectors.triggerElement); const inputElement = useStore(store, selectors.inputElement); const inputInsidePopup = useStore(store, selectors.inputInsidePopup); @@ -82,7 +81,7 @@ export const ComboboxPositioner = React.forwardRef(function ComboboxPositioner( }); useScrollLock({ - enabled: open && modal && openMethod !== 'touch', + enabled: open && modal, mounted, open, referenceElement: triggerElement, diff --git a/packages/react/src/menu/root/MenuRoot.tsx b/packages/react/src/menu/root/MenuRoot.tsx index 17601d34f7e..99d0fa65064 100644 --- a/packages/react/src/menu/root/MenuRoot.tsx +++ b/packages/react/src/menu/root/MenuRoot.tsx @@ -190,14 +190,11 @@ export const MenuRoot: React.FC = function MenuRoot(props) { }, []); const { mounted, setMounted, transitionStatus } = useTransitionStatus(open); - const { - openMethod, - triggerProps: interactionTypeProps, - reset: resetOpenInteractionType, - } = useOpenInteractionType(open); + const { triggerProps: interactionTypeProps, reset: resetOpenInteractionType } = + useOpenInteractionType(open); useScrollLock({ - enabled: open && modal && lastOpenChangeReason !== 'trigger-hover' && openMethod !== 'touch', + enabled: open && modal && lastOpenChangeReason !== 'trigger-hover', mounted, open, referenceElement: positionerElement, diff --git a/packages/react/src/popover/root/PopoverRoot.tsx b/packages/react/src/popover/root/PopoverRoot.tsx index 005386abeff..04a83c61ce6 100644 --- a/packages/react/src/popover/root/PopoverRoot.tsx +++ b/packages/react/src/popover/root/PopoverRoot.tsx @@ -51,7 +51,6 @@ function PopoverRootComponent({ props }: { props: PopoverRoot.Props({ props }: { props: PopoverRoot.Props alignItemWithTriggerActive); useScrollLock({ - enabled: (alignItemWithTriggerActive || modal) && open && !touchModality, + enabled: (alignItemWithTriggerActive || modal) && open, mounted, open, referenceElement: triggerElement, From 1009c88139d51adc796f1c99aefcdea221d4adea Mon Sep 17 00:00:00 2001 From: Lukas Date: Fri, 31 Oct 2025 14:53:25 +0200 Subject: [PATCH 2/3] Update experiment to use `modal` setting --- .../experiments/popover/popovers.tsx | 39 ++++++++++++------- 1 file changed, 26 insertions(+), 13 deletions(-) diff --git a/docs/src/app/(private)/experiments/popover/popovers.tsx b/docs/src/app/(private)/experiments/popover/popovers.tsx index 46d686406e3..6b23bb03d9c 100644 --- a/docs/src/app/(private)/experiments/popover/popovers.tsx +++ b/docs/src/app/(private)/experiments/popover/popovers.tsx @@ -48,6 +48,13 @@ const contents = [ , ]; +function PopoverWithSettings( + props: Popover.Root.Props & React.RefAttributes, +) { + const { settings } = useExperimentSettings(); + return ; +} + export default function Popovers() { const { settings } = useExperimentSettings(); @@ -68,29 +75,29 @@ export default function Popovers() {

Popovers

Uncontrolled, single trigger

- + {renderPopoverContent(0, settings)} - - + + {renderPopoverContent(1, settings)} - - + + {renderPopoverContent(2, settings)} - +

Controlled, single trigger

- setSingleTriggerOpen(nextOpen)} > {renderPopoverContent(0, settings)} - + @@ -98,7 +105,7 @@ export default function Popovers() {

Uncontrolled, multiple triggers within Root

- + {({ payload }) => ( @@ -107,12 +114,12 @@ export default function Popovers() { {renderPopoverContent(payload as number, settings)} )} - +

Controlled, multiple triggers within Root

- { setControlledWithinRootOpen(open); @@ -128,7 +135,7 @@ export default function Popovers() { {renderPopoverContent(payload as number, settings)} )} - +