@umbraco-ui/uui 2.0.0-alpha.1 → 2.0.0-rc.0

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 (96) hide show
  1. package/custom-elements.json +45 -8
  2. package/dist/components/avatar/avatar.element.js +1 -0
  3. package/dist/components/avatar/avatar.element.js.map +1 -1
  4. package/dist/components/boolean-input/boolean-input.element.js +7 -1
  5. package/dist/components/boolean-input/boolean-input.element.js.map +1 -1
  6. package/dist/components/button/button.element.d.ts +0 -1
  7. package/dist/components/button/button.element.js +64 -18
  8. package/dist/components/button/button.element.js.map +1 -1
  9. package/dist/components/card-block-type/card-block-type.element.js +13 -4
  10. package/dist/components/card-block-type/card-block-type.element.js.map +1 -1
  11. package/dist/components/card-content-node/card-content-node.element.js +2 -2
  12. package/dist/components/card-content-node/card-content-node.element.js.map +1 -1
  13. package/dist/components/card-media/card-media.element.js +10 -3
  14. package/dist/components/card-media/card-media.element.js.map +1 -1
  15. package/dist/components/card-user/card-user.element.js +2 -2
  16. package/dist/components/card-user/card-user.element.js.map +1 -1
  17. package/dist/components/checkbox/checkbox.element.js +3 -6
  18. package/dist/components/checkbox/checkbox.element.js.map +1 -1
  19. package/dist/components/color-slider/color-slider.element.js +13 -3
  20. package/dist/components/color-slider/color-slider.element.js.map +1 -1
  21. package/dist/components/color-swatch/color-swatch.element.js +33 -1
  22. package/dist/components/color-swatch/color-swatch.element.js.map +1 -1
  23. package/dist/components/combobox/combobox.element.d.ts +9 -0
  24. package/dist/components/combobox/combobox.element.js +127 -15
  25. package/dist/components/combobox/combobox.element.js.map +1 -1
  26. package/dist/components/combobox-list/combobox-list-option.element.d.ts +1 -0
  27. package/dist/components/combobox-list/combobox-list-option.element.js +49 -10
  28. package/dist/components/combobox-list/combobox-list-option.element.js.map +1 -1
  29. package/dist/components/combobox-list/combobox-list.element.d.ts +14 -0
  30. package/dist/components/combobox-list/combobox-list.element.js +74 -25
  31. package/dist/components/combobox-list/combobox-list.element.js.map +1 -1
  32. package/dist/components/file-dropzone/file-dropzone.element.d.ts +2 -8
  33. package/dist/components/file-dropzone/file-dropzone.element.js +14 -25
  34. package/dist/components/file-dropzone/file-dropzone.element.js.map +1 -1
  35. package/dist/components/icon-registry-essential/UUIIconRegistryEssential.js +1 -1
  36. package/dist/components/icon-registry-essential/icon-registry-essential.js +33 -0
  37. package/dist/components/icon-registry-essential/icon-registry-essential.js.map +1 -1
  38. package/dist/components/index.d.ts +81 -0
  39. package/dist/components/input/input.element.js +33 -3
  40. package/dist/components/input/input.element.js.map +1 -1
  41. package/dist/components/input-file/input-file.element.js +33 -1
  42. package/dist/components/input-file/input-file.element.js.map +1 -1
  43. package/dist/components/input-lock/input-lock.element.js +33 -4
  44. package/dist/components/input-lock/input-lock.element.js.map +1 -1
  45. package/dist/components/input-password/input-password.element.js +33 -3
  46. package/dist/components/input-password/input-password.element.js.map +1 -1
  47. package/dist/components/keyboard-shortcut/key.element.js +7 -1
  48. package/dist/components/keyboard-shortcut/key.element.js.map +1 -1
  49. package/dist/components/loader/loader.element.js +19 -2
  50. package/dist/components/loader/loader.element.js.map +1 -1
  51. package/dist/components/modal/modal-container.js +6 -2
  52. package/dist/components/modal/modal-container.js.map +1 -1
  53. package/dist/components/modal/modal-dialog.element.js +5 -5
  54. package/dist/components/modal/modal-dialog.element.js.map +1 -1
  55. package/dist/components/modal/modal-sidebar.element.js +14 -10
  56. package/dist/components/modal/modal-sidebar.element.js.map +1 -1
  57. package/dist/components/modal/modal-with-toasts-example.element.d.ts +22 -0
  58. package/dist/components/modal/modal.element.d.ts +3 -1
  59. package/dist/components/modal/modal.element.js +31 -12
  60. package/dist/components/modal/modal.element.js.map +1 -1
  61. package/dist/components/modal/modal.js +7 -1
  62. package/dist/components/modal/modal.js.map +1 -1
  63. package/dist/components/pagination/pagination.element.d.ts +2 -0
  64. package/dist/components/pagination/pagination.element.js +26 -20
  65. package/dist/components/pagination/pagination.element.js.map +1 -1
  66. package/dist/components/progress-bar/progress-bar.element.js +6 -5
  67. package/dist/components/progress-bar/progress-bar.element.js.map +1 -1
  68. package/dist/components/responsive-container/responsive-container.element.js +36 -14
  69. package/dist/components/responsive-container/responsive-container.element.js.map +1 -1
  70. package/dist/components/scroll-container/scroll-container.element.js +4 -4
  71. package/dist/components/scroll-container/scroll-container.element.js.map +1 -1
  72. package/dist/components/symbol-expand/symbol-expand.element.js +1 -1
  73. package/dist/components/symbol-expand/symbol-expand.element.js.map +1 -1
  74. package/dist/components/symbol-file-thumbnail/symbol-file-thumbnail.element.js +34 -1
  75. package/dist/components/symbol-file-thumbnail/symbol-file-thumbnail.element.js.map +1 -1
  76. package/dist/components/table/table-head.element.js +4 -0
  77. package/dist/components/table/table-head.element.js.map +1 -1
  78. package/dist/components/table/table.element.js +5 -1
  79. package/dist/components/table/table.element.js.map +1 -1
  80. package/dist/components/tag/tag.element.js +4 -3
  81. package/dist/components/tag/tag.element.js.map +1 -1
  82. package/dist/components/toast-notification/toast-notification.element.js +34 -2
  83. package/dist/components/toast-notification/toast-notification.element.js.map +1 -1
  84. package/dist/components/toggle/toggle.element.js +38 -3
  85. package/dist/components/toggle/toggle.element.js.map +1 -1
  86. package/dist/index.d.ts +1 -81
  87. package/dist/internal/mixins/LabelMixin.js +14 -1
  88. package/dist/internal/mixins/LabelMixin.js.map +1 -1
  89. package/dist/internal/mixins/SelectOnlyMixin.d.ts +1 -1
  90. package/dist/internal/mixins/SelectOnlyMixin.js.map +1 -1
  91. package/dist/package.json.js +1 -1
  92. package/dist/themes/dark.css +1 -1
  93. package/dist/themes/high-contrast.css +1 -1
  94. package/dist/themes/light.css +1 -1
  95. package/package.json +26 -26
  96. package/vscode.html-custom-data.json +33 -18
@@ -6,8 +6,41 @@ var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read fr
6
6
  var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
7
7
  var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), setter ? setter.call(obj, value) : member.set(obj, value), value);
8
8
  var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "access private method"), method);
9
- var _comboboxList, _phoneMediaQuery, _UUIComboboxElement_instances, onSlotChange_fn, _onPhoneChange, updateValue_fn, _onMouseDown, _onBlur, _onInput, _onInnerSlotChange, _onChange, _onToggle, _onOpen, _onClose, _onKeyDown, _onClear, _renderInput, _renderClearButton, _renderDropdown;
9
+ var _comboboxList, _phoneMediaQuery, _UUIComboboxElement_instances, onSlotChange_fn, _onPhoneChange, updateValue_fn, _onMouseDown, _onBlur, _onInput, _onInnerSlotChange, _onChange, _onToggle, _onOpen, _onClose, _onKeyDown, _onClear, _onRemoveTag, _renderInput, _renderClearButton, _renderSelectedTags, _renderDropdown;
10
10
  import "../combobox-list/combobox-list.js";
