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`