@oscarpalmer/oui 0.38.0 → 0.40.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 (264) hide show
  1. package/README.md +1 -1
  2. package/dist/css/badge.css +11 -8
  3. package/dist/css/button.css +106 -14
  4. package/dist/css/color-picker.css +555 -73
  5. package/dist/css/color.css +86 -86
  6. package/dist/css/combobox.css +98 -4
  7. package/dist/css/content.css +7 -6
  8. package/dist/css/floatable.css +1 -3
  9. package/dist/css/form.css +99 -6
  10. package/dist/css/icon.css +99 -0
  11. package/dist/css/listbox.css +3 -0
  12. package/dist/css/message.css +4 -3
  13. package/dist/css/mixins/button.mixins.css +1 -0
  14. package/dist/css/reset.css +1 -1
  15. package/dist/css/tabs.css +95 -3
  16. package/dist/css/typography.css +90 -0
  17. package/dist/js/color-picker/color-picker.constants.d.mts +2 -0
  18. package/dist/js/color-picker/color-picker.constants.mjs +60 -0
  19. package/dist/js/color-picker/color-picker.dom.d.mts +8 -0
  20. package/dist/js/color-picker/color-picker.dom.mjs +191 -0
  21. package/dist/js/color-picker/color-picker.event.d.mts +9 -0
  22. package/dist/js/color-picker/color-picker.event.mjs +2 -0
  23. package/dist/js/color-picker/color-picker.form.d.mts +5 -0
  24. package/dist/js/color-picker/color-picker.form.mjs +27 -0
  25. package/dist/js/color-picker/color-picker.misc.d.mts +2 -0
  26. package/dist/js/color-picker/color-picker.misc.mjs +2 -0
  27. package/dist/js/color-picker/color-picker.model.d.mts +2 -0
  28. package/dist/js/color-picker/color-picker.model.mjs +24 -0
  29. package/dist/js/color-picker/color-picker.output.d.mts +8 -0
  30. package/dist/js/color-picker/color-picker.output.mjs +235 -0
  31. package/dist/js/color-picker/color-picker.state.d.mts +8 -0
  32. package/dist/js/color-picker/color-picker.state.mjs +2 -0
  33. package/dist/js/{color-picker.d.mts → color-picker/index.d.mts} +10 -43
  34. package/dist/js/color-picker/index.mjs +305 -0
  35. package/dist/js/color-picker.constants-D1mxw_Le.d.mts +179 -0
  36. package/dist/js/color-picker.event-Cksj5TvS.mjs +500 -0
  37. package/dist/js/color-picker.misc-CtsXGrOe.d.mts +27 -0
  38. package/dist/js/combobox/combobox.constants.d.mts +2 -0
  39. package/dist/js/combobox/{constants.combobox.mjs → combobox.constants.mjs} +21 -21
  40. package/dist/js/combobox/combobox.dom.d.mts +26 -0
  41. package/dist/js/combobox/{dom.combobox.mjs → combobox.dom.mjs} +44 -37
  42. package/dist/js/combobox/combobox.event.d.mts +22 -0
  43. package/dist/js/combobox/{event.combobox.mjs → combobox.event.mjs} +1 -1
  44. package/dist/js/combobox/combobox.misc.d.mts +2 -0
  45. package/dist/js/combobox/{misc.combobox.mjs → combobox.misc.mjs} +1 -1
  46. package/dist/js/combobox/combobox.model.d.mts +2 -0
  47. package/dist/js/combobox/combobox.state.d.mts +10 -0
  48. package/dist/js/combobox/combobox.state.mjs +2 -0
  49. package/dist/js/combobox/index.d.mts +163 -2
  50. package/dist/js/combobox/index.mjs +53 -52
  51. package/dist/js/combobox.constants-DZVkMP5g.d.mts +19 -0
  52. package/dist/js/combobox.misc-C1tPZZDi.d.mts +22 -0
  53. package/dist/js/{combobox/models.combobox.d.mts → combobox.model-oDV06XCN.d.mts} +6 -6
  54. package/dist/js/{state.combobox-Qm3FWzYW.mjs → combobox.state-BfJ3Hxg8.mjs} +96 -82
  55. package/dist/js/constants.listbox-C5Ap6Ag_.d.mts +9 -0
  56. package/dist/js/dialog/dialog.model.d.mts +2 -0
  57. package/dist/js/dialog/dialog.model.mjs +11 -0
  58. package/dist/js/dialog/index.d.mts +12 -0
  59. package/dist/js/dialog/index.mjs +123 -0
  60. package/dist/js/dialog.model-DX2mndMh.d.mts +45 -0
  61. package/dist/js/floatable/floatable.embedded.d.mts +2 -2
  62. package/dist/js/floatable/floatable.embedded.mjs +64 -92
  63. package/dist/js/floatable/floatable.model.d.mts +2 -0
  64. package/dist/js/floatable/floatable.model.mjs +23 -0
  65. package/dist/js/floatable/floatable.standalone.d.mts +2 -1
  66. package/dist/js/floatable.embedded-MeTyXjFn.d.mts +17 -0
  67. package/dist/js/floatable.model-DXsQgoU7.d.mts +62 -0
  68. package/dist/js/focus-trap/focus-trap.embedded.d.mts +2 -2
  69. package/dist/js/focus-trap/focus-trap.embedded.mjs +112 -134
  70. package/dist/js/focus-trap/focus-trap.model.d.mts +2 -0
  71. package/dist/js/focus-trap/focus-trap.model.mjs +15 -0
  72. package/dist/js/focus-trap/focus-trap.standalone.d.mts +2 -1
  73. package/dist/js/focus-trap.embedded-DIU05m1z.d.mts +13 -0
  74. package/dist/js/{focus-trap.embedded-DR8NpZfr.d.mts → focus-trap.model-BeX6UYlw.d.mts} +16 -18
  75. package/dist/js/index.d.mts +26 -14
  76. package/dist/js/index.mjs +18 -15
  77. package/dist/js/internal/attributable.d.mts +2 -3
  78. package/dist/js/internal/attributable.mjs +3 -2
  79. package/dist/js/internal/draggable/draggable.model.d.mts +2 -0
  80. package/dist/js/internal/draggable/draggable.model.mjs +37 -0
  81. package/dist/js/internal/draggable/index.d.mts +13 -0
  82. package/dist/js/internal/{draggable.mjs → draggable/index.mjs} +83 -114
  83. package/dist/js/internal/listbox/listbox.constants.d.mts +7 -10
  84. package/dist/js/internal/listbox/listbox.constants.mjs +15 -16
  85. package/dist/js/internal/listbox/listbox.data.d.mts +9 -10
  86. package/dist/js/internal/listbox/listbox.data.mjs +1 -1
  87. package/dist/js/internal/listbox/listbox.dom.d.mts +19 -20
  88. package/dist/js/internal/listbox/listbox.dom.mjs +1 -1
  89. package/dist/js/internal/listbox/listbox.event.d.mts +3 -4
  90. package/dist/js/internal/listbox/listbox.event.mjs +23 -20
  91. package/dist/js/internal/listbox/listbox.form.d.mts +4 -5
  92. package/dist/js/internal/listbox/listbox.form.mjs +15 -12
  93. package/dist/js/internal/listbox/listbox.misc.d.mts +10 -11
  94. package/dist/js/internal/listbox/listbox.misc.mjs +1 -1
  95. package/dist/js/internal/listbox/listbox.model.d.mts +2 -2
  96. package/dist/js/internal/listbox/listbox.state.d.mts +5 -6
  97. package/dist/js/internal/listbox/listbox.state.mjs +19 -20
  98. package/dist/js/internal/misc.d.mts +5 -4
  99. package/dist/js/internal/misc.mjs +7 -1
  100. package/dist/js/internal/navigable/index.d.mts +6 -0
  101. package/dist/js/internal/navigable/index.mjs +125 -0
  102. package/dist/js/internal/navigable/navigable.model.d.mts +2 -0
  103. package/dist/js/internal/navigable/navigable.model.mjs +18 -0
  104. package/dist/js/l10n/index.d.mts +9 -0
  105. package/dist/js/{l10n.mjs → l10n/index.mjs} +50 -23
  106. package/dist/js/l10n/l10n.model.d.mts +2 -0
  107. package/dist/js/l10n/l10n.model.mjs +9 -0
  108. package/dist/js/l10n.model-D6a9frgl.d.mts +26 -0
  109. package/dist/js/listbox/constants.listbox.d.mts +2 -2
  110. package/dist/js/listbox/constants.listbox.mjs +10 -14
  111. package/dist/js/listbox/event.listbox.d.mts +6 -7
  112. package/dist/js/listbox/event.listbox.mjs +47 -1
  113. package/dist/js/listbox/index.d.mts +8 -6
  114. package/dist/js/listbox/index.mjs +47 -49
  115. package/dist/js/listbox/misc.listbox.d.mts +1 -1
  116. package/dist/js/listbox/misc.listbox.mjs +1 -1
  117. package/dist/js/listbox/state.listbox.d.mts +8 -10
  118. package/dist/js/listbox/state.listbox.mjs +2 -2
  119. package/dist/js/{listbox.data-C7CRa5Ya.mjs → listbox.data-BQyZGKgr.mjs} +83 -66
  120. package/dist/js/{listbox.model-CRReGOmu.d.mts → listbox.model-CuBOj4qe.d.mts} +15 -11
  121. package/dist/js/menu/index.mjs +167 -0
  122. package/dist/js/menu/menu.model.d.mts +33 -0
  123. package/dist/js/menu/menu.model.mjs +15 -0
  124. package/dist/js/{misc.listbox-Cyz2CRDy.mjs → misc.listbox-CjfBUbHD.mjs} +27 -69
  125. package/dist/js/{misc.listbox-gnoJhrTr.d.mts → misc.listbox-CtoGvXQo.d.mts} +2 -2
  126. package/dist/js/movable/movable.embedded.d.mts +2 -2
  127. package/dist/js/movable/movable.embedded.mjs +60 -72
  128. package/dist/js/movable/movable.model.d.mts +2 -0
  129. package/dist/js/movable/movable.model.mjs +12 -0
  130. package/dist/js/movable/movable.standalone.d.mts +2 -1
  131. package/dist/js/movable.embedded-DoyXLegc.d.mts +11 -0
  132. package/dist/js/movable.model-BHaK_mKw.d.mts +186 -0
  133. package/dist/js/navigable.model-BPOM8DZk.d.mts +44 -0
  134. package/dist/js/popover/index.d.mts +12 -0
  135. package/dist/js/{popover.mjs → popover/index.mjs} +40 -50
  136. package/dist/js/popover/popover.model.d.mts +2 -0
  137. package/dist/js/popover/popover.model.mjs +12 -0
  138. package/dist/js/popover.model-ubKNG612.d.mts +38 -0
  139. package/dist/js/resizable/resizable.embedded.d.mts +2 -2
  140. package/dist/js/resizable/resizable.embedded.mjs +44 -59
  141. package/dist/js/resizable/resizable.model.d.mts +2 -0
  142. package/dist/js/resizable/resizable.model.mjs +21 -0
  143. package/dist/js/resizable/resizable.standalone.d.mts +2 -1
  144. package/dist/js/resizable.embedded-Bf1qBUdt.d.mts +11 -0
  145. package/dist/js/resizable.model-BwzJcTVJ.d.mts +46 -0
  146. package/dist/js/sortable/sortable.embedded.d.mts +2 -2
  147. package/dist/js/sortable/sortable.embedded.mjs +69 -82
  148. package/dist/js/sortable/sortable.model.d.mts +2 -0
  149. package/dist/js/sortable/sortable.model.mjs +24 -0
  150. package/dist/js/sortable/sortable.standalone.d.mts +2 -1
  151. package/dist/js/sortable.embedded-DzBKAwSG.d.mts +11 -0
  152. package/dist/js/{splitter.d.mts → splitter/index.d.mts} +8 -7
  153. package/dist/js/splitter/index.mjs +284 -0
  154. package/dist/js/splitter/splitter.model.d.mts +2 -0
  155. package/dist/js/splitter/splitter.model.mjs +37 -0
  156. package/dist/js/splitter.model-DOLNjLVS.d.mts +57 -0
  157. package/dist/js/{tabs.d.mts → tabs/index.d.mts} +7 -8
  158. package/dist/js/{tabs.mjs → tabs/index.mjs} +58 -58
  159. package/dist/js/tabs/tabs.model.d.mts +2 -0
  160. package/dist/js/tabs/tabs.model.mjs +18 -0
  161. package/dist/js/tabs.model-DRBX_JtI.d.mts +40 -0
  162. package/dist/js/toolbar/index.mjs +27 -0
  163. package/dist/js/toolbar/toolbar.model.d.mts +11 -0
  164. package/dist/js/toolbar/toolbar.model.mjs +7 -0
  165. package/dist/js/tooltip/index.d.mts +19 -0
  166. package/dist/js/{tooltip.mjs → tooltip/index.mjs} +60 -85
  167. package/dist/js/tooltip/tooltip.model.d.mts +2 -0
  168. package/dist/js/tooltip/tooltip.model.mjs +15 -0
  169. package/dist/js/tooltip.model-DRkY_BsL.d.mts +37 -0
  170. package/package.json +43 -37
  171. package/dist/js/color-picker.mjs +0 -924
  172. package/dist/js/combobox/constants.combobox.d.mts +0 -2
  173. package/dist/js/combobox/dom.combobox.d.mts +0 -27
  174. package/dist/js/combobox/event.combobox.d.mts +0 -23
  175. package/dist/js/combobox/misc.combobox.d.mts +0 -2
  176. package/dist/js/combobox/state.combobox.d.mts +0 -12
  177. package/dist/js/combobox/state.combobox.mjs +0 -2
  178. package/dist/js/constants.combobox-DmRAMC64.d.mts +0 -26
  179. package/dist/js/constants.listbox-DRsXUxd3.d.mts +0 -14
  180. package/dist/js/dialog.d.mts +0 -47
  181. package/dist/js/dialog.mjs +0 -131
  182. package/dist/js/draggable-a6w0J1OD.d.mts +0 -154
  183. package/dist/js/floatable.embedded-Bct4U5Dm.d.mts +0 -69
  184. package/dist/js/index-DJdFlTLm.d.mts +0 -177
  185. package/dist/js/internal/draggable.d.mts +0 -2
  186. package/dist/js/internal/navigable.d.mts +0 -37
  187. package/dist/js/internal/navigable.mjs +0 -135
  188. package/dist/js/l10n-Bn-7RcwR.d.mts +0 -20
  189. package/dist/js/l10n.d.mts +0 -2
  190. package/dist/js/menu.mjs +0 -172
  191. package/dist/js/popover.d.mts +0 -38
  192. package/dist/js/resizable.embedded-3qoR0Bjm.d.mts +0 -34
  193. package/dist/js/splitter.mjs +0 -322
  194. package/dist/js/toolbar.mjs +0 -31
  195. package/dist/js/tooltip.d.mts +0 -45
  196. package/src/css/a11y.scss +0 -13
  197. package/src/css/badge.scss +0 -62
  198. package/src/css/button.scss +0 -50
  199. package/src/css/color-picker.scss +0 -344
  200. package/src/css/color.scss +0 -113
  201. package/src/css/combobox.scss +0 -255
  202. package/src/css/content.scss +0 -181
  203. package/src/css/flex.scss +0 -107
  204. package/src/css/floatable.scss +0 -155
  205. package/src/css/form.scss +0 -575
  206. package/src/css/listbox.scss +0 -121
  207. package/src/css/message.scss +0 -74
  208. package/src/css/mixins/badge.mixins.scss +0 -53
  209. package/src/css/mixins/button.mixins.scss +0 -112
  210. package/src/css/mixins/input.mixins.scss +0 -114
  211. package/src/css/mixins/message.mixins.scss +0 -41
  212. package/src/css/mixins/misc.mixins.scss +0 -48
  213. package/src/css/mixins/shadow.mixins.scss +0 -57
  214. package/src/css/reset.scss +0 -392
  215. package/src/css/splitter.scss +0 -89
  216. package/src/css/table.scss +0 -107
  217. package/src/css/tabs.scss +0 -74
  218. package/src/js/color-picker.ts +0 -1653
  219. package/src/js/combobox/constants.combobox.ts +0 -83
  220. package/src/js/combobox/dom.combobox.ts +0 -411
  221. package/src/js/combobox/event.combobox.ts +0 -365
  222. package/src/js/combobox/index.ts +0 -382
  223. package/src/js/combobox/misc.combobox.ts +0 -104
  224. package/src/js/combobox/models.combobox.ts +0 -54
  225. package/src/js/combobox/state.combobox.ts +0 -246
  226. package/src/js/dialog.ts +0 -255
  227. package/src/js/floatable/floatable.embedded.ts +0 -336
  228. package/src/js/floatable/floatable.standalone.ts +0 -6
  229. package/src/js/focus-trap/focus-trap.embedded.ts +0 -411
  230. package/src/js/focus-trap/focus-trap.standalone.ts +0 -1
  231. package/src/js/index.ts +0 -16
  232. package/src/js/internal/attributable.ts +0 -73
  233. package/src/js/internal/draggable.ts +0 -657
  234. package/src/js/internal/listbox/listbox.constants.ts +0 -25
  235. package/src/js/internal/listbox/listbox.data.ts +0 -287
  236. package/src/js/internal/listbox/listbox.dom.ts +0 -446
  237. package/src/js/internal/listbox/listbox.event.ts +0 -129
  238. package/src/js/internal/listbox/listbox.form.ts +0 -125
  239. package/src/js/internal/listbox/listbox.misc.ts +0 -135
  240. package/src/js/internal/listbox/listbox.model.ts +0 -169
  241. package/src/js/internal/listbox/listbox.state.ts +0 -82
  242. package/src/js/internal/misc.ts +0 -27
  243. package/src/js/internal/navigable.ts +0 -317
  244. package/src/js/l10n.ts +0 -192
  245. package/src/js/listbox/constants.listbox.ts +0 -61
  246. package/src/js/listbox/event.listbox.ts +0 -106
  247. package/src/js/listbox/index.ts +0 -364
  248. package/src/js/listbox/misc.listbox.ts +0 -70
  249. package/src/js/listbox/state.listbox.ts +0 -194
  250. package/src/js/menu.ts +0 -348
  251. package/src/js/movable/movable.embedded.ts +0 -318
  252. package/src/js/movable/movable.standalone.ts +0 -2
  253. package/src/js/popover.ts +0 -229
  254. package/src/js/resizable/resizable.embedded.ts +0 -413
  255. package/src/js/resizable/resizable.standalone.ts +0 -5
  256. package/src/js/sortable/sortable.embedded.ts +0 -527
  257. package/src/js/sortable/sortable.standalone.ts +0 -2
  258. package/src/js/splitter.ts +0 -583
  259. package/src/js/tabs.ts +0 -441
  260. package/src/js/toolbar.ts +0 -63
  261. package/src/js/tooltip.ts +0 -367
  262. /package/dist/js/combobox/{models.combobox.mjs → combobox.model.mjs} +0 -0
  263. /package/dist/js/{menu.d.mts → menu/index.d.mts} +0 -0
  264. /package/dist/js/{toolbar.d.mts → toolbar/index.d.mts} +0 -0
