@vaadin/multi-select-combo-box 24.2.3 → 24.3.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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vaadin/multi-select-combo-box",
3
- "version": "24.2.3",
3
+ "version": "24.3.0-alpha10",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
@@ -37,27 +37,27 @@
37
37
  ],
38
38
  "dependencies": {
39
39
  "@polymer/polymer": "^3.0.0",
40
- "@vaadin/a11y-base": "~24.2.3",
41
- "@vaadin/combo-box": "~24.2.3",
42
- "@vaadin/component-base": "~24.2.3",
43
- "@vaadin/field-base": "~24.2.3",
44
- "@vaadin/input-container": "~24.2.3",
45
- "@vaadin/item": "~24.2.3",
46
- "@vaadin/lit-renderer": "~24.2.3",
47
- "@vaadin/overlay": "~24.2.3",
48
- "@vaadin/vaadin-lumo-styles": "~24.2.3",
49
- "@vaadin/vaadin-material-styles": "~24.2.3",
50
- "@vaadin/vaadin-themable-mixin": "~24.2.3"
40
+ "@vaadin/a11y-base": "24.3.0-alpha10",
41
+ "@vaadin/combo-box": "24.3.0-alpha10",
42
+ "@vaadin/component-base": "24.3.0-alpha10",
43
+ "@vaadin/field-base": "24.3.0-alpha10",
44
+ "@vaadin/input-container": "24.3.0-alpha10",
45
+ "@vaadin/item": "24.3.0-alpha10",
46
+ "@vaadin/lit-renderer": "24.3.0-alpha10",
47
+ "@vaadin/overlay": "24.3.0-alpha10",
48
+ "@vaadin/vaadin-lumo-styles": "24.3.0-alpha10",
49
+ "@vaadin/vaadin-material-styles": "24.3.0-alpha10",
50
+ "@vaadin/vaadin-themable-mixin": "24.3.0-alpha10"
51
51
  },
52
52
  "devDependencies": {
53
53
  "@esm-bundle/chai": "^4.3.4",
54
- "@vaadin/testing-helpers": "^0.5.0",
55
- "lit": "^2.0.0",
54
+ "@vaadin/testing-helpers": "^0.6.0",
55
+ "lit": "^3.0.0",
56
56
  "sinon": "^13.0.2"
57
57
  },
58
58
  "web-types": [
59
59
  "web-types.json",
60
60
  "web-types.lit.json"
61
61
  ],
62
- "gitHead": "72e557e765e72559e9c6a525e257d185ad186dc5"
62
+ "gitHead": "0271523d93fe5df0425ff64206886614f3c6f401"
63
63
  }
@@ -14,6 +14,10 @@ registerStyles(
14
14
  display: flex;
15
15
  width: 100%;
16
16
  }
