@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.
- package/dist/css/a11y.css +1 -0
- package/dist/css/badge.css +12 -8
- package/dist/css/button.css +111 -14
- package/dist/css/color-picker.css +859 -0
- package/dist/css/color.css +86 -87
- package/dist/css/combobox.css +105 -4
- package/dist/css/content.css +8 -6
- package/dist/css/floatable.css +3 -3
- package/dist/css/form.css +106 -6
- package/dist/css/icon.css +99 -0
- package/dist/css/listbox.css +5 -0
- package/dist/css/message.css +6 -3
- package/dist/css/mixins/badge.mixins.css +2 -0
- package/dist/css/mixins/button.mixins.css +3 -0
- package/dist/css/mixins/message.mixins.css +1 -0
- package/dist/css/mixins/misc.mixins.css +2 -0
- package/dist/css/mixins/shadow.mixins.css +1 -0
- package/dist/css/reset.css +3 -3
- package/dist/css/splitter.css +1 -1
- package/dist/css/tabs.css +115 -23
- package/dist/css/typography.css +90 -0
- package/dist/js/color-picker/constants.color-picker.d.mts +2 -0
- package/dist/js/color-picker/constants.color-picker.mjs +59 -0
- package/dist/js/color-picker/dom.color-picker.d.mts +8 -0
- package/dist/js/color-picker/dom.color-picker.mjs +191 -0
- package/dist/js/color-picker/event.color-picker.d.mts +9 -0
- package/dist/js/color-picker/event.color-picker.mjs +2 -0
- package/dist/js/color-picker/form.color-picker.d.mts +5 -0
- package/dist/js/color-picker/form.color-picker.mjs +24 -0
- package/dist/js/color-picker/index.d.mts +2 -0
- package/dist/js/color-picker/index.mjs +303 -0
- package/dist/js/color-picker/misc.color-picker.d.mts +2 -0
- package/dist/js/color-picker/misc.color-picker.mjs +2 -0
- package/dist/js/color-picker/models.color-picker.d.mts +2 -0
- package/dist/js/color-picker/models.color-picker.mjs +24 -0
- package/dist/js/color-picker/output.color-picker.d.mts +8 -0
- package/dist/js/color-picker/output.color-picker.mjs +233 -0
- package/dist/js/color-picker/state.color-picker.d.mts +8 -0
- package/dist/js/color-picker/state.color-picker.mjs +2 -0
- package/dist/js/combobox/constants.combobox.d.mts +1 -1
- package/dist/js/combobox/dom.combobox.d.mts +12 -13
- package/dist/js/combobox/dom.combobox.mjs +12 -5
- package/dist/js/combobox/event.combobox.d.mts +20 -21
- package/dist/js/combobox/event.combobox.mjs +1 -1
- package/dist/js/combobox/index.d.mts +1 -1
- package/dist/js/combobox/index.mjs +56 -2
- package/dist/js/combobox/misc.combobox.d.mts +1 -1
- package/dist/js/combobox/misc.combobox.mjs +1 -1
- package/dist/js/combobox/models.combobox.d.mts +12 -13
- package/dist/js/combobox/state.combobox.d.mts +8 -9
- package/dist/js/combobox/state.combobox.mjs +1 -1
- package/dist/js/constants.color-picker-B-gFjL8m.d.mts +364 -0
- package/dist/js/constants.combobox-8EMRmv09.d.mts +18 -0
- package/dist/js/constants.listbox-DGnX32kv.d.mts +8 -0
- package/dist/js/dialog.d.mts +2 -2
- package/dist/js/dialog.mjs +1 -1
- package/dist/js/{draggable-a6w0J1OD.d.mts → draggable-B5-70SZm.d.mts} +5 -4
- package/dist/js/event.color-picker-BEpq0Adu.mjs +485 -0
- package/dist/js/floatable/floatable.embedded.d.mts +1 -1
- package/dist/js/floatable/floatable.embedded.mjs +11 -8
- package/dist/js/floatable/floatable.standalone.d.mts +1 -1
- package/dist/js/{floatable.embedded-Bct4U5Dm.d.mts → floatable.embedded-DQYkXt8X.d.mts} +1 -1
- package/dist/js/focus-trap/focus-trap.embedded.d.mts +1 -1
- package/dist/js/focus-trap/focus-trap.standalone.d.mts +1 -1
- package/dist/js/{focus-trap.embedded-DR8NpZfr.d.mts → focus-trap.embedded-CjyFQYow.d.mts} +2 -2
- package/dist/js/{index-EfkUSals.d.mts → index-C5D3-oiI.d.mts} +41 -3
- package/dist/js/index.d.mts +8 -7
- package/dist/js/index.mjs +6 -3
- package/dist/js/internal/attributable.d.mts +2 -3
- package/dist/js/internal/draggable.d.mts +1 -1
- package/dist/js/internal/draggable.mjs +1 -1
- package/dist/js/internal/listbox/listbox.constants.d.mts +7 -10
- package/dist/js/internal/listbox/listbox.constants.mjs +15 -16
- package/dist/js/internal/listbox/listbox.data.d.mts +9 -10
- package/dist/js/internal/listbox/listbox.data.mjs +1 -1
- package/dist/js/internal/listbox/listbox.dom.d.mts +19 -20
- package/dist/js/internal/listbox/listbox.dom.mjs +1 -1
- package/dist/js/internal/listbox/listbox.event.d.mts +3 -4
- package/dist/js/internal/listbox/listbox.event.mjs +4 -4
- package/dist/js/internal/listbox/listbox.form.d.mts +4 -5
- package/dist/js/internal/listbox/listbox.form.mjs +16 -15
- package/dist/js/internal/listbox/listbox.misc.d.mts +10 -11
- package/dist/js/internal/listbox/listbox.misc.mjs +1 -1
- package/dist/js/internal/listbox/listbox.model.d.mts +1 -1
- package/dist/js/internal/listbox/listbox.state.d.mts +5 -6
- package/dist/js/internal/listbox/listbox.state.mjs +3 -3
- package/dist/js/internal/misc.d.mts +4 -4
- package/dist/js/internal/misc.mjs +9 -1
- package/dist/js/internal/navigable.d.mts +9 -10
- package/dist/js/internal/navigable.mjs +1 -0
- package/dist/js/listbox/constants.listbox.d.mts +1 -1
- package/dist/js/listbox/event.listbox.d.mts +6 -7
- package/dist/js/listbox/event.listbox.mjs +1 -1
- package/dist/js/listbox/index.d.mts +43 -5
- package/dist/js/listbox/index.mjs +56 -2
- package/dist/js/listbox/misc.listbox.d.mts +1 -1
- package/dist/js/listbox/misc.listbox.mjs +1 -1
- package/dist/js/listbox/state.listbox.d.mts +7 -8
- package/dist/js/listbox/state.listbox.mjs +1 -1
- package/dist/js/{listbox.data-BWd0PCy7.mjs → listbox.data-DQ7-x2uY.mjs} +8 -7
- package/dist/js/{listbox.model-CRReGOmu.d.mts → listbox.model-BHPA7GM4.d.mts} +3 -3
- package/dist/js/menu.mjs +1 -1
- package/dist/js/{misc.listbox-BI-XsTOf.mjs → misc.listbox-DKB-j0UK.mjs} +4 -5
- package/dist/js/{misc.listbox-gnoJhrTr.d.mts → misc.listbox-mZMuYOxg.d.mts} +1 -1
- package/dist/js/movable/movable.embedded.d.mts +1 -1
- package/dist/js/movable/movable.standalone.d.mts +1 -1
- package/dist/js/popover.d.mts +2 -2
- package/dist/js/popover.mjs +1 -1
- package/dist/js/resizable/resizable.embedded.d.mts +1 -1
- package/dist/js/resizable/resizable.embedded.mjs +1 -1
- package/dist/js/resizable/resizable.standalone.d.mts +1 -1
- package/dist/js/{resizable.embedded-3qoR0Bjm.d.mts → resizable.embedded-dvhdfQgt.d.mts} +1 -1
- package/dist/js/sortable/sortable.embedded.d.mts +1 -1
- package/dist/js/sortable/sortable.standalone.d.mts +1 -1
- package/dist/js/splitter.d.mts +2 -3
- package/dist/js/splitter.mjs +2 -2
- package/dist/js/{state.combobox-4xq0FPCF.mjs → state.combobox-BWDFHwoi.mjs} +9 -9
- package/dist/js/tabs.d.mts +4 -5
- package/dist/js/tabs.mjs +4 -7
- package/dist/js/tooltip.d.mts +1 -1
- package/package.json +24 -22
- package/dist/js/constants.combobox-DmRAMC64.d.mts +0 -26
- package/dist/js/constants.listbox-DRsXUxd3.d.mts +0 -14
- package/src/css/a11y.scss +0 -13
- package/src/css/badge.scss +0 -62
- package/src/css/button.scss +0 -50
- package/src/css/color.scss +0 -115
- package/src/css/combobox.scss +0 -252
- package/src/css/content.scss +0 -180
- package/src/css/flex.scss +0 -107
- package/src/css/floatable.scss +0 -152
- package/src/css/form.scss +0 -573
- package/src/css/listbox.scss +0 -120
- package/src/css/message.scss +0 -73
- package/src/css/mixins.scss +0 -419
- package/src/css/reset.scss +0 -392
- package/src/css/splitter.scss +0 -89
- package/src/css/table.scss +0 -107
- package/src/css/tabs.scss +0 -85
- package/src/js/combobox/constants.combobox.ts +0 -83
- package/src/js/combobox/dom.combobox.ts +0 -407
- package/src/js/combobox/event.combobox.ts +0 -365
- package/src/js/combobox/index.ts +0 -320
- package/src/js/combobox/misc.combobox.ts +0 -104
- package/src/js/combobox/models.combobox.ts +0 -54
- package/src/js/combobox/state.combobox.ts +0 -246
- package/src/js/dialog.ts +0 -255
- package/src/js/floatable/floatable.embedded.ts +0 -332
- package/src/js/floatable/floatable.standalone.ts +0 -6
- package/src/js/focus-trap/focus-trap.embedded.ts +0 -411
- package/src/js/focus-trap/focus-trap.standalone.ts +0 -1
- package/src/js/index.ts +0 -15
- package/src/js/internal/attributable.ts +0 -73
- package/src/js/internal/draggable.ts +0 -657
- package/src/js/internal/listbox/listbox.constants.ts +0 -25
- package/src/js/internal/listbox/listbox.data.ts +0 -287
- package/src/js/internal/listbox/listbox.dom.ts +0 -445
- package/src/js/internal/listbox/listbox.event.ts +0 -129
- package/src/js/internal/listbox/listbox.form.ts +0 -115
- package/src/js/internal/listbox/listbox.misc.ts +0 -135
- package/src/js/internal/listbox/listbox.model.ts +0 -169
- package/src/js/internal/listbox/listbox.state.ts +0 -82
- package/src/js/internal/misc.ts +0 -27
- package/src/js/internal/navigable.ts +0 -315
- package/src/js/l10n.ts +0 -192
- package/src/js/listbox/constants.listbox.ts +0 -61
- package/src/js/listbox/event.listbox.ts +0 -106
- package/src/js/listbox/index.ts +0 -302
- package/src/js/listbox/misc.listbox.ts +0 -70
- package/src/js/listbox/state.listbox.ts +0 -196
- package/src/js/menu.ts +0 -348
- package/src/js/movable/movable.embedded.ts +0 -318
- package/src/js/movable/movable.standalone.ts +0 -2
- package/src/js/popover.ts +0 -229
- package/src/js/resizable/resizable.embedded.ts +0 -413
- package/src/js/resizable/resizable.standalone.ts +0 -5
- package/src/js/sortable/sortable.embedded.ts +0 -527
- package/src/js/sortable/sortable.standalone.ts +0 -2
- package/src/js/splitter.ts +0 -583
- package/src/js/tabs.ts +0 -447
- package/src/js/toolbar.ts +0 -63
- package/src/js/tooltip.ts +0 -367
- /package/dist/css/{mixins.css → mixins/input.mixins.css} +0 -0
package/src/js/listbox/index.ts
DELETED
|
@@ -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
|