@@ -1,364 +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
- * Form element associated with the listbox
68
- */
69
- get form(): HTMLFormElement | null {
70
- return this.#internals.form;
71
- }
72
-
73
- /**
74
- * Label elements associated with the listbox
75
- */
76
- get labels(): NodeList {
77
- return this.#internals.labels;
78
- }
79
-
80
- /**
81
- * Maximum number of selected options
82
- */
83
- get max(): number | undefined {
84
- return this.#state?.max;
85
- }
86
-
87
- /**
88
- * Set the maximum number of selected options
89
- */
90
- set max(value: number) {
91
- setListboxLimit('max', this.#state, value);
92
- }
93
-
94
- /**
95
- * Minimum number of selected options
96
- */
97
- get min(): number | undefined {
98
- return this.#state?.min;
99
- }
100
-
101
- /**
102
- * Set the minimum number of selected options
103
- */
104
- set min(value: number) {
105
- setListboxLimit('min', this.#state, value);
106
- }
107
-
108
- /**
109
- * Does the listbox allow multiple values?
110
- */
111
- get multiple(): boolean {
112
- return this.hasAttribute('multiple');
113
- }
114
-
115
- /**
116
- * Name of the listbox
117
- */
118
- get name(): string {
119
- return getAttribute(this, 'name') ?? '';
120
- }
121
-
122
- /**
123
- * Is the listbox readonly?
124
- */
125
- get readonly(): boolean {
126
- return this.#state?.readonly ?? false;
127
- }
128
-
129
- /**
130
- * Should the listbox be readonly?
131
- */
132
- set readonly(value: boolean) {
133
- if (typeof value === 'boolean' && value !== this.readonly) {
134
- setListboxReadonly(this.#state, value);
135
- }
136
- }
137
-
138
- /**
139
- * Is the listbox required?
140
- */
141
- get required(): boolean {
142
- return this.#state?.required ?? false;
143
- }
144
-
145
- /**
146
- * Should the listbox be required?
147
- */
148
- set required(value: boolean) {
149
- if (typeof value === 'boolean' && value !== this.required) {
150
- setListboxRequired(this.#state, value);
151
- }
152
- }
153
-
154
- /**
155
- * Selected options
156
- */
157
- get selected(): HTMLElement[] {
158
- return this.#state.options.selected.slice();
159
- }
160
-
161
- /**
162
- * Validation message for the listbox
163
- */
164
- get validationMessage(): string {
165
- return this.#internals.validationMessage;
166
- }
167
-
168
- /**
169
- * Validity state for the listbox
170
- */
171
- get validity(): ValidityState {
172
- return this.#internals.validity;
173
- }
174
-
175
- /**
176
- * Current value
177
- */
178
- get value(): string {
179
- return this.#state.values.current[0];
180
- }
181
-
182
- /**
183
- * Set the value
184
- */
185
- set value(value: unknown) {
186
- setListboxValue(this.#state, value);
187
- }
188
-
189
- /**
190
- * Current values
191
- */
192
- get values(): string[] {
193
- return this.#state.values.current.slice();
194
- }
195
-
196
- /**
197
- * Set the values
198
- */
199
- set values(values: unknown[]) {
200
- setListboxValues(this.#state, values);
201
- }
202
-
203
- /**
204
- * Can the listbox be validated?
205
- */
206
- get willValidate(): boolean {
207
- return this.#internals.willValidate;
208
- }
209
-
210
- constructor() {
211
- super();
212
-
213
- this.#internals = this.attachInternals();
214
- }
215
-
216
- attributeChangedCallback(name: string, _: string | null, value: string | null): void {
217
- if (this.#state == null) {
218
- return;
219
- }
220
-
221
- switch (name) {
222
- case 'required':
223
- this[name] = this.hasAttribute(name);
224
- break;
225
-
226
- case 'max':
227
- case 'min':
228
- setListboxLimit(name, this.#state, value);
229
- break;
230
-
231
- case 'value':
232
- this.value = value ?? '';
233
- break;
234
-
235
- default:
236
- break;
237
- }
238
- }
239
-
240
- /**
241
- * Check if the listbox is valid
242
- *
243
- * @returns `true` if the listbox is valid, otherwise `false`
244
- */
245
- checkValidity(): boolean {
246
- return this.#internals.checkValidity();
247
- }
248
-
249
- /**
250
- * Clear all selected options
251
- */
252
- clear(): void {
253
- setListboxValues(this.#state, []);
254
- }
255
-
256
- connectedCallback(): void {
257
- if (this.#state == null) {
258
- this.#initialize();
259
- } else {
260
- attachListbox(this.#state, listboxStates, onAttachListbox);
261
- }
262
- }
263
-
264
- disconnectedCallback(): void {
265
- if (this.#state != null) {
266
- detachListbox(this.#state, listboxStates, onDetachListbox);
267
- }
268
- }
269
-
270
- formDisabledCallback(disabled: boolean): void {
271
- this.disabled = disabled;
272
- }
273
-
274
- formResetCallback(): void {
275
- setListboxValues(this.#state, this.#state.values.initial);
276
- }
277
-
278
- formStateRestoreCallback(state: string | File | FormData, reason: unknown): void {
279
- if (reason !== 'restore') {
280
- return;
281
- }
282
-
283
- const parsed = typeof state === 'string' ? parse(state) : undefined;
284
-
285
- if (!Array.isArray(parsed)) {
286
- return;
287
- }
288
-
289
- if (this.#state == null) {
290
- this.#restored = parsed;
291
- } else {
292
- setListboxValues(this.#state, parsed);
293
- }
294
- }
295
-
296
- /**
297
- * Check if the listbox is valid and report any validation errors
298
- *
299
- * @returns `true` if the listbox is valid, otherwise `false`
300
- */
301
- reportValidity(): boolean {
302
- return this.#internals.reportValidity();
303
- }
304
-
305
- /**
306
- * Set a custom validation message for the listbox
307
- *
308
- * @param message Validation message
309
- */
310
- setCustomValidity(message: string): void {
311
- this.#internals.setValidity({customError: message !== ''}, message, this);
312
- }
313
-
314
- /**
315
- * Set listbox localizations for a specific language
316
- *
317
- * @param language Language code
318
- * @param localizations Localizations for language
319
- */
320
- setLocalizations(language: string, localizations: Partial<OuiListboxLocalizations>): void;
321
-
322
- /**
323
- * Set listbox localizations for one or more languages
324
- *
325
- * @param localizations Localizations for one or more languages
326
- */
327
- setLocalizations(localizations: Record<string, Partial<OuiListboxLocalizations>>): void;
328
-
329
- setLocalizations(
330
- first: string | Record<string, Partial<OuiListboxLocalizations>>,
331
- second?: Partial<OuiListboxLocalizations>,
332
- ): void {
333
- updateListboxLocalizations(
334
- this.#state.localizations.global,
335
- this.#state.localizations.component,
336
- first,
337
- second,
338
- );
339
- }
340
-
341
- #initialize(): void {
342
- this.#state = createListboxState(this, this.#internals);
343
-
344
- if (this.#restored != null) {
345
- setListboxValues(this.#state, this.#restored);
346
-
347
- this.#restored = undefined;
348
- }
349
- }
350
- }
351
-
352
- // #endregion
353
-
354
- // #region Initialization
355
-
356
- customElements.define(LISTBOX_TAGNAME, OuiListboxElement);
357
-
358
- // #endregion
359
-
360
- // #region Exports
361
-
362
- export {setListboxLocalizations} from './misc.listbox';
363
-
364
- // #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,194 +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
- const disabled = getBooleanAriaValue(element, 'disabled') || select.disabled;
47
- const multiple = element.multiple || select.multiple;
48
- const readonly = getBooleanAriaValue(element, 'readonly');
49
- const required = getBooleanAriaValue(element, 'required') || select.required;
50
-
51
- setAttributes(element, {
52
- autocomplete: 'none',
53
- name: select.name === '' ? select.id : select.name,
54
- });
55
-
56
- const id = getListboxId();
57
-
58
- const labelId = label.id;
59
-
60
- label.htmlFor = id;
61
- label.id = `${id}_label`;
62
-
63
- generateListboxIds(id, select);
64
-
65
- const type = 'select';
66
-
67
- const content = createListboxContent({
68
- element,
69
- id,
70
- label,
71
- multiple,
72
- select,
73
- type,
74
- attributes: LISTBOX_ATTRIBUTES,
75
- autocomplete: listboxAutoComplete,
76
- listbox: true,
77
- });
78
-
79
- const {selected} = content.list.options;
80
-
81
- const values =
82
- selected.length === 0 ? [''] : selected.map(option => getData(option, 'value', false) ?? '');
83
-
84
- const state: OuiListboxState = {
85
- disabled,
86
- id,
87
- internals,
88
- message: content.message,
89
- multiple,
90
- readonly,
91
- required,
92
- select,
93
- type,
94
- active: selected[0],
95
- attributes: LISTBOX_ATTRIBUTES,
96
- autocomplete: listboxAutoComplete,
97
- callbacks: listboxCallbacks,
98
- content: content.element,
99
- elements: [element, content.filter!.element],
100
- filter: {
101
- element: content.filter!.element,
102
- value: '',
103
- },
104
- host: element,
105
- label: {
106
- id: labelId,
107
- element: label,
108
- },
109
- list: content.list.element,
110
- listeners: [],
111
- listbox: true,
112
- localizations: {
113
- component: {},
114
- global: listboxLocalizations,
115
- },
116
- name: element.name,
117
- options: content.list.options,
118
- values: {
119
- current: values.slice(),
120
- initial: values.slice(),
121
- label: content.value,
122
- },
123
- };
124
-
125
- return initializeListboxState(state, listboxStates, onAttachListbox);
126
- }
127
-
128
- // #endregion
129
-
130
- // #region Functions
131
-
132
- export function onAttachListbox(state: OuiListboxState): void {
133
- const {content, select} = state;
134
-
135
- select.hidden = true;
136
-
137
- select.insertAdjacentElement('afterend', content);
138
-
139
- select.remove();
140
- }
141
-
142
- export function onDetachListbox(state: OuiListboxState): void {
143
- const {content, select} = state;
144
-
145
- content.insertAdjacentElement('beforebegin', select);
146
-
147
- content.remove();
148
-
149
- select.hidden = false;
150
- }
151
-
152
- // #endregion
153
-
154
- // #region Variables
155
-
156
- const listboxAutoComplete: Record<OuiListboxAutoCompleteType, boolean> = {
157
- both: false,
158
- inline: false,
159
- list: false,
160
- none: true,
161
- };
162
-
163
- const listboxCallbacks: OuiListboxCallbacks = {
164
- data: {
165
- onApply: noop,
166
- onFilter: onListboxFilter,
167
- onForm: noop,
168
- onPreview: noop,
169
- onToggle: onListboxToggle,
170
- },
171
- keydown: {
172
- onEnter: onListboxEnter,
173
- onNavigation: onListboxNavigation,
174
- onToggle: onListboxToggle,
175
- },
176
- };
177
-
178
- export const listboxLocalizations = getLocalizations<OuiListboxLocalizations>({
179
- empty: 'No results found',
180
- input: '',
181
- invalid: 'Please select an option from the list',
182
- max: max => `Please select fewer options (maximum is ${max})`,
183
- min: min => `Please select more options (minimum is ${min})`,
184
- remove: '',
185
- results: amount => `${amount} results available`,
186
- selected: amount => `${amount} selected`,
187
- });
188
-
189
- export const listboxStates: OuiListboxStates = {
190
- map: new WeakMap(),
191
- set: new Set(),
192
- };
193
-
194
- // #endregion