@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,365 +0,0 @@
1
- import {clamp} from '@oscarpalmer/atoms/number';
2
- import {findAncestor, getData} from '@oscarpalmer/toretto';
3
- import {on} from '@oscarpalmer/toretto/event';
4
- import {LISTBOX_KEYS} from '../internal/listbox/listbox.constants';
5
- import {
6
- applyListboxSelection,
7
- filterListbox,
8
- filterListboxOption,
9
- filterListboxOptions,
10
- toggleListboxOption,
11
- } from '../internal/listbox/listbox.data';
12
- import {updateListboxPreview} from '../internal/listbox/listbox.dom';
13
- import {processListboxKeydown} from '../internal/listbox/listbox.event';
14
- import type {OuiListboxPreview} from '../internal/listbox/listbox.model';
15
- import {
16
- COMBOBOX_ATTRIBUTE_SELECTION_ITEM,
17
- COMBOBOX_SELECTORS,
18
- COMBOBOX_TAGNAME,
19
- } from './constants.combobox';
20
- import {
21
- updateComboboxAutocomplete,
22
- updateComboboxSelection,
23
- updateComboboxTabindices,
24
- } from './dom.combobox';
25
- import type {OuiComboboxElement} from './index';
26
- import {hasTextSelection} from './misc.combobox';
27
- import type {OuiComboboxState} from './models.combobox';
28
- import {comboboxStates} from './state.combobox';
29
-
30
- // #region Functions
31
-
32
- export function onComboboxActivation(state: OuiComboboxState): void {
33
- state.floatable.show();
34
- }
35
-
36
- export function onComboboxApply(
37
- state: OuiComboboxState,
38
- option: HTMLElement | undefined,
39
- _: string[],
40
- added: boolean,
41
- selected?: HTMLElement[],
42
- ): void {
43
- updateComboboxSelection(state, option, added, selected);
44
- }
45
-
46
- export function onComboboxClickContent(event: PointerEvent, state: OuiComboboxState): void {
47
- if (state == null) {
48
- return;
49
- }
50
-
51
- if (state.disabled) {
52
- return;
53
- }
54
-
55
- const option = findAncestor(event, COMBOBOX_SELECTORS.option);
56
-
57
- if (!(option instanceof HTMLElement)) {
58
- state.filter.element.focus();
59
- } else if (state.readonly) {
60
- onComboboxPreview('set', state, option);
61
- } else {
62
- toggleListboxOption(state, option);
63
- }
64
- }
65
-
66
- function onComboboxClickDocument(event: PointerEvent): void {
67
- const combobox = findAncestor(event, COMBOBOX_TAGNAME);
68
- const state = comboboxStates.map.get(combobox!);
69
-
70
- if (combobox == null || state == null) {
71
- return;
72
- }
73
-
74
- if (findAncestor(event, COMBOBOX_SELECTORS.content) != null) {
75
- onComboboxClickContent(event, state);
76
-
77
- return;
78
- }
79
-
80
- const label = findAncestor(event, 'label');
81
-
82
- if (label != null) {
83
- if (label === state.label.element && combobox.type === 'select') {
84
- state.anchor.element.focus();
85
-
86
- if (!state.disabled) {
87
- state.floatable.show();
88
- }
89
- }
90
-
91
- return;
92
- }
93
-
94
- const selection = findAncestor(event, `[${COMBOBOX_ATTRIBUTE_SELECTION_ITEM}]`);
95
-
96
- if (selection != null) {
97
- const option = state.options.selected.find(
98
- option => option.id === getData(selection, 'option', false),
99
- );
100
-
101
- if (state.disabled) {
102
- state.anchor.element.focus();
103
- } else if (state.readonly) {
104
- updateComboboxTabindices(state, option);
105
- } else {
106
- toggleListboxOption(state, option);
107
- }
108
-
109
- return;
110
- }
111
-
112
- const anchor = findAncestor(event, COMBOBOX_SELECTORS.anchor);
113
-
114
- if (anchor != null && !state.disabled) {
115
- state.floatable.show();
116
-
117
- return;
118
- }
119
- }
120
-
121
- export function onComboboxEnter(state: OuiComboboxState): void {
122
- if (state.disabled || state.readonly) {
123
- return;
124
- }
125
-
126
- if (hasTextSelection(state.anchor.element)) {
127
- onComboboxSelection(state, true);
128
- } else {
129
- toggleListboxOption(state, state.active);
130
- }
131
- }
132
-
133
- export function onComboboxEscape(state: OuiComboboxState): void {
134
- state.floatable.hide();
135
- }
136
-
137
- export function onComboboxFilter(
138
- preview: OuiListboxPreview,
139
- state: OuiComboboxState,
140
- update: boolean,
141
- active?: HTMLElement,
142
- emit?: boolean,
143
- ): void {
144
- if (state.autocomplete.none) {
145
- applyListboxSelection({
146
- state,
147
- added: false,
148
- emit: (emit ?? true) && update,
149
- });
150
- } else {
151
- updateListboxPreview(preview, state, active);
152
- }
153
- }
154
-
155
- export function onComboboxFocusout(event: FocusEvent): void {
156
- setTimeout(() => {
157
- const combobox = findAncestor(event, COMBOBOX_TAGNAME);
158
- const state = comboboxStates.map.get(combobox!);
159
-
160
- if (
161
- combobox == null ||
162
- state == null ||
163
- state.disabled ||
164
- state.readonly ||
165
- state.type === 'select' ||
166
- state.host === document.activeElement ||
167
- state.host.contains(document.activeElement)
168
- ) {
169
- return;
170
- }
171
-
172
- const option = filterListboxOption(state, state.filter.element.value, true);
173
-
174
- applyListboxSelection({
175
- option,
176
- state,
177
- added: false,
178
- selected: option == null ? [] : [option],
179
- });
180
- });
181
- }
182
-
183
- export function onComboboxInput(event: InputEvent): void {
184
- const combobox = findAncestor(event, COMBOBOX_TAGNAME) as OuiComboboxElement | null;
185
- const state = comboboxStates.map.get(combobox!);
186
-
187
- if (combobox != null && state != null && event.target === state.filter.element) {
188
- filterListbox(event.inputType, state);
189
- }
190
- }
191
-
192
- export function onComboboxKeydown(event: KeyboardEvent): void {
193
- const combobox = findAncestor(event, COMBOBOX_TAGNAME) as OuiComboboxElement | null;
194
- const state = comboboxStates.map.get(combobox!);
195
-
196
- if (combobox == null || state == null) {
197
- return;
198
- }
199
-
200
- const item = findAncestor(event, COMBOBOX_SELECTORS.selectionItem);
201
-
202
- if (item instanceof HTMLElement) {
203
- onComboboxKeydownSelection(event, state, item);
204
- } else {
205
- processListboxKeydown(event, state);
206
- }
207
- }
208
-
209
- export function onComboboxKeydownSelection(
210
- event: KeyboardEvent,
211
- state: OuiComboboxState,
212
- item: HTMLElement,
213
- ): void {
214
- if (LISTBOX_KEYS.activation.has(event.key)) {
215
- event.preventDefault();
216
-
217
- onComboboxRemoveSelection(state, item);
218
-
219
- return;
220
- }
221
-
222
- if (state.disabled || state.selection == null) {
223
- return;
224
- }
225
-
226
- const {length} = state.selection.items;
227
-
228
- const index = state.selection.items.findIndex(selection => selection.button === item);
229
-
230
- let next: number | undefined;
231
-
232
- switch (event.key) {
233
- case 'ArrowDown':
234
- state.anchor.element.focus();
235
- state.anchor.element.click();
236
- return;
237
-
238
- case 'ArrowRight':
239
- case 'ArrowLeft':
240
- next = clamp(index + (event.key === 'ArrowRight' ? 1 : -1), 0, length - 1, true);
241
- break;
242
-
243
- case 'End':
244
- next = length - 1;
245
- break;
246
-
247
- case 'Home':
248
- next = 0;
249
- break;
250
-
251
- default:
252
- break;
253
- }
254
-
255
- if (next == null) {
256
- return;
257
- }
258
-
259
- event.preventDefault();
260
-
261
- for (let index = 0; index < length; index += 1) {
262
- const {button} = state.selection.items[index];
263
- const selected = index === next;
264
-
265
- button.tabIndex = selected ? 0 : -1;
266
-
267
- if (selected) {
268
- button.focus();
269
- }
270
- }
271
- }
272
-
273
- export function onComboboxPreview(
274
- preview: OuiListboxPreview,
275
- state: OuiComboboxState,
276
- active?: HTMLElement,
277
- ): void {
278
- updateComboboxAutocomplete(preview, state, active);
279
- }
280
-
281
- export function onComboboxRemoveSelection(state: OuiComboboxState, item: HTMLElement): void {
282
- if (state.disabled || state.readonly) {
283
- return;
284
- }
285
-
286
- const option = state.options.selected.find(
287
- option => option.id === getData(item, 'option', false),
288
- );
289
-
290
- if (option != null) {
291
- toggleListboxOption(state, option);
292
- }
293
- }
294
-
295
- export function onComboboxNavigation(
296
- preview: OuiListboxPreview,
297
- state: OuiComboboxState,
298
- active?: HTMLElement,
299
- ): void {
300
- updateListboxPreview(preview, state, active);
301
- }
302
-
303
- export function onComboboxSelection(state: OuiComboboxState, hasSelection?: boolean): void {
304
- if (!(hasSelection ?? hasTextSelection(state.anchor.element))) {
305
- return;
306
- }
307
-
308
- state.filter.value =
309
- state.anchor.element === state.filter.element ? state.filter.element.value : '';
310
-
311
- toggleListboxOption(state, filterListboxOptions(state) ?? state.active);
312
- }
313
-
314
- export function onComboboxTab(state: OuiComboboxState): void {
315
- setTimeout(() => {
316
- if (state.host === document.activeElement) {
317
- return;
318
- }
319
-
320
- if (
321
- state.selection?.container.contains(document.activeElement) ||
322
- !state.host.contains(document.activeElement)
323
- ) {
324
- state.floatable.hide();
325
- }
326
- });
327
- }
328
-
329
- export function onComboboxToggle(state: OuiComboboxState): void {
330
- if (!state.multiple) {
331
- state.floatable.hide();
332
- }
333
- }
334
-
335
- export function preventComboboxActivation(state: OuiComboboxState): boolean {
336
- return state.floatable.open;
337
- }
338
-
339
- export function skipComboboxNavigation(state: OuiComboboxState): boolean {
340
- if (state.floatable.open) {
341
- return false;
342
- }
343
-
344
- state.floatable.show();
345
-
346
- return true;
347
- }
348
-
349
- // #endregion
350
-
351
- // #region Initialization
352
-
353
- on(document, 'click', onComboboxClickDocument);
354
-
355
- on(document, 'focusout', onComboboxFocusout);
356
-
357
- on(document, 'input', onComboboxInput, {
358
- passive: false,
359
- });
360
-
361
- on(document, 'keydown', onComboboxKeydown, {
362
- passive: false,
363
- });
364
-
365
- // #endregion