@vaadin/multi-select-combo-box 25.0.0-alpha1 → 25.0.0-alpha10

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.
Files changed (25) hide show
  1. package/package.json +17 -15
  2. package/src/{vaadin-multi-select-combo-box-styles.d.ts → styles/vaadin-multi-select-combo-box-base-styles.d.ts} +1 -3
  3. package/src/styles/vaadin-multi-select-combo-box-base-styles.js +58 -0
  4. package/src/styles/vaadin-multi-select-combo-box-chip-base-styles.js +112 -0
  5. package/src/styles/vaadin-multi-select-combo-box-chip-core-styles.js +33 -0
  6. package/src/styles/vaadin-multi-select-combo-box-core-styles.d.ts +8 -0
  7. package/src/{vaadin-multi-select-combo-box-styles.js → styles/vaadin-multi-select-combo-box-core-styles.js} +6 -29
  8. package/src/styles/vaadin-multi-select-combo-box-overlay-base-styles.js +19 -0
  9. package/src/styles/vaadin-multi-select-combo-box-overlay-core-styles.js +21 -0
  10. package/src/styles/vaadin-multi-select-combo-box-scroller-base-styles.js +8 -0
  11. package/src/styles/vaadin-multi-select-combo-box-scroller-core-styles.js +27 -0
  12. package/src/vaadin-multi-select-combo-box-chip.js +4 -3
  13. package/src/vaadin-multi-select-combo-box-container.js +1 -0
  14. package/src/vaadin-multi-select-combo-box-item.js +7 -11
  15. package/src/vaadin-multi-select-combo-box-mixin.d.ts +9 -80
  16. package/src/vaadin-multi-select-combo-box-mixin.js +396 -267
  17. package/src/vaadin-multi-select-combo-box-overlay.js +5 -19
  18. package/src/vaadin-multi-select-combo-box-scroller.js +3 -24
  19. package/src/vaadin-multi-select-combo-box.d.ts +13 -7
  20. package/src/vaadin-multi-select-combo-box.js +40 -90
  21. package/theme/lumo/vaadin-multi-select-combo-box-styles.js +4 -1
  22. package/web-types.json +207 -230
  23. package/web-types.lit.json +78 -78
  24. package/src/vaadin-multi-select-combo-box-internal-mixin.js +0 -449
  25. package/src/vaadin-multi-select-combo-box-internal.js +0 -56
@@ -3,29 +3,16 @@
3
3
  * Copyright (c) 2021 - 2025 Vaadin Ltd.
4
4
  * This program is available under Apache License Version 2.0, available at https://vaadin.com/license/
5
5
  */
6
- import { css, html, LitElement } from 'lit';
6
+ import { html, LitElement } from 'lit';
7
7
  import { ComboBoxOverlayMixin } from '@vaadin/combo-box/src/vaadin-combo-box-overlay-mixin.js';
8
8
  import { defineCustomElement } from '@vaadin/component-base/src/define.js';
9
9
  import { DirMixin } from '@vaadin/component-base/src/dir-mixin.js';
10
10
  import { PolylitMixin } from '@vaadin/component-base/src/polylit-mixin.js';
11
+ import { overlayStyles } from '@vaadin/overlay/src/styles/vaadin-overlay-core-styles.js';
11
12
  import { OverlayMixin } from '@vaadin/overlay/src/vaadin-overlay-mixin.js';
12
- import { overlayStyles } from '@vaadin/overlay/src/vaadin-overlay-styles.js';
13
+ import { LumoInjectionMixin } from '@vaadin/vaadin-themable-mixin/lumo-injection-mixin.js';
13
14
  import { ThemableMixin } from '@vaadin/vaadin-themable-mixin/vaadin-themable-mixin.js';