17
+
18
+ :host([auto-expand-vertically]) #wrapper {
19
+ flex-wrap: wrap;
20
+ }
17
21
  `,
18
22
  {
19
23
  moduleId: 'vaadin-multi-select-combo-box-container-styles',
@@ -49,6 +53,21 @@ class MultiSelectComboBoxContainer extends InputContainer {
49
53
  }
50
54
  return memoizedTemplate;
51
55
  }
56
+
57
+ static get properties() {
58
+ return {
59
+ /**
60
+ * Set to true to not collapse selected items chips into the overflow
61
+ * chip and instead always expand vertically, causing input field to
62
+ * wrap into multiple lines when width is limited.
63
+ * @attr {boolean} auto-expand-vertically
64
+ */
65
+ autoExpandVertically: {
66
+ type: Boolean,
67
+ reflectToAttribute: true,
68
+ },
69
+ };
70
+ }
52
71
  }
53
72
 
54
73
  defineCustomElement(MultiSelectComboBoxContainer);
@@ -88,6 +88,15 @@ class MultiSelectComboBoxInternal extends ComboBoxDataProviderMixin(ComboBoxMixi
88
88
  value: () => [],
89
89
  },
90
90
 
91
+ /**
92
+ * Set to true to group selected items at the top of the overlay.
93
+ * @attr {boolean} selected-items-on-top
94
+ */
95
+ selectedItemsOnTop: {
96
+ type: Boolean,
97
+ value: false,
98
+ },
99
+
91
100
  /**
92
101
  * Last input value entered by the user before value is updated.
93
102
  * Used to store `filter` property value before clearing it.
@@ -97,6 +106,14 @@ class MultiSelectComboBoxInternal extends ComboBoxDataProviderMixin(ComboBoxMixi
97
106
  notify: true,
98
107
  },
99
108
 
109
+ /**
110
+ * A subset of items to be shown at the top of the overlay.
111
+ */
112
+ topGroup: {
113
+ type: Array,
114
+ observer: '_topGroupChanged',
115
+ },
116
+
100
117
  _target: {
101
118
  type: Object,
102
119
  },
@@ -140,6 +157,39 @@ class MultiSelectComboBoxInternal extends ComboBoxDataProviderMixin(ComboBoxMixi
140
157
  this._toggleElement = this.querySelector('.toggle-button');
141
158
  }
142
159
 
160
+ /**
161
+ * Override combo-box method to group selected
162
+ * items at the top of the overlay.
163
+ *
164
+ * @protected
165
+ * @override
166
+ */
167
+ _setDropdownItems(items) {
168
+ if (this.filter || this.readonly || !this.selectedItemsOnTop) {
169
+ this._dropdownItems = items;
170
+ return;
171
+ }
172
+
173
+ if (items && items.length && this.topGroup && this.topGroup.length) {
174
+ // Filter out items included to the top group.
175
+ const filteredItems = items.filter(
176
+ (item) => !this.topGroup.some((selectedItem) => this._getItemValue(item) === this._getItemValue(selectedItem)),
177
+ );
178
+
179
+ this._dropdownItems = this.topGroup.concat(filteredItems);
180
+ return;
181
+ }
182
+
183
+ this._dropdownItems = items;
184
+ }
185
+
186
+ /** @private */
187
+ _topGroupChanged(topGroup) {
188
+ if (topGroup) {
189
+ this._setDropdownItems(this.filteredItems);
190
+ }
191
+ }
192
+
143
193
  /**
144
194
  * Override combo-box method to set correct owner for using by item renderers.
145
195
  * This needs to be done before the scroller gets added to the DOM to ensure
@@ -172,9 +222,9 @@ class MultiSelectComboBoxInternal extends ComboBoxDataProviderMixin(ComboBoxMixi
172
222
  this.close();
173
223
  } else {
174
224
  // Keep selected item focused after committing on Enter.
175
- const focusedItem = this.filteredItems[this._focusedIndex];
225
+ const focusedItem = this._dropdownItems[this._focusedIndex];
176
226
  this._commitValue();
177
- this._focusedIndex = this.filteredItems.indexOf(focusedItem);
227
+ this._focusedIndex = this._dropdownItems.indexOf(focusedItem);
178
228
  }
179
229
 
180
230
  return;
@@ -146,6 +146,7 @@ export interface MultiSelectComboBoxEventMap<TItem> extends HTMLElementEventMap
146
146
  * `--vaadin-field-default-width` | Default width of the field | `12em`
147
147
  * `--vaadin-multi-select-combo-box-overlay-width` | Width of the overlay | `auto`
148
148
  * `--vaadin-multi-select-combo-box-overlay-max-height` | Max height of the overlay | `65vh`
149
+ * `--vaadin-multi-select-combo-box-chip-min-width` | Min width of the chip | `50px`
149
150
  * `--vaadin-multi-select-combo-box-input-min-width` | Min width of the input | `4em`
150
151
  *
151
152
  * ### Internal components
@@ -171,6 +172,21 @@ export interface MultiSelectComboBoxEventMap<TItem> extends HTMLElementEventMap
171
172
  * @fires {CustomEvent} validated - Fired whenever the field is validated.
172
173
  */
173
174
  declare class MultiSelectComboBox<TItem = ComboBoxDefaultItem> extends HTMLElement {
175
+ /**
176
+ * Set to true to auto expand horizontally, causing input field to
177
+ * grow until max width is reached.
178
+ * @attr {boolean} auto-expand-horizontally
179
+ */
180
+ autoExpandHorizontally: boolean;
181
+
182
+ /**
183
+ * Set to true to not collapse selected items chips into the overflow
184
+ * chip and instead always expand vertically, causing input field to
185
+ * wrap into multiple lines when width is limited.
186
+ * @attr {boolean} auto-expand-vertically
187
+ */
188
+ autoExpandVertically: boolean;
189
+
174
190
  /**
175
191
  * When true, the user can input a value that is not present in the items list.
176
192
  * @attr {boolean} allow-custom-value
@@ -307,6 +323,12 @@ declare class MultiSelectComboBox<TItem = ComboBoxDefaultItem> extends HTMLEleme
307
323
  */
308
324
  selectedItems: TItem[];
309
325
 
326
+ /**
327
+ * Set to true to group selected items at the top of the overlay.
328
+ * @attr {boolean} selected-items-on-top
329
+ */
330
+ selectedItemsOnTop: boolean;
331
+
310
332
  /**
311
333
  * Total number of items.
312
334
  */
@@ -23,6 +23,7 @@ import { css, registerStyles, ThemableMixin } from '@vaadin/vaadin-themable-mixi
23
23
  const multiSelectComboBox = css`
24
24
  :host {
25
25
  --input-min-width: var(--vaadin-multi-select-combo-box-input-min-width, 4em);
26
+ --_chip-min-width: var(--vaadin-multi-select-combo-box-chip-min-width, 50px);
26
27
  }
27
28
 
28
29
  #chips {
@@ -45,6 +46,14 @@ const multiSelectComboBox = css`
45
46
  flex-basis: 0;
46
47
  padding: 0;
47
48
  }
49
+
50
+ :host([auto-expand-vertically]) #chips {
51
+ display: contents;
52
+ }
53
+
54
+ :host([auto-expand-horizontally]) [class$='container'] {
55
+ width: auto;
56
+ }
48
57
  `;
49
58
 
