@vonage/vivid 3.25.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.
Files changed (120) hide show
  1. package/accordion/index.js +0 -1
  2. package/accordion-item/index.js +0 -1
  3. package/alert/index.js +0 -1
  4. package/avatar/index.js +0 -1
  5. package/badge/index.js +0 -1
  6. package/banner/index.js +0 -1
  7. package/breadcrumb-item/index.js +0 -1
  8. package/button/index.js +0 -1
  9. package/card/index.js +0 -1
  10. package/checkbox/index.js +0 -1
  11. package/combobox/index.js +0 -1
  12. package/custom-elements.json +35 -1
  13. package/data-grid/index.js +7 -2
  14. package/dialog/index.js +0 -1
  15. package/empty-state/index.js +0 -1
  16. package/fab/index.js +0 -1
  17. package/icon/index.js +0 -1
  18. package/index.js +27 -29
  19. package/lib/components.d.ts +0 -2
  20. package/lib/data-grid/data-grid-cell.d.ts +14 -1
  21. package/lib/data-grid/data-grid.options.d.ts +7 -0
  22. package/listbox/index.js +56 -11
  23. package/menu/index.js +2 -3
  24. package/menu-item/index.js +1 -2
  25. package/nav/index.js +1 -1
  26. package/nav-disclosure/index.js +1 -2
  27. package/nav-item/index.js +1 -2
  28. package/note/index.js +1 -2
  29. package/number-field/index.js +1 -2
  30. package/option/index.js +0 -1
  31. package/package.json +1 -1
  32. package/pagination/index.js +1 -2
  33. package/popup/index.js +0 -1
  34. package/progress/index.js +1 -1
  35. package/radio/index.js +1 -1
  36. package/radio-group/index.js +1 -1
  37. package/select/index.js +1 -2
  38. package/shared/definition.js +1 -1
  39. package/shared/definition10.js +1 -1
  40. package/shared/definition11.js +1 -1
  41. package/shared/definition12.js +1 -1
  42. package/shared/definition14.js +1 -1
  43. package/shared/definition15.js +1 -1
  44. package/shared/definition16.js +2 -2
  45. package/shared/definition17.js +1 -1
  46. package/shared/definition18.js +1 -1
  47. package/shared/definition19.js +1 -1
  48. package/shared/definition2.js +1 -1
  49. package/shared/definition21.js +1 -1
  50. package/shared/definition22.js +68 -21
  51. package/shared/definition23.js +1 -1
  52. package/shared/definition24.js +1 -1
  53. package/shared/definition25.js +1 -1
  54. package/shared/definition26.js +1 -1
  55. package/shared/definition27.js +1 -1
  56. package/shared/definition29.js +368 -48
  57. package/shared/definition30.js +301 -296
  58. package/shared/definition31.js +14 -376
  59. package/shared/definition32.js +70 -13
  60. package/shared/definition33.js +25 -66
  61. package/shared/definition34.js +39 -27
  62. package/shared/definition35.js +431 -31
  63. package/shared/definition36.js +214 -430
  64. package/shared/definition37.js +70 -209
  65. package/shared/definition38.js +33 -81
  66. package/shared/definition39.js +423 -32
  67. package/shared/definition4.js +1 -1
  68. package/shared/definition40.js +586 -358
  69. package/shared/definition41.js +73 -648
  70. package/shared/definition42.js +584 -70
  71. package/shared/definition43.js +81 -538
  72. package/shared/definition44.js +52 -127
  73. package/shared/definition45.js +16 -56
  74. package/shared/definition46.js +485 -17
  75. package/shared/definition47.js +99 -477
  76. package/shared/definition48.js +19 -114
  77. package/shared/definition49.js +276 -19
  78. package/shared/definition5.js +1 -1
  79. package/shared/definition50.js +89 -245
  80. package/shared/definition51.js +627 -118
  81. package/shared/definition52.js +86 -601
  82. package/shared/definition53.js +68 -112
  83. package/shared/definition54.js +294 -69
  84. package/shared/definition6.js +1 -1
  85. package/shared/definition7.js +1 -1
  86. package/shared/definition8.js +1 -1
  87. package/shared/definition9.js +1 -1
  88. package/shared/es.object.assign.js +1 -1
  89. package/shared/es.regexp.to-string.js +1 -1
  90. package/shared/es.string.includes.js +1 -1
  91. package/shared/form-elements.js +1 -1
  92. package/shared/icon.js +17 -13
  93. package/shared/index.js +1 -1
  94. package/shared/patterns/form-elements/form-elements.d.ts +4 -4
  95. package/shared/string-trim.js +1 -1
  96. package/shared/text-field.js +1 -1
  97. package/shared/to-string.js +1 -1
  98. package/side-drawer/index.js +1 -1
  99. package/slider/index.js +1 -1
  100. package/styles/core/all.css +1 -1
  101. package/styles/core/theme.css +1 -1
  102. package/styles/core/typography.css +1 -1
  103. package/styles/tokens/theme-dark.css +4 -4
  104. package/styles/tokens/theme-light.css +4 -4
  105. package/switch/index.js +1 -2
  106. package/tab/index.js +1 -2
  107. package/tab-panel/index.js +1 -1
  108. package/tabs/index.js +3 -4
  109. package/tag/index.js +1 -2
  110. package/tag-group/index.js +1 -1
  111. package/text-anchor/index.js +0 -1
  112. package/text-area/index.js +1 -2
  113. package/text-field/index.js +1 -2
  114. package/toggletip/index.js +1 -2
  115. package/tooltip/index.js +1 -2
  116. package/tree-item/index.js +1 -2
  117. package/tree-view/index.js +1 -1
  118. package/vivid.api.json +0 -191
  119. package/shared/definition55.js +0 -305
  120. package/shared/engine-is-node.js +0 -8
