Skip to content

Commit ac47983

Browse files
authored
refactor!: update menu-bar to render root submenu in light DOM (#9745)
1 parent e8e0940 commit ac47983

File tree

4 files changed

+28
-13
lines changed

4 files changed

+28
-13
lines changed

packages/menu-bar/src/vaadin-menu-bar-mixin.js

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -274,11 +274,6 @@ export const MenuBarMixin = (superClass) =>
274274
return Array.from(this.querySelectorAll('vaadin-menu-bar-button'));
275275
}
276276

277-
/** @private */
278-
get _subMenu() {
279-
return this.shadowRoot.querySelector('vaadin-menu-bar-submenu');
280-
}
281-
282277
/** @private */
283278
get _hasOverflow() {
284279
return this._overflow && !this._overflow.hasAttribute('hidden');
@@ -297,6 +292,20 @@ export const MenuBarMixin = (superClass) =>
297292

298293
this.setAttribute('role', 'menubar');
299294

295+
this._subMenuController = new SlotController(this, 'submenu', 'vaadin-menu-bar-submenu', {
296+
initializer: (menu) => {
297+
menu.setAttribute('is-root', '');
298+
299+
menu.addEventListener('item-selected', this.__onItemSelected.bind(this));
300+
menu.addEventListener('close-all-menus', this.__onEscapeClose.bind(this));
301+
302+
const overlay = menu._overlayElement;
303+
overlay.addEventListener('keydown', this.__boundOnContextMenuKeydown);
304+
305+
this._subMenu = menu;
306+
},
307+
});
308+
300309
this._overflowController = new SlotController(this, 'overflow', 'vaadin-menu-bar-button', {
301310
initializer: (btn) => {
302311
btn.setAttribute('hidden', '');
@@ -313,17 +322,13 @@ export const MenuBarMixin = (superClass) =>
313322
this._overflow = btn;
314323
},
315324
});
325+
326+
this.addController(this._subMenuController);
316327
this.addController(this._overflowController);
317328

318329
this.addEventListener('mousedown', () => this._hideTooltip(true));
319330
this.addEventListener('mouseleave', () => this._hideTooltip());
320331

321-
this._subMenu.addEventListener('item-selected', this.__onItemSelected.bind(this));
322-
this._subMenu.addEventListener('close-all-menus', this.__onEscapeClose.bind(this));
323-
324-
const overlay = this._subMenu._overlayElement;
325-
overlay.addEventListener('keydown', this.__boundOnContextMenuKeydown);
326-
327332
this._container = this.shadowRoot.querySelector('[part="container"]');
328333
}
329334

@@ -343,6 +348,10 @@ export const MenuBarMixin = (superClass) =>
343348
this.__updateSubMenu();
344349
}
345350

351+
if (props.has('overlayClass')) {
352+
this._subMenu.overlayClass = this.overlayClass;
353+
}
354+
346355
if (props.has('_theme')) {
347356
this._themeChanged(this._theme);
348357
}

packages/menu-bar/src/vaadin-menu-bar-submenu-mixin.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ export const SubMenuMixin = (superClass) =>
4343

4444
// Only handle 1st level submenu
4545
if (this.hasAttribute('is-root')) {
46-
this.getRootNode().host._close();
46+
this.parentElement._close();
4747
}
4848
}
4949

packages/menu-bar/src/vaadin-menu-bar.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,8 @@ class MenuBar extends MenuBarMixin(ElementMixin(ThemableMixin(PolylitMixin(LumoI
9393
<slot></slot>
9494
<slot name="overflow"></slot>
9595
</div>
96-
<vaadin-menu-bar-submenu is-root .overlayClass="${this.overlayClass}"></vaadin-menu-bar-submenu>
96+
97+
<slot name="submenu"></slot>
9798
9899
<slot name="tooltip"></slot>
99100
`;

packages/menu-bar/test/dom/__snapshots__/menu-bar.test.snap.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,11 @@ export const snapshots = {};
33

44
snapshots["menu-bar basic"] =
55
`<vaadin-menu-bar role="menubar">
6+
<vaadin-menu-bar-submenu
7+
is-root=""
8+
slot="submenu"
9+
>
10+
</vaadin-menu-bar-submenu>
611
<vaadin-menu-bar-button
712
class="home"
813
first-visible=""

0 commit comments

Comments
 (0)