11
+ import "../icon-registry-essential/svgs/iconAdd.js";
12
+ import "../icon-registry-essential/svgs/iconAlert.js";
13
+ import "../icon-registry-essential/svgs/iconAttachment.js";
14
+ import "../icon-registry-essential/svgs/iconCalendar.js";
15
+ import "../icon-registry-essential/svgs/iconCheck.js";
16
+ import "../icon-registry-essential/svgs/iconClipboard.js";
17
+ import "../icon-registry-essential/svgs/iconCode.js";
18
+ import "../icon-registry-essential/svgs/iconColorPicker.js";
19
+ import "../icon-registry-essential/svgs/iconCopy.js";
20
+ import "../icon-registry-essential/svgs/iconDelete.js";
21
+ import "../icon-registry-essential/svgs/iconDocument.js";
22
+ import "../icon-registry-essential/svgs/iconDownload.js";
23
+ import "../icon-registry-essential/svgs/iconDrag.js";
24
+ import "../icon-registry-essential/svgs/iconEdit.js";
25
+ import "../icon-registry-essential/svgs/iconFavorite.js";
26
+ import "../icon-registry-essential/svgs/iconFolder.js";
27
+ import "../icon-registry-essential/svgs/iconForbidden.js";
28
+ import "../icon-registry-essential/svgs/iconInfo.js";
29
+ import "../icon-registry-essential/svgs/iconLink.js";
30
+ import "../icon-registry-essential/svgs/iconLock.js";
31
+ import "../icon-registry-essential/svgs/iconPause.js";
32
+ import "../icon-registry-essential/svgs/iconPicture.js";
33
+ import "../icon-registry-essential/svgs/iconPlay.js";
34
+ import { iconRemove } from "../icon-registry-essential/svgs/iconRemove.js";
35
+ import "../icon-registry-essential/svgs/iconSearch.js";
36
+ import "../icon-registry-essential/svgs/iconSee.js";
37
+ import "../icon-registry-essential/svgs/iconSettings.js";
38
+ import "../icon-registry-essential/svgs/iconSubtract.js";
39
+ import "../icon-registry-essential/svgs/iconSync.js";
40
+ import "../icon-registry-essential/svgs/iconUnlock.js";
41
+ import "../icon-registry-essential/svgs/iconUnsee.js";
42
+ import "../icon-registry-essential/svgs/iconWand.js";
43
+ import "../icon-registry-essential/svgs/iconWrong.js";
11
44
  import { LitElement, nothing, html, css } from "lit";
12
45
  import { property, query, queryAssignedElements, state } from "lit/decorators.js";
13
46
  import { UUIComboboxEvent } from "./UUIComboboxEvent.js";
@@ -17,9 +50,9 @@ import "../button/button.js";
17
50
  import "../icon/icon.js";
18
51
  import "../scroll-container/scroll-container.js";
19
52
  import "../popover-container/popover-container.js";
53
+ import "../tag/tag.js";
20
54
  import { UUIComboboxListEvent } from "../combobox-list/UUIComboboxListEvent.js";
21
55
  import { UUIFormControlWithBasicsMixin } from "../../internal/mixins/FormControlWithBasicsMixin.js";
22
- import { iconRemove } from "../icon-registry-essential/svgs/iconRemove.js";
23
56
  var __defProp = Object.defineProperty;
24
57
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
25
58
  var __decorateClass = (decorators, target, key, kind) => {
@@ -50,11 +83,14 @@ const _UUIComboboxElement = class _UUIComboboxElement extends UUIFormControlWith
50
83
  __privateAdd(this, _onClose);
51
84
  __privateAdd(this, _onKeyDown);
52
85
  __privateAdd(this, _onClear);
86
+ __privateAdd(this, _onRemoveTag);
53
87
  __privateAdd(this, _renderInput);
54
88
  __privateAdd(this, _renderClearButton);
89
+ __privateAdd(this, _renderSelectedTags);
55
90
  __privateAdd(this, _renderDropdown);
56
91
  this.closeLabel = "Close";
57
92
  this.disabled = false;
93
+ this.multiple = false;
58
94
  this.hideExpandSymbol = false;
59
95
  this.readonly = false;
60
96
  this.placeholder = "";
@@ -62,6 +98,7 @@ const _UUIComboboxElement = class _UUIComboboxElement extends UUIFormControlWith
62
98
  this._search = "";
63
99
  this._isPhone = false;
64
100
  this._isOpen = false;
101
+ this._selectedItems = [];
65
102
  __privateSet(this, _onPhoneChange, () => {
66
103
  this._isPhone = __privateGet(this, _phoneMediaQuery).matches;
67
104
  });
@@ -84,9 +121,22 @@ const _UUIComboboxElement = class _UUIComboboxElement extends UUIFormControlWith
84
121
  }
85
122
  });
86
123
  __privateSet(this, _onChange, () => {
87
- this.value = __privateGet(this, _comboboxList)?.value || "";
88
- this.search = this.value ? this.search : "";
89
- __privateGet(this, _onClose).call(this);
124
+ const list = __privateGet(this, _comboboxList);
125
+ if (!list) return;
126
+ if (list.multiple) {
127
+ this._selectedItems = list.selectedValues.map((val, i) => ({
128
+ value: val,
129
+ displayValue: list.selectedDisplayValues[i] || val
130
+ }));
131
+ this.value = list.selectedValues.join(",");
132
+ this.search = "";
133
+ this._input.value = "";
134
+ this.dispatchEvent(new UUIComboboxEvent(UUIComboboxEvent.SEARCH));
135
+ } else {
136
+ this.value = list.value || "";
137
+ this.search = this.value ? this.search : "";
138
+ __privateGet(this, _onClose).call(this);
139
+ }
90
140
  this.dispatchEvent(new UUIComboboxEvent(UUIComboboxEvent.CHANGE));
91
141
  });
92
142
  __privateSet(this, _onToggle, () => {
@@ -106,17 +156,17 @@ const _UUIComboboxElement = class _UUIComboboxElement extends UUIFormControlWith
106
156
  this.dispatchEvent(new UUIComboboxEvent(UUIComboboxEvent.SEARCH));
107
157
  });
