@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.
- package/custom-elements.json +45 -8
- package/dist/components/avatar/avatar.element.js +1 -0
- package/dist/components/avatar/avatar.element.js.map +1 -1
- package/dist/components/boolean-input/boolean-input.element.js +7 -1
- package/dist/components/boolean-input/boolean-input.element.js.map +1 -1
- package/dist/components/button/button.element.d.ts +0 -1
- package/dist/components/button/button.element.js +64 -18
- package/dist/components/button/button.element.js.map +1 -1
- package/dist/components/card-block-type/card-block-type.element.js +13 -4
- package/dist/components/card-block-type/card-block-type.element.js.map +1 -1
- package/dist/components/card-content-node/card-content-node.element.js +2 -2
- package/dist/components/card-content-node/card-content-node.element.js.map +1 -1
- package/dist/components/card-media/card-media.element.js +10 -3
- package/dist/components/card-media/card-media.element.js.map +1 -1
- package/dist/components/card-user/card-user.element.js +2 -2
- package/dist/components/card-user/card-user.element.js.map +1 -1
- package/dist/components/checkbox/checkbox.element.js +3 -6
- package/dist/components/checkbox/checkbox.element.js.map +1 -1
- package/dist/components/color-slider/color-slider.element.js +13 -3
- package/dist/components/color-slider/color-slider.element.js.map +1 -1
- package/dist/components/color-swatch/color-swatch.element.js +33 -1
- package/dist/components/color-swatch/color-swatch.element.js.map +1 -1
- package/dist/components/combobox/combobox.element.d.ts +9 -0
- package/dist/components/combobox/combobox.element.js +127 -15
- package/dist/components/combobox/combobox.element.js.map +1 -1
- package/dist/components/combobox-list/combobox-list-option.element.d.ts +1 -0
- package/dist/components/combobox-list/combobox-list-option.element.js +49 -10
- package/dist/components/combobox-list/combobox-list-option.element.js.map +1 -1
- package/dist/components/combobox-list/combobox-list.element.d.ts +14 -0
- package/dist/components/combobox-list/combobox-list.element.js +74 -25
- package/dist/components/combobox-list/combobox-list.element.js.map +1 -1
- package/dist/components/file-dropzone/file-dropzone.element.d.ts +2 -8
- package/dist/components/file-dropzone/file-dropzone.element.js +14 -25
- package/dist/components/file-dropzone/file-dropzone.element.js.map +1 -1
- package/dist/components/icon-registry-essential/UUIIconRegistryEssential.js +1 -1
- package/dist/components/icon-registry-essential/icon-registry-essential.js +33 -0
- package/dist/components/icon-registry-essential/icon-registry-essential.js.map +1 -1
- package/dist/components/index.d.ts +81 -0
- package/dist/components/input/input.element.js +33 -3
- package/dist/components/input/input.element.js.map +1 -1
- package/dist/components/input-file/input-file.element.js +33 -1
- package/dist/components/input-file/input-file.element.js.map +1 -1
- package/dist/components/input-lock/input-lock.element.js +33 -4
- package/dist/components/input-lock/input-lock.element.js.map +1 -1
- package/dist/components/input-password/input-password.element.js +33 -3
- package/dist/components/input-password/input-password.element.js.map +1 -1
- package/dist/components/keyboard-shortcut/key.element.js +7 -1
- package/dist/components/keyboard-shortcut/key.element.js.map +1 -1
- package/dist/components/loader/loader.element.js +19 -2
- package/dist/components/loader/loader.element.js.map +1 -1
- package/dist/components/modal/modal-container.js +6 -2
- package/dist/components/modal/modal-container.js.map +1 -1
- package/dist/components/modal/modal-dialog.element.js +5 -5
- package/dist/components/modal/modal-dialog.element.js.map +1 -1
- package/dist/components/modal/modal-sidebar.element.js +14 -10
- package/dist/components/modal/modal-sidebar.element.js.map +1 -1
- package/dist/components/modal/modal-with-toasts-example.element.d.ts +22 -0
- package/dist/components/modal/modal.element.d.ts +3 -1
- package/dist/components/modal/modal.element.js +31 -12
- package/dist/components/modal/modal.element.js.map +1 -1
- package/dist/components/modal/modal.js +7 -1
- package/dist/components/modal/modal.js.map +1 -1
- package/dist/components/pagination/pagination.element.d.ts +2 -0
- package/dist/components/pagination/pagination.element.js +26 -20
- package/dist/components/pagination/pagination.element.js.map +1 -1
- package/dist/components/progress-bar/progress-bar.element.js +6 -5
- package/dist/components/progress-bar/progress-bar.element.js.map +1 -1
- package/dist/components/responsive-container/responsive-container.element.js +36 -14
- package/dist/components/responsive-container/responsive-container.element.js.map +1 -1
- package/dist/components/scroll-container/scroll-container.element.js +4 -4
- package/dist/components/scroll-container/scroll-container.element.js.map +1 -1
- package/dist/components/symbol-expand/symbol-expand.element.js +1 -1
- package/dist/components/symbol-expand/symbol-expand.element.js.map +1 -1
- package/dist/components/symbol-file-thumbnail/symbol-file-thumbnail.element.js +34 -1
- package/dist/components/symbol-file-thumbnail/symbol-file-thumbnail.element.js.map +1 -1
- package/dist/components/table/table-head.element.js +4 -0
- package/dist/components/table/table-head.element.js.map +1 -1
- package/dist/components/table/table.element.js +5 -1
- package/dist/components/table/table.element.js.map +1 -1
- package/dist/components/tag/tag.element.js +4 -3
- package/dist/components/tag/tag.element.js.map +1 -1
- package/dist/components/toast-notification/toast-notification.element.js +34 -2
- package/dist/components/toast-notification/toast-notification.element.js.map +1 -1
- package/dist/components/toggle/toggle.element.js +38 -3
- package/dist/components/toggle/toggle.element.js.map +1 -1
- package/dist/index.d.ts +1 -81
- package/dist/internal/mixins/LabelMixin.js +14 -1
- package/dist/internal/mixins/LabelMixin.js.map +1 -1
- package/dist/internal/mixins/SelectOnlyMixin.d.ts +1 -1
- package/dist/internal/mixins/SelectOnlyMixin.js.map +1 -1
- package/dist/package.json.js +1 -1
- package/dist/themes/dark.css +1 -1
- package/dist/themes/high-contrast.css +1 -1
- package/dist/themes/light.css +1 -1
- package/package.json +26 -26
- 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
|
-
|
|
88
|
-
|
|
89
|
-
|
|
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 === "
|
|
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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoCO,MAAM,sBAAN,MAAM,4BAA2B;AAAA,EACtC;AAAA,EACA;AACF,EAAE;AAAA,EAHK,cAAA;AAAA,UAAA,GAAA,SAAA;AAAA;AA8HL;AACA;AAoES;AA8BA;AAGA;AAOA;AAQA;AAMA;AAsBA;AAKA;AAMA;AAUA;AA2BA;AA4BA;AAeA;AA0BA;AAuBA;AAmBA;AA3WT,SAAO,aAAa;AASpB,SAAA,WAAW;AASX,SAAA,WAAW;AASX,SAAA,mBAAmB;AASnB,SAAA,WAAW;AASX,SAAA,cAAc;AAkBd,SAAQ,gBAAgB;AAGxB,SAAQ,UAAU;AAGlB,SAAQ,WAAW;AAGnB,SAAQ,UAAU;AAGlB,SAAQ,iBAAiE,CAAA;AAqDzE,uBAAS,gBAAiB,MAAM;AAC9B,WAAK,WAAW,mBAAK,kBAAiB;AAAA,IACxC;AA4BA,uBAAS,cAAe,MACtB,sBAAsB,MAAM,KAAK,OAAO,OAAO;AAEjD,uBAAS,SAAU,MACjB,sBAAsB,MAAM;AAC1B,UAAI,CAAC,KAAK,YAAY,eAAe;AACnC,2BAAK,UAAL;AAAA,MACF;AAAA,IACF,CAAC;AAEH,uBAAS,UAAW,CAAC,MAAW;AAC9B,QAAE,eAAA;AACF,QAAE,yBAAA;AACF,WAAK,SAAS,EAAE,OAAO;AACvB,WAAK,cAAc,IAAI,iBAAiB,iBAAiB,MAAM,CAAC;AAChE,yBAAK,SAAL;AAAA,IACF;AAEA,uBAAS,oBAAqB,MAAM;AAClC,UAAI,KAAK,SAAS,KAAK,UAAU,mBAAK,gBAAe,OAAO;AAC1D,8BAAK,+CAAL;AAAA,MACF;AAAA,IACF;AAEA,uBAAS,WAAY,MAAM;AACzB,YAAM,OAAO,mBAAK;AAClB,UAAI,CAAC,KAAM;AAEX,UAAI,KAAK,UAAU;AACjB,aAAK,iBAAiB,KAAK,eAAe,IAAI,CAAC,KAAK,OAAO;AAAA,UACzD,OAAO;AAAA,UACP,cAAc,KAAK,sBAAsB,CAAC,KAAK;AAAA,QAAA,EAC/C;AACF,aAAK,QAAQ,KAAK,eAAe,KAAK,GAAG;AAEzC,aAAK,SAAS;AACd,aAAK,OAAO,QAAQ;AACpB,aAAK,cAAc,IAAI,iBAAiB,iBAAiB,MAAM,CAAC;AAAA,MAClE,OAAO;AACL,aAAK,QAAQ,KAAK,SAAS;AAC3B,aAAK,SAAS,KAAK,QAAQ,KAAK,SAAS;AACzC,2BAAK,UAAL;AAAA,MACF;AACA,WAAK,cAAc,IAAI,iBAAiB,iBAAiB,MAAM,CAAC;AAAA,IAClE;AAEA,uBAAS,WAAY,MAAM;AACzB,UAAI,KAAK,SAAU;AACnB,WAAK,OAAO,CAAC,KAAK;AAAA,IACpB;AAEA,uBAAS,SAAU,MAAM;AACvB,UAAI,KAAK,KAAM;AACf,UAAI,KAAK,SAAU;AACnB,WAAK,OAAO;AAAA,IACd;AAEA,uBAAS,UAAW,MAAM;AACxB,UAAI,CAAC,KAAK,KAAM;AAEhB,WAAK,OAAO;AACZ,WAAK,SAAS;AAEd,WAAK,OAAO,QAAQ,KAAK;AACzB,WAAK,cAAc,IAAI,iBAAiB,iBAAiB,MAAM,CAAC;AAAA,IAClE;AAEA,uBAAS,YAAa,CAAC,MAAqB;AAC1C,UACE,EAAE,SAAS,eACX,KAAK,YACL,KAAK,eAAe,SAAS,KAC7B,KAAK,WAAW,IAChB;AACA,cAAM,WAAW,KAAK,eAAe,KAAK,eAAe,SAAS,CAAC;AACnE,2BAAK,cAAL,WAAkB,GAAG,SAAS;AAC9B;AAAA,MACF;AACA,UAAI,KAAK,SAAS,SAAS,EAAE,SAAS,SAAS;AAC7C,UAAE,eAAA;AACF,UAAE,yBAAA;AAEF,2BAAK,SAAL;AAAA,MACF;AAEA,UAAI,EAAE,SAAS,aAAa,EAAE,SAAS,aAAa;AAClD,2BAAK,SAAL;AAAA,MACF;AAEA,UAAI,EAAE,SAAS,UAAU;AACvB,2BAAK,UAAL;AAAA,MACF;AAAA,IACF;AAEA,uBAAS,UAAW,CAAC,MAAW;AAC9B,UAAI,EAAE,OAAO,EAAE,QAAQ,QAAS;AAEhC,QAAE,eAAA;AACF,QAAE,yBAAA;AAEF,YAAM,OAAO,mBAAK;AAClB,UAAI,MAAM,UAAU;AAElB,mBAAW,MAAM,KAAK;AAAA,UACpB;AAAA,QAAA,GACC;AACD,aAAG,WAAW;AAAA,QAChB;AACA,aAAK,eAAA;AACL,aAAK,iBAAiB,CAAA;AAAA,MACxB;AAEA,WAAK,QAAQ;AACb,WAAK,SAAS;AACd,WAAK,OAAO,QAAQ,KAAK;AAEzB,WAAK,OAAO,MAAA;AAEZ,WAAK,cAAc,IAAI,iBAAiB,iBAAiB,MAAM,CAAC;AAChE,WAAK,cAAc,IAAI,iBAAiB,iBAAiB,MAAM,CAAC;AAAA,IAClE;AAEA,uBAAS,cAAe,CAAC,GAAU,UAAkB;AACnD,QAAE,gBAAA;AAEF,YAAM,OAAO,mBAAK;AAClB,UAAI,CAAC,KAAM;AAEX,YAAM,UAAU,KAAK,iBAAiB,0BAA0B;AAChE,iBAAW,UAAU,SAAS;AAC5B,YAAI,OAAO,UAAU,SAAS,OAAO,UAAU;AAC7C,iBAAO,MAAA;AACP;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,uBAAS,cAAe,MAAM;AAC5B,aAAO;AAAA;AAAA;AAAA;AAAA;AAAA,eAKI,KAAK,aAAa;AAAA,qBACZ,KAAK,WAAW;AAAA;AAAA,kBAEnB,KAAK,QAAQ;AAAA,kBACb,KAAK,QAAQ;AAAA;AAAA,eAEhB,mBAAK,UAAS;AAAA,eACd,mBAAK,SAAQ;AAAA,iBACX,mBAAK,WAAU;AAAA;AAAA,QAExB,mBAAK,qBAAL,UAA0B,IAAI,mBAAK,oBAAL,UAAyB;AAAA,QACvD,KAAK,oBAAoB,KAAK,WAC5B,UACA;AAAA,uCAC6B,KAAK,OAAO;AAAA,iBAClC;AAAA;AAAA;AAAA,IAGf;AAEA,uBAAS,oBAAqB,MAAM;AAClC,UAAI,KAAK,SAAU,QAAO;AAC1B,UAAI,KAAK,SAAU,QAAO;AAC1B,UAAI,KAAK,SAAU,QAAO;AAE1B,aAAO;AAAA;AAAA,eAEI,mBAAK,SAAQ;AAAA,iBACX,mBAAK,SAAQ;AAAA;AAAA;AAAA;AAAA;AAAA,iBAKb,KAAK,SAAS,KAAK,UAAU,KAAK,eAAe,SAAS,IACjE,KACA,IAAI;AAAA,cACA,KAAK,SAAS,KAAK,UAAU,KAAK,eAAe,SAAS,IAC9D,YACA,EAAE;AAAA,0CAC8B,WAAW,QAAQ,CAAC,CAAC;AAAA;AAAA,IAE7D;AAEA,uBAAS,qBAAsB,MAAM;AACnC,UAAI,KAAK,eAAe,WAAW,EAAG,QAAO;AAE7C,aAAO,QAAQ,KAAK,eAAe;AAAA,QACjC,CAAA,SACE;AAAA,YACI,KAAK,YAAY;AAAA;AAAA;AAAA,4BAGD,KAAK,YAAY;AAAA,qBACxB,CAAC,MAAa,mBAAK,cAAL,WAAkB,GAAG,KAAK,MAAM;AAAA;AAAA;AAAA,0BAGzC,WAAW,QAAQ,CAAC,CAAC;AAAA;AAAA;AAAA,MAAA,CAG1C;AAAA,IACH;AAEA,uBAAS,iBAAkB,MAAM;AAC/B,aAAO;AAAA;AAAA,4BAEiB,sBAAK,+CAAa;AAAA;AAAA;AAAA,IAG5C;AAAA,EAAA;AAAA,EA/aA,IAAI,MAAM,UAAU;AAClB,UAAM,QAAQ;AAEd,QAAI,OAAO,aAAa,UAAU;AAChC,4BAAK,+CAAL;AAAA,IACF;AAAA,EACF;AAAA,EACA,IAAI,QAAQ;AACV,WAAO,MAAM;AAAA,EACf;AAAA,EASA,IAAW,OAAO,UAAU;AAC1B,QAAI,KAAK,WAAW,SAAU;AAC9B,UAAM,WAAW,KAAK;AACtB,SAAK,UAAU;AACf,SAAK,cAAc,UAAU,QAAQ;AAAA,EACvC;AAAA,EACA,IAAW,SAAS;AAClB,WAAO,KAAK;AAAA,EACd;AAAA,EASA,IAAW,KAAK,UAAmB;AACjC,UAAM,WAAW;AACjB,SAAK,UAAU;AACf,UAAM,UAAU,KAAK;AACrB,QAAI,SAAS;AACX,UAAI,UAAU;AACZ,cAAM,QAAQ,KAAK,OAAO;AAC1B,gBAAQ,MAAM,YAAY,mBAAmB,GAAG,KAAK,IAAI;AACzD,gBAAQ,YAAA;AAAA,MACV,OAAO;AACL,gBAAQ,YAAA;AAAA,MACV;AAAA,IACF;AAEA,SAAK,cAAc,QAAQ,QAAQ;AAAA,EACrC;AAAA,EACA,IAAW,OAAO;AAChB,WAAO,KAAK;AAAA,EACd;AAAA,EAsFA,oBAA0B;AACxB,UAAM,kBAAA;AAEN,SAAK,iBAAiB,QAAQ,mBAAK,QAAO;AAC1C,SAAK,iBAAiB,aAAa,mBAAK,aAAY;AAEpD,uBAAK,kBAAmB,OAAO,WAAW,oBAAoB;AAC9D,uBAAK,gBAAL;AACA,uBAAK,kBAAiB,iBAAiB,UAAU,mBAAK,eAAc;AAAA,EACtE;AAAA,EAEA,uBAA6B;AAC3B,UAAM,qBAAA;AAEN,SAAK,oBAAoB,QAAQ,mBAAK,QAAO;AAC7C,SAAK,oBAAoB,aAAa,mBAAK,aAAY;AACvD,uBAAK,kBAAiB,oBAAoB,UAAU,mBAAK,eAAc;AAAA,EACzE;AAAA,EA+CU,iBAA0C;AAClD,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAM,QAAQ;AACZ,UAAM,KAAK;AACX,SAAK,OAAO,MAAA;AAAA,EACd;AAAA,EACA,MAAM,OAAO;AACX,UAAM,KAAK;AACX,SAAK,OAAO,KAAA;AAAA,EACd;AAAA,EACA,MAAM,QAAQ;AACZ,UAAM,KAAK;AACX,SAAK,OAAO,MAAA;AAAA,EACd;AAAA,EAuNA,SAAS;AACP,QAAI,KAAK,YAAY,KAAK,MAAM;AAC9B,aAAO;AAAA,0DAC6C,mBAAK,SAAQ;AAAA,YAC3D,KAAK,UAAU;AAAA;AAAA,UAEjB,mBAAK,cAAL,UAAmB,IAAI,mBAAK,iBAAL,UAAsB;AAAA;AAAA,IAEnD,OAAO;AACL,aAAO;AAAA,UACH,mBAAK,cAAL,UAAmB;AAAA;AAAA;AAAA;AAAA;AAAA,YAKjB,mBAAK,iBAAL,UAAsB;AAAA;AAAA;AAAA,IAG9B;AAAA,EACF;AAmGF;AA9aE;AACA;AA/HK;AAmKL,kBAAA,WAAgB;AACd,MAAI,mBAAK,gBAAe;AACtB,uBAAK,eAAc;AAAA,MACjB,qBAAqB;AAAA,MACrB,mBAAK;AAAA,IAAA;AAEP,uBAAK,eAAc;AAAA,MACjB,qBAAqB;AAAA,MACrB,mBAAK;AAAA,IAAA;AAAA,EAET;AACA,QAAM,OAAO,KAAK,wBAAwB,CAAC;AAE3C,MAAI,MAAM;AACR,uBAAK,eAAgB;AACrB,uBAAK,eAAc,MAAM;AACzB,uBAAK,eAAc,WAAW,KAAK;AACnC,uBAAK,eAAc;AAAA,MACjB,qBAAqB;AAAA,MACrB,mBAAK;AAAA,IAAA;AAEP,uBAAK,eAAc;AAAA,MACjB,qBAAqB;AAAA,MACrB,mBAAK;AAAA,IAAA;AAAA,EAET;AAEA,OAAK,eAAe,KAAK,MAAM;AAC7B,0BAAK,+CAAL;AAAA,EACF,CAAC;AACH;AAES;AAIT,iBAAA,WAAe;AACb,MAAI,mBAAK,gBAAe;AACtB,uBAAK,eAAc,QAAQ,KAAK;AAChC;AAAA,MACE,MAAO,KAAK,gBAAgB,mBAAK,eAAc,gBAAgB;AAAA,IAAA;AAAA,EAEnE;AACF;AAmBS;AAGA;AAOA;AAQA;AAMA;AAsBA;AAKA;AAMA;AAUA;AA2BA;AA4BA;AAeA;AA0BA;AAuBA;AAmBA;AA6BT,oBAAyB,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;AA5cG,IAAM,qBAAN;AAKD,gBAAA;AAAA,EADH,SAAS,EAAE,WAAW,SAAS,SAAS,MAAM;AAAA,GAJpC,mBAKP,WAAA,SAAA,CAAA;AAkBO,gBAAA;AAAA,EADV,SAAS,EAAE,MAAM,OAAA,CAAQ;AAAA,GAtBf,mBAuBA,WAAA,UAAA,CAAA;AAiBA,gBAAA;AAAA,EADV,SAAS,EAAE,MAAM,QAAA,CAAS;AAAA,GAvChB,mBAwCA,WAAA,QAAA,CAAA;AA2BJ,gBAAA;AAAA,EADN,SAAS,EAAE,MAAM,QAAQ,WAAW,eAAe;AAAA,GAlEzC,mBAmEJ,WAAA,cAAA,CAAA;AASP,gBAAA;AAAA,EADC,SAAS,EAAE,MAAM,SAAS,SAAS,MAAM;AAAA,GA3E/B,mBA4EX,WAAA,YAAA,CAAA;AASA,gBAAA;AAAA,EADC,SAAS,EAAE,MAAM,SAAS,SAAS,MAAM;AAAA,GApF/B,mBAqFX,WAAA,YAAA,CAAA;AASA,gBAAA;AAAA,EADC,SAAS,EAAE,MAAM,SAAS,SAAS,OAAO,WAAW,sBAAsB;AAAA,GA7FjE,mBA8FX,WAAA,oBAAA,CAAA;AASA,gBAAA;AAAA,EADC,SAAS,EAAE,MAAM,SAAS,SAAS,MAAM;AAAA,GAtG/B,mBAuGX,WAAA,YAAA,CAAA;AASA,gBAAA;AAAA,EADC,SAAA;AAAS,GA/GC,mBAgHX,WAAA,eAAA,CAAA;AAGiB,gBAAA;AAAA,EADhB,MAAM,iBAAiB;AAAA,GAlHb,mBAmHM,WAAA,UAAA,CAAA;AAGA,gBAAA;AAAA,EADhB,MAAM,mBAAmB;AAAA,GArHf,mBAsHM,WAAA,2BAAA,CAAA;AAMA,gBAAA;AAAA,EAJhB,sBAAsB;AAAA,IACrB,SAAS;AAAA,IACT,UAAU;AAAA,EAAA,CACX;AAAA,GA3HU,mBA4HM,WAAA,yBAAA,CAAA;AAMT,gBAAA;AAAA,EADP,MAAA;AAAM,GAjII,mBAkIH,WAAA,iBAAA,CAAA;AAGA,gBAAA;AAAA,EADP,MAAA;AAAM,GApII,mBAqIH,WAAA,WAAA,CAAA;AAGA,gBAAA;AAAA,EADP,MAAA;AAAM,GAvII,mBAwIH,WAAA,YAAA,CAAA;AAGA,gBAAA;AAAA,EADP,MAAA;AAAM,GA1II,mBA2IH,WAAA,WAAA,CAAA;AAGA,gBAAA;AAAA,EADP,MAAA;AAAM,GA7II,mBA8IH,WAAA,kBAAA,CAAA;"}
|
|
@@ -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`<
|
|
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-
|
|
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-
|
|
64
|
-
padding-left: var(--uui-size-
|
|
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:
|
|
79
|
-
|
|
80
|
-
|
|
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-
|
|
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;
|