@vaadin/menu-bar 23.3.0-alpha3 → 24.0.0-alpha1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vaadin/menu-bar",
3
- "version": "23.3.0-alpha3",
3
+ "version": "24.0.0-alpha1",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
@@ -37,16 +37,16 @@
37
37
  "dependencies": {
38
38
  "@open-wc/dedupe-mixin": "^1.3.0",
39
39
  "@polymer/polymer": "^3.0.0",
40
- "@vaadin/button": "23.3.0-alpha3",
41
- "@vaadin/component-base": "23.3.0-alpha3",
42
- "@vaadin/context-menu": "23.3.0-alpha3",
43
- "@vaadin/vaadin-lumo-styles": "23.3.0-alpha3",
44
- "@vaadin/vaadin-material-styles": "23.3.0-alpha3",
45
- "@vaadin/vaadin-themable-mixin": "23.3.0-alpha3"
40
+ "@vaadin/button": "24.0.0-alpha1",
41
+ "@vaadin/component-base": "24.0.0-alpha1",
42
+ "@vaadin/context-menu": "24.0.0-alpha1",
43
+ "@vaadin/vaadin-lumo-styles": "24.0.0-alpha1",
44
+ "@vaadin/vaadin-material-styles": "24.0.0-alpha1",
45
+ "@vaadin/vaadin-themable-mixin": "24.0.0-alpha1"
46
46
  },
47
47
  "devDependencies": {
48
48
  "@esm-bundle/chai": "^4.3.4",
49
- "@vaadin/icon": "23.3.0-alpha3",
49
+ "@vaadin/icon": "24.0.0-alpha1",
50
50
  "@vaadin/testing-helpers": "^0.3.2",
51
51
  "sinon": "^13.0.2"
52
52
  },
@@ -54,5 +54,5 @@
54
54
  "web-types.json",
55
55
  "web-types.lit.json"
56
56
  ],
57
- "gitHead": "e86cd2abf3e28bade37711291331415d92c454ec"
57
+ "gitHead": "427527c27c4b27822d61fd41d38d7b170134770b"
58
58
  }