14
-
15
- const multiSelectComboBoxOverlayStyles = css`
16
- #overlay {
17
- width: var(
18
- --vaadin-multi-select-combo-box-overlay-width,
19
- var(--_vaadin-multi-select-combo-box-overlay-default-width, auto)
20
- );
21
- }
22
-
23
- [part='content'] {
24
- display: flex;
25
- flex-direction: column;
26
- height: 100%;
27
- }
28
- `;
15
+ import { multiSelectComboBoxOverlayStyles } from './styles/vaadin-multi-select-combo-box-overlay-core-styles.js';
29
16
 
30
17
  /**
31
18
  * An element used internally by `<vaadin-multi-select-combo-box>`. Not intended to be used separately.
@@ -39,7 +26,7 @@ const multiSelectComboBoxOverlayStyles = css`
39
26
  * @private
40
27
  */
41
28
  class MultiSelectComboBoxOverlay extends ComboBoxOverlayMixin(
42
- OverlayMixin(DirMixin(ThemableMixin(PolylitMixin(LitElement)))),
29
+ OverlayMixin(DirMixin(ThemableMixin(PolylitMixin(LumoInjectionMixin(LitElement))))),
43
30
  ) {
44
31
  static get is() {
45
32
  return 'vaadin-multi-select-combo-box-overlay';
@@ -52,7 +39,6 @@ class MultiSelectComboBoxOverlay extends ComboBoxOverlayMixin(
52
39
  /** @protected */
53
40
  render() {
54
41
  return html`
55
- <div id="backdrop" part="backdrop" hidden></div>
56
42
  <div part="overlay" id="overlay">
57
43
  <div part="loader"></div>
58
44
  <div part="content" id="content"><slot></slot></div>
@@ -3,11 +3,12 @@
3
3
  * Copyright (c) 2021 - 2025 Vaadin Ltd.
4
4
  * This program is available under Apache License Version 2.0, available at https://vaadin.com/license/
5
5
  */
6
- import { css, html, LitElement } from 'lit';
6
+ import { html, LitElement } from 'lit';
7
7
  import { ComboBoxPlaceholder } from '@vaadin/combo-box/src/vaadin-combo-box-placeholder.js';
8
8
  import { ComboBoxScrollerMixin } from '@vaadin/combo-box/src/vaadin-combo-box-scroller-mixin.js';
9
9
  import { defineCustomElement } from '@vaadin/component-base/src/define.js';
10
10
  import { PolylitMixin } from '@vaadin/component-base/src/polylit-mixin.js';
11
+ import { multiSelectComboBoxScrollerStyles } from './styles/vaadin-multi-select-combo-box-scroller-core-styles.js';
11
12
 
12
13
  /**
13
14
  * An element used internally by `<vaadin-multi-select-combo-box>`. Not intended to be used separately.
@@ -23,29 +24,7 @@ export class MultiSelectComboBoxScroller extends ComboBoxScrollerMixin(PolylitMi
23
24
  }
24
25
 
25
26
  static get styles() {
26
- return css`
27
- :host {
28
- display: block;
29
- min-height: 1px;
30
- overflow: auto;
31
-
32
- /* Fixes item background from getting on top of scrollbars on Safari */
33
- transform: translate3d(0, 0, 0);
34
-
35
- /* Enable momentum scrolling on iOS */
36
- -webkit-overflow-scrolling: touch;
37
-
38
- /* Fixes scrollbar disappearing when 'Show scroll bars: Always' enabled in Safari */
39
- box-shadow: 0 0 0 white;
40
- }
41
-
42
- #selector {
43
- border-width: var(--_vaadin-multi-select-combo-box-items-container-border-width);
44
- border-style: var(--_vaadin-multi-select-combo-box-items-container-border-style);
45
- border-color: var(--_vaadin-multi-select-combo-box-items-container-border-color, transparent);
46
- position: relative;
47
- }
48
- `;
27
+ return multiSelectComboBoxScrollerStyles;
49
28
  }
50
29
 
51
30
  /** @protected */
@@ -8,8 +8,12 @@ import type { DisabledMixinClass } from '@vaadin/a11y-base/src/disabled-mixin.js
8
8
  import type { FocusMixinClass } from '@vaadin/a11y-base/src/focus-mixin.js';
9
9
  import type { KeyboardMixinClass } from '@vaadin/a11y-base/src/keyboard-mixin.js';
10
10
  import type { ComboBoxDefaultItem } from '@vaadin/combo-box/src/vaadin-combo-box.js';
11
+ import type { ComboBoxBaseMixinClass } from '@vaadin/combo-box/src/vaadin-combo-box-base-mixin.js';
12
+ import type { ComboBoxDataProviderMixinClass } from '@vaadin/combo-box/src/vaadin-combo-box-data-provider-mixin.js';
13
+ import type { ComboBoxItemsMixinClass } from '@vaadin/combo-box/src/vaadin-combo-box-items-mixin.js';
11
14
  import type { DelegateStateMixinClass } from '@vaadin/component-base/src/delegate-state-mixin.js';
12
15
  import type { ElementMixinClass } from '@vaadin/component-base/src/element-mixin.js';
16
+ import type { OverlayClassMixinClass } from '@vaadin/component-base/src/overlay-class-mixin.js';
13
17
  import type { ResizeMixinClass } from '@vaadin/component-base/src/resize-mixin.js';
14
18
  import type { SlotStylesMixinClass } from '@vaadin/component-base/src/slot-styles-mixin.js';
15
19
  import type { ClearButtonMixinClass } from '@vaadin/field-base/src/clear-button-mixin.js';
@@ -106,6 +110,9 @@ export interface MultiSelectComboBoxEventMap<TItem> extends HTMLElementEventMap
106
110
  * `helper-text` | The helper text element wrapper
107
111
  * `required-indicator` | The `required` state indicator element
108
112
  * `toggle-button` | The toggle button
113
+ * `overlay` | The overlay container
114
+ * `content` | The overlay content
115
+ * `loader` | The loading indicator shown while loading items
109
116
  *
110
117
  * The following state attributes are available for styling:
111
118
  *
@@ -130,7 +137,6 @@ export interface MultiSelectComboBoxEventMap<TItem> extends HTMLElementEventMap
130
137
  * `--vaadin-field-default-width` | Default width of the field | `12em`
131
138
  * `--vaadin-multi-select-combo-box-overlay-width` | Width of the overlay | `auto`
132
139
  * `--vaadin-multi-select-combo-box-overlay-max-height` | Max height of the overlay | `65vh`
133
- * `--vaadin-multi-select-combo-box-chip-min-width` | Min width of the chip | `50px`
134
140
  * `--vaadin-multi-select-combo-box-input-min-width` | Min width of the input | `4em`
135
141
  *
136
142
  * ### Internal components
@@ -138,12 +144,8 @@ export interface MultiSelectComboBoxEventMap<TItem> extends HTMLElementEventMap
138
144
  * In addition to `<vaadin-multi-select-combo-box>` itself, the following internal
139
145
  * components are themable:
140
146
  *
141
- * - `<vaadin-multi-select-combo-box-overlay>` - has the same API as `<vaadin-overlay>`.
147
+ * - `<vaadin-multi-select-combo-box-chip>`
142
148
  * - `<vaadin-multi-select-combo-box-item>` - has the same API as `<vaadin-item>`.
143
- * - `<vaadin-multi-select-combo-box-container>` - has the same API as `<vaadin-input-container>`.
144
- *
145
- * Note: the `theme` attribute value set on `<vaadin-multi-select-combo-box>` is
146
- * propagated to these components.
147
149
  *
148
150
  * See [Styling Components](https://vaadin.com/docs/latest/styling/styling-components) documentation.
149
151
  *
@@ -170,7 +172,10 @@ declare class MultiSelectComboBox<TItem = ComboBoxDefaultItem> extends HTMLEleme
170
172
  }
171
173
 
172
174
  interface MultiSelectComboBox<TItem = ComboBoxDefaultItem>
173
- extends ValidateMixinClass,
175
+ extends ComboBoxBaseMixinClass,
176
+ ComboBoxDataProviderMixinClass<TItem>,
177
+ ComboBoxItemsMixinClass<TItem>,
178
+ ValidateMixinClass,
174
179
  SlotStylesMixinClass,
175
180
  LabelMixinClass,
176
181
  KeyboardMixinClass,
@@ -184,6 +189,7 @@ interface MultiSelectComboBox<TItem = ComboBoxDefaultItem>
184
189
  DelegateStateMixinClass,
185
190
  DelegateFocusMixinClass,
186
191
  MultiSelectComboBoxMixinClass<TItem>,
192
+ OverlayClassMixinClass,
187
193
  ResizeMixinClass,
188
194
  ThemableMixinClass,
189
195
  ThemePropertyMixinClass,
@@ -5,16 +5,19 @@
5
5
  */
6
6
  import './vaadin-multi-select-combo-box-chip.js';
7
7
  import './vaadin-multi-select-combo-box-container.js';
8
- import './vaadin-multi-select-combo-box-internal.js';
8
+ import './vaadin-multi-select-combo-box-item.js';
9
+ import './vaadin-multi-select-combo-box-overlay.js';
10
+ import './vaadin-multi-select-combo-box-scroller.js';
9
11
  import { html, LitElement } from 'lit';
10
12
  import { ifDefined } from 'lit/directives/if-defined.js';
11
13
  import { defineCustomElement } from '@vaadin/component-base/src/define.js';
12
14
  import { ElementMixin } from '@vaadin/component-base/src/element-mixin.js';
13
15
  import { PolylitMixin } from '@vaadin/component-base/src/polylit-mixin.js';
14
16
  import { inputFieldShared } from '@vaadin/field-base/src/styles/input-field-shared-styles.js';
17
+ import { LumoInjectionMixin } from '@vaadin/vaadin-themable-mixin/lumo-injection-mixin.js';
15
18
  import { ThemableMixin } from '@vaadin/vaadin-themable-mixin/vaadin-themable-mixin.js';
19
+ import { multiSelectComboBoxStyles } from './styles/vaadin-multi-select-combo-box-core-styles.js';
16
20
  import { MultiSelectComboBoxMixin } from './vaadin-multi-select-combo-box-mixin.js';
17
- import { multiSelectComboBox } from './vaadin-multi-select-combo-box-styles.js';
18
21
 
19
22
  /**
20
23
  * `<vaadin-multi-select-combo-box>` is a web component that wraps `<vaadin-combo-box>` and extends
@@ -44,6 +47,9 @@ import { multiSelectComboBox } from './vaadin-multi-select-combo-box-styles.js';
44
47
  * `helper-text` | The helper text element wrapper
45
48
  * `required-indicator` | The `required` state indicator element
46
49
  * `toggle-button` | The toggle button
50
+ * `overlay` | The overlay container
51
+ * `content` | The overlay content
52
+ * `loader` | The loading indicator shown while loading items
47
53
  *
48
54
  * The following state attributes are available for styling:
49
55
  *
@@ -68,7 +74,6 @@ import { multiSelectComboBox } from './vaadin-multi-select-combo-box-styles.js';
68
74
  * `--vaadin-field-default-width` | Default width of the field | `12em`
69
75
  * `--vaadin-multi-select-combo-box-overlay-width` | Width of the overlay | `auto`
70
76
  * `--vaadin-multi-select-combo-box-overlay-max-height` | Max height of the overlay | `65vh`
71
- * `--vaadin-multi-select-combo-box-chip-min-width` | Min width of the chip | `50px`
72
77
  * `--vaadin-multi-select-combo-box-input-min-width` | Min width of the input | `4em`
73
78
  *
74
79
  * ### Internal components
@@ -76,12 +81,8 @@ import { multiSelectComboBox } from './vaadin-multi-select-combo-box-styles.js';
76
81
  * In addition to `<vaadin-multi-select-combo-box>` itself, the following internal
77
82
  * components are themable:
78
83
  *
79
- * - `<vaadin-multi-select-combo-box-overlay>` - has the same API as `<vaadin-overlay>`.
84
+ * - `<vaadin-multi-select-combo-box-chip>`
80
85
  * - `<vaadin-multi-select-combo-box-item>` - has the same API as `<vaadin-item>`.
81
- * - `<vaadin-multi-select-combo-box-container>` - has the same API as `<vaadin-input-container>`.
82
- *
83
- * Note: the `theme` attribute value set on `<vaadin-multi-select-combo-box>` is
84
- * propagated to these components.
85
86
  *
86
87
  * See [Styling Components](https://vaadin.com/docs/latest/styling/styling-components) documentation.
87
88
  *
@@ -99,13 +100,15 @@ import { multiSelectComboBox } from './vaadin-multi-select-combo-box-styles.js';
99
100
  * @mixes ThemableMixin
100
101
  * @mixes MultiSelectComboBoxMixin
101
102
  */
102
- class MultiSelectComboBox extends MultiSelectComboBoxMixin(ThemableMixin(ElementMixin(PolylitMixin(LitElement)))) {
103
+ class MultiSelectComboBox extends MultiSelectComboBoxMixin(
104
+ ThemableMixin(ElementMixin(PolylitMixin(LumoInjectionMixin(LitElement)))),
105
+ ) {
103
106
  static get is() {
104
107
  return 'vaadin-multi-select-combo-box';
105
108
  }
106
109
 
107
110
  static get styles() {
108
- return [inputFieldShared, multiSelectComboBox];
111
+ return [inputFieldShared, multiSelectComboBoxStyles];
109
112
  }
110
113
 
111
114
  /** @protected */
@@ -117,64 +120,22 @@ class MultiSelectComboBox extends MultiSelectComboBoxMixin(ThemableMixin(Element
117
120
  <span part="required-indicator" aria-hidden="true" @click="${this.focus}"></span>
118
121
  </div>
119
122
 
120
- <vaadin-multi-select-combo-box-internal
121
- id="comboBox"
122
- .filteredItems="${this.filteredItems}"
123
- .items="${this.items}"
124
- .itemIdPath="${this.itemIdPath}"
125
- .itemLabelPath="${this.itemLabelPath}"
126
- .itemValuePath="${this.itemValuePath}"
127
- .disabled="${this.disabled}"
123
+ <vaadin-multi-select-combo-box-container
124
+ part="input-field"
125
+ .autoExpandVertically="${this.autoExpandVertically}"
128
126
  .readonly="${this.readonly}"
129
- .autoOpenDisabled="${this.autoOpenDisabled}"
130
- .allowCustomValue="${this.allowCustomValue}"
131
- .overlayClass="${this.overlayClass}"
132
- .dataProvider="${this.dataProvider}"
133
- .filter="${this.filter}"
134
- .lastFilter="${this._lastFilter}"
135
- .loading="${this.loading}"
136
- .size="${this.size}"
137
- .selectedItems="${this.selectedItems}"
138
- .selectedItemsOnTop="${this.selectedItemsOnTop}"
139
- .itemClassNameGenerator="${this.itemClassNameGenerator}"
140
- .topGroup="${this._topGroup}"
141
- .opened="${this.opened}"
142
- .renderer="${this.renderer}"
143
- .keepFilter="${this.keepFilter}"
127
+ .disabled="${this.disabled}"
128
+ .invalid="${this.invalid}"
144
129
  theme="${ifDefined(this._theme)}"
145
- @combo-box-item-selected="${this._onComboBoxItemSelected}"
146
- @change="${this._onComboBoxChange}"
147
- @custom-value-set="${this._onCustomValueSet}"
148
- @filtered-items-changed="${this._onFilteredItemsChanged}"
149
- @filter-changed="${this._onComboBoxFilterChanged}"
150
- @last-filter-changed="${this._onComboBoxLastFilterChanged}"
151
- @loading-changed="${this._onComboBoxLoadingChanged}"
152
- @opened-changed="${this._onComboBoxOpenedChanged}"
153
- @size-changed="${this._onComboBoxSizeChanged}"
154
130
  >
155
- <vaadin-multi-select-combo-box-container
156
- part="input-field"
157
- .autoExpandVertically="${this.autoExpandVertically}"
158
- .readonly="${this.readonly}"
159
- .disabled="${this.disabled}"
160
- .invalid="${this.invalid}"
161
- theme="${ifDefined(this._theme)}"
162
- >
163
- <slot name="overflow" slot="prefix"></slot>
164
- <div id="chips" part="chips" slot="prefix">
165
- <slot name="chip"></slot>
166
- </div>
167
- <slot name="input"></slot>
168
- <div
169
- id="clearButton"
170
- part="clear-button"
171
- slot="suffix"
172
- @touchend="${this._onClearButtonTouchend}"
173
- aria-hidden="true"
174
- ></div>
175
- <div id="toggleButton" class="toggle-button" part="toggle-button" slot="suffix" aria-hidden="true"></div>
176
- </vaadin-multi-select-combo-box-container>
177
- </vaadin-multi-select-combo-box-internal>
131
+ <slot name="overflow" slot="prefix"></slot>
132
+ <div id="chips" part="chips" slot="prefix">
133
+ <slot name="chip"></slot>
134
+ </div>
135
+ <slot name="input"></slot>
136
+ <div id="clearButton" part="clear-button" slot="suffix" aria-hidden="true"></div>
137
+ <div id="toggleButton" part="toggle-button" slot="suffix" aria-hidden="true"></div>
138
+ </vaadin-multi-select-combo-box-container>
178
139
 
179
140
  <div part="helper-text">
180
141
  <slot name="helper"></slot>
@@ -185,34 +146,23 @@ class MultiSelectComboBox extends MultiSelectComboBoxMixin(ThemableMixin(Element
185
146
  </div>
186
147
  </div>
187
148
 
149
+ <vaadin-multi-select-combo-box-overlay
150
+ id="overlay"
151
+ exportparts="overlay, content, loader"
152
+ .owner="${this}"
153
+ .dir="${this.dir}"
154
+ .opened="${this._overlayOpened}"
155
+ ?loading="${this.loading}"
156
+ theme="${ifDefined(this._theme)}"
157
+ .positionTarget="${this._inputField}"
158
+ no-vertical-overlap
159
+ >
160
+ <slot name="overlay"></slot>
161
+ </vaadin-multi-select-combo-box-overlay>
162
+
188
163
  <slot name="tooltip"></slot>
189
164
  `;
190
165
  }
191
-
192
- /** @private */
193
- _onComboBoxFilterChanged(event) {
194
- this.filter = event.detail.value;
195
- }
196
-
197
- /** @private */
198
- _onComboBoxLoadingChanged(event) {
199
- this.loading = event.detail.value;
200
- }
201
-
202
- /** @private */
203
- _onComboBoxLastFilterChanged(event) {
204
- this._lastFilter = event.detail.value;
205
- }
206
-
207
- /** @private */
208
- _onComboBoxOpenedChanged(event) {
209
- this.opened = event.detail.value;
210
- }
211
-
212
- /** @private */
213
- _onComboBoxSizeChanged(event) {
214
- this.size = event.detail.value;
215
- }
216
166
  }
217
167
 
218
168
  defineCustomElement(MultiSelectComboBox);
@@ -59,6 +59,10 @@ registerStyles(
59
59
  );
60
60
 
61
61
  const multiSelectComboBox = css`
62
+ :host {
63
+ --_wrapper-gap: 0;
64
+ }
65
+
62
66
  :host([has-value]) {
63
67
  padding-inline-start: 0;
64
68
  }
@@ -77,7 +81,6 @@ const multiSelectComboBox = css`
77
81
  min-height: auto;
78
82
  padding: 0.3125em calc(0.5em + var(--lumo-border-radius-s) / 4);
79
83
  color: var(--lumo-body-text-color);
80
- -webkit-mask-image: none;
81
84
  mask-image: none;
82
85
  }
83
86