@vonage/vivid 3.24.0 → 3.26.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/accordion/index.js +0 -1
- package/accordion-item/index.js +0 -1
- package/alert/index.js +0 -1
- package/avatar/index.js +0 -1
- package/badge/index.js +0 -1
- package/banner/index.js +0 -1
- package/breadcrumb-item/index.js +0 -1
- package/button/index.js +0 -1
- package/card/index.js +0 -1
- package/checkbox/index.js +0 -1
- package/combobox/index.js +0 -1
- package/custom-elements.json +82 -10
- package/data-grid/index.js +7 -2
- package/dialog/index.js +0 -1
- package/empty-state/index.js +0 -1
- package/fab/index.js +0 -1
- package/icon/index.js +0 -1
- package/index.js +27 -29
- package/lib/action-group/action-group.d.ts +1 -1
- package/lib/avatar/avatar.d.ts +1 -1
- package/lib/checkbox/checkbox.d.ts +0 -1
- package/lib/components.d.ts +0 -2
- package/lib/data-grid/data-grid-cell.d.ts +14 -1
- package/lib/data-grid/data-grid.d.ts +4 -0
- package/lib/data-grid/data-grid.options.d.ts +7 -0
- package/lib/dialog/dialog.d.ts +1 -0
- package/lib/listbox/listbox.d.ts +1 -1
- package/lib/menu/menu.d.ts +0 -1
- package/lib/menu-item/menu-item.d.ts +6 -0
- package/lib/menu-item/menu-item.template.d.ts +2 -3
- package/lib/number-field/number-field.d.ts +1 -1
- package/lib/select/select.d.ts +1 -1
- package/lib/text-field/text-field.d.ts +1 -1
- package/listbox/index.js +56 -11
- package/menu/index.js +2 -3
- package/menu-item/index.js +2 -2
- package/nav/index.js +1 -1
- package/nav-disclosure/index.js +1 -2
- package/nav-item/index.js +1 -2
- package/note/index.js +1 -2
- package/number-field/index.js +1 -2
- package/option/index.js +0 -1
- package/package.json +1 -1
- package/pagination/index.js +1 -2
- package/popup/index.js +0 -1
- package/progress/index.js +1 -1
- package/radio/index.js +1 -1
- package/radio-group/index.js +1 -1
- package/select/index.js +1 -2
- package/shared/definition.js +1 -1
- package/shared/definition10.js +1 -1
- package/shared/definition11.js +1 -1
- package/shared/definition12.js +1 -1
- package/shared/definition14.js +1 -1
- package/shared/definition15.js +1 -1
- package/shared/definition16.js +2 -2
- package/shared/definition17.js +1 -1
- package/shared/definition18.js +1 -1
- package/shared/definition19.js +1 -1
- package/shared/definition2.js +1 -1
- package/shared/definition21.js +1 -1
- package/shared/definition22.js +76 -21
- package/shared/definition23.js +5 -4
- package/shared/definition24.js +1 -1
- package/shared/definition25.js +1 -1
- package/shared/definition26.js +1 -1
- package/shared/definition27.js +1 -1
- package/shared/definition29.js +368 -48
- package/shared/definition30.js +301 -298
- package/shared/definition31.js +14 -366
- package/shared/definition32.js +70 -13
- package/shared/definition33.js +25 -64
- package/shared/definition34.js +39 -27
- package/shared/definition35.js +431 -31
- package/shared/definition36.js +214 -430
- package/shared/definition37.js +70 -209
- package/shared/definition38.js +33 -81
- package/shared/definition39.js +423 -32
- package/shared/definition4.js +1 -1
- package/shared/definition40.js +586 -358
- package/shared/definition41.js +73 -648
- package/shared/definition42.js +584 -70
- package/shared/definition43.js +81 -538
- package/shared/definition44.js +52 -127
- package/shared/definition45.js +16 -56
- package/shared/definition46.js +485 -17
- package/shared/definition47.js +99 -477
- package/shared/definition48.js +19 -114
- package/shared/definition49.js +276 -19
- package/shared/definition5.js +1 -1
- package/shared/definition50.js +89 -245
- package/shared/definition51.js +629 -109
- package/shared/definition52.js +86 -601
- package/shared/definition53.js +68 -112
- package/shared/definition54.js +294 -69
- package/shared/definition6.js +1 -1
- package/shared/definition7.js +1 -1
- package/shared/definition8.js +2 -2
- package/shared/definition9.js +1 -1
- package/shared/es.object.assign.js +1 -1
- package/shared/es.regexp.to-string.js +1 -1
- package/shared/es.string.includes.js +1 -1
- package/shared/form-elements.js +1 -1
- package/shared/icon.js +17 -13
- package/shared/index.js +1 -1
- package/shared/patterns/form-elements/form-elements.d.ts +4 -4
- package/shared/string-trim.js +1 -1
- package/shared/text-field.js +1 -1
- package/shared/to-string.js +1 -1
- package/side-drawer/index.js +1 -1
- package/slider/index.js +1 -1
- package/styles/core/all.css +1 -1
- package/styles/core/theme.css +1 -1
- package/styles/core/typography.css +1 -1
- package/styles/tokens/theme-dark.css +4 -4
- package/styles/tokens/theme-light.css +4 -4
- package/switch/index.js +1 -2
- package/tab/index.js +1 -2
- package/tab-panel/index.js +1 -1
- package/tabs/index.js +3 -4
- package/tag/index.js +1 -2
- package/tag-group/index.js +1 -1
- package/text-anchor/index.js +0 -1
- package/text-area/index.js +1 -2
- package/text-field/index.js +3 -2
- package/toggletip/index.js +1 -2
- package/tooltip/index.js +1 -2
- package/tree-item/index.js +1 -2
- package/tree-view/index.js +1 -1
- package/vivid.api.json +19 -210
- package/shared/definition55.js +0 -305
- package/shared/engine-is-node.js +0 -8
package/shared/definition40.js
CHANGED
|
@@ -1,437 +1,665 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import
|
|
8
|
-
import {
|
|
1
|
+
import { Y as DOM, O as Observable, _ as __decorate, a as attr, S as volatile, o as observable, b as __metadata, h as html, r as registerFactory } from './index.js';
|
|
2
|
+
import { f as focusRegistries } from './definition4.js';
|
|
3
|
+
import { P as Popup, p as popupRegistries } from './definition20.js';
|
|
4
|
+
import { i as iconRegistries } from './definition3.js';
|
|
5
|
+
import { l as listboxOptionRegistries } from './definition21.js';
|
|
6
|
+
import { A as AffixIconWithTrailing, a as affixIconTemplateFactory } from './affix.js';
|
|
7
|
+
import './focus.js';
|
|
8
|
+
import { e as errorText, f as formElements, F as FormElementSuccessText, a as FormElementHelperText, g as getFeedbackTemplate } from './form-elements.js';
|
|
9
|
+
import { b as ListboxElement, L as Listbox, D as DelegatesARIAListbox, a as Listbox$1 } from './listbox.js';
|
|
10
|
+
import { S as StartEnd } from './start-end.js';
|
|
11
|
+
import { a as applyMixins } from './apply-mixins.js';
|
|
12
|
+
import { F as FormAssociated } from './form-associated.js';
|
|
13
|
+
import { S as SelectPosition } from './select.options.js';
|
|
14
|
+
import { u as uniqueId } from './strings.js';
|
|
15
|
+
import { g as keyTab, f as keyEscape, d as keyEnter, k as keyEnd, a as keyHome, e as keySpace, b as keyArrowDown, c as keyArrowUp } from './key-codes.js';
|
|
16
|
+
import { f as focusTemplateFactory } from './focus2.js';
|
|
9
17
|
import { w as when } from './when.js';
|
|
18
|
+
import { s as slotted } from './slotted.js';
|
|
19
|
+
import { r as ref } from './ref.js';
|
|
20
|
+
import { c as classNames } from './class-names.js';
|
|
21
|
+
|
|
22
|
+
class _Select extends ListboxElement {
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* A form-associated base class for the {@link @microsoft/fast-foundation#(Select:class)} component.
|
|
26
|
+
*
|
|
27
|
+
* @internal
|
|
28
|
+
*/
|
|
29
|
+
class FormAssociatedSelect extends FormAssociated(_Select) {
|
|
30
|
+
constructor() {
|
|
31
|
+
super(...arguments);
|
|
32
|
+
this.proxy = document.createElement("select");
|
|
33
|
+
}
|
|
34
|
+
}
|
|
10
35
|
|
|
11
36
|
/**
|
|
12
|
-
*
|
|
13
|
-
* Implements the {@link https://www.w3.org/TR/wai-aria-1.1/#
|
|
37
|
+
* A Select Custom HTML Element.
|
|
38
|
+
* Implements the {@link https://www.w3.org/TR/wai-aria-1.1/#select | ARIA select }.
|
|
14
39
|
*
|
|
15
|
-
* @slot
|
|
16
|
-
* @slot -
|
|
17
|
-
* @
|
|
18
|
-
* @
|
|
40
|
+
* @slot start - Content which can be provided before the button content
|
|
41
|
+
* @slot end - Content which can be provided after the button content
|
|
42
|
+
* @slot button-container - The element representing the select button
|
|
43
|
+
* @slot selected-value - The selected value
|
|
44
|
+
* @slot indicator - The visual indicator for the expand/collapse state of the button
|
|
45
|
+
* @slot - The default slot for slotted options
|
|
46
|
+
* @csspart control - The element representing the select invoking element
|
|
47
|
+
* @csspart selected-value - The element wrapping the selected value
|
|
48
|
+
* @csspart indicator - The element wrapping the visual indicator
|
|
49
|
+
* @csspart listbox - The listbox element
|
|
50
|
+
* @fires input - Fires a custom 'input' event when the value updates
|
|
51
|
+
* @fires change - Fires a custom 'change' event when the value updates
|
|
19
52
|
*
|
|
20
53
|
* @public
|
|
21
54
|
*/
|
|
22
|
-
class
|
|
55
|
+
class Select$1 extends FormAssociatedSelect {
|
|
23
56
|
constructor() {
|
|
24
57
|
super(...arguments);
|
|
25
58
|
/**
|
|
26
|
-
* The
|
|
59
|
+
* The open attribute.
|
|
27
60
|
*
|
|
28
61
|
* @public
|
|
29
62
|
* @remarks
|
|
30
|
-
* HTML Attribute:
|
|
63
|
+
* HTML Attribute: open
|
|
31
64
|
*/
|
|
32
|
-
this.
|
|
33
|
-
this.radioChangeHandler = (e) => {
|
|
34
|
-
const changedRadio = e.target;
|
|
35
|
-
if (changedRadio.checked) {
|
|
36
|
-
this.slottedRadioButtons.forEach((radio) => {
|
|
37
|
-
if (radio !== changedRadio) {
|
|
38
|
-
radio.checked = false;
|
|
39
|
-
if (!this.isInsideFoundationToolbar) {
|
|
40
|
-
radio.setAttribute("tabindex", "-1");
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
});
|
|
44
|
-
this.selectedRadio = changedRadio;
|
|
45
|
-
this.value = changedRadio.value;
|
|
46
|
-
changedRadio.setAttribute("tabindex", "0");
|
|
47
|
-
this.focusedRadio = changedRadio;
|
|
48
|
-
}
|
|
49
|
-
e.stopPropagation();
|
|
50
|
-
};
|
|
51
|
-
this.moveToRadioByIndex = (group, index) => {
|
|
52
|
-
const radio = group[index];
|
|
53
|
-
if (!this.isInsideToolbar) {
|
|
54
|
-
radio.setAttribute("tabindex", "0");
|
|
55
|
-
if (radio.readOnly) {
|
|
56
|
-
this.slottedRadioButtons.forEach((nextRadio) => {
|
|
57
|
-
if (nextRadio !== radio) {
|
|
58
|
-
nextRadio.setAttribute("tabindex", "-1");
|
|
59
|
-
}
|
|
60
|
-
});
|
|
61
|
-
}
|
|
62
|
-
else {
|
|
63
|
-
radio.checked = true;
|
|
64
|
-
this.selectedRadio = radio;
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
this.focusedRadio = radio;
|
|
68
|
-
radio.focus();
|
|
69
|
-
};
|
|
70
|
-
this.moveRightOffGroup = () => {
|
|
71
|
-
var _a;
|
|
72
|
-
(_a = this.nextElementSibling) === null || _a === void 0 ? void 0 : _a.focus();
|
|
73
|
-
};
|
|
74
|
-
this.moveLeftOffGroup = () => {
|
|
75
|
-
var _a;
|
|
76
|
-
(_a = this.previousElementSibling) === null || _a === void 0 ? void 0 : _a.focus();
|
|
77
|
-
};
|
|
65
|
+
this.open = false;
|
|
78
66
|
/**
|
|
67
|
+
* Indicates the initial state of the position attribute.
|
|
68
|
+
*
|
|
79
69
|
* @internal
|
|
80
70
|
*/
|
|
81
|
-
this.
|
|
82
|
-
const group = this.slottedRadioButtons;
|
|
83
|
-
const radio = e.target;
|
|
84
|
-
const index = radio !== null ? group.indexOf(radio) : 0;
|
|
85
|
-
const focusedIndex = this.focusedRadio
|
|
86
|
-
? group.indexOf(this.focusedRadio)
|
|
87
|
-
: -1;
|
|
88
|
-
if ((focusedIndex === 0 && index === focusedIndex) ||
|
|
89
|
-
(focusedIndex === group.length - 1 && focusedIndex === index)) {
|
|
90
|
-
if (!this.selectedRadio) {
|
|
91
|
-
this.focusedRadio = group[0];
|
|
92
|
-
this.focusedRadio.setAttribute("tabindex", "0");
|
|
93
|
-
group.forEach((nextRadio) => {
|
|
94
|
-
if (nextRadio !== this.focusedRadio) {
|
|
95
|
-
nextRadio.setAttribute("tabindex", "-1");
|
|
96
|
-
}
|
|
97
|
-
});
|
|
98
|
-
}
|
|
99
|
-
else {
|
|
100
|
-
this.focusedRadio = this.selectedRadio;
|
|
101
|
-
if (!this.isInsideFoundationToolbar) {
|
|
102
|
-
this.selectedRadio.setAttribute("tabindex", "0");
|
|
103
|
-
group.forEach((nextRadio) => {
|
|
104
|
-
if (nextRadio !== this.selectedRadio) {
|
|
105
|
-
nextRadio.setAttribute("tabindex", "-1");
|
|
106
|
-
}
|
|
107
|
-
});
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
return true;
|
|
112
|
-
};
|
|
71
|
+
this.forcedPosition = false;
|
|
113
72
|
/**
|
|
73
|
+
* The unique id for the internal listbox element.
|
|
74
|
+
*
|
|
114
75
|
* @internal
|
|
115
76
|
*/
|
|
116
|
-
this.
|
|
117
|
-
const radio = e.target;
|
|
118
|
-
if (radio) {
|
|
119
|
-
const group = this.slottedRadioButtons;
|
|
120
|
-
if (radio.checked || group.indexOf(radio) === 0) {
|
|
121
|
-
radio.setAttribute("tabindex", "0");
|
|
122
|
-
this.selectedRadio = radio;
|
|
123
|
-
}
|
|
124
|
-
else {
|
|
125
|
-
radio.setAttribute("tabindex", "-1");
|
|
126
|
-
this.selectedRadio = null;
|
|
127
|
-
}
|
|
128
|
-
this.focusedRadio = radio;
|
|
129
|
-
}
|
|
130
|
-
e.preventDefault();
|
|
131
|
-
};
|
|
132
|
-
this.shouldMoveOffGroupToTheRight = (index, group, key) => {
|
|
133
|
-
return index === group.length && this.isInsideToolbar && key === keyArrowRight;
|
|
134
|
-
};
|
|
135
|
-
this.shouldMoveOffGroupToTheLeft = (group, key) => {
|
|
136
|
-
const index = this.focusedRadio ? group.indexOf(this.focusedRadio) - 1 : 0;
|
|
137
|
-
return index < 0 && this.isInsideToolbar && key === keyArrowLeft;
|
|
138
|
-
};
|
|
139
|
-
this.checkFocusedRadio = () => {
|
|
140
|
-
if (this.focusedRadio !== null &&
|
|
141
|
-
!this.focusedRadio.readOnly &&
|
|
142
|
-
!this.focusedRadio.checked) {
|
|
143
|
-
this.focusedRadio.checked = true;
|
|
144
|
-
this.focusedRadio.setAttribute("tabindex", "0");
|
|
145
|
-
this.focusedRadio.focus();
|
|
146
|
-
this.selectedRadio = this.focusedRadio;
|
|
147
|
-
}
|
|
148
|
-
};
|
|
149
|
-
this.moveRight = (e) => {
|
|
150
|
-
const group = this.slottedRadioButtons;
|
|
151
|
-
let index = 0;
|
|
152
|
-
index = this.focusedRadio ? group.indexOf(this.focusedRadio) + 1 : 1;
|
|
153
|
-
if (this.shouldMoveOffGroupToTheRight(index, group, e.key)) {
|
|
154
|
-
this.moveRightOffGroup();
|
|
155
|
-
return;
|
|
156
|
-
}
|
|
157
|
-
else if (index === group.length) {
|
|
158
|
-
index = 0;
|
|
159
|
-
}
|
|
160
|
-
/* looping to get to next radio that is not disabled */
|
|
161
|
-
/* matching native radio/radiogroup which does not select an item if there is only 1 in the group */
|
|
162
|
-
while (index < group.length && group.length > 1) {
|
|
163
|
-
if (!group[index].disabled) {
|
|
164
|
-
this.moveToRadioByIndex(group, index);
|
|
165
|
-
break;
|
|
166
|
-
}
|
|
167
|
-
else if (this.focusedRadio && index === group.indexOf(this.focusedRadio)) {
|
|
168
|
-
break;
|
|
169
|
-
}
|
|
170
|
-
else if (index + 1 >= group.length) {
|
|
171
|
-
if (this.isInsideToolbar) {
|
|
172
|
-
break;
|
|
173
|
-
}
|
|
174
|
-
else {
|
|
175
|
-
index = 0;
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
else {
|
|
179
|
-
index += 1;
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
};
|
|
183
|
-
this.moveLeft = (e) => {
|
|
184
|
-
const group = this.slottedRadioButtons;
|
|
185
|
-
let index = 0;
|
|
186
|
-
index = this.focusedRadio ? group.indexOf(this.focusedRadio) - 1 : 0;
|
|
187
|
-
index = index < 0 ? group.length - 1 : index;
|
|
188
|
-
if (this.shouldMoveOffGroupToTheLeft(group, e.key)) {
|
|
189
|
-
this.moveLeftOffGroup();
|
|
190
|
-
return;
|
|
191
|
-
}
|
|
192
|
-
/* looping to get to next radio that is not disabled */
|
|
193
|
-
while (index >= 0 && group.length > 1) {
|
|
194
|
-
if (!group[index].disabled) {
|
|
195
|
-
this.moveToRadioByIndex(group, index);
|
|
196
|
-
break;
|
|
197
|
-
}
|
|
198
|
-
else if (this.focusedRadio && index === group.indexOf(this.focusedRadio)) {
|
|
199
|
-
break;
|
|
200
|
-
}
|
|
201
|
-
else if (index - 1 < 0) {
|
|
202
|
-
index = group.length - 1;
|
|
203
|
-
}
|
|
204
|
-
else {
|
|
205
|
-
index -= 1;
|
|
206
|
-
}
|
|
207
|
-
}
|
|
208
|
-
};
|
|
77
|
+
this.listboxId = uniqueId("listbox-");
|
|
209
78
|
/**
|
|
210
|
-
*
|
|
211
|
-
* navigation is different when there is an ancestor with role='toolbar'
|
|
79
|
+
* The max height for the listbox when opened.
|
|
212
80
|
*
|
|
213
81
|
* @internal
|
|
214
82
|
*/
|
|
215
|
-
this.
|
|
216
|
-
const key = e.key;
|
|
217
|
-
if (key in ArrowKeys && this.isInsideFoundationToolbar) {
|
|
218
|
-
return true;
|
|
219
|
-
}
|
|
220
|
-
switch (key) {
|
|
221
|
-
case keyEnter: {
|
|
222
|
-
this.checkFocusedRadio();
|
|
223
|
-
break;
|
|
224
|
-
}
|
|
225
|
-
case keyArrowRight:
|
|
226
|
-
case keyArrowDown: {
|
|
227
|
-
if (this.direction === Direction.ltr) {
|
|
228
|
-
this.moveRight(e);
|
|
229
|
-
}
|
|
230
|
-
else {
|
|
231
|
-
this.moveLeft(e);
|
|
232
|
-
}
|
|
233
|
-
break;
|
|
234
|
-
}
|
|
235
|
-
case keyArrowLeft:
|
|
236
|
-
case keyArrowUp: {
|
|
237
|
-
if (this.direction === Direction.ltr) {
|
|
238
|
-
this.moveLeft(e);
|
|
239
|
-
}
|
|
240
|
-
else {
|
|
241
|
-
this.moveRight(e);
|
|
242
|
-
}
|
|
243
|
-
break;
|
|
244
|
-
}
|
|
245
|
-
default: {
|
|
246
|
-
return true;
|
|
247
|
-
}
|
|
248
|
-
}
|
|
249
|
-
};
|
|
83
|
+
this.maxHeight = 0;
|
|
250
84
|
}
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
85
|
+
/**
|
|
86
|
+
* Sets focus and synchronizes ARIA attributes when the open property changes.
|
|
87
|
+
*
|
|
88
|
+
* @param prev - the previous open value
|
|
89
|
+
* @param next - the current open value
|
|
90
|
+
*
|
|
91
|
+
* @internal
|
|
92
|
+
*/
|
|
93
|
+
openChanged(prev, next) {
|
|
94
|
+
if (!this.collapsible) {
|
|
95
|
+
return;
|
|
261
96
|
}
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
this.
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
}
|
|
272
|
-
});
|
|
97
|
+
if (this.open) {
|
|
98
|
+
this.ariaControls = this.listboxId;
|
|
99
|
+
this.ariaExpanded = "true";
|
|
100
|
+
this.setPositioning();
|
|
101
|
+
this.focusAndScrollOptionIntoView();
|
|
102
|
+
this.indexWhenOpened = this.selectedIndex;
|
|
103
|
+
// focus is directed to the element when `open` is changed programmatically
|
|
104
|
+
DOM.queueUpdate(() => this.focus());
|
|
105
|
+
return;
|
|
273
106
|
}
|
|
107
|
+
this.ariaControls = "";
|
|
108
|
+
this.ariaExpanded = "false";
|
|
274
109
|
}
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
110
|
+
/**
|
|
111
|
+
* The component is collapsible when in single-selection mode with no size attribute.
|
|
112
|
+
*
|
|
113
|
+
* @internal
|
|
114
|
+
*/
|
|
115
|
+
get collapsible() {
|
|
116
|
+
return !(this.multiple || typeof this.size === "number");
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* The value property.
|
|
120
|
+
*
|
|
121
|
+
* @public
|
|
122
|
+
*/
|
|
123
|
+
get value() {
|
|
124
|
+
Observable.track(this, "value");
|
|
125
|
+
return this._value;
|
|
126
|
+
}
|
|
127
|
+
set value(next) {
|
|
128
|
+
var _a, _b, _c, _d, _e, _f, _g;
|
|
129
|
+
const prev = `${this._value}`;
|
|
130
|
+
if ((_a = this._options) === null || _a === void 0 ? void 0 : _a.length) {
|
|
131
|
+
const selectedIndex = this._options.findIndex(el => el.value === next);
|
|
132
|
+
const prevSelectedValue = (_c = (_b = this._options[this.selectedIndex]) === null || _b === void 0 ? void 0 : _b.value) !== null && _c !== void 0 ? _c : null;
|
|
133
|
+
const nextSelectedValue = (_e = (_d = this._options[selectedIndex]) === null || _d === void 0 ? void 0 : _d.value) !== null && _e !== void 0 ? _e : null;
|
|
134
|
+
if (selectedIndex === -1 || prevSelectedValue !== nextSelectedValue) {
|
|
135
|
+
next = "";
|
|
136
|
+
this.selectedIndex = selectedIndex;
|
|
137
|
+
}
|
|
138
|
+
next = (_g = (_f = this.firstSelectedOption) === null || _f === void 0 ? void 0 : _f.value) !== null && _g !== void 0 ? _g : next;
|
|
139
|
+
}
|
|
140
|
+
if (prev !== next) {
|
|
141
|
+
this._value = next;
|
|
142
|
+
super.valueChanged(prev, next);
|
|
143
|
+
Observable.notify(this, "value");
|
|
144
|
+
this.updateDisplayValue();
|
|
280
145
|
}
|
|
281
146
|
}
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
147
|
+
/**
|
|
148
|
+
* Sets the value and display value to match the first selected option.
|
|
149
|
+
*
|
|
150
|
+
* @param shouldEmit - if true, the input and change events will be emitted
|
|
151
|
+
*
|
|
152
|
+
* @internal
|
|
153
|
+
*/
|
|
154
|
+
updateValue(shouldEmit) {
|
|
155
|
+
var _a, _b;
|
|
156
|
+
if (this.$fastController.isConnected) {
|
|
157
|
+
this.value = (_b = (_a = this.firstSelectedOption) === null || _a === void 0 ? void 0 : _a.value) !== null && _b !== void 0 ? _b : "";
|
|
158
|
+
}
|
|
159
|
+
if (shouldEmit) {
|
|
160
|
+
this.$emit("input");
|
|
161
|
+
this.$emit("change", this, {
|
|
162
|
+
bubbles: true,
|
|
163
|
+
composed: undefined,
|
|
289
164
|
});
|
|
290
165
|
}
|
|
291
|
-
this.$emit("change");
|
|
292
166
|
}
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
167
|
+
/**
|
|
168
|
+
* Updates the proxy value when the selected index changes.
|
|
169
|
+
*
|
|
170
|
+
* @param prev - the previous selected index
|
|
171
|
+
* @param next - the next selected index
|
|
172
|
+
*
|
|
173
|
+
* @internal
|
|
174
|
+
*/
|
|
175
|
+
selectedIndexChanged(prev, next) {
|
|
176
|
+
super.selectedIndexChanged(prev, next);
|
|
177
|
+
this.updateValue();
|
|
178
|
+
}
|
|
179
|
+
positionChanged(prev, next) {
|
|
180
|
+
this.positionAttribute = next;
|
|
181
|
+
this.setPositioning();
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Calculate and apply listbox positioning based on available viewport space.
|
|
185
|
+
*
|
|
186
|
+
* @public
|
|
187
|
+
*/
|
|
188
|
+
setPositioning() {
|
|
189
|
+
const currentBox = this.getBoundingClientRect();
|
|
190
|
+
const viewportHeight = window.innerHeight;
|
|
191
|
+
const availableBottom = viewportHeight - currentBox.bottom;
|
|
192
|
+
this.position = this.forcedPosition
|
|
193
|
+
? this.positionAttribute
|
|
194
|
+
: currentBox.top > availableBottom
|
|
195
|
+
? SelectPosition.above
|
|
196
|
+
: SelectPosition.below;
|
|
197
|
+
this.positionAttribute = this.forcedPosition
|
|
198
|
+
? this.positionAttribute
|
|
199
|
+
: this.position;
|
|
200
|
+
this.maxHeight =
|
|
201
|
+
this.position === SelectPosition.above ? ~~currentBox.top : ~~availableBottom;
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* The value displayed on the button.
|
|
205
|
+
*
|
|
206
|
+
* @public
|
|
207
|
+
*/
|
|
208
|
+
get displayValue() {
|
|
209
|
+
var _a, _b;
|
|
210
|
+
Observable.track(this, "displayValue");
|
|
211
|
+
return (_b = (_a = this.firstSelectedOption) === null || _a === void 0 ? void 0 : _a.text) !== null && _b !== void 0 ? _b : "";
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Synchronize the `aria-disabled` property when the `disabled` property changes.
|
|
215
|
+
*
|
|
216
|
+
* @param prev - The previous disabled value
|
|
217
|
+
* @param next - The next disabled value
|
|
218
|
+
*
|
|
219
|
+
* @internal
|
|
220
|
+
*/
|
|
221
|
+
disabledChanged(prev, next) {
|
|
222
|
+
if (super.disabledChanged) {
|
|
223
|
+
super.disabledChanged(prev, next);
|
|
296
224
|
}
|
|
225
|
+
this.ariaDisabled = this.disabled ? "true" : "false";
|
|
297
226
|
}
|
|
298
|
-
|
|
299
|
-
|
|
227
|
+
/**
|
|
228
|
+
* Reset the element to its first selectable option when its parent form is reset.
|
|
229
|
+
*
|
|
230
|
+
* @internal
|
|
231
|
+
*/
|
|
232
|
+
formResetCallback() {
|
|
233
|
+
this.setProxyOptions();
|
|
234
|
+
// Call the base class's implementation setDefaultSelectedOption instead of the select's
|
|
235
|
+
// override, in order to reset the selectedIndex without using the value property.
|
|
236
|
+
super.setDefaultSelectedOption();
|
|
237
|
+
if (this.selectedIndex === -1) {
|
|
238
|
+
this.selectedIndex = 0;
|
|
239
|
+
}
|
|
300
240
|
}
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
241
|
+
/**
|
|
242
|
+
* Handle opening and closing the listbox when the select is clicked.
|
|
243
|
+
*
|
|
244
|
+
* @param e - the mouse event
|
|
245
|
+
* @internal
|
|
246
|
+
*/
|
|
247
|
+
clickHandler(e) {
|
|
248
|
+
// do nothing if the select is disabled
|
|
249
|
+
if (this.disabled) {
|
|
250
|
+
return;
|
|
251
|
+
}
|
|
252
|
+
if (this.open) {
|
|
253
|
+
const captured = e.target.closest(`option,[role=option]`);
|
|
254
|
+
if (captured && captured.disabled) {
|
|
255
|
+
return;
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
super.clickHandler(e);
|
|
259
|
+
this.open = this.collapsible && !this.open;
|
|
260
|
+
if (!this.open && this.indexWhenOpened !== this.selectedIndex) {
|
|
261
|
+
this.updateValue(true);
|
|
262
|
+
}
|
|
263
|
+
return true;
|
|
304
264
|
}
|
|
305
|
-
|
|
265
|
+
/**
|
|
266
|
+
* Handles focus state when the element or its children lose focus.
|
|
267
|
+
*
|
|
268
|
+
* @param e - The focus event
|
|
269
|
+
* @internal
|
|
270
|
+
*/
|
|
271
|
+
focusoutHandler(e) {
|
|
306
272
|
var _a;
|
|
307
|
-
|
|
273
|
+
super.focusoutHandler(e);
|
|
274
|
+
if (!this.open) {
|
|
275
|
+
return true;
|
|
276
|
+
}
|
|
277
|
+
const focusTarget = e.relatedTarget;
|
|
278
|
+
if (this.isSameNode(focusTarget)) {
|
|
279
|
+
this.focus();
|
|
280
|
+
return;
|
|
281
|
+
}
|
|
282
|
+
if (!((_a = this.options) === null || _a === void 0 ? void 0 : _a.includes(focusTarget))) {
|
|
283
|
+
this.open = false;
|
|
284
|
+
if (this.indexWhenOpened !== this.selectedIndex) {
|
|
285
|
+
this.updateValue(true);
|
|
286
|
+
}
|
|
287
|
+
}
|
|
308
288
|
}
|
|
309
289
|
/**
|
|
290
|
+
* Updates the value when an option's value changes.
|
|
291
|
+
*
|
|
292
|
+
* @param source - the source object
|
|
293
|
+
* @param propertyName - the property to evaluate
|
|
294
|
+
*
|
|
310
295
|
* @internal
|
|
296
|
+
* @override
|
|
311
297
|
*/
|
|
312
|
-
|
|
313
|
-
super.
|
|
314
|
-
|
|
315
|
-
|
|
298
|
+
handleChange(source, propertyName) {
|
|
299
|
+
super.handleChange(source, propertyName);
|
|
300
|
+
if (propertyName === "value") {
|
|
301
|
+
this.updateValue();
|
|
302
|
+
}
|
|
316
303
|
}
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
304
|
+
/**
|
|
305
|
+
* Synchronize the form-associated proxy and updates the value property of the element.
|
|
306
|
+
*
|
|
307
|
+
* @param prev - the previous collection of slotted option elements
|
|
308
|
+
* @param next - the next collection of slotted option elements
|
|
309
|
+
*
|
|
310
|
+
* @internal
|
|
311
|
+
*/
|
|
312
|
+
slottedOptionsChanged(prev, next) {
|
|
313
|
+
this.options.forEach(o => {
|
|
314
|
+
const notifier = Observable.getNotifier(o);
|
|
315
|
+
notifier.unsubscribe(this, "value");
|
|
320
316
|
});
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
317
|
+
super.slottedOptionsChanged(prev, next);
|
|
318
|
+
this.options.forEach(o => {
|
|
319
|
+
const notifier = Observable.getNotifier(o);
|
|
320
|
+
notifier.subscribe(this, "value");
|
|
325
321
|
});
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
322
|
+
this.setProxyOptions();
|
|
323
|
+
this.updateValue();
|
|
324
|
+
}
|
|
325
|
+
/**
|
|
326
|
+
* Prevents focus when size is set and a scrollbar is clicked.
|
|
327
|
+
*
|
|
328
|
+
* @param e - the mouse event object
|
|
329
|
+
*
|
|
330
|
+
* @override
|
|
331
|
+
* @internal
|
|
332
|
+
*/
|
|
333
|
+
mousedownHandler(e) {
|
|
334
|
+
var _a;
|
|
335
|
+
if (e.offsetX >= 0 && e.offsetX <= ((_a = this.listbox) === null || _a === void 0 ? void 0 : _a.scrollWidth)) {
|
|
336
|
+
return super.mousedownHandler(e);
|
|
337
|
+
}
|
|
338
|
+
return this.collapsible;
|
|
339
|
+
}
|
|
340
|
+
/**
|
|
341
|
+
* Sets the multiple property on the proxy element.
|
|
342
|
+
*
|
|
343
|
+
* @param prev - the previous multiple value
|
|
344
|
+
* @param next - the current multiple value
|
|
345
|
+
*/
|
|
346
|
+
multipleChanged(prev, next) {
|
|
347
|
+
super.multipleChanged(prev, next);
|
|
348
|
+
if (this.proxy) {
|
|
349
|
+
this.proxy.multiple = next;
|
|
330
350
|
}
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
351
|
+
}
|
|
352
|
+
/**
|
|
353
|
+
* Updates the selectedness of each option when the list of selected options changes.
|
|
354
|
+
*
|
|
355
|
+
* @param prev - the previous list of selected options
|
|
356
|
+
* @param next - the current list of selected options
|
|
357
|
+
*
|
|
358
|
+
* @override
|
|
359
|
+
* @internal
|
|
360
|
+
*/
|
|
361
|
+
selectedOptionsChanged(prev, next) {
|
|
362
|
+
var _a;
|
|
363
|
+
super.selectedOptionsChanged(prev, next);
|
|
364
|
+
(_a = this.options) === null || _a === void 0 ? void 0 : _a.forEach((o, i) => {
|
|
365
|
+
var _a;
|
|
366
|
+
const proxyOption = (_a = this.proxy) === null || _a === void 0 ? void 0 : _a.options.item(i);
|
|
367
|
+
if (proxyOption) {
|
|
368
|
+
proxyOption.selected = o.selected;
|
|
335
369
|
}
|
|
336
|
-
|
|
337
|
-
|
|
370
|
+
});
|
|
371
|
+
}
|
|
372
|
+
/**
|
|
373
|
+
* Sets the selected index to match the first option with the selected attribute, or
|
|
374
|
+
* the first selectable option.
|
|
375
|
+
*
|
|
376
|
+
* @override
|
|
377
|
+
* @internal
|
|
378
|
+
*/
|
|
379
|
+
setDefaultSelectedOption() {
|
|
380
|
+
var _a;
|
|
381
|
+
const options = (_a = this.options) !== null && _a !== void 0 ? _a : Array.from(this.children).filter(Listbox.slottedOptionFilter);
|
|
382
|
+
const selectedIndex = options === null || options === void 0 ? void 0 : options.findIndex(el => el.hasAttribute("selected") || el.selected || el.value === this.value);
|
|
383
|
+
if (selectedIndex !== -1) {
|
|
384
|
+
this.selectedIndex = selectedIndex;
|
|
385
|
+
return;
|
|
386
|
+
}
|
|
387
|
+
this.selectedIndex = 0;
|
|
388
|
+
}
|
|
389
|
+
/**
|
|
390
|
+
* Resets and fills the proxy to match the component's options.
|
|
391
|
+
*
|
|
392
|
+
* @internal
|
|
393
|
+
*/
|
|
394
|
+
setProxyOptions() {
|
|
395
|
+
if (this.proxy instanceof HTMLSelectElement && this.options) {
|
|
396
|
+
this.proxy.options.length = 0;
|
|
397
|
+
this.options.forEach(option => {
|
|
398
|
+
const proxyOption = option.proxy ||
|
|
399
|
+
(option instanceof HTMLOptionElement ? option.cloneNode() : null);
|
|
400
|
+
if (proxyOption) {
|
|
401
|
+
this.proxy.options.add(proxyOption);
|
|
402
|
+
}
|
|
403
|
+
});
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
/**
|
|
407
|
+
* Handle keyboard interaction for the select.
|
|
408
|
+
*
|
|
409
|
+
* @param e - the keyboard event
|
|
410
|
+
* @internal
|
|
411
|
+
*/
|
|
412
|
+
keydownHandler(e) {
|
|
413
|
+
super.keydownHandler(e);
|
|
414
|
+
const key = e.key || e.key.charCodeAt(0);
|
|
415
|
+
switch (key) {
|
|
416
|
+
case keySpace: {
|
|
417
|
+
e.preventDefault();
|
|
418
|
+
if (this.collapsible && this.typeAheadExpired) {
|
|
419
|
+
this.open = !this.open;
|
|
420
|
+
}
|
|
421
|
+
break;
|
|
338
422
|
}
|
|
339
|
-
|
|
340
|
-
|
|
423
|
+
case keyHome:
|
|
424
|
+
case keyEnd: {
|
|
425
|
+
e.preventDefault();
|
|
426
|
+
break;
|
|
341
427
|
}
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
this.
|
|
345
|
-
|
|
346
|
-
radio.setAttribute("tabindex", "0");
|
|
347
|
-
foundMatchingVal = true;
|
|
428
|
+
case keyEnter: {
|
|
429
|
+
e.preventDefault();
|
|
430
|
+
this.open = !this.open;
|
|
431
|
+
break;
|
|
348
432
|
}
|
|
349
|
-
|
|
350
|
-
if (
|
|
351
|
-
|
|
433
|
+
case keyEscape: {
|
|
434
|
+
if (this.collapsible && this.open) {
|
|
435
|
+
e.preventDefault();
|
|
436
|
+
this.open = false;
|
|
352
437
|
}
|
|
353
|
-
|
|
354
|
-
}
|
|
355
|
-
radio.addEventListener("change", this.radioChangeHandler);
|
|
356
|
-
});
|
|
357
|
-
if (this.value === undefined && this.slottedRadioButtons.length > 0) {
|
|
358
|
-
const checkedRadios = this.slottedRadioButtons.filter((radio) => {
|
|
359
|
-
return radio.hasAttribute("checked");
|
|
360
|
-
});
|
|
361
|
-
const numberOfCheckedRadios = checkedRadios !== null ? checkedRadios.length : 0;
|
|
362
|
-
if (numberOfCheckedRadios > 0 && !foundMatchingVal) {
|
|
363
|
-
const lastCheckedRadio = checkedRadios[numberOfCheckedRadios - 1];
|
|
364
|
-
lastCheckedRadio.checked = true;
|
|
365
|
-
this.focusedRadio = lastCheckedRadio;
|
|
366
|
-
lastCheckedRadio.setAttribute("tabindex", "0");
|
|
438
|
+
break;
|
|
367
439
|
}
|
|
368
|
-
|
|
369
|
-
this.
|
|
370
|
-
|
|
440
|
+
case keyTab: {
|
|
441
|
+
if (this.collapsible && this.open) {
|
|
442
|
+
e.preventDefault();
|
|
443
|
+
this.open = false;
|
|
444
|
+
}
|
|
445
|
+
return true;
|
|
371
446
|
}
|
|
372
447
|
}
|
|
448
|
+
if (!this.open && this.indexWhenOpened !== this.selectedIndex) {
|
|
449
|
+
this.updateValue(true);
|
|
450
|
+
this.indexWhenOpened = this.selectedIndex;
|
|
451
|
+
}
|
|
452
|
+
return !(key === keyArrowDown || key === keyArrowUp);
|
|
453
|
+
}
|
|
454
|
+
connectedCallback() {
|
|
455
|
+
super.connectedCallback();
|
|
456
|
+
this.forcedPosition = !!this.positionAttribute;
|
|
457
|
+
this.addEventListener("contentchange", this.updateDisplayValue);
|
|
458
|
+
}
|
|
459
|
+
disconnectedCallback() {
|
|
460
|
+
this.removeEventListener("contentchange", this.updateDisplayValue);
|
|
461
|
+
super.disconnectedCallback();
|
|
462
|
+
}
|
|
463
|
+
/**
|
|
464
|
+
* Updates the proxy's size property when the size attribute changes.
|
|
465
|
+
*
|
|
466
|
+
* @param prev - the previous size
|
|
467
|
+
* @param next - the current size
|
|
468
|
+
*
|
|
469
|
+
* @override
|
|
470
|
+
* @internal
|
|
471
|
+
*/
|
|
472
|
+
sizeChanged(prev, next) {
|
|
473
|
+
super.sizeChanged(prev, next);
|
|
474
|
+
if (this.proxy) {
|
|
475
|
+
this.proxy.size = next;
|
|
476
|
+
}
|
|
477
|
+
}
|
|
478
|
+
/**
|
|
479
|
+
*
|
|
480
|
+
* @internal
|
|
481
|
+
*/
|
|
482
|
+
updateDisplayValue() {
|
|
483
|
+
if (this.collapsible) {
|
|
484
|
+
Observable.notify(this, "displayValue");
|
|
485
|
+
}
|
|
373
486
|
}
|
|
374
487
|
}
|
|
375
488
|
__decorate([
|
|
376
|
-
attr({ attribute: "
|
|
377
|
-
],
|
|
489
|
+
attr({ attribute: "open", mode: "boolean" })
|
|
490
|
+
], Select$1.prototype, "open", void 0);
|
|
378
491
|
__decorate([
|
|
379
|
-
|
|
380
|
-
],
|
|
492
|
+
volatile
|
|
493
|
+
], Select$1.prototype, "collapsible", null);
|
|
381
494
|
__decorate([
|
|
382
|
-
|
|
383
|
-
],
|
|
495
|
+
observable
|
|
496
|
+
], Select$1.prototype, "control", void 0);
|
|
384
497
|
__decorate([
|
|
385
|
-
attr
|
|
386
|
-
],
|
|
498
|
+
attr({ attribute: "position" })
|
|
499
|
+
], Select$1.prototype, "positionAttribute", void 0);
|
|
387
500
|
__decorate([
|
|
388
|
-
|
|
389
|
-
],
|
|
501
|
+
observable
|
|
502
|
+
], Select$1.prototype, "position", void 0);
|
|
390
503
|
__decorate([
|
|
391
504
|
observable
|
|
392
|
-
],
|
|
505
|
+
], Select$1.prototype, "maxHeight", void 0);
|
|
506
|
+
/**
|
|
507
|
+
* Includes ARIA states and properties relating to the ARIA select role.
|
|
508
|
+
*
|
|
509
|
+
* @public
|
|
510
|
+
*/
|
|
511
|
+
class DelegatesARIASelect {
|
|
512
|
+
}
|
|
393
513
|
__decorate([
|
|
394
514
|
observable
|
|
395
|
-
],
|
|
515
|
+
], DelegatesARIASelect.prototype, "ariaControls", void 0);
|
|
516
|
+
applyMixins(DelegatesARIASelect, DelegatesARIAListbox);
|
|
517
|
+
applyMixins(Select$1, StartEnd, DelegatesARIASelect);
|
|
396
518
|
|
|
397
|
-
var css_248z = "/**\n * Do not edit directly\n * Generated on
|
|
519
|
+
var css_248z = "/**\n * Do not edit directly\n * Generated on Tue, 25 Jul 2023 07:38:24 GMT\n */\n@supports selector(:focus-visible) {\n :host(:focus) {\n outline: none;\n }\n}\n:host {\n display: inline-flex;\n flex-direction: column;\n gap: 4px;\n --_low-ink-color: var(--vvd-color-neutral-600);\n}\n\n:host([disabled]) {\n --_low-ink-color: var(--vvd-color-neutral-400);\n}\n\n.label {\n color: var(--vvd-color-canvas-text);\n contain: inline-size;\n font: var(--vvd-typography-base);\n}\n\n.control {\n display: flex;\n align-items: center;\n justify-content: space-between;\n background-color: var(--_appearance-color-fill);\n block-size: calc(1px * (40 + 4 * clamp(-1, var(--vvd-size-density, 0), 2)));\n border-radius: var(--_select-control-border-radius);\n box-shadow: inset 0 0 0 1px var(--_appearance-color-outline);\n color: var(--_appearance-color-text);\n font: var(--vvd-typography-base);\n gap: 8px;\n padding-inline: 16px;\n transition: box-shadow 0.2s, background-color 0.2s;\n}\n.control {\n --_appearance-color-text: var(--vvd-color-canvas-text);\n --_appearance-color-fill: var(--_connotation-color-backdrop);\n --_appearance-color-outline: var(--_connotation-color-intermediate);\n}\n.control.appearance-ghost {\n --_appearance-color-text: var(--_connotation-color-primary);\n --_appearance-color-fill: transparent;\n --_appearance-color-outline: transparent;\n}\n.control:where(:hover, .hover):where(:not(:disabled, .disabled, .readonly)) {\n --_appearance-color-text: var(--vvd-color-canvas-text);\n --_appearance-color-fill: var(--_connotation-color-backdrop);\n --_appearance-color-outline: var(--_connotation-color-firm);\n}\n.control:where(:hover, .hover):where(:not(:disabled, .disabled, .readonly)).appearance-ghost {\n --_appearance-color-text: var(--_connotation-color-primary);\n --_appearance-color-fill: var(--_connotation-color-faint);\n --_appearance-color-outline: transparent;\n}\n.control:where(:disabled, .disabled) {\n --_appearance-color-text: var(--vvd-color-neutral-300);\n --_appearance-color-fill: var(--vvd-color-neutral-100);\n --_appearance-color-outline: var(--vvd-color-neutral-300);\n}\n.control:where(:disabled, .disabled).appearance-ghost {\n --_appearance-color-text: var(--vvd-color-neutral-300);\n --_appearance-color-fill: transparent;\n --_appearance-color-outline: transparent;\n}\n.control:where(.readonly):where(:not(:disabled, .disabled)) {\n --_appearance-color-text: var(--vvd-color-canvas-text);\n --_appearance-color-fill: var(--vvd-color-neutral-200);\n --_appearance-color-outline: var(--vvd-color-neutral-400);\n}\n.control:where(.readonly):where(:not(:disabled, .disabled)).appearance-ghost {\n --_appearance-color-text: var(--vvd-color-neutral-600);\n --_appearance-color-fill: transparent;\n --_appearance-color-outline: transparent;\n}\n.control.connotation-success {\n /* @cssprop [--vvd-select-success-primary=var(--vvd-color-success-500)] */\n --_connotation-color-primary: var(--vvd-select-success-primary, var(--vvd-color-success-500));\n /* @cssprop [--vvd-select-success-backdrop=var(--vvd-color-success-50)] */\n --_connotation-color-backdrop: var(--vvd-select-success-backdrop, var(--vvd-color-success-50));\n /* @cssprop [--vvd-select-success-intermediate=var(--vvd-color-success-500)] */\n --_connotation-color-intermediate: var(--vvd-select-success-intermediate, var(--vvd-color-success-500));\n /* @cssprop [--vvd-select-success-firm=var(--vvd-color-success-600)] */\n --_connotation-color-firm: var(--vvd-select-success-firm, var(--vvd-color-success-600));\n}\n.control.connotation-alert {\n /* @cssprop [--vvd-select-alert-primary=var(--vvd-color-alert-500)] */\n --_connotation-color-primary: var(--vvd-select-alert-primary, var(--vvd-color-alert-500));\n /* @cssprop [--vvd-select-alert-backdrop=var(--vvd-color-alert-50)] */\n --_connotation-color-backdrop: var(--vvd-select-alert-backdrop, var(--vvd-color-alert-50));\n /* @cssprop [--vvd-select-alert-intermediate=var(--vvd-color-alert-500)] */\n --_connotation-color-intermediate: var(--vvd-select-alert-intermediate, var(--vvd-color-alert-500));\n /* @cssprop [--vvd-select-alert-firm=var(--vvd-color-alert-600)] */\n --_connotation-color-firm: var(--vvd-select-alert-firm, var(--vvd-color-alert-600));\n}\n.control:not(.connotation-success, .connotation-alert) {\n /* @cssprop [--vvd-select-accent-primary=var(--vvd-color-canvas-text)] */\n --_connotation-color-primary: var(--vvd-select-accent-primary, var(--vvd-color-canvas-text));\n /* @cssprop [--vvd-select-accent-backdrop=var(--vvd-color-canvas)] */\n --_connotation-color-backdrop: var(--vvd-select-accent-backdrop, var(--vvd-color-canvas));\n /* @cssprop [--vvd-select-accent-intermediate=var(--vvd-color-neutral-500)] */\n --_connotation-color-intermediate: var(--vvd-select-accent-intermediate, var(--vvd-color-neutral-500));\n /* @cssprop [--vvd-select-accent-firm=var(--vvd-color-canvas-text)] */\n --_connotation-color-firm: var(--vvd-select-accent-firm, var(--vvd-color-canvas-text));\n}\n.control-wrapper {\n position: relative;\n}\n.control:not(.disabled) {\n cursor: pointer;\n}\n.control.disabled {\n cursor: not-allowed;\n pointer-events: none;\n}\n.control:not(.shape-pill) {\n --_select-control-border-radius: 6px;\n}\n.control.shape-pill {\n --_select-control-border-radius: 24px;\n}\n\n.list-box {\n display: flex;\n max-height: var(--select-height, 408px);\n flex-direction: column;\n padding: 4px;\n gap: 2px;\n overflow-y: auto;\n}\n\n.icon {\n display: flex;\n flex-shrink: 0;\n}\n\n.selected-value {\n display: flex;\n overflow: hidden;\n flex-grow: 1;\n align-items: center;\n column-gap: 12px;\n white-space: nowrap;\n}\n.selected-value .text {\n overflow: hidden;\n max-inline-size: 100%;\n text-overflow: ellipsis;\n}\n.selected-value slot[name=icon] {\n flex: 0 0 20px;\n font-size: 20px;\n line-height: 1;\n}\n.control.has-meta .selected-value {\n padding-inline-end: 8px;\n}\n\n::part(popup-base) {\n inline-size: max-content;\n min-inline-size: var(--_select-fixed-width, 100%);\n}\n:host([multiple]) ::part(popup-base) {\n position: static;\n}\n\n.focus-indicator {\n border-radius: var(--_select-control-border-radius);\n pointer-events: none;\n}\n:host(:not(:focus-visible)) .focus-indicator {\n display: none;\n}\n:host([multiple]) .focus-indicator {\n --_select-control-border-radius: 6px;\n}";
|
|
398
520
|
|
|
399
|
-
class
|
|
400
|
-
|
|
521
|
+
let Select = class Select extends Select$1 {
|
|
522
|
+
constructor() {
|
|
523
|
+
super(...arguments);
|
|
524
|
+
this.fixedDropdown = false;
|
|
525
|
+
}
|
|
526
|
+
connectedCallback() {
|
|
527
|
+
super.connectedCallback();
|
|
528
|
+
this._popup.anchor = this._anchor;
|
|
529
|
+
}
|
|
530
|
+
get displayValue() {
|
|
531
|
+
var _a, _b, _c, _d;
|
|
532
|
+
Observable.track(this, 'displayValue');
|
|
533
|
+
return (_d = (_b = (_a = this.firstSelectedOption) === null || _a === void 0 ? void 0 : _a.getAttribute('label')) !== null && _b !== void 0 ? _b : (_c = this.firstSelectedOption) === null || _c === void 0 ? void 0 : _c.text) !== null && _d !== void 0 ? _d : '';
|
|
534
|
+
}
|
|
535
|
+
};
|
|
536
|
+
__decorate([attr, __metadata("design:type", String)], Select.prototype, "appearance", void 0);
|
|
537
|
+
__decorate([attr, __metadata("design:type", String)], Select.prototype, "shape", void 0);
|
|
538
|
+
__decorate([observable, __metadata("design:type", Array)], Select.prototype, "metaSlottedContent", void 0);
|
|
539
|
+
__decorate([attr({
|
|
540
|
+
mode: 'boolean',
|
|
541
|
+
attribute: 'fixed-dropdown'
|
|
542
|
+
}), __metadata("design:type", Object)], Select.prototype, "fixedDropdown", void 0);
|
|
543
|
+
Select = __decorate([errorText, formElements], Select);
|
|
544
|
+
applyMixins(Select, AffixIconWithTrailing, FormElementHelperText, FormElementSuccessText);
|
|
401
545
|
|
|
402
546
|
let _ = t => t,
|
|
403
547
|
_t,
|
|
404
|
-
_t2
|
|
405
|
-
|
|
548
|
+
_t2,
|
|
549
|
+
_t3,
|
|
550
|
+
_t4,
|
|
551
|
+
_t5;
|
|
552
|
+
const getStateClasses = ({
|
|
553
|
+
shape,
|
|
554
|
+
disabled,
|
|
555
|
+
appearance,
|
|
556
|
+
metaSlottedContent,
|
|
557
|
+
errorValidationMessage,
|
|
558
|
+
successText
|
|
559
|
+
}) => classNames(['disabled', disabled], [`appearance-${appearance}`, Boolean(appearance)], [`shape-${shape}`, Boolean(shape)], ['has-meta', Boolean(metaSlottedContent === null || metaSlottedContent === void 0 ? void 0 : metaSlottedContent.length)], ['error connotation-alert', Boolean(errorValidationMessage)], ['success connotation-success', !!successText], ['has-meta', Boolean(metaSlottedContent === null || metaSlottedContent === void 0 ? void 0 : metaSlottedContent.length)]);
|
|
560
|
+
function renderLabel() {
|
|
406
561
|
return html(_t || (_t = _`
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
562
|
+
<label for="control" class="label">
|
|
563
|
+
${0}
|
|
564
|
+
</label>`), x => x.label);
|
|
565
|
+
}
|
|
566
|
+
function selectValue(context) {
|
|
567
|
+
const affixIconTemplate = affixIconTemplateFactory(context, false);
|
|
568
|
+
const focusTemplate = focusTemplateFactory(context);
|
|
569
|
+
return html(_t2 || (_t2 = _`
|
|
570
|
+
<div
|
|
571
|
+
class="control ${0}"
|
|
572
|
+
?disabled="${0}"
|
|
573
|
+
id="control"
|
|
574
|
+
${0}
|
|
575
|
+
>
|
|
576
|
+
<div class="selected-value">
|
|
577
|
+
<slot name="icon">
|
|
578
|
+
${0}
|
|
579
|
+
</slot>
|
|
580
|
+
<span class="text">${0}</span>
|
|
581
|
+
<slot name="meta" ${0}></slot>
|
|
582
|
+
</div>
|
|
583
|
+
${0}
|
|
584
|
+
${0}
|
|
585
|
+
</div>
|
|
586
|
+
`), getStateClasses, x => x.disabled, ref('_anchor'), when(x => x.icon, html(_t3 || (_t3 = _`${0}`), x => affixIconTemplate(x.icon))), x => x.displayValue, slotted('metaSlottedContent'), () => affixIconTemplate('chevron-down-line'), () => focusTemplate);
|
|
587
|
+
}
|
|
588
|
+
function setFixedDropdownVarWidth(x) {
|
|
589
|
+
return x.open && x.fixedDropdown ? `--_select-fixed-width: ${Math.round(x.getBoundingClientRect().width)}px` : null;
|
|
590
|
+
}
|
|
591
|
+
function renderControl(context) {
|
|
592
|
+
const focusTemplate = focusTemplateFactory(context);
|
|
593
|
+
const popupTag = context.tagFor(Popup);
|
|
594
|
+
return html(_t4 || (_t4 = _`
|
|
417
595
|
${0}
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
596
|
+
<div class="control-wrapper">
|
|
597
|
+
${0}
|
|
598
|
+
<${0}
|
|
599
|
+
?open="${0}"
|
|
600
|
+
anchor="control"
|
|
601
|
+
placement="bottom-start"
|
|
602
|
+
strategy="${0}"
|
|
603
|
+
${0}
|
|
604
|
+
class="popup"
|
|
605
|
+
style="${0}"
|
|
606
|
+
>
|
|
607
|
+
<div
|
|
608
|
+
id="${0}"
|
|
609
|
+
role="listbox"
|
|
610
|
+
?disabled="${0}"
|
|
611
|
+
${0}
|
|
612
|
+
class="list-box"
|
|
613
|
+
>
|
|
614
|
+
${0}
|
|
615
|
+
<slot
|
|
616
|
+
${0}
|
|
617
|
+
></slot>
|
|
618
|
+
</div>
|
|
619
|
+
</${0}>
|
|
421
620
|
</div>
|
|
621
|
+
${0}
|
|
622
|
+
${0}
|
|
623
|
+
${0}
|
|
624
|
+
`), when(x => x.label, renderLabel()), when(x => !x.multiple, selectValue(context)), popupTag, x => x.collapsible ? x.open : true, x => x.fixedDropdown ? null : 'absolute', ref('_popup'), setFixedDropdownVarWidth, x => x.listboxId, x => x.disabled, ref('listbox'), when(x => x.multiple, focusTemplate), slotted({
|
|
625
|
+
filter: Listbox$1.slottedOptionFilter,
|
|
626
|
+
flatten: true,
|
|
627
|
+
property: 'slottedOptions'
|
|
628
|
+
}), popupTag, when(x => {
|
|
629
|
+
var _a;
|
|
630
|
+
return (_a = x.helperText) === null || _a === void 0 ? void 0 : _a.length;
|
|
631
|
+
}, getFeedbackTemplate('helper', context)), when(x => !x.successText && x.errorValidationMessage, getFeedbackTemplate('error', context)), when(x => x.successText, getFeedbackTemplate('success', context)));
|
|
632
|
+
}
|
|
633
|
+
const SelectTemplate = context => {
|
|
634
|
+
return html(_t5 || (_t5 = _`
|
|
635
|
+
<template class="base"
|
|
636
|
+
aria-label="${0}"
|
|
637
|
+
aria-activedescendant="${0}"
|
|
638
|
+
aria-controls="${0}"
|
|
639
|
+
aria-disabled="${0}"
|
|
640
|
+
aria-expanded="${0}"
|
|
641
|
+
aria-haspopup="${0}"
|
|
642
|
+
aria-multiselectable="${0}"
|
|
643
|
+
?open="${0}"
|
|
644
|
+
role="combobox"
|
|
645
|
+
tabindex="${0}"
|
|
646
|
+
@click="${0}"
|
|
647
|
+
@focusin="${0}"
|
|
648
|
+
@focusout="${0}"
|
|
649
|
+
@keydown="${0}"
|
|
650
|
+
@mousedown="${0}"
|
|
651
|
+
>
|
|
652
|
+
${0}
|
|
422
653
|
</template>
|
|
423
|
-
`), x => x.
|
|
424
|
-
property: 'slottedRadioButtons',
|
|
425
|
-
filter: elements(context.tagFor(Radio))
|
|
426
|
-
}));
|
|
654
|
+
`), x => x.ariaLabel ? x.ariaLabel : x.label, x => x.ariaActiveDescendant, x => x.ariaControls, x => x.ariaDisabled, x => x.ariaExpanded, x => x.collapsible ? 'listbox' : null, x => x.ariaMultiSelectable, x => x.open, x => !x.disabled ? '0' : null, (x, c) => x.clickHandler(c.event), (x, c) => x.focusinHandler(c.event), (x, c) => x.focusoutHandler(c.event), (x, c) => x.keydownHandler(c.event), (x, c) => x.mousedownHandler(c.event), renderControl(context));
|
|
427
655
|
};
|
|
428
656
|
|
|
429
|
-
const
|
|
430
|
-
baseName: '
|
|
431
|
-
template:
|
|
657
|
+
const selectDefinition = Select.compose({
|
|
658
|
+
baseName: 'select',
|
|
659
|
+
template: SelectTemplate,
|
|
432
660
|
styles: css_248z
|
|
433
661
|
});
|
|
434
|
-
const
|
|
435
|
-
const
|
|
662
|
+
const selectRegistries = [selectDefinition(), ...focusRegistries, ...popupRegistries, ...iconRegistries, ...listboxOptionRegistries];
|
|
663
|
+
const registerSelect = registerFactory(selectRegistries);
|
|
436
664
|
|
|
437
|
-
export {
|
|
665
|
+
export { selectRegistries as a, registerSelect as r, selectDefinition as s };
|