diff --git a/packages/menu/src/Menu.ts b/packages/menu/src/Menu.ts index a26acdaa06..4d4e7f70e2 100644 --- a/packages/menu/src/Menu.ts +++ b/packages/menu/src/Menu.ts @@ -591,7 +591,8 @@ export class Menu extends SizedMixin(SpectrumElement) { const focusedItem = this.childItems[this.focusedItemIndex]; if (focusedItem) { focusedItem.focused = false; - focusedItem.active = false; + // Remain active while a submenu is opened. + focusedItem.active = focusedItem.open; } this.focusedItemIndex = (this.childItems.length + this.focusedItemIndex + offset) % diff --git a/packages/menu/src/MenuItem.ts b/packages/menu/src/MenuItem.ts index c10ad560fa..e840f6584d 100644 --- a/packages/menu/src/MenuItem.ts +++ b/packages/menu/src/MenuItem.ts @@ -369,6 +369,14 @@ export class MenuItem extends LikeAnchor( this.openOverlay(); } + protected handleSubmenuFocus(): void { + requestAnimationFrame(() => { + // Wait till after `closeDescendentOverlays` has happened in Menu + // to reopen (keey open) the direct descendent of this Menu Item + this.overlayElement.open = this.open; + }); + } + protected handlePointerenter(): void { if (this.leaveTimeout) { clearTimeout(this.leaveTimeout); @@ -512,6 +520,11 @@ export class MenuItem extends LikeAnchor( this.handleSubmenuClick, options ); + this.addEventListener( + 'focus', + this.handleSubmenuFocus, + options + ); this.addEventListener( 'pointerenter', this.handlePointerenter, diff --git a/packages/overlay/src/topLayerOverTransforms.ts b/packages/overlay/src/topLayerOverTransforms.ts index 5e2c763bcc..a721d9339b 100644 --- a/packages/overlay/src/topLayerOverTransforms.ts +++ b/packages/overlay/src/topLayerOverTransforms.ts @@ -14,6 +14,7 @@ import { getContainingBlock, getWindow, isContainingBlock, + isWebKit, } from '@floating-ui/utils/dom'; import { VirtualTrigger } from './VirtualTrigger.js'; @@ -79,7 +80,9 @@ export const topLayerOverTransforms = (): Middleware => ({ const css = getComputedStyle(containingBlock); overTransforms = withinReference && - (css.transform !== 'none' || css.filter !== 'none'); + (css.transform !== 'none' || + (!isWebKit() && + (css.filter ? css.filter !== 'none' : false))); } if (onTopLayer && overTransforms && containingBlock) { diff --git a/packages/overlay/stories/overlay-element.stories.ts b/packages/overlay/stories/overlay-element.stories.ts index ed271a5fc9..e4dc8f5f85 100644 --- a/packages/overlay/stories/overlay-element.stories.ts +++ b/packages/overlay/stories/overlay-element.stories.ts @@ -167,11 +167,24 @@ export const actionGroup = ({ delayed }: Properties): TemplateResult => { return html` @@ -187,6 +200,41 @@ export const actionGroup = ({ delayed }: Properties): TemplateResult => { + + + cms + + Update All Content + + + Refresh All XDs + + + + ssg + + Clear Cache + + + + vrt + + Contributions + + + Internal + + Public + + Patterns + + All + + + + Logout + + @@ -280,13 +328,27 @@ export const actionGroupWithFilters = ({ return html`