@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,246 +0,0 @@
1
- import {noop} from '@oscarpalmer/atoms/function';
2
- import {setAria} from '@oscarpalmer/toretto/aria';
3
- import {setAttributes} from '@oscarpalmer/toretto/attribute';
4
- import {getData} from '@oscarpalmer/toretto/data';
5
- import {on} from '@oscarpalmer/toretto/event';
6
- import {createEmbeddedFloatable} from '../floatable/floatable.embedded';
7
- import {LISTBOX_TYPES} from '../internal/listbox/listbox.constants';
8
- import {generateListboxIds} from '../internal/listbox/listbox.misc';
9
- import type {
10
- OuiListboxCallbacks,
11
- OuiListboxLocalizations,
12
- OuiListboxStates,
13
- } from '../internal/listbox/listbox.model';
14
- import {initializeListboxState} from '../internal/listbox/listbox.state';
15
- import {getAttributeValue, getBooleanAriaValue} from '../internal/misc';
16
- import {getLocalizations} from '../l10n';
17
- import {COMBOBOX_ATTRIBUTES, COMBOBOX_MESSAGES} from './constants.combobox';
18
- import {createComboboxAnchor, createComboboxContent} from './dom.combobox';
19
- import {
20
- onComboboxActivation,
21
- onComboboxApply,
22
- onComboboxEnter,
23
- onComboboxEscape,
24
- onComboboxFilter,
25
- onComboboxNavigation,
26
- onComboboxPreview,
27
- onComboboxSelection,
28
- onComboboxTab,
29
- onComboboxToggle,
30
- preventComboboxActivation,
31
- skipComboboxNavigation,
32
- } from './event.combobox';
33
- import type {OuiComboboxElement} from './index';
34
- import {getComboboxAutoComplete, getComboboxId} from './misc.combobox';
35
- import type {OuiComboboxState} from './models.combobox';
36
-
37
- // #region Functions
38
-
39
- export function createComboboxState(
40
- element: OuiComboboxElement,
41
- internals: ElementInternals,
42
- ): OuiComboboxState {
43
- const select = element.querySelector('select');
44
-
45
- if (select == null || select.id === '') {
46
- throw new Error(COMBOBOX_MESSAGES.select);
47
- }
48
-
49
- const label = element.querySelector(`label[for="${select.id}"]`) as HTMLLabelElement;
50
-
51
- if (label == null) {
52
- throw new Error(COMBOBOX_MESSAGES.label);
53
- }
54
-
55
- element.id = select.id;
56
-
57
- const disabled = getBooleanAriaValue(element, 'disabled') || select.disabled;
58
- const multiple = element.multiple || select.multiple;
59
- const readonly = getBooleanAriaValue(element, 'readonly');
60
- const required = getBooleanAriaValue(element, 'required') || select.required;
61
-
62
- const id = getComboboxId();
63
- const type = multiple ? 'select' : getAttributeValue(element, 'type', LISTBOX_TYPES, 'select');
64
-
65
- const autocomplete = getComboboxAutoComplete(element, type === 'select');
66
-
67
- setAttributes(element, {
68
- autocomplete: autocomplete.value,
69
- name: select.name === '' ? select.id : select.name,
70
- });
71
-
72
- const labelId = label.id;
73
-
74
- label.htmlFor = id;
75
- label.id = `${id}_label`;
76
-
77
- generateListboxIds(id, select);
78
-
79
- const parameters = {
80
- autocomplete,
81
- element,
82
- id,
83
- label,
84
- multiple,
85
- select,
86
- type,
87
- attributes: COMBOBOX_ATTRIBUTES,
88
- listbox: false,
89
- };
90
-
91
- const anchor = createComboboxAnchor(parameters);
92
- const content = createComboboxContent(parameters);
93
-
94
- const {selected} = content.list.options;
95
-
96
- const values =
97
- selected.length === 0 ? [''] : selected.map(option => getData(option, 'value', false) ?? '');
98
-
99
- const state: OuiComboboxState = {
100
- autocomplete,
101
- disabled,
102
- id,
103
- internals,
104
- multiple,
105
- readonly,
106
- required,
107
- select,
108
- type,
109
- active: selected[0],
110
- anchor: {
111
- container: anchor.container,
112
- element: anchor.element,
113
- },
114
- attributes: COMBOBOX_ATTRIBUTES,
115
- callbacks: comboboxCallbacks as OuiComboboxState['callbacks'],
116
- content: content.element,
117
- elements: [element, anchor.element, content.filter?.element],
118
- filter: {
119
- element: content.filter?.element ?? (anchor.element as HTMLInputElement),
120
- value: '',
121
- },
122
- floatable: undefined as never,
123
- groups: content.list.groups,
124
- host: element,
125
- label: {
126
- element: label,
127
- id: labelId,
128
- },
129
- list: content.list.element,
130
- listbox: false,
131
- listeners: [],
132
- localizations: {
133
- component: {},
134
- global: comboboxLocalizations,
135
- },
136
- message: content.message,
137
- name: element.name,
138
- options: {
139
- selected,
140
- all: content.list.options.all,
141
- },
142
- selection: anchor.selection,
143
- values: {
144
- current: values.slice(),
145
- initial: values.slice(),
146
- label: content.value,
147
- },
148
- };
149
-
150
- return initializeListboxState(state, comboboxStates, onAttachCombobox);
151
- }
152
-
153
- export function onAttachCombobox(state: OuiComboboxState): void {
154
- const {anchor, content, filter, select} = state;
155
-
156
- select.hidden = true;
157
-
158
- select.insertAdjacentElement('afterend', anchor.container ?? anchor.element);
159
- (anchor.container ?? anchor.element).insertAdjacentElement('afterend', content);
160
-
161
- select.remove();
162
-
163
- state.floatable = createEmbeddedFloatable(anchor.container ?? anchor.element, content, {
164
- position: 'below-start',
165
- reusable: false,
166
- });
167
-
168
- state.floatable.update();
169
-
170
- state.listeners.push(
171
- on(content, 'toggle', () => {
172
- setAria(anchor.element, 'expanded', state.floatable.open);
173
-
174
- setAria(
175
- filter.element,
176
- 'activedescendant',
177
- state.floatable.open ? state.active?.id : undefined,
178
- );
179
-
180
- if (state.floatable.open) {
181
- filter.element.focus();
182
- }
183
- }),
184
- );
185
- }
186
-
187
- export function onDetachCombobox(state: OuiComboboxState): void {
188
- const {content, floatable, label, select} = state;
189
-
190
- floatable.destroy();
191
-
192
- const anchor = state.anchor.container ?? state.anchor.element;
193
-
194
- anchor.insertAdjacentElement('beforebegin', select);
195
-
196
- anchor.remove();
197
- content.remove();
198
-
199
- label.element.htmlFor = select.id;
200
- label.element.id = state.label.id;
201
-
202
- select.hidden = false;
203
- }
204
-
205
- // #endregion
206
-
207
- // #region Variables
208
-
209
- const comboboxCallbacks: OuiListboxCallbacks<OuiComboboxState> = {
210
- data: {
211
- onApply: onComboboxApply,
212
- onFilter: onComboboxFilter,
213
- onForm: noop,
214
- onPreview: onComboboxPreview,
215
- onToggle: onComboboxToggle,
216
- },
217
- keydown: {
218
- onActivation: onComboboxActivation,
219
- onEnter: onComboboxEnter,
220
- onEscape: onComboboxEscape,
221
- onNavigation: onComboboxNavigation,
222
- onSelection: onComboboxSelection,
223
- onTab: onComboboxTab,
224
- onToggle: onComboboxToggle,
225
- preventActivation: preventComboboxActivation,
226
- skipNavigation: skipComboboxNavigation,
227
- },
228
- };
229
-
230
- export const comboboxLocalizations = getLocalizations<OuiListboxLocalizations>({
231
- empty: 'No results found',
232
- input: 'Please enter a value',
233
- invalid: 'Please select an option from the list',
234
- max: max => `Please select fewer options (maximum is ${max})`,
235
- min: min => `Please select more options (minimum is ${min})`,
236
- remove: label => `Remove ${label}`,
237
- results: amount => `${amount} results available`,
238
- selected: amount => `${amount} selected`,
239
- });
240
-
241
- export const comboboxStates: OuiListboxStates<OuiComboboxState> = {
242
- map: new WeakMap(),
243
- set: new Set(),
244
- };
245
-
246
- // #endregion
package/src/js/dialog.ts DELETED
@@ -1,255 +0,0 @@
1
- import {getAria, setAria} from '@oscarpalmer/toretto/aria';
2
- import {on} from '@oscarpalmer/toretto/event';
3
- import type {RemovableEventListener} from '@oscarpalmer/toretto/models';
4
- import {getOnBeforeToggleListener} from './floatable/floatable.embedded';
5
- import {attributable} from './internal/attributable';
6
- import {ATTRIBUTE_MOVABLE_HANDLE} from './movable/movable.embedded';
7
- import {createMovable, type OuiMovable} from './movable/movable.standalone';
8
- import {createResizable, RESIZABLE_ATTRIBUTE_HANDLE} from './resizable/resizable.embedded';
9
- import type {OuiResizable} from './resizable/resizable.standalone';
10
- import {getAttribute, setAttribute} from '@oscarpalmer/toretto/attribute';
11
- import {setStyles} from '@oscarpalmer/toretto/style';
12
-
13
- // #region Types
14
-
15
- class OuiDialog {
16
- readonly #state: OuiDialogState;
17
-
18
- /**
19
- * Is the dialog open?
20
- */
21
- get open(): boolean {
22
- return this.#state.element.open;
23
- }
24
-
25
- /**
26
- * Open or close the dialog
27
- */
28
- set open(value: boolean) {
29
- if (value === true) {
30
- this.show();
31
- } else if (value === false) {
32
- this.hide();
33
- }
34
- }
35
-
36
- constructor(state: OuiDialogState) {
37
- this.#state = state;
38
- }
39
-
40
- /**
41
- * Closes the dialog by request
42
- */
43
- hide(request: true, value?: string): void;
44
-
45
- /**
46
- * Closes the dialog
47
- */
48
- hide(value?: string): void;
49
-
50
- hide(first?: string | boolean, second?: string): void {
51
- if (!this.#state.element.open) {
52
- return;
53
- }
54
-
55
- if (first === true) {
56
- this.#state.element.requestClose(typeof second === 'string' ? second : undefined);
57
- } else {
58
- this.#state.element.close(typeof first === 'string' ? first : undefined);
59
- }
60
- }
61
-
62
- /**
63
- * Opens the dialog
64
- */
65
- show(modal?: boolean): void {
66
- const {element} = this.#state;
67
-
68
- if (element == null || element.open) {
69
- return;
70
- }
71
-
72
- const isModal = modal !== false;
73
-
74
- setAria(element, 'modal', isModal);
75
-
76
- if (isModal) {
77
- element.showModal();
78
- } else {
79
- element.show();
80
- }
81
- }
82
- }
83
-
84
- type OuiDialogState = {
85
- dialog: OuiDialog;
86
- element: HTMLDialogElement;
87
- listeners: RemovableEventListener[];
88
- modal: boolean;
89
- movable?: OuiMovable;
90
- resizable?: OuiResizable;
91
- };
92
-
93
- // #endregion
94
-
95
- // #region Functions
96
-
97
- function addDialog(element: HTMLElement): void {
98
- if (!(element instanceof HTMLDialogElement)) {
99
- throw new TypeError(MESSAGE);
100
- }
101
-
102
- if (!states.has(element)) {
103
- states.set(element, getState(element));
104
- }
105
- }
106
-
107
- function destroyDialog(state: OuiDialogState): void {
108
- state.element.close();
109
-
110
- setAria(state.element, 'modal', state.modal);
111
-
112
- state.element.removeAttribute(ATTRIBUTE_OPEN);
113
-
114
- for (const listener of state.listeners) {
115
- listener();
116
- }
117
-
118
- state.movable?.destroy();
119
- state.resizable?.destroy();
120
-
121
- state.dialog = undefined as never;
122
- state.element = undefined as never;
123
- state.listeners = undefined as never;
124
- state.movable = undefined;
125
- state.resizable = undefined;
126
- }
127
-
128
- /**
129
- * Get the _OuiDialog_ for an element
130
- *
131
- * @param element Element to get _OuiDialog_ for
132
- * @returns _OuiDialog_ instance
133
- */
134
- function getDialog(element: HTMLDialogElement): OuiDialog | undefined {
135
- return states.get(element)?.dialog;
136
- }
137
-
138
- function getMovable(element: HTMLDialogElement): OuiMovable | undefined {
139
- const handles = element.querySelectorAll(SELECTOR_MOVER);
140
-
141
- if (handles.length === 0) {
142
- return;
143
- }
144
-
145
- for (const handle of handles) {
146
- setAttribute(handle, ATTRIBUTE_MOVABLE_HANDLE, '');
147
- }
148
-
149
- return createMovable(element, {
150
- container: getAttribute(element, ATTRIBUTE_CONTAINER),
151
- });
152
- }
153
-
154
- function getResizable(element: HTMLDialogElement): OuiResizable | undefined {
155
- const handle = element.querySelector(SELECTOR_RESIZER);
156
-
157
- if (handle == null) {
158
- return;
159
- }
160
-
161
- setAttribute(handle, RESIZABLE_ATTRIBUTE_HANDLE, '');
162
-
163
- return createResizable(element);
164
- }
165
-
166
- function getState(element: HTMLDialogElement): OuiDialogState {
167
- const state: OuiDialogState = {
168
- element,
169
- dialog: undefined as never,
170
- listeners: [
171
- getOnBeforeToggleListener(element),
172
- on(element, 'toggle', event => {
173
- const {source} = event;
174
-
175
- if (element.open) {
176
- const modal =
177
- (source instanceof HTMLButtonElement && source.command === 'show-modal') ||
178
- element.matches(':modal');
179
-
180
- setAria(element, 'modal', modal);
181
- setAttribute(element, ATTRIBUTE_OPEN, '');
182
-
183
- element.focus();
184
-
185
- setTimeout(() => {
186
- state.resizable?.set();
187
- }, 500);
188
- } else {
189
- setAttribute(element, ATTRIBUTE_OPEN);
190
- setAria(element, 'modal', state.modal);
191
-
192
- setStyles(element, {
193
- inset: '',
194
- position: '',
195
- transform: '',
196
- });
197
-
198
- state.resizable?.reset();
199
- }
200
- }),
201
- ],
202
- modal: getAria(element, 'modal') === true || element.matches(':modal'),
203
- };
204
-
205
- state.dialog = new OuiDialog(state);
206
-
207
- state.movable = getMovable(element);
208
- state.resizable = getResizable(element);
209
-
210
- return state;
211
- }
212
-
213
- function removeDialog(element: HTMLElement): void {
214
- const state = states.get(element);
215
-
216
- if (state == null) {
217
- return;
218
- }
219
-
220
- destroyDialog(state);
221
-
222
- states.delete(element);
223
- }
224
-
225
- // #endregion
226
-
227
- // #region Variables
228
-
229
- const ATTRIBUTE = 'oui-dialog';
230
-
231
- const ATTRIBUTE_CONTAINER = `${ATTRIBUTE}-container`;
232
-
233
- const ATTRIBUTE_OPEN = `${ATTRIBUTE}-open`;
234
-
235
- const MESSAGE = 'The element must be an instance of HTMLDialogElement';
236
-
237
- const SELECTOR_MOVER = `[${ATTRIBUTE}-mover]`;
238
-
239
- const SELECTOR_RESIZER = `[${ATTRIBUTE}-resizer]`;
240
-
241
- const states = new WeakMap<HTMLElement, OuiDialogState>();
242
-
243
- // #endregion
244
-
245
- // #region Initialization
246
-
247
- attributable(ATTRIBUTE, addDialog, removeDialog);
248
-
249
- // #endregion
250
-
251
- // #region Exports
252
-
253
- export {getDialog, type OuiDialog};
254
-
255
- // #endregion