50
59
  registerStyles('vaadin-multi-select-combo-box', [inputFieldShared, multiSelectComboBox], {
@@ -103,6 +112,7 @@ registerStyles('vaadin-multi-select-combo-box', [inputFieldShared, multiSelectCo
103
112
  * `--vaadin-field-default-width` | Default width of the field | `12em`
104
113
  * `--vaadin-multi-select-combo-box-overlay-width` | Width of the overlay | `auto`
105
114
  * `--vaadin-multi-select-combo-box-overlay-max-height` | Max height of the overlay | `65vh`
115
+ * `--vaadin-multi-select-combo-box-chip-min-width` | Min width of the chip | `50px`
106
116
  * `--vaadin-multi-select-combo-box-input-min-width` | Min width of the input | `4em`
107
117
  *
108
118
  * ### Internal components
@@ -165,6 +175,8 @@ class MultiSelectComboBox extends ResizeMixin(InputControlMixin(ThemableMixin(El
165
175
  size="{{size}}"
166
176
  filtered-items="[[__effectiveFilteredItems]]"
167
177
  selected-items="[[selectedItems]]"
178
+ selected-items-on-top="[[selectedItemsOnTop]]"
179
+ top-group="[[_topGroup]]"
168
180
  opened="{{opened}}"
169
181
  renderer="[[renderer]]"
170
182
  theme$="[[_theme]]"
@@ -175,6 +187,7 @@ class MultiSelectComboBox extends ResizeMixin(InputControlMixin(ThemableMixin(El
175
187
  >
176
188
  <vaadin-multi-select-combo-box-container
177
189
  part="input-field"
190
+ auto-expand-vertically="[[autoExpandVertically]]"
178
191
  readonly="[[readonly]]"
179
192
  disabled="[[disabled]]"
180
193
  invalid="[[invalid]]"
@@ -211,6 +224,31 @@ class MultiSelectComboBox extends ResizeMixin(InputControlMixin(ThemableMixin(El
211
224
 
212
225
  static get properties() {
213
226
  return {
227
+ /**
228
+ * Set to true to auto expand horizontally, causing input field to
229
+ * grow until max width is reached.
230
+ * @attr {boolean} auto-expand-horizontally
231
+ */
232
+ autoExpandHorizontally: {
233
+ type: Boolean,
234
+ value: false,
235
+ reflectToAttribute: true,
236
+ observer: '_autoExpandHorizontallyChanged',
237
+ },
238
+
239
+ /**
240
+ * Set to true to not collapse selected items chips into the overflow
241
+ * chip and instead always expand vertically, causing input field to
242
+ * wrap into multiple lines when width is limited.
243
+ * @attr {boolean} auto-expand-vertically
244
+ */
245
+ autoExpandVertically: {
246
+ type: Boolean,
247
+ value: false,
248
+ reflectToAttribute: true,
249
+ observer: '_autoExpandVerticallyChanged',
250
+ },
251
+
214
252
  /**
215
253
  * Set true to prevent the overlay from opening automatically.
216
254
  * @attr {boolean} auto-open-disabled
@@ -430,6 +468,15 @@ class MultiSelectComboBox extends ResizeMixin(InputControlMixin(ThemableMixin(El
430
468
  */
431
469
  filteredItems: Array,
432
470
 
471
+ /**
472
+ * Set to true to group selected items at the top of the overlay.
473
+ * @attr {boolean} selected-items-on-top
474
+ */
475
+ selectedItemsOnTop: {
476
+ type: Boolean,
477
+ value: false,
478
+ },
479
+
433
480
  /** @private */
434
481
  value: {
435
482
  type: String,
@@ -464,6 +511,11 @@ class MultiSelectComboBox extends ResizeMixin(InputControlMixin(ThemableMixin(El
464
511
  _lastFilter: {
465
512
  type: String,
466
513
  },
514
+
515
+ /** @private */
516
+ _topGroup: {
517
+ type: Array,
518
+ },
467
519
  };
468
520
  }
469
521
 
@@ -471,6 +523,7 @@ class MultiSelectComboBox extends ResizeMixin(InputControlMixin(ThemableMixin(El
471
523
  return [
472
524
  '_selectedItemsChanged(selectedItems, selectedItems.*)',
473
525
  '__updateOverflowChip(_overflow, _overflowItems, disabled, readonly)',
526
+ '__updateTopGroup(selectedItemsOnTop, selectedItems, opened)',
474
527
  ];
475
528
  }
476
529
 
@@ -657,6 +710,20 @@ class MultiSelectComboBox extends ResizeMixin(InputControlMixin(ThemableMixin(El
657
710
  super._delegateAttribute(name, value);
658
711
  }
659
712
 
713
+ /** @private */
714
+ _autoExpandHorizontallyChanged(autoExpand, oldAutoExpand) {
715
+ if (autoExpand || oldAutoExpand) {
716
+ this.__updateChips();
717
+ }
718
+ }
719
+
720
+ /** @private */
721
+ _autoExpandVerticallyChanged(autoExpand, oldAutoExpand) {
722
+ if (autoExpand || oldAutoExpand) {
723
+ this.__updateChips();
724
+ }
725
+ }
726
+
660
727
  /**
661
728
  * Setting clear button visible reduces total space available
662
729
  * for rendering chips, and making it hidden increases it.
@@ -735,6 +802,10 @@ class MultiSelectComboBox extends ResizeMixin(InputControlMixin(ThemableMixin(El
735
802
 
736
803
  // Update selected for dropdown items
737
804
  this.requestContentUpdate();
805
+
806
+ if (this.opened) {
807
+ this.$.comboBox.$.overlay._updateOverlayWidth();
808
+ }
738
809
  }
739
810
 
740
811
  /** @private */
@@ -823,6 +894,15 @@ class MultiSelectComboBox extends ResizeMixin(InputControlMixin(ThemableMixin(El
823
894
  this.dispatchEvent(new CustomEvent('change', { bubbles: true }));
824
895
  }
825
896
 
897
+ /** @private */
898
+ __updateTopGroup(selectedItemsOnTop, selectedItems, opened) {
899
+ if (!selectedItemsOnTop) {
900
+ this._topGroup = [];
901
+ } else if (!opened) {
902
+ this._topGroup = [...selectedItems];
903
+ }
904
+ }
905
+
826
906
  /** @private */
827
907
  __createChip(item) {
828
908
  const chip = document.createElement('vaadin-multi-select-combo-box-chip');
@@ -887,14 +967,60 @@ class MultiSelectComboBox extends ResizeMixin(InputControlMixin(ThemableMixin(El
887
967
  remainingWidth -= this.__getOverflowWidth();
888
968
  }
889
969
 
970
+ const chipMinWidth = parseInt(getComputedStyle(this).getPropertyValue('--_chip-min-width'));
971
+
972
+ if (this.autoExpandHorizontally) {
973
+ const chips = [];
974
+
975
+ // First, add all chips to make the field fully expand
976
+ for (let i = items.length - 1, refNode = null; i >= 0; i--) {
977
+ const chip = this.__createChip(items[i]);
978
+ this.insertBefore(chip, refNode);
979
+ refNode = chip;
980
+ chips.unshift(chip);
981
+ }
982
+
983
+ const overflowItems = [];
984
+ const availableWidth = this._inputField.$.wrapper.clientWidth - this.$.chips.clientWidth;
985
+
986
+ // When auto expanding vertically, no need to measure width
987
+ if (!this.autoExpandVertically && availableWidth < inputWidth) {
988
+ // Always show at least last item as a chip
989
+ while (chips.length > 1) {
990
+ const lastChip = chips.pop();
991
+ lastChip.remove();
992
+ overflowItems.unshift(items.pop());
993
+
994
+ // Remove chips until there is enough width for the input element to fit
995
+ const neededWidth = overflowItems.length > 0 ? inputWidth + this.__getOverflowWidth() : inputWidth;
996
+ if (this._inputField.$.wrapper.clientWidth - this.$.chips.clientWidth >= neededWidth) {
997
+ break;
998
+ }
999
+ }
1000
+
1001
+ if (chips.length === 1) {
1002
+ chips[0].style.maxWidth = `${Math.max(chipMinWidth, remainingWidth)}px`;
1003
+ }
1004
+ }
1005
+
1006
+ this._overflowItems = overflowItems;
1007
+ return;
1008
+ }
1009
+
890
1010
  // Add chips until remaining width is exceeded
891
1011
  for (let i = items.length - 1, refNode = null; i >= 0; i--) {
892
1012
  const chip = this.__createChip(items[i]);
893
1013
  this.insertBefore(chip, refNode);
894
1014
 
895
- if (this.$.chips.clientWidth > remainingWidth) {
896
- chip.remove();
897
- break;
1015
+ // When auto expanding vertically, no need to measure remaining width
1016
+ if (!this.autoExpandVertically && this.$.chips.clientWidth > remainingWidth) {
1017
+ // Always show at least last selected item as a chip
1018
+ if (refNode === null) {
1019
+ chip.style.maxWidth = `${Math.max(chipMinWidth, remainingWidth)}px`;
1020
+ } else {
1021
+ chip.remove();
1022
+ break;
1023
+ }
898
1024
  }
899
1025
 
900
1026
  items.pop();
@@ -3,6 +3,7 @@
3
3
  * Copyright (c) 2021 - 2023 Vaadin Ltd.
4
4
  * This program is available under Apache License Version 2.0, available at https://vaadin.com/license/
5
5
  */
6
+ import '@vaadin/input-container/theme/lumo/vaadin-input-container-styles.js';
6
7
  import '@vaadin/vaadin-lumo-styles/color.js';
7
8
  import '@vaadin/vaadin-lumo-styles/font-icons.js';
8
9
  import '@vaadin/vaadin-lumo-styles/style.js';
@@ -47,6 +48,16 @@ registerStyles(
47
48
  { moduleId: 'lumo-multi-select-combo-box-overlay' },
48
49
  );
49
50
 
51
+ registerStyles(
52
+ 'vaadin-multi-select-combo-box-container',
53
+ css`
54
+ :host([auto-expand-vertically]) {
55
+ padding-block: var(--lumo-space-xs);
56
+ }
57
+ `,
58
+ { moduleId: 'lumo-multi-select-combo-box-container' },
59
+ );
60
+
50
61
  const multiSelectComboBox = css`
51
62
  :host([has-value]) {
52
63
  padding-inline-start: 0;
@@ -56,6 +67,10 @@ const multiSelectComboBox = css`
56
67
  caret-color: var(--lumo-body-text-color) !important;
57
68
  }
58
69
 
70
+ [part='label'] {
71
+ flex-shrink: 0;
72
+ }
73
+
59
74
  /* Override input-container styles */
60
75
  ::slotted([slot='chip']),
61
76
  ::slotted([slot='overflow']) {
@@ -66,17 +81,25 @@ const multiSelectComboBox = css`
66
81
  mask-image: none;
67
82
  }
68
83
 
84
+ :host([auto-expand-vertically]) ::slotted([slot='chip']) {
85
+ margin-block: calc(var(--lumo-space-xs) / 2);
86
+ }
87
+
69
88
  ::slotted([slot='chip']:not([readonly]):not([disabled])) {
70
89
  padding-inline-end: 0;
71
90
  }
72
91
 
92
+ :host([auto-expand-vertically]) ::slotted([slot='input']) {
93
+ min-height: calc(var(--lumo-text-field-size, var(--lumo-size-m)) - 2 * var(--lumo-space-xs));
94
+ }
95
+
73
96
  ::slotted([slot='chip']:not(:last-of-type)),
74
97
  ::slotted([slot='overflow']:not(:last-of-type)) {
75
98
  margin-inline-end: var(--lumo-space-xs);
76
99
  }
77
100
 
78
101
  ::slotted([slot='chip'][focused]) {
79
- background-color: var(--lumo-primary-color);
102
+ background-color: var(--vaadin-selection-color, var(--lumo-primary-color));
80
103
  color: var(--lumo-primary-contrast-color);
81
104
  }
82
105
 
@@ -3,7 +3,6 @@
3
3
  * Copyright (c) 2021 - 2023 Vaadin Ltd.
4
4
  * This program is available under Apache License Version 2.0, available at https://vaadin.com/license/
5
5
  */
6
- import '@vaadin/input-container/theme/lumo/vaadin-input-container.js';
7
6
  import '@vaadin/overlay/theme/lumo/vaadin-overlay.js';
8
7
  import './vaadin-multi-select-combo-box-chip-styles.js';
9
8
  import './vaadin-multi-select-combo-box-styles.js';
@@ -3,6 +3,7 @@
3
3
  * Copyright (c) 2021 - 2023 Vaadin Ltd.
4
4
  * This program is available under Apache License Version 2.0, available at https://vaadin.com/license/
5
5
  */
6
+ import '@vaadin/input-container/theme/material/vaadin-input-container-styles.js';
6
7
  import '@vaadin/vaadin-material-styles/color.js';
7
8
  import '@vaadin/vaadin-material-styles/font-icons.js';
8
9
  import '@vaadin/vaadin-material-styles/typography.js';
@@ -55,6 +56,11 @@ const multiSelectComboBox = css`
55
56
  padding: 0 0.5rem;
56
57
  }
57
58
 
59
+ :host([auto-expand-vertically]) ::slotted([slot='chip']) {
60
+ margin-top: 0.25rem;
61
+ align-self: flex-start;
62
+ }
63
+
58
64
  ::slotted([slot='chip']:not([readonly]):not([disabled])) {
59
65
  padding-inline-end: 0;
60
66
  }
@@ -3,7 +3,6 @@
3
3
  * Copyright (c) 2021 - 2023 Vaadin Ltd.
4
4
  * This program is available under Apache License Version 2.0, available at https://vaadin.com/license/
5
5
  */
6
- import '@vaadin/input-container/theme/material/vaadin-input-container.js';
7
6
  import '@vaadin/overlay/theme/material/vaadin-overlay.js';
8
7
  import './vaadin-multi-select-combo-box-chip-styles.js';
9
8
  import './vaadin-multi-select-combo-box-styles.js';
package/web-types.json CHANGED
@@ -1,14 +1,14 @@
1
1
  {
2
2
  "$schema": "https://json.schemastore.org/web-types",
3
3
  "name": "@vaadin/multi-select-combo-box",
4
- "version": "24.2.3",
4
+ "version": "24.3.0-alpha10",
5
5
  "description-markup": "markdown",
6
6
  "contributions": {
7
7
  "html": {
8
8
  "elements": [
9
9
  {
10
10
  "name": "vaadin-multi-select-combo-box",
11
- "description": "`<vaadin-multi-select-combo-box>` is a web component that wraps `<vaadin-combo-box>` and extends\nits functionality to allow selecting multiple items, in addition to basic features.\n\n```html\n<vaadin-multi-select-combo-box id=\"comboBox\"></vaadin-multi-select-combo-box>\n```\n```js\nconst comboBox = document.querySelector('#comboBox');\ncomboBox.items = ['apple', 'banana', 'lemon', 'orange'];\ncomboBox.selectedItems = ['lemon', 'orange'];\n```\n\n### Styling\n\nThe following shadow DOM parts are available for styling:\n\nPart name | Description\n-----------------------|----------------\n`chips` | The element that wraps slotted chips for selected items\n`label` | The label element\n`input-field` | The element that wraps prefix, value and suffix\n`clear-button` | The clear button\n`error-message` | The error message element\n`helper-text` | The helper text element wrapper\n`required-indicator` | The `required` state indicator element\n`toggle-button` | The toggle button\n\nThe following state attributes are available for styling:\n\nAttribute | Description\n-----------------------|-----------------\n`disabled` | Set to a disabled element\n`has-value` | Set when the element has a value\n`has-label` | Set when the element has a label\n`has-helper` | Set when the element has helper text or slot\n`has-error-message` | Set when the element has an error message\n`invalid` | Set when the element is invalid\n`focused` | Set when the element is focused\n`focus-ring` | Set when the element is keyboard focused\n`loading` | Set when loading items from the data provider\n`opened` | Set when the dropdown is open\n`readonly` | Set to a readonly element\n\nThe following custom CSS properties are available for styling:\n\nCustom property | Description | Default\n-----------------------------------------------------|----------------------------|--------\n`--vaadin-field-default-width` | Default width of the field | `12em`\n`--vaadin-multi-select-combo-box-overlay-width` | Width of the overlay | `auto`\n`--vaadin-multi-select-combo-box-overlay-max-height` | Max height of the overlay | `65vh`\n`--vaadin-multi-select-combo-box-input-min-width` | Min width of the input | `4em`\n\n### Internal components\n\nIn addition to `<vaadin-multi-select-combo-box>` itself, the following internal\ncomponents are themable:\n\n- `<vaadin-multi-select-combo-box-overlay>` - has the same API as `<vaadin-overlay>`.\n- `<vaadin-multi-select-combo-box-item>` - has the same API as `<vaadin-item>`.\n- `<vaadin-multi-select-combo-box-container>` - has the same API as `<vaadin-input-container>`.\n\nNote: the `theme` attribute value set on `<vaadin-multi-select-combo-box>` is\npropagated to these components.\n\nSee [Styling Components](https://vaadin.com/docs/latest/styling/styling-components) documentation.",
11
+ "description": "`<vaadin-multi-select-combo-box>` is a web component that wraps `<vaadin-combo-box>` and extends\nits functionality to allow selecting multiple items, in addition to basic features.\n\n```html\n<vaadin-multi-select-combo-box id=\"comboBox\"></vaadin-multi-select-combo-box>\n```\n```js\nconst comboBox = document.querySelector('#comboBox');\ncomboBox.items = ['apple', 'banana', 'lemon', 'orange'];\ncomboBox.selectedItems = ['lemon', 'orange'];\n```\n\n### Styling\n\nThe following shadow DOM parts are available for styling:\n\nPart name | Description\n-----------------------|----------------\n`chips` | The element that wraps slotted chips for selected items\n`label` | The label element\n`input-field` | The element that wraps prefix, value and suffix\n`clear-button` | The clear button\n`error-message` | The error message element\n`helper-text` | The helper text element wrapper\n`required-indicator` | The `required` state indicator element\n`toggle-button` | The toggle button\n\nThe following state attributes are available for styling:\n\nAttribute | Description\n-----------------------|-----------------\n`disabled` | Set to a disabled element\n`has-value` | Set when the element has a value\n`has-label` | Set when the element has a label\n`has-helper` | Set when the element has helper text or slot\n`has-error-message` | Set when the element has an error message\n`invalid` | Set when the element is invalid\n`focused` | Set when the element is focused\n`focus-ring` | Set when the element is keyboard focused\n`loading` | Set when loading items from the data provider\n`opened` | Set when the dropdown is open\n`readonly` | Set to a readonly element\n\nThe following custom CSS properties are available for styling:\n\nCustom property | Description | Default\n-----------------------------------------------------|----------------------------|--------\n`--vaadin-field-default-width` | Default width of the field | `12em`\n`--vaadin-multi-select-combo-box-overlay-width` | Width of the overlay | `auto`\n`--vaadin-multi-select-combo-box-overlay-max-height` | Max height of the overlay | `65vh`\n`--vaadin-multi-select-combo-box-chip-min-width` | Min width of the chip | `50px`\n`--vaadin-multi-select-combo-box-input-min-width` | Min width of the input | `4em`\n\n### Internal components\n\nIn addition to `<vaadin-multi-select-combo-box>` itself, the following internal\ncomponents are themable:\n\n- `<vaadin-multi-select-combo-box-overlay>` - has the same API as `<vaadin-overlay>`.\n- `<vaadin-multi-select-combo-box-item>` - has the same API as `<vaadin-item>`.\n- `<vaadin-multi-select-combo-box-container>` - has the same API as `<vaadin-input-container>`.\n\nNote: the `theme` attribute value set on `<vaadin-multi-select-combo-box>` is\npropagated to these components.\n\nSee [Styling Components](https://vaadin.com/docs/latest/styling/styling-components) documentation.",
12
12
  "attributes": [
13
13
  {
14
14
  "name": "disabled",
@@ -197,6 +197,28 @@
197
197
  ]
198
198
  }
199
199
  },
200
+ {
201
+ "name": "auto-expand-horizontally",
202
+ "description": "Set to true to auto expand horizontally, causing input field to\ngrow until max width is reached.",
203
+ "value": {
204
+ "type": [
205
+ "boolean",
206
+ "null",
207
+ "undefined"
208
+ ]
209
+ }
210
+ },
211
+ {
212
+ "name": "auto-expand-vertically",
213
+ "description": "Set to true to not collapse selected items chips into the overflow\nchip and instead always expand vertically, causing input field to\nwrap into multiple lines when width is limited.",
214
+ "value": {
215
+ "type": [
216
+ "boolean",
217
+ "null",
218
+ "undefined"
219
+ ]
220
+ }
221
+ },
200
222
  {
201
223
  "name": "auto-open-disabled",
202
224
  "description": "Set true to prevent the overlay from opening automatically.",
@@ -318,6 +340,17 @@
318
340
  ]
319
341
  }
320
342
  },
343
+ {
344
+ "name": "selected-items-on-top",
345
+ "description": "Set to true to group selected items at the top of the overlay.",
346
+ "value": {
347
+ "type": [
348
+ "boolean",
349
+ "null",
350
+ "undefined"
351
+ ]
352
+ }
353
+ },
321
354
  {
322
355
  "name": "theme",
323
356
  "description": "The theme variants to apply to the component.",
@@ -508,6 +541,28 @@
508
541
  ]
509
542
  }
510
543
  },
544
+ {
545
+ "name": "autoExpandHorizontally",
546
+ "description": "Set to true to auto expand horizontally, causing input field to\ngrow until max width is reached.",
547
+ "value": {
548
+ "type": [
549
+ "boolean",
550
+ "null",
551
+ "undefined"
552
+ ]
553
+ }
554
+ },
555
+ {
556
+ "name": "autoExpandVertically",
557
+ "description": "Set to true to not collapse selected items chips into the overflow\nchip and instead always expand vertically, causing input field to\nwrap into multiple lines when width is limited.",
558
+ "value": {
559
+ "type": [
560
+ "boolean",
561
+ "null",
562
+ "undefined"
563
+ ]
564
+ }
565
+ },
511
566
  {
512
567
  "name": "autoOpenDisabled",
513
568
  "description": "Set true to prevent the overlay from opening automatically.",
@@ -692,6 +747,17 @@
692
747
  "undefined"
693
748
  ]
694
749
  }
750
+ },
751
+ {
752
+ "name": "selectedItemsOnTop",
753
+ "description": "Set to true to group selected items at the top of the overlay.",
754
+ "value": {
755
+ "type": [
756
+ "boolean",
757
+ "null",
758
+ "undefined"
759
+ ]
760
+ }
695
761
  }
696
762
  ],
697
763
  "events": [
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://json.schemastore.org/web-types",
3
3
  "name": "@vaadin/multi-select-combo-box",
4
- "version": "24.2.3",
4
+ "version": "24.3.0-alpha10",
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-multi-select-combo-box",
19
- "description": "`<vaadin-multi-select-combo-box>` is a web component that wraps `<vaadin-combo-box>` and extends\nits functionality to allow selecting multiple items, in addition to basic features.\n\n```html\n<vaadin-multi-select-combo-box id=\"comboBox\"></vaadin-multi-select-combo-box>\n```\n```js\nconst comboBox = document.querySelector('#comboBox');\ncomboBox.items = ['apple', 'banana', 'lemon', 'orange'];\ncomboBox.selectedItems = ['lemon', 'orange'];\n```\n\n### Styling\n\nThe following shadow DOM parts are available for styling:\n\nPart name | Description\n-----------------------|----------------\n`chips` | The element that wraps slotted chips for selected items\n`label` | The label element\n`input-field` | The element that wraps prefix, value and suffix\n`clear-button` | The clear button\n`error-message` | The error message element\n`helper-text` | The helper text element wrapper\n`required-indicator` | The `required` state indicator element\n`toggle-button` | The toggle button\n\nThe following state attributes are available for styling:\n\nAttribute | Description\n-----------------------|-----------------\n`disabled` | Set to a disabled element\n`has-value` | Set when the element has a value\n`has-label` | Set when the element has a label\n`has-helper` | Set when the element has helper text or slot\n`has-error-message` | Set when the element has an error message\n`invalid` | Set when the element is invalid\n`focused` | Set when the element is focused\n`focus-ring` | Set when the element is keyboard focused\n`loading` | Set when loading items from the data provider\n`opened` | Set when the dropdown is open\n`readonly` | Set to a readonly element\n\nThe following custom CSS properties are available for styling:\n\nCustom property | Description | Default\n-----------------------------------------------------|----------------------------|--------\n`--vaadin-field-default-width` | Default width of the field | `12em`\n`--vaadin-multi-select-combo-box-overlay-width` | Width of the overlay | `auto`\n`--vaadin-multi-select-combo-box-overlay-max-height` | Max height of the overlay | `65vh`\n`--vaadin-multi-select-combo-box-input-min-width` | Min width of the input | `4em`\n\n### Internal components\n\nIn addition to `<vaadin-multi-select-combo-box>` itself, the following internal\ncomponents are themable:\n\n- `<vaadin-multi-select-combo-box-overlay>` - has the same API as `<vaadin-overlay>`.\n- `<vaadin-multi-select-combo-box-item>` - has the same API as `<vaadin-item>`.\n- `<vaadin-multi-select-combo-box-container>` - has the same API as `<vaadin-input-container>`.\n\nNote: the `theme` attribute value set on `<vaadin-multi-select-combo-box>` is\npropagated to these components.\n\nSee [Styling Components](https://vaadin.com/docs/latest/styling/styling-components) documentation.",
19
+ "description": "`<vaadin-multi-select-combo-box>` is a web component that wraps `<vaadin-combo-box>` and extends\nits functionality to allow selecting multiple items, in addition to basic features.\n\n```html\n<vaadin-multi-select-combo-box id=\"comboBox\"></vaadin-multi-select-combo-box>\n```\n```js\nconst comboBox = document.querySelector('#comboBox');\ncomboBox.items = ['apple', 'banana', 'lemon', 'orange'];\ncomboBox.selectedItems = ['lemon', 'orange'];\n```\n\n### Styling\n\nThe following shadow DOM parts are available for styling:\n\nPart name | Description\n-----------------------|----------------\n`chips` | The element that wraps slotted chips for selected items\n`label` | The label element\n`input-field` | The element that wraps prefix, value and suffix\n`clear-button` | The clear button\n`error-message` | The error message element\n`helper-text` | The helper text element wrapper\n`required-indicator` | The `required` state indicator element\n`toggle-button` | The toggle button\n\nThe following state attributes are available for styling:\n\nAttribute | Description\n-----------------------|-----------------\n`disabled` | Set to a disabled element\n`has-value` | Set when the element has a value\n`has-label` | Set when the element has a label\n`has-helper` | Set when the element has helper text or slot\n`has-error-message` | Set when the element has an error message\n`invalid` | Set when the element is invalid\n`focused` | Set when the element is focused\n`focus-ring` | Set when the element is keyboard focused\n`loading` | Set when loading items from the data provider\n`opened` | Set when the dropdown is open\n`readonly` | Set to a readonly element\n\nThe following custom CSS properties are available for styling:\n\nCustom property | Description | Default\n-----------------------------------------------------|----------------------------|--------\n`--vaadin-field-default-width` | Default width of the field | `12em`\n`--vaadin-multi-select-combo-box-overlay-width` | Width of the overlay | `auto`\n`--vaadin-multi-select-combo-box-overlay-max-height` | Max height of the overlay | `65vh`\n`--vaadin-multi-select-combo-box-chip-min-width` | Min width of the chip | `50px`\n`--vaadin-multi-select-combo-box-input-min-width` | Min width of the input | `4em`\n\n### Internal components\n\nIn addition to `<vaadin-multi-select-combo-box>` itself, the following internal\ncomponents are themable:\n\n- `<vaadin-multi-select-combo-box-overlay>` - has the same API as `<vaadin-overlay>`.\n- `<vaadin-multi-select-combo-box-item>` - has the same API as `<vaadin-item>`.\n- `<vaadin-multi-select-combo-box-container>` - has the same API as `<vaadin-input-container>`.\n\nNote: the `theme` attribute value set on `<vaadin-multi-select-combo-box>` is\npropagated to these components.\n\nSee [Styling Components](https://vaadin.com/docs/latest/styling/styling-components) documentation.",
20
20
  "extension": true,
21
21
  "attributes": [
22
22
  {
@@ -68,6 +68,20 @@
68
68
  "kind": "expression"
69
69
  }
70
70
  },
71
+ {
72
+ "name": "?autoExpandHorizontally",
73
+ "description": "Set to true to auto expand horizontally, causing input field to\ngrow until max width is reached.",
74
+ "value": {
75
+ "kind": "expression"
76
+ }
77
+ },
78
+ {
79
+ "name": "?autoExpandVertically",
80
+ "description": "Set to true to not collapse selected items chips into the overflow\nchip and instead always expand vertically, causing input field to\nwrap into multiple lines when width is limited.",
81
+ "value": {
82
+ "kind": "expression"
83
+ }
84
+ },
71
85
  {
72
86
  "name": "?autoOpenDisabled",
73
87
  "description": "Set true to prevent the overlay from opening automatically.",
@@ -96,6 +110,13 @@
96
110
  "kind": "expression"
97
111
  }
98
112
  },
113
+ {
114
+ "name": "?selectedItemsOnTop",
115
+ "description": "Set to true to group selected items at the top of the overlay.",
116
+ "value": {
117
+ "kind": "expression"
118
+ }
119
+ },
99
120
  {
100
121
  "name": ".label",
101
122
  "description": "The label text for the input node.\nWhen no light dom defined via [slot=label], this value will be used.",