@@ -9,6 +9,14 @@ import { css, registerStyles } from '@vaadin/vaadin-themable-mixin/vaadin-themab
9
9
  registerStyles(
10
10
  'vaadin-menu-bar-button',
11
11
  css`
12
+ :host {
13
+ flex-shrink: 0;
14
+ }
15
+
16
+ :host([slot='overflow']) {
17
+ margin-inline-end: 0;
18
+ }
19
+
12
20
  [part='label'] ::slotted(vaadin-context-menu-item) {
13
21
  position: relative;
14
22
  z-index: 1;
@@ -4,11 +4,12 @@
4
4
  * This program is available under Apache License Version 2.0, available at https://vaadin.com/license/
5
5
  */
6
6
  import type { Constructor } from '@open-wc/dedupe-mixin';
7
+ import type { ControllerMixinClass } from '@vaadin/component-base/src/controller-mixin.js';
7
8
  import type { ResizeMixinClass } from '@vaadin/component-base/src/resize-mixin.js';
8
9
 
9
10
  export declare function ButtonsMixin<T extends Constructor<HTMLElement>>(
10
11
  base: T,
11
- ): Constructor<ButtonsMixinClass> & Constructor<ResizeMixinClass> & T;
12
+ ): Constructor<ButtonsMixinClass> & Constructor<ControllerMixinClass> & Constructor<ResizeMixinClass> & T;
12
13
 
13
14
  export declare class ButtonsMixinClass {
14
15
  protected readonly _buttons: HTMLElement[];
@@ -3,14 +3,17 @@
3
3
  * Copyright (c) 2019 - 2022 Vaadin Ltd.
4
4
  * This program is available under Apache License Version 2.0, available at https://vaadin.com/license/
5
5
  */
6
+ import { ControllerMixin } from '@vaadin/component-base/src/controller-mixin.js';
6
7
  import { ResizeMixin } from '@vaadin/component-base/src/resize-mixin.js';
8
+ import { SlotController } from '@vaadin/component-base/src/slot-controller.js';
7
9
 
8
10
  /**
9
11
  * @polymerMixin
10
12
  * @mixes ResizeMixin
13
+ * @mixes ControllerMixin
11
14
  */
12
15
  export const ButtonsMixin = (superClass) =>
13
- class extends ResizeMixin(superClass) {
16
+ class extends ResizeMixin(ControllerMixin(superClass)) {
14
17
  static get properties() {
15
18
  return {
16
19
  /**
@@ -21,11 +24,20 @@ export const ButtonsMixin = (superClass) =>
21
24
  type: Boolean,
22
25
  value: false,
23
26
  },
27
+
28
+ /** @protected */
29
+ _overflow: {
30
+ type: Object,
31
+ },
24
32
  };
25
33
  }
26
34
 
27
35
  static get observers() {
28
- return ['_menuItemsChanged(items, items.splices)'];
36
+ return [
37
+ '__hasOverflowChanged(_hasOverflow, _overflow)',
38
+ '__i18nChanged(i18n, _overflow)',
39
+ '_menuItemsChanged(items, _overflow, items.splices)',
40
+ ];
29
41
  }
30
42
 
31
43
  /**
@@ -43,13 +55,24 @@ export const ButtonsMixin = (superClass) =>
43
55
  super.ready();
44
56
 
45
57
  this.setAttribute('role', 'menubar');
46
- }
47
58
 
48
- /** @protected */
49
- connectedCallback() {
50
- super.connectedCallback();
59
+ this._overflowController = new SlotController(
60
+ this,
61
+ 'overflow',
62
+ () => document.createElement('vaadin-menu-bar-button'),
63
+ (_, btn) => {
64
+ btn.setAttribute('hidden', '');
51
65
 
52
- this._initButtonAttrs(this._overflow);
66
+ const dots = document.createElement('div');
67
+ dots.setAttribute('aria-hidden', 'true');
68
+ dots.textContent = '···';
69
+ btn.appendChild(dots);
70
+
71
+ this._overflow = btn;
72
+ this._initButtonAttrs(btn);
73
+ },
74
+ );
75
+ this.addController(this._overflowController);
53
76
  }
54
77
 
55
78
  /**
@@ -57,7 +80,7 @@ export const ButtonsMixin = (superClass) =>
57
80
  * @protected
58
81
  */
59
82
  get _buttons() {
60
- return Array.from(this.shadowRoot.querySelectorAll('[part$="button"]'));
83
+ return Array.from(this.querySelectorAll('vaadin-menu-bar-button'));
61
84
  }
62
85
 
63
86
  /**
@@ -68,22 +91,36 @@ export const ButtonsMixin = (superClass) =>
68
91
  return this.shadowRoot.querySelector('[part="container"]');
69
92
  }
70
93
 
71
- /**
72
- * @return {!HTMLElement}
73
- * @protected
74
- */
75
- get _overflow() {
76
- return this.shadowRoot.querySelector('[part="overflow-button"]');
94
+ /** @private */
95
+ __hasOverflowChanged(hasOverflow, overflow) {
96
+ if (overflow) {
97
+ overflow.toggleAttribute('hidden', !hasOverflow);
98
+ }
77
99
  }
78
100
 
79
101
  /** @private */
80
- _menuItemsChanged(items) {
102
+ _menuItemsChanged(items, overflow) {
103
+ if (!overflow) {
104
+ return;
105
+ }
106
+
81
107
  if (items !== this._oldItems) {
82
108
  this._oldItems = items;
83
109
  this.__renderButtons(items);
84
110
  }
85
111
  }
86
112
 
113
+ /** @private */
114
+ __i18nChanged(i18n, overflow) {
115
+ if (overflow && i18n && i18n.moreOptions !== undefined) {
116
+ if (i18n.moreOptions) {
117
+ overflow.setAttribute('aria-label', i18n.moreOptions);
118
+ } else {
119
+ overflow.removeAttribute('aria-label');
120
+ }
121
+ }
122
+ }
123
+
87
124
  /** @private */
88
125
  __getOverflowCount(overflow) {
89
126
  // We can't use optional chaining due to webpack 4
@@ -170,17 +207,16 @@ export const ButtonsMixin = (superClass) =>
170
207
 
171
208
  /** @protected */
172
209
  _removeButtons() {
173
- const container = this._container;
174
-
175
- while (container.children.length > 1) {
176
- container.removeChild(container.firstElementChild);
177
- }
210
+ this._buttons.forEach((button) => {
211
+ if (button !== this._overflow) {
212
+ this.removeChild(button);
213
+ }
214
+ });
178
215
  }
179
216
 
180
217
  /** @protected */
181
218
  _initButton(item) {
182
219
  const button = document.createElement('vaadin-menu-bar-button');
183
- button.setAttribute('part', 'menu-bar-button');
184
220
 
185
221
  const itemCopy = { ...item };
186
222
  button.item = itemCopy;
@@ -231,11 +267,6 @@ export const ButtonsMixin = (superClass) =>
231
267
  }
232
268
  }
233
269
 
234
- /** @protected */
235
- _appendButton(button) {
236
- this._container.insertBefore(button, this._overflow);
237
- }
238
-
239
270
  /** @private */
240
271
  __getComponent(item) {
241
272
  const itemComponent = item.component;
@@ -268,7 +299,7 @@ export const ButtonsMixin = (superClass) =>
268
299
 
269
300
  items.forEach((item) => {
270
301
  const button = this._initButton(item);
271
- this._appendButton(button);
302
+ this.insertBefore(button, this._overflow);
272
303
  this._setButtonDisabled(button, item.disabled);
273
304
  this._initButtonAttrs(button);
274
305
  this._setButtonTheme(button, this._theme);
@@ -4,7 +4,7 @@
4
4
  * This program is available under Apache License Version 2.0, available at https://vaadin.com/license/
5
5
  */
6
6
  import { FocusMixin } from '@vaadin/component-base/src/focus-mixin.js';
7
- import { isKeyboardActive } from '@vaadin/component-base/src/focus-utils.js';
7
+ import { isElementFocused, isKeyboardActive } from '@vaadin/component-base/src/focus-utils.js';
8
8
  import { KeyboardDirectionMixin } from '@vaadin/component-base/src/keyboard-direction-mixin.js';
9
9
 
10
10
  /**
@@ -55,15 +55,15 @@ export const InteractionsMixin = (superClass) =>
55
55
 
56
56
  /**
57
57
  * Override getter from `KeyboardDirectionMixin`
58
- * to look for activeElement in shadow root, or
59
- * use the expanded button as a fallback.
58
+ * to use expanded button for arrow navigation
59
+ * when the sub-menu is opened and has focus.
60
60
  *
61
61
  * @return {Element | null}
62
62
  * @protected
63
63
  * @override
64
64
  */
65
65
  get focused() {
66
- return this.shadowRoot.activeElement || this._expandedButton;
66
+ return (this._getItems() || []).find(isElementFocused) || this._expandedButton;
67
67
  }
68
68
 
69
69
  /**
@@ -89,11 +89,6 @@ export const InteractionsMixin = (superClass) =>
89
89
  return this._buttons;
90
90
  }
91
91
 
92
- /** @private */
93
- get __isRTL() {
94
- return this.getAttribute('dir') === 'rtl';
95
- }
96
-
97
92
  /** @protected */
98
93
  disconnectedCallback() {
99
94
  super.disconnectedCallback();
@@ -129,7 +124,7 @@ export const InteractionsMixin = (superClass) =>
129
124
 
130
125
  /** @protected */
131
126
  _hideTooltip(immediate) {
132
- const tooltip = this._tooltipController.node;
127
+ const tooltip = this._tooltipController && this._tooltipController.node;
133
128
  if (tooltip) {
134
129
  tooltip._stateController.close(immediate);
135
130
  }
@@ -192,7 +187,7 @@ export const InteractionsMixin = (superClass) =>
192
187
  */
193
188
  _setFocused(focused) {
194
189
  if (focused) {
195
- const target = this.shadowRoot.querySelector('[part$="button"][tabindex="0"]');
190
+ const target = this.querySelector('[tabindex="0"]');
196
191
  if (target) {
197
192
  this._buttons.forEach((btn) => {
198
193
  this._setTabindex(btn, btn === target);
@@ -3,7 +3,6 @@
3
3
  * Copyright (c) 2019 - 2022 Vaadin Ltd.
4
4
  * This program is available under Apache License Version 2.0, available at https://vaadin.com/license/
5
5
  */
6
- import { ControllerMixin } from '@vaadin/component-base/src/controller-mixin.js';
7
6
  import { DisabledMixin } from '@vaadin/component-base/src/disabled-mixin.js';
8
7
  import { ElementMixin } from '@vaadin/component-base/src/element-mixin.js';
9
8
  import { ThemableMixin } from '@vaadin/vaadin-themable-mixin/vaadin-themable-mixin.js';
@@ -87,8 +86,6 @@ export interface MenuBarEventMap extends HTMLElementEventMap, MenuBarCustomEvent
87
86
  * Part name | Description
88
87
  * ------------------|----------------
89
88
  * `container` | The container wrapping menu bar buttons.
90
- * `menu-bar-button` | The menu bar button.
91
- * `overflow-button` | The "overflow" button appearing when menu bar width is not enough to fit all the buttons.
92
89
  *
93
90
  * The following state attributes are available for styling:
94
91
  *
@@ -111,9 +108,7 @@ export interface MenuBarEventMap extends HTMLElementEventMap, MenuBarCustomEvent
111
108
  *
112
109
  * @fires {CustomEvent} item-selected - Fired when a submenu item or menu bar button without children is clicked.
113
110
  */
114
- declare class MenuBar extends ButtonsMixin(
115
- DisabledMixin(InteractionsMixin(ElementMixin(ThemableMixin(ControllerMixin(HTMLElement))))),
116
- ) {
111
+ declare class MenuBar extends ButtonsMixin(DisabledMixin(InteractionsMixin(ElementMixin(ThemableMixin(HTMLElement))))) {
117
112
  /**
118
113
  * Defines a hierarchical structure, where root level items represent menu bar buttons,
119
114
  * and `children` property configures a submenu with items to be opened below
@@ -6,7 +6,6 @@
6
6
  import './vaadin-menu-bar-submenu.js';
7
7
  import './vaadin-menu-bar-button.js';
8
8
  import { html, PolymerElement } from '@polymer/polymer/polymer-element.js';
9
- import { ControllerMixin } from '@vaadin/component-base/src/controller-mixin.js';
10
9
  import { DisabledMixin } from '@vaadin/component-base/src/disabled-mixin.js';
11
10
  import { ElementMixin } from '@vaadin/component-base/src/element-mixin.js';
12
11
  import { TooltipController } from '@vaadin/component-base/src/tooltip-controller.js';
@@ -38,8 +37,6 @@ import { InteractionsMixin } from './vaadin-menu-bar-interactions-mixin.js';
38
37
  * Part name | Description
39
38
  * ------------------|----------------
40
39
  * `container` | The container wrapping menu bar buttons.
41
- * `menu-bar-button` | The menu bar button.
42
- * `overflow-button` | The "overflow" button appearing when menu bar width is not enough to fit all the buttons.
43
40
  *
44
41
  * The following state attributes are available for styling:
45
42
  *
@@ -63,16 +60,13 @@ import { InteractionsMixin } from './vaadin-menu-bar-interactions-mixin.js';
63
60
  * @fires {CustomEvent<boolean>} item-selected - Fired when a submenu item or menu bar button without children is clicked.
64
61
  *
65
62
  * @extends HTMLElement
66
- * @mixes ControllerMixin
67
63
  * @mixes ButtonsMixin
68
64
  * @mixes InteractionsMixin
69
65
  * @mixes DisabledMixin
70
66
  * @mixes ElementMixin
71
67
  * @mixes ThemableMixin
72
68
  */
73
- class MenuBar extends ButtonsMixin(
74
- DisabledMixin(InteractionsMixin(ElementMixin(ThemableMixin(ControllerMixin(PolymerElement))))),
75
- ) {
69
+ class MenuBar extends ButtonsMixin(DisabledMixin(InteractionsMixin(ElementMixin(ThemableMixin(PolymerElement))))) {
76
70
  static get template() {
77
71
  return html`
78
72
  <style>
@@ -91,27 +85,11 @@ class MenuBar extends ButtonsMixin(
91
85
  flex-wrap: nowrap;
92
86
  overflow: hidden;
93
87
  }
94
-
95
- [part$='button'] {
96
- flex-shrink: 0;
97
- }
98
-
99
- [part='overflow-button'] {
100
- margin-right: 0;
101
- }
102
-
103
- .dots::before {
104
- display: block;
105
- content: '\\00B7\\00B7\\00B7';
106
- font-size: inherit;
107
- line-height: inherit;
108
- }
109
88
  </style>
110
89
 
111
90
  <div part="container">
112
- <vaadin-menu-bar-button part="overflow-button" hidden$="[[!_hasOverflow]]" aria-label$="[[i18n.moreOptions]]">
113
- <div class="dots"></div>
114
- </vaadin-menu-bar-button>
91
+ <slot></slot>
92
+ <slot name="overflow"></slot>
115
93
  </div>
116
94
  <vaadin-menu-bar-submenu is-root=""></vaadin-menu-bar-submenu>
117
95
 
@@ -219,7 +197,7 @@ class MenuBar extends ButtonsMixin(
219
197
  }
220
198
 
221
199
  static get observers() {
222
- return ['_themeChanged(_theme)'];
200
+ return ['_themeChanged(_theme, _overflow)'];
223
201
  }
224
202
 
225
203
  /** @protected */
@@ -255,8 +233,8 @@ class MenuBar extends ButtonsMixin(
255
233
  * @param {string | null} theme
256
234
  * @protected
257
235
  */
258
- _themeChanged(theme) {
259
- if (this.shadowRoot) {
236
+ _themeChanged(theme, overflow) {
237
+ if (overflow) {
260
238
  this._buttons.forEach((btn) => this._setButtonTheme(btn, theme));
261
239
  this.__detectOverflow();
262
240
  }
@@ -54,7 +54,7 @@ const menuBarButton = css`
54
54
  }
55
55
 
56
56
  :host(:nth-last-of-type(2)),
57
- :host([part='overflow-button']) {
57
+ :host([slot='overflow']) {
58
58
  border-radius: 0 var(--lumo-border-radius-m) var(--lumo-border-radius-m) 0;
59
59
  }
60
60
 
@@ -63,18 +63,18 @@ const menuBarButton = css`
63
63
  border-radius: var(--lumo-border-radius-m);
64
64
  }
65
65
 
66
- :host([part='overflow-button']) {
66
+ :host([slot='overflow']) {
67
67
  min-width: var(--lumo-button-size);
68
68
  padding-left: calc(var(--lumo-button-size) / 4);
69
69
  padding-right: calc(var(--lumo-button-size) / 4);
70
70
  }
71
71
 
72
- :host([part='overflow-button']) ::slotted(*) {
72
+ :host([slot='overflow']) ::slotted(*) {
73
73
  font-size: var(--lumo-font-size-xl);
74
74
  }
75
75
 
76
- :host([part='overflow-button']) [part='prefix'],
77
- :host([part='overflow-button']) [part='suffix'] {
76
+ :host([slot='overflow']) [part='prefix'],
77
+ :host([slot='overflow']) [part='suffix'] {
78
78
  margin-left: 0;
79
79
  margin-right: 0;
80
80
  }
@@ -92,7 +92,7 @@ const menuBarButton = css`
92
92
  }
93
93
 
94
94
  :host([dir='rtl']:nth-last-of-type(2)),
95
- :host([dir='rtl'][part='overflow-button']) {
95
+ :host([dir='rtl'][slot='overflow']) {
96
96
  border-radius: var(--lumo-border-radius-m) 0 0 var(--lumo-border-radius-m);
97
97
  }
98
98
  `;
@@ -4,12 +4,12 @@ import { css, registerStyles } from '@vaadin/vaadin-themable-mixin/vaadin-themab
4
4
  registerStyles(
5
5
  'vaadin-menu-bar',
6
6
  css`
7
- :host([has-single-button]) [part$='button'] {
7
+ :host([has-single-button]) ::slotted(vaadin-menu-bar-button) {
8
8
  border-radius: var(--lumo-border-radius-m);
9
9
  }
10
10
 
11
- :host([theme~='end-aligned']) [part$='button']:first-child,
12
- :host([theme~='end-aligned'][has-single-button]) [part$='button'] {
11
+ :host([theme~='end-aligned']) ::slotted(vaadin-menu-bar-button:first-of-type),
12
+ :host([theme~='end-aligned'][has-single-button]) ::slotted(vaadin-menu-bar-button) {
13
13
  margin-inline-start: auto;
14
14
  }
15
15
  `,
@@ -54,17 +54,17 @@ const menuBarButton = css`
54
54
  }
55
55
 
56
56
  :host(:nth-last-of-type(2)),
57
- :host([part~='overflow-button']) {
57
+ :host([slot='overflow']) {
58
58
  border-radius: 0 4px 4px 0;
59
59
  }
60
60
 
61
- :host([part='overflow-button']) {
61
+ :host([slot='overflow']) {
62
62
  padding-right: 8px;
63
63
  padding-left: 8px;
64
64
  min-width: 36px;
65
65
  }
66
66
 
67
- :host([part='overflow-button']) ::slotted(*) {
67
+ :host([slot='overflow']) ::slotted(*) {
68
68
  font-size: 24px;
69
69
  }
70
70
 
@@ -73,7 +73,7 @@ const menuBarButton = css`
73
73
  }
74
74
 
75
75
  :host([theme~='outlined']:not([dir='rtl']):nth-last-of-type(2)),
76
- :host([theme~='outlined']:not([dir='rtl'])[part~='overflow-button']) {
76
+ :host([theme~='outlined']:not([dir='rtl'])[slot='overflow']) {
77
77
  margin-right: 0;
78
78
  }
79
79
 
@@ -88,7 +88,7 @@ const menuBarButton = css`
88
88
  }
89
89
 
90
90
  :host([dir='rtl']:nth-last-of-type(2)),
91
- :host([dir='rtl'][part='overflow-button']) {
91
+ :host([dir='rtl'][slot='overflow']) {
92
92
  border-radius: 4px 0 0 4px;
93
93
  }
94
94
 
@@ -101,7 +101,7 @@ const menuBarButton = css`
101
101
  }
102
102
 
103
103
  :host([theme~='outlined'][dir='rtl']:nth-last-of-type(2)),
104
- :host([theme~='outlined'][dir='rtl'][part~='overflow-button']) {
104
+ :host([theme~='outlined'][dir='rtl'][slot='overflow']) {
105
105
  margin-left: 0;
106
106
  }
107
107
  `;
@@ -8,12 +8,12 @@ registerStyles(
8
8
  padding-bottom: 5px;
9
9
  }
10
10
 
11
- :host([has-single-button]) [part$='button'] {
11
+ :host([has-single-button]) ::slotted(vaadin-menu-bar-button) {
12
12
  border-radius: 4px;
13
13
  }
14
14
 
15
- :host([theme~='end-aligned']) [part$='button']:first-child,
16
- :host([theme~='end-aligned'][has-single-button]) [part$='button'] {
15
+ :host([theme~='end-aligned']) ::slotted(vaadin-menu-bar-button:first-of-type),
16
+ :host([theme~='end-aligned'][has-single-button]) ::slotted(vaadin-menu-bar-button) {
17
17
  margin-inline-start: auto;
18
18
  }
19
19
  `,
package/web-types.json CHANGED
@@ -1,14 +1,14 @@
1
1
  {
2
2
  "$schema": "https://json.schemastore.org/web-types",
3
3
  "name": "@vaadin/menu-bar",
4
- "version": "23.3.0-alpha3",
4
+ "version": "24.0.0-alpha1",
5
5
  "description-markup": "markdown",
6
6
  "contributions": {
7
7
  "html": {
8
8
  "elements": [
9
9
  {
10
10
  "name": "vaadin-menu-bar",
11
- "description": "`<vaadin-menu-bar>` is a Web Component providing a set of horizontally stacked buttons offering\nthe user quick access to a consistent set of commands. Each button can toggle a submenu with\nsupport for additional levels of nested menus.\n\nTo create the menu bar, first add the component to the page:\n\n```\n<vaadin-menu-bar></vaadin-menu-bar>\n```\n\nAnd then use [`items`](https://cdn.vaadin.com/vaadin-web-components/23.3.0-alpha3/#/elements/vaadin-menu-bar#property-items) property to initialize the structure:\n\n```\ndocument.querySelector('vaadin-menu-bar').items = [{text: 'File'}, {text: 'Edit'}];\n```\n\n### Styling\n\nThe following shadow DOM parts are exposed for styling:\n\nPart name | Description\n------------------|----------------\n`container` | The container wrapping menu bar buttons.\n`menu-bar-button` | The menu bar button.\n`overflow-button` | The \"overflow\" button appearing when menu bar width is not enough to fit all the buttons.\n\nThe following state attributes are available for styling:\n\nAttribute | Description\n--------------------|----------------------------------\n`disabled` | Set when the menu bar is disabled\n`has-single-button` | Set when there is only one button visible\n\nSee [Styling Components](https://vaadin.com/docs/latest/styling/custom-theme/styling-components) documentation.\n\n### Internal components\n\nIn addition to `<vaadin-menu-bar>` itself, the following internal\ncomponents are themable:\n\n- `<vaadin-menu-bar-button>` - has the same API as [`<vaadin-button>`](https://cdn.vaadin.com/vaadin-web-components/23.3.0-alpha3/#/elements/vaadin-button).\n- `<vaadin-context-menu-item>` - has the same API as [`<vaadin-item>`](https://cdn.vaadin.com/vaadin-web-components/23.3.0-alpha3/#/elements/vaadin-item).\n- `<vaadin-context-menu-list-box>` - has the same API as [`<vaadin-list-box>`](https://cdn.vaadin.com/vaadin-web-components/23.3.0-alpha3/#/elements/vaadin-list-box).\n- `<vaadin-context-menu-overlay>` - has the same API as [`<vaadin-overlay>`](https://cdn.vaadin.com/vaadin-web-components/23.3.0-alpha3/#/elements/vaadin-overlay).",
11
+ "description": "`<vaadin-menu-bar>` is a Web Component providing a set of horizontally stacked buttons offering\nthe user quick access to a consistent set of commands. Each button can toggle a submenu with\nsupport for additional levels of nested menus.\n\nTo create the menu bar, first add the component to the page:\n\n```\n<vaadin-menu-bar></vaadin-menu-bar>\n```\n\nAnd then use [`items`](https://cdn.vaadin.com/vaadin-web-components/24.0.0-alpha1/#/elements/vaadin-menu-bar#property-items) property to initialize the structure:\n\n```\ndocument.querySelector('vaadin-menu-bar').items = [{text: 'File'}, {text: 'Edit'}];\n```\n\n### Styling\n\nThe following shadow DOM parts are exposed for styling:\n\nPart name | Description\n------------------|----------------\n`container` | The container wrapping menu bar buttons.\n\nThe following state attributes are available for styling:\n\nAttribute | Description\n--------------------|----------------------------------\n`disabled` | Set when the menu bar is disabled\n`has-single-button` | Set when there is only one button visible\n\nSee [Styling Components](https://vaadin.com/docs/latest/styling/custom-theme/styling-components) documentation.\n\n### Internal components\n\nIn addition to `<vaadin-menu-bar>` itself, the following internal\ncomponents are themable:\n\n- `<vaadin-menu-bar-button>` - has the same API as [`<vaadin-button>`](https://cdn.vaadin.com/vaadin-web-components/24.0.0-alpha1/#/elements/vaadin-button).\n- `<vaadin-context-menu-item>` - has the same API as [`<vaadin-item>`](https://cdn.vaadin.com/vaadin-web-components/24.0.0-alpha1/#/elements/vaadin-item).\n- `<vaadin-context-menu-list-box>` - has the same API as [`<vaadin-list-box>`](https://cdn.vaadin.com/vaadin-web-components/24.0.0-alpha1/#/elements/vaadin-list-box).\n- `<vaadin-context-menu-overlay>` - has the same API as [`<vaadin-overlay>`](https://cdn.vaadin.com/vaadin-web-components/24.0.0-alpha1/#/elements/vaadin-overlay).",
12
12
  "attributes": [
13
13
  {
14
14
  "name": "open-on-hover",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://json.schemastore.org/web-types",
3
3
  "name": "@vaadin/menu-bar",
4
- "version": "23.3.0-alpha3",
4
+ "version": "24.0.0-alpha1",
5
5
  "description-markup": "markdown",
6
6
  "framework": "lit",
7
7
  "framework-config": {
@@ -16,7 +16,7 @@
16
16
  "elements": [
17
17
  {
18
18
  "name": "vaadin-menu-bar",
19
- "description": "`<vaadin-menu-bar>` is a Web Component providing a set of horizontally stacked buttons offering\nthe user quick access to a consistent set of commands. Each button can toggle a submenu with\nsupport for additional levels of nested menus.\n\nTo create the menu bar, first add the component to the page:\n\n```\n<vaadin-menu-bar></vaadin-menu-bar>\n```\n\nAnd then use [`items`](https://cdn.vaadin.com/vaadin-web-components/23.3.0-alpha3/#/elements/vaadin-menu-bar#property-items) property to initialize the structure:\n\n```\ndocument.querySelector('vaadin-menu-bar').items = [{text: 'File'}, {text: 'Edit'}];\n```\n\n### Styling\n\nThe following shadow DOM parts are exposed for styling:\n\nPart name | Description\n------------------|----------------\n`container` | The container wrapping menu bar buttons.\n`menu-bar-button` | The menu bar button.\n`overflow-button` | The \"overflow\" button appearing when menu bar width is not enough to fit all the buttons.\n\nThe following state attributes are available for styling:\n\nAttribute | Description\n--------------------|----------------------------------\n`disabled` | Set when the menu bar is disabled\n`has-single-button` | Set when there is only one button visible\n\nSee [Styling Components](https://vaadin.com/docs/latest/styling/custom-theme/styling-components) documentation.\n\n### Internal components\n\nIn addition to `<vaadin-menu-bar>` itself, the following internal\ncomponents are themable:\n\n- `<vaadin-menu-bar-button>` - has the same API as [`<vaadin-button>`](https://cdn.vaadin.com/vaadin-web-components/23.3.0-alpha3/#/elements/vaadin-button).\n- `<vaadin-context-menu-item>` - has the same API as [`<vaadin-item>`](https://cdn.vaadin.com/vaadin-web-components/23.3.0-alpha3/#/elements/vaadin-item).\n- `<vaadin-context-menu-list-box>` - has the same API as [`<vaadin-list-box>`](https://cdn.vaadin.com/vaadin-web-components/23.3.0-alpha3/#/elements/vaadin-list-box).\n- `<vaadin-context-menu-overlay>` - has the same API as [`<vaadin-overlay>`](https://cdn.vaadin.com/vaadin-web-components/23.3.0-alpha3/#/elements/vaadin-overlay).",
19
+ "description": "`<vaadin-menu-bar>` is a Web Component providing a set of horizontally stacked buttons offering\nthe user quick access to a consistent set of commands. Each button can toggle a submenu with\nsupport for additional levels of nested menus.\n\nTo create the menu bar, first add the component to the page:\n\n```\n<vaadin-menu-bar></vaadin-menu-bar>\n```\n\nAnd then use [`items`](https://cdn.vaadin.com/vaadin-web-components/24.0.0-alpha1/#/elements/vaadin-menu-bar#property-items) property to initialize the structure:\n\n```\ndocument.querySelector('vaadin-menu-bar').items = [{text: 'File'}, {text: 'Edit'}];\n```\n\n### Styling\n\nThe following shadow DOM parts are exposed for styling:\n\nPart name | Description\n------------------|----------------\n`container` | The container wrapping menu bar buttons.\n\nThe following state attributes are available for styling:\n\nAttribute | Description\n--------------------|----------------------------------\n`disabled` | Set when the menu bar is disabled\n`has-single-button` | Set when there is only one button visible\n\nSee [Styling Components](https://vaadin.com/docs/latest/styling/custom-theme/styling-components) documentation.\n\n### Internal components\n\nIn addition to `<vaadin-menu-bar>` itself, the following internal\ncomponents are themable:\n\n- `<vaadin-menu-bar-button>` - has the same API as [`<vaadin-button>`](https://cdn.vaadin.com/vaadin-web-components/24.0.0-alpha1/#/elements/vaadin-button).\n- `<vaadin-context-menu-item>` - has the same API as [`<vaadin-item>`](https://cdn.vaadin.com/vaadin-web-components/24.0.0-alpha1/#/elements/vaadin-item).\n- `<vaadin-context-menu-list-box>` - has the same API as [`<vaadin-list-box>`](https://cdn.vaadin.com/vaadin-web-components/24.0.0-alpha1/#/elements/vaadin-list-box).\n- `<vaadin-context-menu-overlay>` - has the same API as [`<vaadin-overlay>`](https://cdn.vaadin.com/vaadin-web-components/24.0.0-alpha1/#/elements/vaadin-overlay).",
20
20
  "extension": true,
21
21
  "attributes": [
22
22
  {