@@ -1,437 +1,665 @@
1
- import { F as FoundationElement, _ as __decorate, a as attr, o as observable, b as __metadata, h as html, r as registerFactory } from './index.js';
2
- import { D as Direction, g as getDirection } from './direction.js';
3
- import { h as keyArrowRight, i as keyArrowLeft, A as ArrowKeys, c as keyArrowUp, b as keyArrowDown, d as keyEnter } from './key-codes.js';
4
- import { O as Orientation } from './aria.js';
5
- import { R as Radio } from './radio.js';
6
- import { e as elements } from './node-observation.js';
7
- import { O as Orientation$1 } from './aria2.js';
8
- import { s as slotted } from './slotted.js';
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
- * An Radio Group Custom HTML Element.
13
- * Implements the {@link https://www.w3.org/TR/wai-aria-1.1/#radiogroup | ARIA radiogroup }.
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 label - The slot for the label
16
- * @slot - The default slot for radio buttons
17
- * @csspart positioning-region - The positioning region for laying out the radios
18
- * @fires change - Fires a custom 'change' event when the value changes
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 RadioGroup$1 extends FoundationElement {
55
+ class Select$1 extends FormAssociatedSelect {
23
56
  constructor() {
24
57
  super(...arguments);
25
58
  /**
26
- * The orientation of the group
59
+ * The open attribute.
27
60
  *
28
61
  * @public
29
62
  * @remarks
30
- * HTML Attribute: orientation
63
+ * HTML Attribute: open
31
64
  */
32
- this.orientation = Orientation.horizontal;
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.focusOutHandler = (e) => {
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.clickHandler = (e) => {
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
- * keyboard handling per https://w3c.github.io/aria-practices/#for-radio-groups-not-contained-in-a-toolbar
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.keydownHandler = (e) => {
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
- readOnlyChanged() {
252
- if (this.slottedRadioButtons !== undefined) {
253
- this.slottedRadioButtons.forEach((radio) => {
254
- if (this.readOnly) {
255
- radio.readOnly = true;
256
- }
257
- else {
258
- radio.readOnly = false;
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
- disabledChanged() {
264
- if (this.slottedRadioButtons !== undefined) {
265
- this.slottedRadioButtons.forEach((radio) => {
266
- if (this.disabled) {
267
- radio.disabled = true;
268
- }
269
- else {
270
- radio.disabled = false;
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
- nameChanged() {
276
- if (this.slottedRadioButtons) {
277
- this.slottedRadioButtons.forEach((radio) => {
278
- radio.setAttribute("name", this.name);
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
- valueChanged() {
283
- if (this.slottedRadioButtons) {
284
- this.slottedRadioButtons.forEach((radio) => {
285
- if (radio.value === this.value) {
286
- radio.checked = true;
287
- this.selectedRadio = radio;
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
- slottedRadioButtonsChanged(oldValue, newValue) {
294
- if (this.slottedRadioButtons && this.slottedRadioButtons.length > 0) {
295
- this.setupRadioButtons();
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
- get parentToolbar() {
299
- return this.closest('[role="toolbar"]');
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
- get isInsideToolbar() {
302
- var _a;
303
- return ((_a = this.parentToolbar) !== null && _a !== void 0 ? _a : false);
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
- get isInsideFoundationToolbar() {
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
- return !!((_a = this.parentToolbar) === null || _a === void 0 ? void 0 : _a["$fastController"]);
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
- connectedCallback() {
313
- super.connectedCallback();
314
- this.direction = getDirection(this);
315
- this.setupRadioButtons();
298
+ handleChange(source, propertyName) {
299
+ super.handleChange(source, propertyName);
300
+ if (propertyName === "value") {
301
+ this.updateValue();
302
+ }
316
303
  }
317
- disconnectedCallback() {
318
- this.slottedRadioButtons.forEach((radio) => {
319
- radio.removeEventListener("change", this.radioChangeHandler);
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
- setupRadioButtons() {
323
- const checkedRadios = this.slottedRadioButtons.filter((radio) => {
324
- return radio.hasAttribute("checked");
317
+ super.slottedOptionsChanged(prev, next);
318
+ this.options.forEach(o => {
319
+ const notifier = Observable.getNotifier(o);
320
+ notifier.subscribe(this, "value");
325
321
  });
326
- const numberOfCheckedRadios = checkedRadios ? checkedRadios.length : 0;
327
- if (numberOfCheckedRadios > 1) {
328
- const lastCheckedRadio = checkedRadios[numberOfCheckedRadios - 1];
329
- lastCheckedRadio.checked = true;
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
- let foundMatchingVal = false;
332
- this.slottedRadioButtons.forEach((radio) => {
333
- if (this.name !== undefined) {
334
- radio.setAttribute("name", this.name);
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
- if (this.disabled) {
337
- radio.disabled = true;
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
- if (this.readOnly) {
340
- radio.readOnly = true;
423
+ case keyHome:
424
+ case keyEnd: {
425
+ e.preventDefault();
426
+ break;
341
427
  }
342
- if (this.value && this.value === radio.value) {
343
- this.selectedRadio = radio;
344
- this.focusedRadio = radio;
345
- radio.checked = true;
346
- radio.setAttribute("tabindex", "0");
347
- foundMatchingVal = true;
428
+ case keyEnter: {
429
+ e.preventDefault();
430
+ this.open = !this.open;
431
+ break;
348
432
  }
349
- else {
350
- if (!this.isInsideFoundationToolbar) {
351
- radio.setAttribute("tabindex", "-1");
433
+ case keyEscape: {
434
+ if (this.collapsible && this.open) {
435
+ e.preventDefault();
436
+ this.open = false;
352
437
  }
353
- radio.checked = false;
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
- else {
369
- this.slottedRadioButtons[0].setAttribute("tabindex", "0");
370
- this.focusedRadio = this.slottedRadioButtons[0];
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: "readonly", mode: "boolean" })
377
- ], RadioGroup$1.prototype, "readOnly", void 0);
489
+ attr({ attribute: "open", mode: "boolean" })
490
+ ], Select$1.prototype, "open", void 0);
378
491
  __decorate([
379
- attr({ attribute: "disabled", mode: "boolean" })
380
- ], RadioGroup$1.prototype, "disabled", void 0);
492
+ volatile
493
+ ], Select$1.prototype, "collapsible", null);
381
494
  __decorate([
382
- attr
383
- ], RadioGroup$1.prototype, "name", void 0);
495
+ observable
496
+ ], Select$1.prototype, "control", void 0);
384
497
  __decorate([
385
- attr
386
- ], RadioGroup$1.prototype, "value", void 0);
498
+ attr({ attribute: "position" })
499
+ ], Select$1.prototype, "positionAttribute", void 0);
387
500
  __decorate([
388
- attr
389
- ], RadioGroup$1.prototype, "orientation", void 0);
501
+ observable
502
+ ], Select$1.prototype, "position", void 0);
390
503
  __decorate([
391
504
  observable
392
- ], RadioGroup$1.prototype, "childItems", void 0);
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
- ], RadioGroup$1.prototype, "slottedRadioButtons", void 0);
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 Thu, 20 Jul 2023 11:19:49 GMT\n */\n.positioning-region {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n}\n.positioning-region.vertical {\n flex-direction: column;\n}\nlabel + .positioning-region {\n margin-block-start: 8px;\n}\n\nlabel {\n color: var(--vvd-color-canvas-text);\n font: var(--vvd-typography-base);\n}";
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 RadioGroup extends RadioGroup$1 {}
400
- __decorate([attr, __metadata("design:type", String)], RadioGroup.prototype, "label", void 0);
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
- const RadioGroupTemplate = context => {
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
- <template
408
- role="radiogroup"
409
- aria-disabled="${0}"
410
- aria-readonly="${0}"
411
- aria-orientation="${0}"
412
- @click="${0}"
413
- @keydown="${0}"
414
- @focusout="${0}"
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
- <div class="positioning-region ${0}">
420
- <slot ${0}></slot>
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.disabled, x => x.readOnly, x => x.orientation, (x, c) => x.clickHandler(c.event), (x, c) => x.keydownHandler(c.event), (x, c) => x.focusOutHandler(c.event), when(x => x.label, html(_t2 || (_t2 = _`<label>${0}</label>`), x => x.label)), x => x.orientation === Orientation$1.horizontal ? 'horizontal' : 'vertical', slotted({
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 radioGroupDefinition = RadioGroup.compose({
430
- baseName: 'radio-group',
431
- template: RadioGroupTemplate,
657
+ const selectDefinition = Select.compose({
658
+ baseName: 'select',
659
+ template: SelectTemplate,
432
660
  styles: css_248z
433
661
  });
434
- const radioGroupRegistries = [radioGroupDefinition()];
435
- const registerRadioGroup = registerFactory(radioGroupRegistries);
662
+ const selectRegistries = [selectDefinition(), ...focusRegistries, ...popupRegistries, ...iconRegistries, ...listboxOptionRegistries];
663
+ const registerSelect = registerFactory(selectRegistries);
436
664
 
437
- export { radioGroupDefinition as a, radioGroupRegistries as b, registerRadioGroup as r };
665
+ export { selectRegistries as a, registerSelect as r, selectDefinition as s };