Skip to content

Commit 8d367e0

Browse files
Fix Unavailable Menu Item's Popover positioning (#4917)
* show overflow of popover * detect if scroll is prevented in position calc * add docs example to see fix * only overflow when submenus are shown * Fix menu clipping corners * only make overflow visible on menus * update type * revert docs change --------- Co-authored-by: Rob Snow <[email protected]>
1 parent 3b390fd commit 8d367e0

File tree

3 files changed

+36
-32
lines changed

3 files changed

+36
-32
lines changed

packages/@react-aria/overlays/src/calculatePosition.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,9 @@ function getDelta(
143143
containerDimensions: Dimensions,
144144
padding: number
145145
) {
146-
let containerScroll = containerDimensions.scroll[axis];
146+
let root = document.scrollingElement || document.documentElement;
147+
let isScrollPrevented = window.getComputedStyle(root).overflow === 'hidden';
148+
let containerScroll = isScrollPrevented ? 0 : containerDimensions.scroll[axis];
147149
let containerHeight = containerDimensions[AXIS_SIZE[axis]];
148150

149151
let startEdgeOffset = offset - padding - containerScroll;

packages/@react-spectrum/menu/src/Menu.tsx

Lines changed: 32 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -39,43 +39,45 @@ function Menu<T extends object>(props: SpectrumMenuProps<T>, ref: DOMRef<HTMLULi
3939
return (
4040
<MenuStateContext.Provider value={{state, container: scopedRef, menu: domRef}}>
4141
<FocusScope contain={state.expandedKeys.size > 0}>
42-
<ul
43-
{...menuProps}
44-
{...styleProps}
45-
ref={domRef}
46-
className={
47-
classNames(
48-
styles,
49-
'spectrum-Menu',
50-
styleProps.className
51-
)
52-
}>
53-
{[...state.collection].map(item => {
54-
if (item.type === 'section') {
55-
return (
56-
<MenuSection
42+
<div style={{overflow: 'hidden', maxHeight: '100%', display: 'inline-flex', borderRadius: 'var(--spectrum-alias-border-radius-regular)'}}>
43+
<ul
44+
{...menuProps}
45+
{...styleProps}
46+
ref={domRef}
47+
className={
48+
classNames(
49+
styles,
50+
'spectrum-Menu',
51+
styleProps.className
52+
)
53+
}>
54+
{[...state.collection].map(item => {
55+
if (item.type === 'section') {
56+
return (
57+
<MenuSection
58+
key={item.key}
59+
item={item}
60+
state={state}
61+
onAction={completeProps.onAction} />
62+
);
63+
}
64+
65+
let menuItem = (
66+
<MenuItem
5767
key={item.key}
5868
item={item}
5969
state={state}
6070
onAction={completeProps.onAction} />
6171
);
62-
}
63-
64-
let menuItem = (
65-
<MenuItem
66-
key={item.key}
67-
item={item}
68-
state={state}
69-
onAction={completeProps.onAction} />
70-
);
7172

72-
if (item.wrapper) {
73-
menuItem = item.wrapper(menuItem);
74-
}
73+
if (item.wrapper) {
74+
menuItem = item.wrapper(menuItem);
75+
}
7576

76-
return menuItem;
77-
})}
78-
</ul>
77+
return menuItem;
78+
})}
79+
</ul>
80+
</div>
7981
<div ref={scopedRef} />
8082
</FocusScope>
8183
</MenuStateContext.Provider>

packages/@react-spectrum/menu/src/MenuTrigger.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ function MenuTrigger(props: SpectrumMenuTriggerProps, ref: DOMRef<HTMLElement>)
8181
} else {
8282
overlay = (
8383
<Popover
84-
UNSAFE_style={{clipPath: 'unset'}}
84+
UNSAFE_style={{clipPath: 'unset', overflow: 'visible'}}
8585
state={state}
8686
triggerRef={menuTriggerRef}
8787
scrollRef={menuRef}

0 commit comments

Comments
 (0)