@oscarpalmer/oui 0.37.0 → 0.39.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 (183) hide show
  1. package/dist/css/a11y.css +1 -0
  2. package/dist/css/badge.css +12 -8
  3. package/dist/css/button.css +111 -14
  4. package/dist/css/color-picker.css +859 -0
  5. package/dist/css/color.css +86 -87
  6. package/dist/css/combobox.css +105 -4
  7. package/dist/css/content.css +8 -6
  8. package/dist/css/floatable.css +3 -3
  9. package/dist/css/form.css +106 -6
  10. package/dist/css/icon.css +99 -0
  11. package/dist/css/listbox.css +5 -0
  12. package/dist/css/message.css +6 -3
  13. package/dist/css/mixins/badge.mixins.css +2 -0
  14. package/dist/css/mixins/button.mixins.css +3 -0
  15. package/dist/css/mixins/message.mixins.css +1 -0
  16. package/dist/css/mixins/misc.mixins.css +2 -0
  17. package/dist/css/mixins/shadow.mixins.css +1 -0
  18. package/dist/css/reset.css +3 -3
  19. package/dist/css/splitter.css +1 -1
  20. package/dist/css/tabs.css +115 -23
  21. package/dist/css/typography.css +90 -0
  22. package/dist/js/color-picker/constants.color-picker.d.mts +2 -0
  23. package/dist/js/color-picker/constants.color-picker.mjs +59 -0
  24. package/dist/js/color-picker/dom.color-picker.d.mts +8 -0
  25. package/dist/js/color-picker/dom.color-picker.mjs +191 -0
  26. package/dist/js/color-picker/event.color-picker.d.mts +9 -0
  27. package/dist/js/color-picker/event.color-picker.mjs +2 -0
  28. package/dist/js/color-picker/form.color-picker.d.mts +5 -0
  29. package/dist/js/color-picker/form.color-picker.mjs +24 -0
  30. package/dist/js/color-picker/index.d.mts +2 -0
  31. package/dist/js/color-picker/index.mjs +303 -0
  32. package/dist/js/color-picker/misc.color-picker.d.mts +2 -0
  33. package/dist/js/color-picker/misc.color-picker.mjs +2 -0
  34. package/dist/js/color-picker/models.color-picker.d.mts +2 -0
  35. package/dist/js/color-picker/models.color-picker.mjs +24 -0
  36. package/dist/js/color-picker/output.color-picker.d.mts +8 -0
  37. package/dist/js/color-picker/output.color-picker.mjs +233 -0
  38. package/dist/js/color-picker/state.color-picker.d.mts +8 -0
  39. package/dist/js/color-picker/state.color-picker.mjs +2 -0
  40. package/dist/js/combobox/constants.combobox.d.mts +1 -1
  41. package/dist/js/combobox/dom.combobox.d.mts +12 -13
  42. package/dist/js/combobox/dom.combobox.mjs +12 -5
  43. package/dist/js/combobox/event.combobox.d.mts +20 -21
  44. package/dist/js/combobox/event.combobox.mjs +1 -1
  45. package/dist/js/combobox/index.d.mts +1 -1
  46. package/dist/js/combobox/index.mjs +56 -2
  47. package/dist/js/combobox/misc.combobox.d.mts +1 -1
  48. package/dist/js/combobox/misc.combobox.mjs +1 -1
  49. package/dist/js/combobox/models.combobox.d.mts +12 -13
  50. package/dist/js/combobox/state.combobox.d.mts +8 -9
  51. package/dist/js/combobox/state.combobox.mjs +1 -1
  52. package/dist/js/constants.color-picker-B-gFjL8m.d.mts +364 -0
  53. package/dist/js/constants.combobox-8EMRmv09.d.mts +18 -0
  54. package/dist/js/constants.listbox-DGnX32kv.d.mts +8 -0
  55. package/dist/js/dialog.d.mts +2 -2
  56. package/dist/js/dialog.mjs +1 -1
  57. package/dist/js/{draggable-a6w0J1OD.d.mts → draggable-B5-70SZm.d.mts} +5 -4
  58. package/dist/js/event.color-picker-BEpq0Adu.mjs +485 -0
  59. package/dist/js/floatable/floatable.embedded.d.mts +1 -1
  60. package/dist/js/floatable/floatable.embedded.mjs +11 -8
  61. package/dist/js/floatable/floatable.standalone.d.mts +1 -1
  62. package/dist/js/{floatable.embedded-Bct4U5Dm.d.mts → floatable.embedded-DQYkXt8X.d.mts} +1 -1
  63. package/dist/js/focus-trap/focus-trap.embedded.d.mts +1 -1
  64. package/dist/js/focus-trap/focus-trap.standalone.d.mts +1 -1
  65. package/dist/js/{focus-trap.embedded-DR8NpZfr.d.mts → focus-trap.embedded-CjyFQYow.d.mts} +2 -2
  66. package/dist/js/{index-EfkUSals.d.mts → index-C5D3-oiI.d.mts} +41 -3
  67. package/dist/js/index.d.mts +8 -7
  68. package/dist/js/index.mjs +6 -3
  69. package/dist/js/internal/attributable.d.mts +2 -3
  70. package/dist/js/internal/draggable.d.mts +1 -1
  71. package/dist/js/internal/draggable.mjs +1 -1
  72. package/dist/js/internal/listbox/listbox.constants.d.mts +7 -10
  73. package/dist/js/internal/listbox/listbox.constants.mjs +15 -16
  74. package/dist/js/internal/listbox/listbox.data.d.mts +9 -10
  75. package/dist/js/internal/listbox/listbox.data.mjs +1 -1
  76. package/dist/js/internal/listbox/listbox.dom.d.mts +19 -20
  77. package/dist/js/internal/listbox/listbox.dom.mjs +1 -1
  78. package/dist/js/internal/listbox/listbox.event.d.mts +3 -4
  79. package/dist/js/internal/listbox/listbox.event.mjs +4 -4
  80. package/dist/js/internal/listbox/listbox.form.d.mts +4 -5
  81. package/dist/js/internal/listbox/listbox.form.mjs +16 -15
  82. package/dist/js/internal/listbox/listbox.misc.d.mts +10 -11
  83. package/dist/js/internal/listbox/listbox.misc.mjs +1 -1
  84. package/dist/js/internal/listbox/listbox.model.d.mts +1 -1
  85. package/dist/js/internal/listbox/listbox.state.d.mts +5 -6
  86. package/dist/js/internal/listbox/listbox.state.mjs +3 -3
  87. package/dist/js/internal/misc.d.mts +4 -4
  88. package/dist/js/internal/misc.mjs +9 -1
  89. package/dist/js/internal/navigable.d.mts +9 -10
  90. package/dist/js/internal/navigable.mjs +1 -0
  91. package/dist/js/listbox/constants.listbox.d.mts +1 -1
  92. package/dist/js/listbox/event.listbox.d.mts +6 -7
  93. package/dist/js/listbox/event.listbox.mjs +1 -1
  94. package/dist/js/listbox/index.d.mts +43 -5
  95. package/dist/js/listbox/index.mjs +56 -2
  96. package/dist/js/listbox/misc.listbox.d.mts +1 -1
  97. package/dist/js/listbox/misc.listbox.mjs +1 -1
  98. package/dist/js/listbox/state.listbox.d.mts +7 -8
  99. package/dist/js/listbox/state.listbox.mjs +1 -1
  100. package/dist/js/{listbox.data-BWd0PCy7.mjs → listbox.data-DQ7-x2uY.mjs} +8 -7
  101. package/dist/js/{listbox.model-CRReGOmu.d.mts → listbox.model-BHPA7GM4.d.mts} +3 -3
  102. package/dist/js/menu.mjs +1 -1
  103. package/dist/js/{misc.listbox-BI-XsTOf.mjs → misc.listbox-DKB-j0UK.mjs} +4 -5
  104. package/dist/js/{misc.listbox-gnoJhrTr.d.mts → misc.listbox-mZMuYOxg.d.mts} +1 -1
  105. package/dist/js/movable/movable.embedded.d.mts +1 -1
  106. package/dist/js/movable/movable.standalone.d.mts +1 -1
  107. package/dist/js/popover.d.mts +2 -2
  108. package/dist/js/popover.mjs +1 -1
  109. package/dist/js/resizable/resizable.embedded.d.mts +1 -1
  110. package/dist/js/resizable/resizable.embedded.mjs +1 -1
  111. package/dist/js/resizable/resizable.standalone.d.mts +1 -1
  112. package/dist/js/{resizable.embedded-3qoR0Bjm.d.mts → resizable.embedded-dvhdfQgt.d.mts} +1 -1
  113. package/dist/js/sortable/sortable.embedded.d.mts +1 -1
  114. package/dist/js/sortable/sortable.standalone.d.mts +1 -1
  115. package/dist/js/splitter.d.mts +2 -3
  116. package/dist/js/splitter.mjs +2 -2
  117. package/dist/js/{state.combobox-4xq0FPCF.mjs → state.combobox-BWDFHwoi.mjs} +9 -9
  118. package/dist/js/tabs.d.mts +4 -5
  119. package/dist/js/tabs.mjs +4 -7
  120. package/dist/js/tooltip.d.mts +1 -1
  121. package/package.json +24 -22
  122. package/dist/js/constants.combobox-DmRAMC64.d.mts +0 -26
  123. package/dist/js/constants.listbox-DRsXUxd3.d.mts +0 -14
  124. package/src/css/a11y.scss +0 -13
  125. package/src/css/badge.scss +0 -62
  126. package/src/css/button.scss +0 -50
  127. package/src/css/color.scss +0 -115
  128. package/src/css/combobox.scss +0 -252
  129. package/src/css/content.scss +0 -180
  130. package/src/css/flex.scss +0 -107
  131. package/src/css/floatable.scss +0 -152
  132. package/src/css/form.scss +0 -573
  133. package/src/css/listbox.scss +0 -120
  134. package/src/css/message.scss +0 -73
  135. package/src/css/mixins.scss +0 -419
  136. package/src/css/reset.scss +0 -392
  137. package/src/css/splitter.scss +0 -89
  138. package/src/css/table.scss +0 -107
  139. package/src/css/tabs.scss +0 -85
  140. package/src/js/combobox/constants.combobox.ts +0 -83
  141. package/src/js/combobox/dom.combobox.ts +0 -407
  142. package/src/js/combobox/event.combobox.ts +0 -365
  143. package/src/js/combobox/index.ts +0 -320
  144. package/src/js/combobox/misc.combobox.ts +0 -104
  145. package/src/js/combobox/models.combobox.ts +0 -54
  146. package/src/js/combobox/state.combobox.ts +0 -246
  147. package/src/js/dialog.ts +0 -255
  148. package/src/js/floatable/floatable.embedded.ts +0 -332
  149. package/src/js/floatable/floatable.standalone.ts +0 -6
  150. package/src/js/focus-trap/focus-trap.embedded.ts +0 -411
  151. package/src/js/focus-trap/focus-trap.standalone.ts +0 -1
  152. package/src/js/index.ts +0 -15
  153. package/src/js/internal/attributable.ts +0 -73
  154. package/src/js/internal/draggable.ts +0 -657
  155. package/src/js/internal/listbox/listbox.constants.ts +0 -25
  156. package/src/js/internal/listbox/listbox.data.ts +0 -287
  157. package/src/js/internal/listbox/listbox.dom.ts +0 -445
  158. package/src/js/internal/listbox/listbox.event.ts +0 -129
  159. package/src/js/internal/listbox/listbox.form.ts +0 -115
  160. package/src/js/internal/listbox/listbox.misc.ts +0 -135
  161. package/src/js/internal/listbox/listbox.model.ts +0 -169
  162. package/src/js/internal/listbox/listbox.state.ts +0 -82
  163. package/src/js/internal/misc.ts +0 -27
  164. package/src/js/internal/navigable.ts +0 -315
  165. package/src/js/l10n.ts +0 -192
  166. package/src/js/listbox/constants.listbox.ts +0 -61
  167. package/src/js/listbox/event.listbox.ts +0 -106
  168. package/src/js/listbox/index.ts +0 -302
  169. package/src/js/listbox/misc.listbox.ts +0 -70
  170. package/src/js/listbox/state.listbox.ts +0 -196
  171. package/src/js/menu.ts +0 -348
  172. package/src/js/movable/movable.embedded.ts +0 -318
  173. package/src/js/movable/movable.standalone.ts +0 -2
  174. package/src/js/popover.ts +0 -229
  175. package/src/js/resizable/resizable.embedded.ts +0 -413
  176. package/src/js/resizable/resizable.standalone.ts +0 -5
  177. package/src/js/sortable/sortable.embedded.ts +0 -527
  178. package/src/js/sortable/sortable.standalone.ts +0 -2
  179. package/src/js/splitter.ts +0 -583
  180. package/src/js/tabs.ts +0 -447
  181. package/src/js/toolbar.ts +0 -63
  182. package/src/js/tooltip.ts +0 -367
  183. /package/dist/css/{mixins.css → mixins/input.mixins.css} +0 -0