108
158
  __privateSet(this, _onKeyDown, (e) => {
159
+ if (e.code === "Backspace" && this.multiple && this._selectedItems.length > 0 && this.search === "") {
160
+ const lastItem = this._selectedItems[this._selectedItems.length - 1];
161
+ __privateGet(this, _onRemoveTag).call(this, e, lastItem.value);
162
+ return;
163
+ }
109
164
  if (this.open === false && e.code === "Enter") {
110
165
  e.preventDefault();
111
166
  e.stopImmediatePropagation();
112
- }
113
- if (e.code === "ArrowUp" || e.code === "ArrowDown") {
114
167
  __privateGet(this, _onOpen).call(this);
115
168
  }
116
- if (e.code === "Space") {
117
- if (this._isOpen) return;
118
- e.preventDefault();
119
- e.stopImmediatePropagation();
169
+ if (e.code === "ArrowUp" || e.code === "ArrowDown") {
120
170
  __privateGet(this, _onOpen).call(this);
121
171
  }
122
172
  if (e.code === "Escape") {
@@ -127,6 +177,16 @@ const _UUIComboboxElement = class _UUIComboboxElement extends UUIFormControlWith
127
177
  if (e.key && e.key !== "Enter") return;
128
178
  e.preventDefault();
129
179
  e.stopImmediatePropagation();
180
+ const list = __privateGet(this, _comboboxList);
181
+ if (list?.multiple) {
182
+ for (const el of list.querySelectorAll(
183
+ "uui-combobox-list-option[selected]"
184
+ )) {
185
+ el.selected = false;
186
+ }
187
+ list.resetSelection();
188
+ this._selectedItems = [];
189
+ }
130
190
  this.value = "";
131
191
  this.search = "";
132
192
  this._input.value = this._displayValue;
@@ -134,6 +194,18 @@ const _UUIComboboxElement = class _UUIComboboxElement extends UUIFormControlWith
134
194
  this.dispatchEvent(new UUIComboboxEvent(UUIComboboxEvent.SEARCH));
135
195
  this.dispatchEvent(new UUIComboboxEvent(UUIComboboxEvent.CHANGE));
136
196
  });
197
+ __privateSet(this, _onRemoveTag, (e, value) => {
198
+ e.stopPropagation();
199
+ const list = __privateGet(this, _comboboxList);
200
+ if (!list) return;
201
+ const options = list.querySelectorAll("uui-combobox-list-option");
202
+ for (const option of options) {
203
+ if (option.value === value && option.selected) {
204
+ option.click();
205
+ break;
206
+ }
207
+ }
208
+ });
137
209
  __privateSet(this, _renderInput, () => {
138
210
  return html`<uui-input
139
211
  slot="trigger"
@@ -150,8 +222,8 @@ const _UUIComboboxElement = class _UUIComboboxElement extends UUIFormControlWith
150
222
  @input=${__privateGet(this, _onInput)}
151
223
  @keydown=${__privateGet(this, _onKeyDown)}>
152
224
  <slot name="input-prepend" slot="prepend"></slot>
153
- ${__privateGet(this, _renderClearButton).call(this)}
154
- ${this.hideExpandSymbol ? nothing : html`<div id="expand-symbol-wrapper" slot="append">
225
+ ${__privateGet(this, _renderSelectedTags).call(this)} ${__privateGet(this, _renderClearButton).call(this)}
226
+ ${this.hideExpandSymbol || this.multiple ? nothing : html`<div id="expand-symbol-wrapper" slot="append">
155
227
  <uui-symbol-expand .open=${this._isOpen}></uui-symbol-expand>
156
228
  </div>`}
157
229
  <slot name="input-append" slot="append"></slot>
@@ -160,6 +232,7 @@ const _UUIComboboxElement = class _UUIComboboxElement extends UUIFormControlWith
160
232
  __privateSet(this, _renderClearButton, () => {
161
233
  if (this.disabled) return nothing;
162
234
  if (this.readonly) return nothing;
235
+ if (this.multiple) return nothing;
163
236
  return html`<uui-button
164
237
  id="clear-button"
165
238
  @click=${__privateGet(this, _onClear)}
@@ -168,11 +241,27 @@ const _UUIComboboxElement = class _UUIComboboxElement extends UUIFormControlWith
168
241
  slot="append"
169
242
  compact
170
243
  style="height: 100%;"
171
- tabindex=${this.value || this.search ? "" : "-1"}
172
- class=${this.value || this.search ? "visible" : ""}>
244
+ tabindex=${this.value || this.search || this._selectedItems.length > 0 ? "" : "-1"}
245
+ class=${this.value || this.search || this._selectedItems.length > 0 ? "visible" : ""}>
173
246
  <uui-icon name="remove" .fallback=${iconRemove.strings[0]}></uui-icon>
174
247
  </uui-button>`;
175
248
  });
249
+ __privateSet(this, _renderSelectedTags, () => {
250
+ if (this._selectedItems.length === 0) return nothing;
251
+ return html` ${this._selectedItems.map(
252
+ (item) => html`<uui-tag look="secondary">
253
+ ${item.displayValue}
254
+ <uui-button
255
+ compact
256
+ label="Remove ${item.displayValue}"
257
+ @click=${(e) => __privateGet(this, _onRemoveTag).call(this, e, item.value)}>
258
+ <uui-icon
259
+ name="remove"
260
+ .fallback=${iconRemove.strings[0]}></uui-icon>
261
+ </uui-button>
262
+ </uui-tag>`
263
+ )}`;
264
+ });
176
265
  __privateSet(this, _renderDropdown, () => {
177
266
  return html`<div id="dropdown">
178
267
  <uui-scroll-container tabindex="-1" id="scroll-container">
@@ -285,6 +374,7 @@ onSlotChange_fn = function() {
285
374
  if (list) {
286
375
  __privateSet(this, _comboboxList, list);
287
376
  __privateGet(this, _comboboxList).for = this;
377
+ __privateGet(this, _comboboxList).multiple = this.multiple;
288
378
  __privateGet(this, _comboboxList).addEventListener(
289
379
  UUIComboboxListEvent.CHANGE,
290
380
  __privateGet(this, _onChange)
@@ -317,8 +407,10 @@ _onOpen = new WeakMap();
317
407
  _onClose = new WeakMap();
318
408
  _onKeyDown = new WeakMap();
319
409
  _onClear = new WeakMap();
410
+ _onRemoveTag = new WeakMap();
320
411
  _renderInput = new WeakMap();
321
412
  _renderClearButton = new WeakMap();
413
+ _renderSelectedTags = new WeakMap();
322
414
  _renderDropdown = new WeakMap();
323
415
  _UUIComboboxElement.styles = [
324
416
  css`
@@ -401,6 +493,20 @@ _UUIComboboxElement.styles = [
401
493
  #phone-wrapper #scroll-container {
402
494
  max-height: unset;
403
495
  }
496
+
497
+ :host([multiple]) #combobox-input {
498
+ --uui-input-height: auto;
499
+ min-height: var(--uui-size-11);
500
+ }
501
+ :host([multiple]) uui-tag {
502
+ display: inline-flex;
503
+ align-items: center;
504
+ gap: 2px;
505
+ }
506
+
507
+ :host([multiple]) uui-tag uui-button {
508
+ font-size: 10px;
509
+ }
404
510
  `
405
511
  ];
406
512
  let UUIComboboxElement = _UUIComboboxElement;
@@ -419,6 +525,9 @@ __decorateClass([
419
525
  __decorateClass([
420
526
  property({ type: Boolean, reflect: true })
421
527
  ], UUIComboboxElement.prototype, "disabled", 2);
528
+ __decorateClass([
529
+ property({ type: Boolean, reflect: true })
530
+ ], UUIComboboxElement.prototype, "multiple", 2);
422
531
  __decorateClass([
423
532
  property({ type: Boolean, reflect: false, attribute: "hide-expand-symbol" })
424
533
  ], UUIComboboxElement.prototype, "hideExpandSymbol", 2);
@@ -452,6 +561,9 @@ __decorateClass([
452
561
  __decorateClass([
453
562
  state()
454
563
  ], UUIComboboxElement.prototype, "_isOpen", 2);
564
+ __decorateClass([
565
+ state()
566
+ ], UUIComboboxElement.prototype, "_selectedItems", 2);
455
567
  export {
456
568
  UUIComboboxElement
457
569
  };
@@ -1 +1 @@
1
- {"version":3,"file":"combobox.element.js","sources":["../../../src/components/combobox/combobox.element.ts"],"sourcesContent":["import { UUIFormControlWithBasicsMixin } from '../../internal/mixins/index.js';\nimport type { UUIComboboxListElement } from '../combobox-list/combobox-list.js';\nimport { UUIComboboxListEvent } from '../combobox-list/combobox-list.js';\nimport { iconRemove } from '../icon-registry-essential/svgs/index.js';\nimport type { UUIPopoverContainerElement } from '../popover-container/popover-container.js';\nimport { css, html, LitElement, nothing } from 'lit';\nimport {\n property,\n query,\n queryAssignedElements,\n state,\n} from 'lit/decorators.js';\n\nimport { UUIComboboxEvent } from './UUIComboboxEvent.js';\n\nimport '../input/input.js';\nimport '../symbol-expand/symbol-expand.js';\nimport '../button/button.js';\nimport '../icon/icon.js';\nimport '../scroll-container/scroll-container.js';\nimport '../popover-container/popover-container.js';\n\n/**\n * @element uui-combobox\n * @fires {UUIComboboxEvent} input - fires when search input is changed\n * @fires {UUIComboboxEvent} change - fires when selection is changed\n * @slot - for uui-combobox-list-options\n * @slot input-prepend - prepend for the uui-input\n * @slot input-append - append for the uui-input\n * @cssprop --uui-dropdown-width - overwrite the dropdown width\n * @description - Filterable combobox\n */\nexport class UUIComboboxElement extends UUIFormControlWithBasicsMixin(\n LitElement,\n '',\n) {\n @property({ attribute: 'value', reflect: true })\n set value(newValue) {\n super.value = newValue;\n\n if (typeof newValue === 'string') {\n this.#updateValue();\n }\n }\n get value() {\n return super.value;\n }\n\n /**\n * The search input.\n * @type {string}\n * @attr\n * @default \"\"\n */\n @property({ type: String })\n public set search(newValue) {\n if (this.search === newValue) return;\n const oldValue = this._search;\n this._search = newValue;\n this.requestUpdate('search', oldValue);\n }\n public get search() {\n return this._search;\n }\n\n /**\n * Specifies if the popover should be open.\n * @type {boolean}\n * @attr\n * @default false\n */\n @property({ type: Boolean })\n public set open(newValue: boolean) {\n const oldValue = newValue;\n this._isOpen = newValue;\n const popover = this._comboboxPopoverElement;\n if (popover) {\n if (newValue) {\n const width = this._input.offsetWidth;\n popover.style.setProperty('--popover-width', `${width}px`);\n popover.showPopover();\n } else {\n popover.hidePopover();\n }\n }\n\n this.requestUpdate('open', oldValue);\n }\n public get open() {\n return this._isOpen;\n }\n\n /**\n * Specifies the button label for the close button in mobile mode\n * @type {string}\n * @attr\n * @default \"Close\"\n */\n @property({ type: String, attribute: 'close-label' })\n public closeLabel = 'Close';\n\n /**\n * Disables the uui-combobox.\n * @type {boolean}\n * @attr\n * @default false\n */\n @property({ type: Boolean, reflect: true })\n disabled = false;\n\n /**\n * Removes the expand symbol.\n * @type {boolean}\n * @attr\n * @default false\n */\n @property({ type: Boolean, reflect: false, attribute: 'hide-expand-symbol' })\n hideExpandSymbol = false;\n\n /**\n * Sets the input to readonly mode, meaning value cannot be changed but still able to read and select its content.\n * @type {boolean}\n * @attr\n * @default false\n */\n @property({ type: Boolean, reflect: true })\n readonly = false;\n\n /**\n * Defines the input placeholder.\n * @type {string}\n * @attr\n * @default ''\n */\n @property()\n placeholder = '';\n\n @query('#combobox-input')\n private readonly _input!: HTMLInputElement;\n\n @query('#combobox-popover')\n private readonly _comboboxPopoverElement?: UUIPopoverContainerElement;\n\n @queryAssignedElements({\n flatten: true,\n selector: 'uui-combobox-list',\n })\n private readonly _comboboxListElements?: UUIComboboxListElement[];\n\n #comboboxList!: UUIComboboxListElement;\n #phoneMediaQuery!: MediaQueryList;\n\n @state()\n private _displayValue = '';\n\n @state()\n private _search = '';\n\n @state()\n private _isPhone = false;\n\n @state()\n private _isOpen = false;\n\n connectedCallback(): void {\n super.connectedCallback();\n\n this.addEventListener('blur', this.#onBlur);\n this.addEventListener('mousedown', this.#onMouseDown);\n\n this.#phoneMediaQuery = window.matchMedia('(max-width: 600px)');\n this.#onPhoneChange();\n this.#phoneMediaQuery.addEventListener('change', this.#onPhoneChange);\n }\n\n disconnectedCallback(): void {\n super.disconnectedCallback();\n\n this.removeEventListener('blur', this.#onBlur);\n this.removeEventListener('mousedown', this.#onMouseDown);\n this.#phoneMediaQuery.removeEventListener('change', this.#onPhoneChange);\n }\n\n #onSlotChange() {\n if (this.#comboboxList) {\n this.#comboboxList.removeEventListener(\n UUIComboboxListEvent.CHANGE,\n this.#onChange,\n );\n this.#comboboxList.removeEventListener(\n UUIComboboxListEvent.INNER_SLOT_CHANGE,\n this.#onInnerSlotChange,\n );\n }\n const list = this._comboboxListElements?.[0];\n\n if (list) {\n this.#comboboxList = list;\n this.#comboboxList.for = this;\n this.#comboboxList.addEventListener(\n UUIComboboxListEvent.CHANGE,\n this.#onChange,\n );\n this.#comboboxList.addEventListener(\n UUIComboboxListEvent.INNER_SLOT_CHANGE,\n this.#onInnerSlotChange,\n );\n }\n\n this.updateComplete.then(() => {\n this.#updateValue();\n });\n }\n\n readonly #onPhoneChange = () => {\n this._isPhone = this.#phoneMediaQuery.matches;\n };\n\n #updateValue() {\n if (this.#comboboxList) {\n this.#comboboxList.value = this.value;\n requestAnimationFrame(\n () => (this._displayValue = this.#comboboxList.displayValue || ''),\n );\n }\n }\n\n protected getFormElement(): HTMLElement | undefined {\n return this._input;\n }\n\n async focus() {\n await this.updateComplete;\n this._input.focus();\n }\n async blur() {\n await this.updateComplete;\n this._input.blur();\n }\n async click() {\n await this.updateComplete;\n this._input.click();\n }\n\n readonly #onMouseDown = () =>\n requestAnimationFrame(() => this._input.focus());\n\n readonly #onBlur = () =>\n requestAnimationFrame(() => {\n if (!this.shadowRoot?.activeElement) {\n this.#onClose();\n }\n });\n\n readonly #onInput = (e: any) => {\n e.preventDefault();\n e.stopImmediatePropagation();\n this.search = e.target.value;\n this.dispatchEvent(new UUIComboboxEvent(UUIComboboxEvent.SEARCH));\n this.#onOpen();\n };\n\n readonly #onInnerSlotChange = () => {\n if (this.value && this.value !== this.#comboboxList?.value) {\n this.#updateValue();\n }\n };\n\n readonly #onChange = () => {\n this.value = this.#comboboxList?.value || '';\n this.search = this.value ? this.search : '';\n\n this.#onClose();\n this.dispatchEvent(new UUIComboboxEvent(UUIComboboxEvent.CHANGE));\n };\n\n readonly #onToggle = () => {\n if (this.readonly) return;\n this.open = !this.open;\n };\n\n readonly #onOpen = () => {\n if (this.open) return;\n if (this.readonly) return;\n this.open = true;\n };\n\n readonly #onClose = () => {\n if (!this.open) return;\n\n this.open = false;\n this.search = '';\n // Reset input(search-input) value:\n this._input.value = this._displayValue;\n this.dispatchEvent(new UUIComboboxEvent(UUIComboboxEvent.SEARCH));\n };\n\n readonly #onKeyDown = (e: KeyboardEvent) => {\n if (this.open === false && e.code === 'Enter') {\n e.preventDefault(); // Prevent form submission when combobox is closed\n e.stopImmediatePropagation(); // Don't let list handle Enter when closed\n }\n\n if (e.code === 'ArrowUp' || e.code === 'ArrowDown') {\n this.#onOpen();\n }\n\n if (e.code === 'Space') {\n if (this._isOpen) return;\n e.preventDefault();\n e.stopImmediatePropagation();\n this.#onOpen();\n }\n\n if (e.code === 'Escape') {\n this.#onClose();\n }\n };\n\n readonly #onClear = (e: any) => {\n if (e.key && e.key !== 'Enter') return;\n\n e.preventDefault(); // Prevent form submission from clear button\n e.stopImmediatePropagation(); // Don't let list handle Enter after clearing\n\n this.value = '';\n this.search = '';\n // Reset input(search-input) value:\n this._input.value = this._displayValue;\n\n this._input.focus();\n\n this.dispatchEvent(new UUIComboboxEvent(UUIComboboxEvent.SEARCH));\n this.dispatchEvent(new UUIComboboxEvent(UUIComboboxEvent.CHANGE));\n };\n\n readonly #renderInput = () => {\n return html`<uui-input\n slot=\"trigger\"\n id=\"combobox-input\"\n label=\"combobox-input\"\n type=\"text\"\n .value=${this._displayValue}\n .placeholder=${this.placeholder}\n autocomplete=\"off\"\n .disabled=${this.disabled}\n .readonly=${this.readonly}\n popovertarget=\"combobox-popover\"\n @click=${this.#onToggle}\n @input=${this.#onInput}\n @keydown=${this.#onKeyDown}>\n <slot name=\"input-prepend\" slot=\"prepend\"></slot>\n ${this.#renderClearButton()}\n ${this.hideExpandSymbol\n ? nothing\n : html`<div id=\"expand-symbol-wrapper\" slot=\"append\">\n <uui-symbol-expand .open=${this._isOpen}></uui-symbol-expand>\n </div>`}\n <slot name=\"input-append\" slot=\"append\"></slot>\n </uui-input>`;\n };\n\n readonly #renderClearButton = () => {\n if (this.disabled) return nothing;\n if (this.readonly) return nothing;\n\n return html`<uui-button\n id=\"clear-button\"\n @click=${this.#onClear}\n @keydown=${this.#onClear}\n label=\"clear\"\n slot=\"append\"\n compact\n style=\"height: 100%;\"\n tabindex=${this.value || this.search ? '' : '-1'}\n class=${this.value || this.search ? 'visible' : ''}>\n <uui-icon name=\"remove\" .fallback=${iconRemove.strings[0]}></uui-icon>\n </uui-button>`;\n };\n\n readonly #renderDropdown = () => {\n return html`<div id=\"dropdown\">\n <uui-scroll-container tabindex=\"-1\" id=\"scroll-container\">\n <slot @slotchange=${this.#onSlotChange}></slot>\n </uui-scroll-container>\n </div>`;\n };\n\n render() {\n if (this._isPhone && this.open) {\n return html`<div id=\"phone-wrapper\">\n <uui-button label=\"close\" look=\"primary\" @click=${this.#onClose}>\n ${this.closeLabel}\n </uui-button>\n ${this.#renderInput()} ${this.#renderDropdown()}\n </div>`;\n } else {\n return html`\n ${this.#renderInput()}\n <uui-popover-container\n id=\"combobox-popover\"\n popover=\"manual\"\n placement=\"bottom-end\">\n ${this.#renderDropdown()}\n </uui-popover-container>\n `;\n }\n }\n\n static override readonly styles = [\n css`\n :host {\n display: inline-flex;\n }\n\n #combobox-input {\n width: 100%;\n border-radius: var(--uui-border-radius-3);\n }\n\n #combobox-popover {\n width: var(--uui-dropdown-width, var(--popover-width, inherit));\n }\n\n #scroll-container {\n overflow-y: auto;\n width: 100%;\n max-height: var(--uui-combobox-popover-max-height, 500px);\n }\n #expand-symbol-wrapper {\n height: 100%;\n padding-right: var(--uui-size-space-3);\n display: flex;\n justify-content: center;\n }\n\n #clear-button {\n opacity: 0;\n transition: opacity 80ms;\n }\n\n :host(:not([disabled]):not([readonly]):focus-within)\n #clear-button.visible,\n :host(:not([disabled]):not([readonly]):hover) #clear-button.visible {\n opacity: 1;\n }\n\n #dropdown {\n overflow: hidden;\n z-index: -1;\n background-color: var(\n --uui-combobox-popover-background-color,\n var(--uui-color-surface)\n );\n border: 1px solid var(--uui-color-border);\n border-radius: var(--uui-border-radius-3);\n width: 100%;\n box-sizing: border-box;\n box-shadow: var(--uui-shadow-depth-3);\n }\n\n :host([disabled]) #caret {\n fill: var(--uui-color-disabled-contrast);\n }\n\n #phone-wrapper {\n position: fixed;\n inset: 0;\n display: flex;\n flex-direction: column;\n z-index: 1;\n font-size: 1.1em;\n }\n\n #phone-wrapper #dropdown {\n display: flex;\n }\n\n #phone-wrapper #combobox-input {\n height: var(--uui-size-16);\n }\n\n #phone-wrapper > uui-button {\n height: var(--uui-size-14);\n width: 100%;\n }\n\n #phone-wrapper #scroll-container {\n max-height: unset;\n }\n `,\n ];\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"combobox.element.js","sources":["../../../src/components/combobox/combobox.element.ts"],"sourcesContent":["import { UUIFormControlWithBasicsMixin } from '../../internal/mixins/index.js';\nimport type {\n UUIComboboxListElement,\n UUIComboboxListOptionElement,\n} from '../combobox-list/combobox-list.js';\nimport { UUIComboboxListEvent } from '../combobox-list/combobox-list.js';\nimport { iconRemove } from '../icon-registry-essential/svgs/index.js';\nimport type { UUIPopoverContainerElement } from '../popover-container/popover-container.js';\nimport { css, html, LitElement, nothing } from 'lit';\nimport {\n property,\n query,\n queryAssignedElements,\n state,\n} from 'lit/decorators.js';\n\nimport { UUIComboboxEvent } from './UUIComboboxEvent.js';\n\nimport '../input/input.js';\nimport '../symbol-expand/symbol-expand.js';\nimport '../button/button.js';\nimport '../icon/icon.js';\nimport '../scroll-container/scroll-container.js';\nimport '../popover-container/popover-container.js';\nimport '../tag/tag.js';\n\n/**\n * @element uui-combobox\n * @fires {UUIComboboxEvent} input - fires when search input is changed\n * @fires {UUIComboboxEvent} change - fires when selection is changed\n * @slot - for uui-combobox-list-options\n * @slot input-prepend - prepend for the uui-input\n * @slot input-append - append for the uui-input\n * @cssprop --uui-dropdown-width - overwrite the dropdown width\n * @description - Filterable combobox\n */\nexport class UUIComboboxElement extends UUIFormControlWithBasicsMixin(\n LitElement,\n '',\n) {\n @property({ attribute: 'value', reflect: true })\n set value(newValue) {\n super.value = newValue;\n\n if (typeof newValue === 'string') {\n this.#updateValue();\n }\n }\n get value() {\n return super.value;\n }\n\n /**\n * The search input.\n * @type {string}\n * @attr\n * @default \"\"\n */\n @property({ type: String })\n public set search(newValue) {\n if (this.search === newValue) return;\n const oldValue = this._search;\n this._search = newValue;\n this.requestUpdate('search', oldValue);\n }\n public get search() {\n return this._search;\n }\n\n /**\n * Specifies if the popover should be open.\n * @type {boolean}\n * @attr\n * @default false\n */\n @property({ type: Boolean })\n public set open(newValue: boolean) {\n const oldValue = newValue;\n this._isOpen = newValue;\n const popover = this._comboboxPopoverElement;\n if (popover) {\n if (newValue) {\n const width = this._input.offsetWidth;\n popover.style.setProperty('--popover-width', `${width}px`);\n popover.showPopover();\n } else {\n popover.hidePopover();\n }\n }\n\n this.requestUpdate('open', oldValue);\n }\n public get open() {\n return this._isOpen;\n }\n\n /**\n * Specifies the button label for the close button in mobile mode\n * @type {string}\n * @attr\n * @default \"Close\"\n */\n @property({ type: String, attribute: 'close-label' })\n public closeLabel = 'Close';\n\n /**\n * Disables the uui-combobox.\n * @type {boolean}\n * @attr\n * @default false\n */\n @property({ type: Boolean, reflect: true })\n disabled = false;\n\n /**\n * Enables multiple selection mode.\n * @type {boolean}\n * @attr\n * @default false\n */\n @property({ type: Boolean, reflect: true })\n multiple = false;\n\n /**\n * Removes the expand symbol.\n * @type {boolean}\n * @attr\n * @default false\n */\n @property({ type: Boolean, reflect: false, attribute: 'hide-expand-symbol' })\n hideExpandSymbol = false;\n\n /**\n * Sets the input to readonly mode, meaning value cannot be changed but still able to read and select its content.\n * @type {boolean}\n * @attr\n * @default false\n */\n @property({ type: Boolean, reflect: true })\n readonly = false;\n\n /**\n * Defines the input placeholder.\n * @type {string}\n * @attr\n * @default ''\n */\n @property()\n placeholder = '';\n\n @query('#combobox-input')\n private readonly _input!: HTMLInputElement;\n\n @query('#combobox-popover')\n private readonly _comboboxPopoverElement?: UUIPopoverContainerElement;\n\n @queryAssignedElements({\n flatten: true,\n selector: 'uui-combobox-list',\n })\n private readonly _comboboxListElements?: UUIComboboxListElement[];\n\n #comboboxList!: UUIComboboxListElement;\n #phoneMediaQuery!: MediaQueryList;\n\n @state()\n private _displayValue = '';\n\n @state()\n private _search = '';\n\n @state()\n private _isPhone = false;\n\n @state()\n private _isOpen = false;\n\n @state()\n private _selectedItems: Array<{ value: string; displayValue: string }> = [];\n\n connectedCallback(): void {\n super.connectedCallback();\n\n this.addEventListener('blur', this.#onBlur);\n this.addEventListener('mousedown', this.#onMouseDown);\n\n this.#phoneMediaQuery = window.matchMedia('(max-width: 600px)');\n this.#onPhoneChange();\n this.#phoneMediaQuery.addEventListener('change', this.#onPhoneChange);\n }\n\n disconnectedCallback(): void {\n super.disconnectedCallback();\n\n this.removeEventListener('blur', this.#onBlur);\n this.removeEventListener('mousedown', this.#onMouseDown);\n this.#phoneMediaQuery.removeEventListener('change', this.#onPhoneChange);\n }\n\n #onSlotChange() {\n if (this.#comboboxList) {\n this.#comboboxList.removeEventListener(\n UUIComboboxListEvent.CHANGE,\n this.#onChange,\n );\n this.#comboboxList.removeEventListener(\n UUIComboboxListEvent.INNER_SLOT_CHANGE,\n this.#onInnerSlotChange,\n );\n }\n const list = this._comboboxListElements?.[0];\n\n if (list) {\n this.#comboboxList = list;\n this.#comboboxList.for = this;\n this.#comboboxList.multiple = this.multiple;\n this.#comboboxList.addEventListener(\n UUIComboboxListEvent.CHANGE,\n this.#onChange,\n );\n this.#comboboxList.addEventListener(\n UUIComboboxListEvent.INNER_SLOT_CHANGE,\n this.#onInnerSlotChange,\n );\n }\n\n this.updateComplete.then(() => {\n this.#updateValue();\n });\n }\n\n readonly #onPhoneChange = () => {\n this._isPhone = this.#phoneMediaQuery.matches;\n };\n\n #updateValue() {\n if (this.#comboboxList) {\n this.#comboboxList.value = this.value;\n requestAnimationFrame(\n () => (this._displayValue = this.#comboboxList.displayValue || ''),\n );\n }\n }\n\n protected getFormElement(): HTMLElement | undefined {\n return this._input;\n }\n\n async focus() {\n await this.updateComplete;\n this._input.focus();\n }\n async blur() {\n await this.updateComplete;\n this._input.blur();\n }\n async click() {\n await this.updateComplete;\n this._input.click();\n }\n\n readonly #onMouseDown = () =>\n requestAnimationFrame(() => this._input.focus());\n\n readonly #onBlur = () =>\n requestAnimationFrame(() => {\n if (!this.shadowRoot?.activeElement) {\n this.#onClose();\n }\n });\n\n readonly #onInput = (e: any) => {\n e.preventDefault();\n e.stopImmediatePropagation();\n this.search = e.target.value;\n this.dispatchEvent(new UUIComboboxEvent(UUIComboboxEvent.SEARCH));\n this.#onOpen();\n };\n\n readonly #onInnerSlotChange = () => {\n if (this.value && this.value !== this.#comboboxList?.value) {\n this.#updateValue();\n }\n };\n\n readonly #onChange = () => {\n const list = this.#comboboxList;\n if (!list) return;\n\n if (list.multiple) {\n this._selectedItems = list.selectedValues.map((val, i) => ({\n value: val,\n displayValue: list.selectedDisplayValues[i] || val,\n }));\n this.value = list.selectedValues.join(',');\n\n this.search = '';\n this._input.value = '';\n this.dispatchEvent(new UUIComboboxEvent(UUIComboboxEvent.SEARCH));\n } else {\n this.value = list.value || '';\n this.search = this.value ? this.search : '';\n this.#onClose();\n }\n this.dispatchEvent(new UUIComboboxEvent(UUIComboboxEvent.CHANGE));\n };\n\n readonly #onToggle = () => {\n if (this.readonly) return;\n this.open = !this.open;\n };\n\n readonly #onOpen = () => {\n if (this.open) return;\n if (this.readonly) return;\n this.open = true;\n };\n\n readonly #onClose = () => {\n if (!this.open) return;\n\n this.open = false;\n this.search = '';\n // Reset input(search-input) value:\n this._input.value = this._displayValue;\n this.dispatchEvent(new UUIComboboxEvent(UUIComboboxEvent.SEARCH));\n };\n\n readonly #onKeyDown = (e: KeyboardEvent) => {\n if (\n e.code === 'Backspace' &&\n this.multiple &&\n this._selectedItems.length > 0 &&\n this.search === ''\n ) {\n const lastItem = this._selectedItems[this._selectedItems.length - 1];\n this.#onRemoveTag(e, lastItem.value);\n return;\n }\n if (this.open === false && e.code === 'Enter') {\n e.preventDefault(); // Prevent form submission when combobox is closed\n e.stopImmediatePropagation(); // Don't let list handle Enter when closed\n\n this.#onOpen();\n }\n\n if (e.code === 'ArrowUp' || e.code === 'ArrowDown') {\n this.#onOpen();\n }\n\n if (e.code === 'Escape') {\n this.#onClose();\n }\n };\n\n readonly #onClear = (e: any) => {\n if (e.key && e.key !== 'Enter') return;\n\n e.preventDefault();\n e.stopImmediatePropagation();\n\n const list = this.#comboboxList;\n if (list?.multiple) {\n // Deselect all options\n for (const el of list.querySelectorAll<UUIComboboxListOptionElement>(\n 'uui-combobox-list-option[selected]',\n )) {\n el.selected = false;\n }\n list.resetSelection();\n this._selectedItems = [];\n }\n\n this.value = '';\n this.search = '';\n this._input.value = this._displayValue;\n\n this._input.focus();\n\n this.dispatchEvent(new UUIComboboxEvent(UUIComboboxEvent.SEARCH));\n this.dispatchEvent(new UUIComboboxEvent(UUIComboboxEvent.CHANGE));\n };\n\n readonly #onRemoveTag = (e: Event, value: string) => {\n e.stopPropagation(); // Don't let this trigger the input click/toggle\n\n const list = this.#comboboxList;\n if (!list) return;\n\n const options = list.querySelectorAll('uui-combobox-list-option');\n for (const option of options) {\n if (option.value === value && option.selected) {\n option.click(); // Triggers SelectableMixin's toggle → fires DESELECTED → list updates arrays\n break;\n }\n }\n };\n\n readonly #renderInput = () => {\n return html`<uui-input\n slot=\"trigger\"\n id=\"combobox-input\"\n label=\"combobox-input\"\n type=\"text\"\n .value=${this._displayValue}\n .placeholder=${this.placeholder}\n autocomplete=\"off\"\n .disabled=${this.disabled}\n .readonly=${this.readonly}\n popovertarget=\"combobox-popover\"\n @click=${this.#onToggle}\n @input=${this.#onInput}\n @keydown=${this.#onKeyDown}>\n <slot name=\"input-prepend\" slot=\"prepend\"></slot>\n ${this.#renderSelectedTags()} ${this.#renderClearButton()}\n ${this.hideExpandSymbol || this.multiple\n ? nothing\n : html`<div id=\"expand-symbol-wrapper\" slot=\"append\">\n <uui-symbol-expand .open=${this._isOpen}></uui-symbol-expand>\n </div>`}\n <slot name=\"input-append\" slot=\"append\"></slot>\n </uui-input>`;\n };\n\n readonly #renderClearButton = () => {\n if (this.disabled) return nothing;\n if (this.readonly) return nothing;\n if (this.multiple) return nothing;\n\n return html`<uui-button\n id=\"clear-button\"\n @click=${this.#onClear}\n @keydown=${this.#onClear}\n label=\"clear\"\n slot=\"append\"\n compact\n style=\"height: 100%;\"\n tabindex=${this.value || this.search || this._selectedItems.length > 0\n ? ''\n : '-1'}\n class=${this.value || this.search || this._selectedItems.length > 0\n ? 'visible'\n : ''}>\n <uui-icon name=\"remove\" .fallback=${iconRemove.strings[0]}></uui-icon>\n </uui-button>`;\n };\n\n readonly #renderSelectedTags = () => {\n if (this._selectedItems.length === 0) return nothing;\n\n return html` ${this._selectedItems.map(\n item =>\n html`<uui-tag look=\"secondary\">\n ${item.displayValue}\n <uui-button\n compact\n label=\"Remove ${item.displayValue}\"\n @click=${(e: Event) => this.#onRemoveTag(e, item.value)}>\n <uui-icon\n name=\"remove\"\n .fallback=${iconRemove.strings[0]}></uui-icon>\n </uui-button>\n </uui-tag>`,\n )}`;\n };\n\n readonly #renderDropdown = () => {\n return html`<div id=\"dropdown\">\n <uui-scroll-container tabindex=\"-1\" id=\"scroll-container\">\n <slot @slotchange=${this.#onSlotChange}></slot>\n </uui-scroll-container>\n </div>`;\n };\n\n render() {\n if (this._isPhone && this.open) {\n return html`<div id=\"phone-wrapper\">\n <uui-button label=\"close\" look=\"primary\" @click=${this.#onClose}>\n ${this.closeLabel}\n </uui-button>\n ${this.#renderInput()} ${this.#renderDropdown()}\n </div>`;\n } else {\n return html`\n ${this.#renderInput()}\n <uui-popover-container\n id=\"combobox-popover\"\n popover=\"manual\"\n placement=\"bottom-end\">\n ${this.#renderDropdown()}\n </uui-popover-container>\n `;\n }\n }\n\n static override readonly styles = [\n css`\n :host {\n display: inline-flex;\n }\n\n #combobox-input {\n width: 100%;\n border-radius: var(--uui-border-radius-3);\n }\n\n #combobox-popover {\n width: var(--uui-dropdown-width, var(--popover-width, inherit));\n }\n\n #scroll-container {\n overflow-y: auto;\n width: 100%;\n max-height: var(--uui-combobox-popover-max-height, 500px);\n }\n #expand-symbol-wrapper {\n height: 100%;\n padding-right: var(--uui-size-space-3);\n display: flex;\n justify-content: center;\n }\n\n #clear-button {\n opacity: 0;\n transition: opacity 80ms;\n }\n\n :host(:not([disabled]):not([readonly]):focus-within)\n #clear-button.visible,\n :host(:not([disabled]):not([readonly]):hover) #clear-button.visible {\n opacity: 1;\n }\n\n #dropdown {\n overflow: hidden;\n z-index: -1;\n background-color: var(\n --uui-combobox-popover-background-color,\n var(--uui-color-surface)\n );\n border: 1px solid var(--uui-color-border);\n border-radius: var(--uui-border-radius-3);\n width: 100%;\n box-sizing: border-box;\n box-shadow: var(--uui-shadow-depth-3);\n }\n\n :host([disabled]) #caret {\n fill: var(--uui-color-disabled-contrast);\n }\n\n #phone-wrapper {\n position: fixed;\n inset: 0;\n display: flex;\n flex-direction: column;\n z-index: 1;\n font-size: 1.1em;\n }\n\n #phone-wrapper #dropdown {\n display: flex;\n }\n\n #phone-wrapper #combobox-input {\n height: var(--uui-size-16);\n }\n\n #phone-wrapper > uui-button {\n height: var(--uui-size-14);\n width: 100%;\n }\n\n #phone-wrapper #scroll-container {\n max-height: unset;\n }\n\n :host([multiple]) #combobox-input {\n --uui-input-height: auto;\n min-height: var(--uui-size-11);\n }\n :host([multiple]) uui-tag {\n display: inline-flex;\n align-items: center;\n gap: 2px;\n }\n\n :host([multiple]) uui-tag uui-button {\n font-size: 10px;\n }\n `,\n ];\n}\n"],"names":[],"mappings":"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"}
@@ -9,6 +9,7 @@ export declare class UUIComboboxListOptionElement extends UUIComboboxListOptionE
9
9
  private _value;
10
10
  private _disabled;
11
11
  _displayValue: string;
12
+ multiple: boolean;
12
13
  /**
13
14
  * Value of the option.
14
15
  * @type {string}
@@ -1,4 +1,4 @@
1
- import { LitElement, html, css } from "lit";
1
+ import { LitElement, nothing, html, css } from "lit";
2
2
  import { state, property } from "lit/decorators.js";
3
3
  import { SelectableMixin } from "../../internal/mixins/SelectableMixin.js";
4
4
  import { ActiveMixin } from "../../internal/mixins/ActiveMixin.js";
@@ -19,6 +19,7 @@ const _UUIComboboxListOptionElement = class _UUIComboboxListOptionElement extend
19
19
  super();
20
20
  this._disabled = false;
21
21
  this._displayValue = "";
22
+ this.multiple = false;
22
23
  this.selectable = true;
23
24
  this.deselectable = false;
24
25
  }
@@ -48,7 +49,8 @@ const _UUIComboboxListOptionElement = class _UUIComboboxListOptionElement extend
48
49
  this.requestUpdate("disabled", oldValue);
49
50
  }
50
51
  render() {
51
- return html`<slot></slot>`;
52
+ return html`${this.multiple ? html`<span id="checkbox"></span>` : nothing}
53
+ <slot></slot>`;
52
54
  }
53
55
  };
54
56
  _UUIComboboxListOptionElement.styles = [
@@ -56,12 +58,12 @@ _UUIComboboxListOptionElement.styles = [
56
58
  :host {
57
59
  position: relative;
58
60
  cursor: pointer;
59
- margin: 1px var(--uui-size-2);
61
+ margin: 1px var(--uui-size-1);
60
62
  border-radius: var(--uui-border-radius);
61
63
  outline: 2px solid transparent;
62
64
  outline-offset: -2px;
63
- padding: var(--uui-size-1);
64
- padding-left: var(--uui-size-2);
65
+ padding: var(--uui-size-2);
66
+ padding-left: var(--uui-size-3);
65
67
  }
66
68
 
67
69
  :host(:first-child) {
@@ -75,9 +77,10 @@ _UUIComboboxListOptionElement.styles = [
75
77
  display: block;
76
78
  content: '';
77
79
  position: absolute;
78
- inset: 0px;
79
- outline: var(--uui-color-surface) solid 2px;
80
- outline-offset: -4px;
80
+ inset: 2px;
81
+ border: var(--uui-color-surface) solid 1px;
82
+ border-radius: calc(var(--uui-border-radius) - 1px);
83
+ pointer-events: none;
81
84
  }
82
85
  /*
83
86
  :host::before {
@@ -113,12 +116,12 @@ _UUIComboboxListOptionElement.styles = [
113
116
  outline-color: var(--uui-color-focus);
114
117
  }
115
118
 
116
- :host([selected]) {
119
+ :host([selected]:not([multiple])) {
117
120
  color: var(--uui-color-selected-contrast);
118
121
  background-color: var(--uui-color-selected);
119
122
  }
120
123
 
121
- :host([selected]:hover) {
124
+ :host([selected]:not([multiple]):hover) {
122
125
  color: var(--uui-color-selected-contrast);
123
126
  background-color: var(--uui-color-selected-emphasis);
124
127
  }
@@ -126,6 +129,39 @@ _UUIComboboxListOptionElement.styles = [
126
129
  color: var(--uui-color-disabled-contrast);
127
130
  background-color: var(--uui-color-disabled);
128
131
  }
132
+
133
+ #checkbox {
134
+ display: inline-block;
135
+ width: 16px;
136
+ height: 16px;
137
+ min-width: 16px;
138
+ border: 2px solid var(--uui-color-border-standalone);
139
+ border-radius: 3px;
140
+ margin-right: var(--uui-size-2);
141
+ vertical-align: middle;
142
+ box-sizing: border-box;
143
+ position: relative;
144
+ }
145
+
146
+ :host([selected]) #checkbox {
147
+ background-color: var(--uui-color-selected);
148
+ border-color: var(--uui-color-selected);
149
+ }
150
+
151
+ :host([selected]) #checkbox::after {
152
+ content: '';
153
+ position: absolute;
154
+ left: 0;
155
+ right: 0;
156
+ top: 0;
157
+ bottom: 2px;
158
+ margin: auto;
159
+ width: 4px;
160
+ height: 8px;
161
+ border: solid var(--uui-color-selected-contrast);
162
+ border-width: 0 2px 2px 0;
163
+ transform: rotate(45deg);
164
+ }
129
165
  `
130
166
  ];
131
167
  let UUIComboboxListOptionElement = _UUIComboboxListOptionElement;
@@ -135,6 +171,9 @@ __decorateClass([
135
171
  __decorateClass([
136
172
  state()
137
173
  ], UUIComboboxListOptionElement.prototype, "_displayValue", 2);
174
+ __decorateClass([
175
+ property({ type: Boolean, reflect: true })
176
+ ], UUIComboboxListOptionElement.prototype, "multiple", 2);
138
177
  __decorateClass([
139
178
  property({ type: String })
140
179
  ], UUIComboboxListOptionElement.prototype, "value", 1);
@@ -1 +1 @@
1
- {"version":3,"file":"combobox-list-option.element.js","sources":["../../../src/components/combobox-list/combobox-list-option.element.ts"],"sourcesContent":["import { css, html, LitElement } from 'lit';\nimport { property, state } from 'lit/decorators.js';\nimport { ActiveMixin, SelectableMixin } from '../../internal/mixins/index.js';\n\n/**\n * @element uui-combobox-list-option\n * @slot - For option content\n * @description - An option to be used within uui-combobox-list\n */\nexport class UUIComboboxListOptionElement extends SelectableMixin(\n ActiveMixin(LitElement),\n) {\n private _value: string | undefined;\n\n @state()\n private _disabled = false;\n\n @state() _displayValue = '';\n\n /**\n * Value of the option.\n * @type {string}\n * @attr\n * @default \"\"\n */\n @property({ type: String })\n public get value(): string {\n return this._value ? this._value : this.textContent?.trim() || '';\n }\n public set value(newValue: string) {\n const oldValue = this._value;\n this._value = newValue;\n this.requestUpdate('value', oldValue);\n }\n\n /**\n * A readable value.\n * @type {string}\n * @attr\n * @default \"\"\n */\n @property({ type: String, attribute: 'display-value' })\n public get displayValue() {\n return this._displayValue\n ? this._displayValue\n : this.textContent?.trim() || '';\n }\n public set displayValue(newValue) {\n const oldValue = this._displayValue;\n this._displayValue = newValue;\n this.requestUpdate('displayValue', oldValue);\n }\n\n /**\n * Determines if the options is disabled. If true the option can't be selected\n * @type {boolean}\n * @attr\n * @default false\n */\n @property({ type: Boolean, reflect: true })\n public get disabled() {\n return this._disabled;\n }\n public set disabled(newValue) {\n const oldValue = this._disabled;\n this._disabled = newValue;\n this.selectable = !this._disabled;\n this.requestUpdate('disabled', oldValue);\n }\n\n constructor() {\n super();\n this.selectable = true;\n this.deselectable = false;\n }\n\n render() {\n return html`<slot></slot>`;\n }\n\n static override readonly styles = [\n css`\n :host {\n position: relative;\n cursor: pointer;\n margin: 1px var(--uui-size-2);\n border-radius: var(--uui-border-radius);\n outline: 2px solid transparent;\n outline-offset: -2px;\n padding: var(--uui-size-1);\n padding-left: var(--uui-size-2);\n }\n\n :host(:first-child) {\n margin-top: 6px;\n }\n :host(:last-child) {\n margin-bottom: 6px;\n }\n\n :host([selected]):host([active])::after {\n display: block;\n content: '';\n position: absolute;\n inset: 0px;\n outline: var(--uui-color-surface) solid 2px;\n outline-offset: -4px;\n }\n /*\n :host::before {\n display: block;\n content: '';\n opacity: 0;\n position: absolute;\n inset: 0;\n background-color: var(--uui-color-selected);\n }\n\n :host(:hover)::before {\n opacity: 0.15;\n border-radius: var(--uui-border-radius);\n } */\n\n :host(:hover) {\n background-color: var(--uui-color-surface-emphasis);\n color: var(--uui-color-interactive-emphasis);\n }\n\n :host([disabled]) {\n cursor: auto;\n color: var(--uui-color-disabled-contrast);\n background-color: var(--uui-color-disabled);\n }\n\n :host([disabled]:hover) {\n background-color: var(--uui-color-disabled);\n }\n\n :host([active]) {\n outline-color: var(--uui-color-focus);\n }\n\n :host([selected]) {\n color: var(--uui-color-selected-contrast);\n background-color: var(--uui-color-selected);\n }\n\n :host([selected]:hover) {\n color: var(--uui-color-selected-contrast);\n background-color: var(--uui-color-selected-emphasis);\n }\n :host([selected][disabled]) {\n color: var(--uui-color-disabled-contrast);\n background-color: var(--uui-color-disabled);\n }\n `,\n ];\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;AASO,MAAM,gCAAN,MAAM,sCAAqC;AAAA,EAChD,YAAY,UAAU;AACxB,EAAE;AAAA,EA2DA,cAAc;AACZ,UAAA;AAxDF,SAAQ,YAAY;AAEX,SAAA,gBAAgB;AAuDvB,SAAK,aAAa;AAClB,SAAK,eAAe;AAAA,EACtB;AAAA,EAhDA,IAAW,QAAgB;AACzB,WAAO,KAAK,SAAS,KAAK,SAAS,KAAK,aAAa,UAAU;AAAA,EACjE;AAAA,EACA,IAAW,MAAM,UAAkB;AACjC,UAAM,WAAW,KAAK;AACtB,SAAK,SAAS;AACd,SAAK,cAAc,SAAS,QAAQ;AAAA,EACtC;AAAA,EASA,IAAW,eAAe;AACxB,WAAO,KAAK,gBACR,KAAK,gBACL,KAAK,aAAa,UAAU;AAAA,EAClC;AAAA,EACA,IAAW,aAAa,UAAU;AAChC,UAAM,WAAW,KAAK;AACtB,SAAK,gBAAgB;AACrB,SAAK,cAAc,gBAAgB,QAAQ;AAAA,EAC7C;AAAA,EASA,IAAW,WAAW;AACpB,WAAO,KAAK;AAAA,EACd;AAAA,EACA,IAAW,SAAS,UAAU;AAC5B,UAAM,WAAW,KAAK;AACtB,SAAK,YAAY;AACjB,SAAK,aAAa,CAAC,KAAK;AACxB,SAAK,cAAc,YAAY,QAAQ;AAAA,EACzC;AAAA,EAQA,SAAS;AACP,WAAO;AAAA,EACT;AA+EF;AA7EE,8BAAyB,SAAS;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAxEG,IAAM,+BAAN;AAMG,gBAAA;AAAA,EADP,MAAA;AAAM,GALI,6BAMH,WAAA,aAAA,CAAA;AAEC,gBAAA;AAAA,EAAR,MAAA;AAAM,GARI,6BAQF,WAAA,iBAAA,CAAA;AASE,gBAAA;AAAA,EADV,SAAS,EAAE,MAAM,OAAA,CAAQ;AAAA,GAhBf,6BAiBA,WAAA,SAAA,CAAA;AAgBA,gBAAA;AAAA,EADV,SAAS,EAAE,MAAM,QAAQ,WAAW,iBAAiB;AAAA,GAhC3C,6BAiCA,WAAA,gBAAA,CAAA;AAkBA,gBAAA;AAAA,EADV,SAAS,EAAE,MAAM,SAAS,SAAS,MAAM;AAAA,GAlD/B,6BAmDA,WAAA,YAAA,CAAA;"}
1
+ {"version":3,"file":"combobox-list-option.element.js","sources":["../../../src/components/combobox-list/combobox-list-option.element.ts"],"sourcesContent":["import { css, html, LitElement, nothing } from 'lit';\nimport { property, state } from 'lit/decorators.js';\nimport { ActiveMixin, SelectableMixin } from '../../internal/mixins/index.js';\n\n/**\n * @element uui-combobox-list-option\n * @slot - For option content\n * @description - An option to be used within uui-combobox-list\n */\nexport class UUIComboboxListOptionElement extends SelectableMixin(\n ActiveMixin(LitElement),\n) {\n private _value: string | undefined;\n\n @state()\n private _disabled = false;\n\n @state() _displayValue = '';\n\n @property({ type: Boolean, reflect: true })\n multiple = false;\n\n /**\n * Value of the option.\n * @type {string}\n * @attr\n * @default \"\"\n */\n @property({ type: String })\n public get value(): string {\n return this._value ? this._value : this.textContent?.trim() || '';\n }\n public set value(newValue: string) {\n const oldValue = this._value;\n this._value = newValue;\n this.requestUpdate('value', oldValue);\n }\n\n /**\n * A readable value.\n * @type {string}\n * @attr\n * @default \"\"\n */\n @property({ type: String, attribute: 'display-value' })\n public get displayValue() {\n return this._displayValue\n ? this._displayValue\n : this.textContent?.trim() || '';\n }\n public set displayValue(newValue) {\n const oldValue = this._displayValue;\n this._displayValue = newValue;\n this.requestUpdate('displayValue', oldValue);\n }\n\n /**\n * Determines if the options is disabled. If true the option can't be selected\n * @type {boolean}\n * @attr\n * @default false\n */\n @property({ type: Boolean, reflect: true })\n public get disabled() {\n return this._disabled;\n }\n public set disabled(newValue) {\n const oldValue = this._disabled;\n this._disabled = newValue;\n this.selectable = !this._disabled;\n this.requestUpdate('disabled', oldValue);\n }\n\n constructor() {\n super();\n this.selectable = true;\n this.deselectable = false;\n }\n\n render() {\n return html`${this.multiple ? html`<span id=\"checkbox\"></span>` : nothing}\n <slot></slot>`;\n }\n\n static override readonly styles = [\n css`\n :host {\n position: relative;\n cursor: pointer;\n margin: 1px var(--uui-size-1);\n border-radius: var(--uui-border-radius);\n outline: 2px solid transparent;\n outline-offset: -2px;\n padding: var(--uui-size-2);\n padding-left: var(--uui-size-3);\n }\n\n :host(:first-child) {\n margin-top: 6px;\n }\n :host(:last-child) {\n margin-bottom: 6px;\n }\n\n :host([selected]):host([active])::after {\n display: block;\n content: '';\n position: absolute;\n inset: 2px;\n border: var(--uui-color-surface) solid 1px;\n border-radius: calc(var(--uui-border-radius) - 1px);\n pointer-events: none;\n }\n /*\n :host::before {\n display: block;\n content: '';\n opacity: 0;\n position: absolute;\n inset: 0;\n background-color: var(--uui-color-selected);\n }\n\n :host(:hover)::before {\n opacity: 0.15;\n border-radius: var(--uui-border-radius);\n } */\n\n :host(:hover) {\n background-color: var(--uui-color-surface-emphasis);\n color: var(--uui-color-interactive-emphasis);\n }\n\n :host([disabled]) {\n cursor: auto;\n color: var(--uui-color-disabled-contrast);\n background-color: var(--uui-color-disabled);\n }\n\n :host([disabled]:hover) {\n background-color: var(--uui-color-disabled);\n }\n\n :host([active]) {\n outline-color: var(--uui-color-focus);\n }\n\n :host([selected]:not([multiple])) {\n color: var(--uui-color-selected-contrast);\n background-color: var(--uui-color-selected);\n }\n\n :host([selected]:not([multiple]):hover) {\n color: var(--uui-color-selected-contrast);\n background-color: var(--uui-color-selected-emphasis);\n }\n :host([selected][disabled]) {\n color: var(--uui-color-disabled-contrast);\n background-color: var(--uui-color-disabled);\n }\n\n #checkbox {\n display: inline-block;\n width: 16px;\n height: 16px;\n min-width: 16px;\n border: 2px solid var(--uui-color-border-standalone);\n border-radius: 3px;\n margin-right: var(--uui-size-2);\n vertical-align: middle;\n box-sizing: border-box;\n position: relative;\n }\n\n :host([selected]) #checkbox {\n background-color: var(--uui-color-selected);\n border-color: var(--uui-color-selected);\n }\n\n :host([selected]) #checkbox::after {\n content: '';\n position: absolute;\n left: 0;\n right: 0;\n top: 0;\n bottom: 2px;\n margin: auto;\n width: 4px;\n height: 8px;\n border: solid var(--uui-color-selected-contrast);\n border-width: 0 2px 2px 0;\n transform: rotate(45deg);\n }\n `,\n ];\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;AASO,MAAM,gCAAN,MAAM,sCAAqC;AAAA,EAChD,YAAY,UAAU;AACxB,EAAE;AAAA,EA8DA,cAAc;AACZ,UAAA;AA3DF,SAAQ,YAAY;AAEX,SAAA,gBAAgB;AAGzB,SAAA,WAAW;AAuDT,SAAK,aAAa;AAClB,SAAK,eAAe;AAAA,EACtB;AAAA,EAhDA,IAAW,QAAgB;AACzB,WAAO,KAAK,SAAS,KAAK,SAAS,KAAK,aAAa,UAAU;AAAA,EACjE;AAAA,EACA,IAAW,MAAM,UAAkB;AACjC,UAAM,WAAW,KAAK;AACtB,SAAK,SAAS;AACd,SAAK,cAAc,SAAS,QAAQ;AAAA,EACtC;AAAA,EASA,IAAW,eAAe;AACxB,WAAO,KAAK,gBACR,KAAK,gBACL,KAAK,aAAa,UAAU;AAAA,EAClC;AAAA,EACA,IAAW,aAAa,UAAU;AAChC,UAAM,WAAW,KAAK;AACtB,SAAK,gBAAgB;AACrB,SAAK,cAAc,gBAAgB,QAAQ;AAAA,EAC7C;AAAA,EASA,IAAW,WAAW;AACpB,WAAO,KAAK;AAAA,EACd;AAAA,EACA,IAAW,SAAS,UAAU;AAC5B,UAAM,WAAW,KAAK;AACtB,SAAK,YAAY;AACjB,SAAK,aAAa,CAAC,KAAK;AACxB,SAAK,cAAc,YAAY,QAAQ;AAAA,EACzC;AAAA,EAQA,SAAS;AACP,WAAO,OAAO,KAAK,WAAW,oCAAoC,OAAO;AAAA;AAAA,EAE3E;AAiHF;AA/GE,8BAAyB,SAAS;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA5EG,IAAM,+BAAN;AAMG,gBAAA;AAAA,EADP,MAAA;AAAM,GALI,6BAMH,WAAA,aAAA,CAAA;AAEC,gBAAA;AAAA,EAAR,MAAA;AAAM,GARI,6BAQF,WAAA,iBAAA,CAAA;AAGT,gBAAA;AAAA,EADC,SAAS,EAAE,MAAM,SAAS,SAAS,MAAM;AAAA,GAV/B,6BAWX,WAAA,YAAA,CAAA;AASW,gBAAA;AAAA,EADV,SAAS,EAAE,MAAM,OAAA,CAAQ;AAAA,GAnBf,6BAoBA,WAAA,SAAA,CAAA;AAgBA,gBAAA;AAAA,EADV,SAAS,EAAE,MAAM,QAAQ,WAAW,iBAAiB;AAAA,GAnC3C,6BAoCA,WAAA,gBAAA,CAAA;AAkBA,gBAAA;AAAA,EADV,SAAS,EAAE,MAAM,SAAS,SAAS,MAAM;AAAA,GArD/B,6BAsDA,WAAA,YAAA,CAAA;"}
@@ -22,6 +22,7 @@ export declare class UUIComboboxListElement extends LitElement {
22
22
  * @default ""
23
23
  */
24
24
  displayValue: string;
25
+ multiple: boolean;
25
26
  private _for?;
26
27
  /**
27
28
  * provide another element of which keyboard navigation
@@ -36,12 +37,25 @@ export declare class UUIComboboxListElement extends LitElement {
36
37
  private _value;
37
38
  private _activeElementValue;
38
39
  private _selectedElement;
40
+ private _selectedValues;
41
+ private _selectedElements;
42
+ /**
43
+ * Array of selected option values. Only relevant when multiple is true.
44
+ * @type {string[]}
45
+ */
46
+ get selectedValues(): string[];
47
+ /**
48
+ * Array of display values for selected options. Only relevant when multiple is true.
49
+ * @type {string[]}
50
+ */
51
+ get selectedDisplayValues(): string[];
39
52
  connectedCallback(): void;
40
53
  disconnectedCallback(): void;
41
54
  private _updateSelection;
42
55
  private readonly _onSlotChange;
43
56
  private readonly _onSelected;
44
57
  private readonly _onDeselected;
58
+ resetSelection(): void;
45
59
  private get _getActiveIndex();
46
60
  private get _getActiveElement();
47
61
  private readonly _moveIndex;