@@ -1,302 +0,0 @@
1
- import {parse} from '@oscarpalmer/atoms/string';
2
- import {getAttribute} from '@oscarpalmer/toretto/attribute';
3
- import {setListboxValue, setListboxValues} from '../internal/listbox/listbox.data';
4
- import {
5
- setListboxDisabled,
6
- setListboxFilter,
7
- setListboxLimit,
8
- setListboxReadonly,
9
- setListboxRequired,
10
- } from '../internal/listbox/listbox.misc';
11
- import type {OuiListboxLocalizations, OuiListboxState} from '../internal/listbox/listbox.model';
12
- import {attachListbox, detachListbox} from '../internal/listbox/listbox.state';
13
- import {LISTBOX_TAGNAME} from './constants.listbox';
14
- import {updateListboxLocalizations} from './misc.listbox';
15
- import {createListboxState, listboxStates, onAttachListbox, onDetachListbox} from './state.listbox';
16
-
17
- // #region Types
18
-
19
- declare global {
20
- interface HTMLElementTagNameMap {
21
- [LISTBOX_TAGNAME]: OuiListboxElement;
22
- }
23
- }
24
-
25
- export class OuiListboxElement extends HTMLElement {
26
- static formAssociated = true;
27
-
28
- static observedAttributes = ['max', 'min', 'required', 'value'];
29
-
30
- readonly #internals: ElementInternals;
31
-
32
- #restored?: string[];
33
-
34
- #state!: OuiListboxState;
35
-
36
- /**
37
- * Is the listbox disabled?
38
- */
39
- get disabled(): boolean {
40
- return this.#state?.disabled ?? false;
41
- }
42
-
43
- /**
44
- * Should the listbox be disabled?
45
- */
46
- set disabled(value: boolean) {
47
- if (typeof value === 'boolean' && value !== this.disabled) {
48
- setListboxDisabled(this.#state, value);
49
- }
50
- }
51
-
52
- /**
53
- * Current filter value
54
- */
55
- get filter(): string {
56
- return this.#state.filter.element.value;
57
- }
58
-
59
- /**
60
- * Set the filter value
61
- */
62
- set filter(value: string) {
63
- setListboxFilter(this.#state, value);
64
- }
65
-
66
- /**
67
- * Maximum number of selected options
68
- */
69
- get max(): number | undefined {
70
- return this.#state?.max;
71
- }
72
-
73
- /**
74
- * Set the maximum number of selected options
75
- */
76
- set max(value: number) {
77
- setListboxLimit('max', this.#state, value);
78
- }
79
-
80
- /**
81
- * Minimum number of selected options
82
- */
83
- get min(): number | undefined {
84
- return this.#state?.min;
85
- }
86
-
87
- /**
88
- * Set the minimum number of selected options
89
- */
90
- set min(value: number) {
91
- setListboxLimit('min', this.#state, value);
92
- }
93
-
94
- /**
95
- * Does the listbox allow multiple values?
96
- */
97
- get multiple(): boolean {
98
- return this.hasAttribute('multiple');
99
- }
100
-
101
- /**
102
- * Name of the listbox
103
- */
104
- get name(): string {
105
- return getAttribute(this, 'name') ?? '';
106
- }
107
-
108
- /**
109
- * Is the listbox readonly?
110
- */
111
- get readonly(): boolean {
112
- return this.#state?.readonly ?? false;
113
- }
114
-
115
- /**
116
- * Should the listbox be readonly?
117
- */
118
- set readonly(value: boolean) {
119
- if (typeof value === 'boolean' && value !== this.readonly) {
120
- setListboxReadonly(this.#state, value);
121
- }
122
- }
123
-
124
- /**
125
- * Is the listbox required?
126
- */
127
- get required(): boolean {
128
- return this.#state?.required ?? false;
129
- }
130
-
131
- /**
132
- * Should the listbox be required?
133
- */
134
- set required(value: boolean) {
135
- if (typeof value === 'boolean' && value !== this.required) {
136
- setListboxRequired(this.#state, value);
137
- }
138
- }
139
-
140
- /**
141
- * Selected options
142
- */
143
- get selected(): HTMLElement[] {
144
- return this.#state.options.selected.slice();
145
- }
146
-
147
- /**
148
- * Current value
149
- */
150
- get value(): string {
151
- return this.#state.values.current[0];
152
- }
153
-
154
- /**
155
- * Set the value
156
- */
157
- set value(value: unknown) {
158
- setListboxValue(this.#state, value);
159
- }
160
-
161
- /**
162
- * Current values
163
- */
164
- get values(): string[] {
165
- return this.#state.values.current.slice();
166
- }
167
-
168
- /**
169
- * Set the values
170
- */
171
- set values(values: unknown[]) {
172
- setListboxValues(this.#state, values);
173
- }
174
-
175
- constructor() {
176
- super();
177
-
178
- this.#internals = this.attachInternals();
179
- }
180
-
181
- attributeChangedCallback(name: string, _: string | null, value: string | null): void {
182
- if (this.#state == null) {
183
- return;
184
- }
185
-
186
- switch (name) {
187
- case 'required':
188
- this[name] = this.hasAttribute(name);
189
- break;
190
-
191
- case 'max':
192
- case 'min':
193
- setListboxLimit(name, this.#state, value);
194
- break;
195
-
196
- case 'value':
197
- this.value = value ?? '';
198
- break;
199
-
200
- default:
201
- break;
202
- }
203
- }
204
-
205
- /**
206
- * Clear all selected options
207
- */
208
- clear(): void {
209
- setListboxValues(this.#state, []);
210
- }
211
-
212
- connectedCallback(): void {
213
- if (this.#state == null) {
214
- this.#initialize();
215
- } else {
216
- attachListbox(this.#state, listboxStates, onAttachListbox);
217
- }
218
- }
219
-
220
- disconnectedCallback(): void {
221
- if (this.#state != null) {
222
- detachListbox(this.#state, listboxStates, onDetachListbox);
223
- }
224
- }
225
-
226
- formDisabledCallback(disabled: boolean): void {
227
- this.disabled = disabled;
228
- }
229
-
230
- formResetCallback(): void {
231
- setListboxValues(this.#state, this.#state.values.initial);
232
- }
233
-
234
- formStateRestoreCallback(state: string | File | FormData, reason: unknown): void {
235
- if (reason !== 'restore') {
236
- return;
237
- }
238
-
239
- const parsed = typeof state === 'string' ? parse(state) : undefined;
240
-
241
- if (!Array.isArray(parsed)) {
242
- return;
243
- }
244
-
245
- if (this.#state == null) {
246
- this.#restored = parsed;
247
- } else {
248
- setListboxValues(this.#state, parsed);
249
- }
250
- }
251
-
252
- /**
253
- * Set listbox localizations for a specific language
254
- *
255
- * @param language Language code
256
- * @param localizations Localizations for language
257
- */
258
- setLocalizations(language: string, localizations: Partial<OuiListboxLocalizations>): void;
259
-
260
- /**
261
- * Set listbox localizations for one or more languages
262
- *
263
- * @param localizations Localizations for one or more languages
264
- */
265
- setLocalizations(localizations: Record<string, Partial<OuiListboxLocalizations>>): void;
266
-
267
- setLocalizations(
268
- first: string | Record<string, Partial<OuiListboxLocalizations>>,
269
- second?: Partial<OuiListboxLocalizations>,
270
- ): void {
271
- updateListboxLocalizations(
272
- this.#state.localizations.global,
273
- this.#state.localizations.component,
274
- first,
275
- second,
276
- );
277
- }
278
-
279
- #initialize(): void {
280
- this.#state = createListboxState(this, this.#internals);
281
-
282
- if (this.#restored != null) {
283
- setListboxValues(this.#state, this.#restored);
284
-
285
- this.#restored = undefined;
286
- }
287
- }
288
- }
289
-
290
- // #endregion
291
-
292
- // #region Initialization
293
-
294
- customElements.define(LISTBOX_TAGNAME, OuiListboxElement);
295
-
296
- // #endregion
297
-
298
- // #region Exports
299
-
300
- export {setListboxLocalizations} from './misc.listbox';
301
-
302
- // #endregion
@@ -1,70 +0,0 @@
1
- import {updateListboxMessage, updateListboxValueLabel} from '../internal/listbox/listbox.dom';
2
- import type {OuiListboxLocalizations} from '../internal/listbox/listbox.model';
3
- import {OuiLocalizations, updateLocalizations} from '../l10n';
4
- import {listboxLocalizations, listboxStates} from './state.listbox';
5
-
6
- // #region Functions
7
-
8
- export function getListboxId(): string {
9
- index += 1;
10
-
11
- return `oui_listbox_${index}`;
12
- }
13
-
14
- /**
15
- * Set listbox localizations for a specific language
16
- *
17
- * @param language Language code
18
- * @param localizations Localizations for language
19
- */
20
- export function setListboxLocalizations(
21
- language: string,
22
- localizations: Partial<OuiListboxLocalizations>,
23
- ): void;
24
-
25
- /**
26
- * Set listbox localizations for one or more languages
27
- *
28
- * @param localizations Localizations for one or more languages
29
- */
30
- export function setListboxLocalizations(
31
- localizations: Record<string, Partial<OuiListboxLocalizations>>,
32
- ): void;
33
-
34
- export function setListboxLocalizations(
35
- first: string | Record<string, Partial<OuiListboxLocalizations>>,
36
- second?: Partial<OuiListboxLocalizations>,
37
- ): void {
38
- updateListboxLocalizations(listboxLocalizations, listboxLocalizations.values, first, second);
39
- }
40
-
41
- export function updateListboxLocalizations(
42
- instance: OuiLocalizations<OuiListboxLocalizations>,
43
- destination: Record<string, Partial<OuiListboxLocalizations>>,
44
- first: string | Record<string, Partial<OuiListboxLocalizations>>,
45
- second?: Partial<OuiListboxLocalizations>,
46
- ): void {
47
- updateLocalizations(
48
- instance,
49
- typeof first === 'string'
50
- ? {
51
- [first]: second!,
52
- }
53
- : first,
54
- destination,
55
- () => {
56
- for (const state of listboxStates.set) {
57
- updateListboxMessage(state);
58
- updateListboxValueLabel(state);
59
- }
60
- },
61
- );
62
- }
63
-
64
- // #endregion
65
-
66
- // #region Variables
67
-
68
- let index = 0;
69
-
70
- // #endregion
@@ -1,196 +0,0 @@
1
- import {noop} from '@oscarpalmer/atoms/function';
2
- import {setAttribute, setAttributes} from '@oscarpalmer/toretto/attribute';
3
- import {getData} from '@oscarpalmer/toretto/data';
4
- import {createListboxContent} from '../internal/listbox/listbox.dom';
5
- import {generateListboxIds} from '../internal/listbox/listbox.misc';
6
- import type {
7
- OuiListboxAutoCompleteType,
8
- OuiListboxCallbacks,
9
- OuiListboxLocalizations,
10
- OuiListboxState,
11
- OuiListboxStates,
12
- } from '../internal/listbox/listbox.model';
13
- import {initializeListboxState} from '../internal/listbox/listbox.state';
14
- import {getBooleanAriaValue} from '../internal/misc';
15
- import {getLocalizations} from '../l10n';
16
- import {LISTBOX_ATTRIBUTES, LISTBOX_MESSAGES} from './constants.listbox';
17
- import {
18
- onListboxEnter,
19
- onListboxFilter,
20
- onListboxNavigation,
21
- onListboxToggle,
22
- } from './event.listbox';
23
- import type {OuiListboxElement} from './index';
24
- import {getListboxId} from './misc.listbox';
25
-
26
- // #region Functions
27
-
28
- export function createListboxState(
29
- element: OuiListboxElement,
30
- internals: ElementInternals,
31
- ): OuiListboxState {
32
- const select = element.querySelector('select');
33
-
34
- if (select == null) {
35
- throw new Error(LISTBOX_MESSAGES.select);
36
- }
37
-
38
- const label = element.querySelector(`label[for="${select.id}"]`) as HTMLLabelElement;
39
-
40
- if (label == null) {
41
- throw new Error(LISTBOX_MESSAGES.label);
42
- }
43
-
44
- element.id = select.id;
45
-
46
- setAttribute(element, 'name', select.name === '' ? select.id : select.name);
47
-
48
- const disabled = getBooleanAriaValue(element, 'disabled') || select.disabled;
49
- const multiple = element.multiple || select.multiple;
50
- const readonly = getBooleanAriaValue(element, 'readonly');
51
- const required = getBooleanAriaValue(element, 'required') || select.required;
52
-
53
- setAttributes(element, {
54
- autocomplete: 'none',
55
- name: select.name === '' ? select.id : select.name,
56
- });
57
-
58
- const id = getListboxId();
59
-
60
- const labelId = label.id;
61
-
62
- label.htmlFor = id;
63
- label.id = `${id}_label`;
64
-
65
- generateListboxIds(id, select);
66
-
67
- const type = 'select';
68
-
69
- const content = createListboxContent({
70
- element,
71
- id,
72
- label,
73
- multiple,
74
- select,
75
- type,
76
- attributes: LISTBOX_ATTRIBUTES,
77
- autocomplete: listboxAutoComplete,
78
- listbox: true,
79
- });
80
-
81
- const {selected} = content.list.options;
82
-
83
- const values =
84
- selected.length === 0 ? [''] : selected.map(option => getData(option, 'value', false) ?? '');
85
-
86
- const state: OuiListboxState = {
87
- disabled,
88
- id,
89
- internals,
90
- message: content.message,
91
- multiple,
92
- readonly,
93
- required,
94
- select,
95
- type,
96
- active: selected[0],
97
- attributes: LISTBOX_ATTRIBUTES,
98
- autocomplete: listboxAutoComplete,
99
- callbacks: listboxCallbacks,
100
- content: content.element,
101
- elements: [element, content.filter!.element],
102
- filter: {
103
- element: content.filter!.element,
104
- value: '',
105
- },
106
- host: element,
107
- label: {
108
- id: labelId,
109
- element: label,
110
- },
111
- list: content.list.element,
112
- listeners: [],
113
- listbox: true,
114
- localizations: {
115
- component: {},
116
- global: listboxLocalizations,
117
- },
118
- name: element.name,
119
- options: content.list.options,
120
- values: {
121
- current: values.slice(),
122
- initial: values.slice(),
123
- label: content.value,
124
- },
125
- };
126
-
127
- return initializeListboxState(state, listboxStates, onAttachListbox);
128
- }
129
-
130
- // #endregion
131
-
132
- // #region Functions
133
-
134
- export function onAttachListbox(state: OuiListboxState): void {
135
- const {content, select} = state;
136
-
137
- select.hidden = true;
138
-
139
- select.insertAdjacentElement('afterend', content);
140
-
141
- select.remove();
142
- }
143
-
144
- export function onDetachListbox(state: OuiListboxState): void {
145
- const {content, select} = state;
146
-
147
- content.insertAdjacentElement('beforebegin', select);
148
-
149
- content.remove();
150
-
151
- select.hidden = false;
152
- }
153
-
154
- // #endregion
155
-
156
- // #region Variables
157
-
158
- const listboxAutoComplete: Record<OuiListboxAutoCompleteType, boolean> = {
159
- both: false,
160
- inline: false,
161
- list: false,
162
- none: true,
163
- };
164
-
165
- const listboxCallbacks: OuiListboxCallbacks = {
166
- data: {
167
- onApply: noop,
168
- onFilter: onListboxFilter,
169
- onForm: noop,
170
- onPreview: noop,
171
- onToggle: onListboxToggle,
172
- },
173
- keydown: {
174
- onEnter: onListboxEnter,
175
- onNavigation: onListboxNavigation,
176
- onToggle: onListboxToggle,
177
- },
178
- };
179
-
180
- export const listboxLocalizations = getLocalizations<OuiListboxLocalizations>({
181
- empty: 'No results found',
182
- input: '',
183
- invalid: 'Please select an option from the list',
184
- max: max => `Please select fewer options (maximum is ${max})`,
185
- min: min => `Please select more options (minimum is ${min})`,
186
- remove: '',
187
- results: amount => `${amount} results available`,
188
- selected: amount => `${amount} selected`,
189
- });
190
-
191
- export const listboxStates: OuiListboxStates = {
192
- map: new WeakMap(),
193
- set: new Set(),
194
- };
195
-
196
- // #endregion