@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,657 +0,0 @@
1
- import type {EventPosition, PlainObject} from '@oscarpalmer/atoms/models';
2
- import {clamp} from '@oscarpalmer/atoms/number';
3
- import {getAttribute, setAttribute} from '@oscarpalmer/toretto/attribute';
4
- import {dispatch, getEventPosition, on} from '@oscarpalmer/toretto/event';
5
- import {findAncestor} from '@oscarpalmer/toretto/find';
6
- import {isHTMLOrSVGElement} from '@oscarpalmer/toretto/is';
7
- import {setStyle, setStyles, toggleStyles, type StyleToggler} from '@oscarpalmer/toretto/style';
8
- import supportsTouch from '@oscarpalmer/toretto/touch';
9
- import type {OuiMovable} from '../movable/movable.embedded';
10
- import type {OuiSortable} from '../sortable/sortable.embedded';
11
-
12
- // #region Types
13
-
14
- export type CreateOuiDraggableOptions = {
15
- /**
16
- * Container to hold the draggable element and restrict its movement within. Can be `body`, `document`, `window`, a _CSS_ selector, or an element. _(If not provided, the draggable element will not have any constraints)_
17
- */
18
- container?: string | HTMLElement;
19
- /**
20
- * Direction in which the element can be dragged. _(If not provided, the element can be dragged in any direction)_
21
- */
22
- direction?: OuiDraggableDirection;
23
- };
24
-
25
- type OuiDraggableDirection = 'horizontal' | 'vertical' | 'x' | 'y';
26
-
27
- export abstract class OuiDraggable<ExtraState extends PlainObject = PlainObject> {
28
- #destroyed = false;
29
-
30
- readonly #state: OuiDraggableState & ExtraState;
31
-
32
- get element(): HTMLElement {
33
- return this.#state.element;
34
- }
35
-
36
- constructor(
37
- name: keyof OuiDraggableStates,
38
- event: string,
39
- attribute: string,
40
- element: HTMLElement,
41
- options: OuiDraggableOptions<ExtraState>,
42
- extras: ExtraState,
43
- ) {
44
- this.#state = {
45
- ...extras,
46
- attribute,
47
- element,
48
- event,
49
- name,
50
- options,
51
- horizontal: true,
52
- vertical: true,
53
- styling: toggleStyles(element, styles),
54
- } as OuiDraggableState & ExtraState;
55
-
56
- const item = {
57
- instance: this,
58
- state: this.#state,
59
- };
60
-
61
- setContainer(item);
62
- setDirection(item);
63
-
64
- setAttribute(element, attribute, '');
65
-
66
- let states = globals.states.get(element);
67
-
68
- states ??= {};
69
-
70
- states[this.#state.name] = this.#state;
71
-
72
- globals.states.set(element, states);
73
- }
74
-
75
- destroy(): void {
76
- if (this.#destroyed) {
77
- return;
78
- }
79
-
80
- this.#destroyed = true;
81
-
82
- destroyInstance(this, this.#state);
83
- }
84
- }
85
-
86
- type OuiDragBegin<State extends PlainObject = PlainObject> = (
87
- event: MouseEvent | TouchEvent,
88
- globals: OuiDraggableGlobals,
89
- item: OuiDraggableItem<State>,
90
- element: HTMLElement,
91
- handle: HTMLElement,
92
- position: EventPosition,
93
- ) => void;
94
-
95
- type OuiDragCancel<State extends PlainObject = PlainObject> = (
96
- globals: OuiDraggableGlobals,
97
- item: OuiDraggableItem<State>,
98
- ) => void;
99
-
100
- type OuiDragEnd<State extends PlainObject = PlainObject> = (
101
- event: MouseEvent | TouchEvent,
102
- globals: OuiDraggableGlobals,
103
- item: OuiDraggableItem<State>,
104
- reset: () => void,
105
- ) => void;
106
-
107
- type OuiDragMove<State extends PlainObject = PlainObject> = (
108
- event: MouseEvent | TouchEvent,
109
- globals: OuiDraggableGlobals,
110
- item: OuiDraggableItem<State>,
111
- position: OuiDragMovePosition,
112
- ) => PlainObject | undefined;
113
-
114
- export type OuiDragMovePosition = {
115
- calculated: EventPosition;
116
- original: EventPosition;
117
- };
118
-
119
- export type OuiDraggableBound<
120
- Property extends keyof OuiDraggableInstances = keyof OuiDraggableInstances,
121
- Instance extends OuiDraggableInstances[Property] = OuiDraggableInstances[Property],
122
- > = {
123
- constructor: new (element: HTMLElement, options?: CreateOuiDraggableOptions) => Instance;
124
- property: Property;
125
- };
126
-
127
- export type OuiDraggableGlobals = {
128
- container?: DOMRect;
129
- element?: OuiDraggableGlobalsElement;
130
- instances: WeakMap<HTMLElement, OuiDraggableInstances>;
131
- offset?: EventPosition;
132
- original?: EventPosition;
133
- states: WeakMap<HTMLElement, OuiDraggableStates>;
134
- };
135
-
136
- type OuiDraggableGlobalsElement = {
137
- node: HTMLElement;
138
- rectangle: DOMRect;
139
- };
140
-
141
- type OuiDraggableInstances = {
142
- movable?: OuiMovable;
143
- sortable?: OuiSortable;
144
- };
145
-
146
- export type OuiDraggableItem<ExtraState extends PlainObject = PlainObject> = {
147
- instance: OuiDraggable<ExtraState>;
148
- state: OuiDraggableState & ExtraState;
149
- };
150
-
151
- type OuiDraggableOptions<ExtraState extends PlainObject = PlainObject> = {
152
- container: OuiDraggableOptionsContainer<ExtraState>;
153
- direction: OuiDraggableOptionsDirection<ExtraState>;
154
- drag: OuiDraggableOptionsDrag<ExtraState>;
155
- input?: CreateOuiDraggableOptions;
156
- position: OuiDraggableOptionsPosition<ExtraState>;
157
- getDragged(): HTMLElement;
158
- getOrigin(): HTMLElement | undefined;
159
- };
160
-
161
- type OuiDraggableOptionsContainer<ExtraState extends PlainObject = PlainObject> = {
162
- attribute: string;
163
- map: Map<HTMLElement, Set<OuiDraggable>>;
164
- onDestroy?: OuiDraggableOptionsContainerOnDestroy<ExtraState>;
165
- onInitialize?: OuiDraggableOptionsContainerOnInitialize;
166
- };
167
-
168
- type OuiDraggableOptionsContainerOnDestroy<ExtraState extends PlainObject = PlainObject> = (
169
- item: OuiDraggableItem<ExtraState>,
170
- container: HTMLElement,
171
- empty: boolean,
172
- ) => void;
173
-
174
- type OuiDraggableOptionsContainerOnInitialize<ExtraState extends PlainObject = PlainObject> = (
175
- item: OuiDraggableItem<ExtraState>,
176
- ) => void;
177
-
178
- type OuiDraggableOptionsDirection<ExtraState extends PlainObject = PlainObject> = {
179
- attribute: string;
180
- onAfter?: OuiDraggableOptionsDirectionOnAfter<ExtraState>;
181
- };
182
-
183
- type OuiDraggableOptionsDirectionOnAfter<ExtraState extends PlainObject = PlainObject> = (
184
- item: OuiDraggableItem<ExtraState>,
185
- ) => void;
186
-
187
- type OuiDraggableOptionsDrag<ExtraState extends PlainObject = PlainObject> = {
188
- onBegin: OuiDragBegin<ExtraState>;
189
- onCancel: OuiDragCancel<ExtraState>;
190
- onEnd: OuiDragEnd<ExtraState>;
191
- onMove: OuiDragMove<ExtraState>;
192
- };
193
-
194
- type OuiDraggableOptionsPosition<ExtraState extends PlainObject = PlainObject> = {
195
- getOffset: OuiDraggableOptionsPositionGetOffset<ExtraState>;
196
- getOriginal: OuiDraggableOptionsPositionGetOriginal<ExtraState>;
197
- };
198
-
199
- type OuiDraggableOptionsPositionGetOffset<ExtraState extends PlainObject = PlainObject> = (
200
- globals: OuiDraggableGlobals,
201
- item: OuiDraggableItem<ExtraState>,
202
- element: HTMLElement,
203
- position: EventPosition,
204
- ) => EventPosition;
205
-
206
- type OuiDraggableOptionsPositionGetOriginal<ExtraState extends PlainObject = PlainObject> = (
207
- globals: OuiDraggableGlobals,
208
- item: OuiDraggableItem<ExtraState>,
209
- position: EventPosition,
210
- ) => EventPosition;
211
-
212
- export type OuiDraggableState = {
213
- attribute: string;
214
- container?: HTMLElement;
215
- element: HTMLElement;
216
- hasHandles?: boolean;
217
- horizontal: boolean;
218
- name: keyof OuiDraggableStates;
219
- options: OuiDraggableOptions;
220
- styling: StyleToggler;
221
- vertical: boolean;
222
- };
223
-
224
- type OuiDraggableStates = {
225
- movable?: OuiDraggableState;
226
- sortable?: OuiDraggableState;
227
- };
228
-
229
- // #endregion
230
-
231
- // #region Functions
232
-
233
- export function addDraggable<
234
- Property extends keyof OuiDraggableInstances,
235
- Instance extends OuiDraggableInstances[Property],
236
- >(
237
- this: OuiDraggableBound<Property, Instance>,
238
- element: HTMLElement,
239
- options?: CreateOuiDraggableOptions,
240
- ): Instance {
241
- let instances = globals.instances.get(element);
242
-
243
- if (instances == null) {
244
- instances = {};
245
-
246
- globals.instances.set(element, instances);
247
- }
248
-
249
- instances[this.property] ??= new this.constructor(element, options);
250
-
251
- return instances[this.property] as Instance;
252
- }
253
-
254
- function cancelDrag(item?: OuiDraggableItem): void {
255
- if (item == null) {
256
- return;
257
- }
258
-
259
- item.state.options.drag.onCancel?.(globals, item);
260
-
261
- dispatch(item.state.element, `oui:${item.state.name}:cancel`, {
262
- detail: {
263
- element: item.state.options.getOrigin(),
264
- },
265
- });
266
-
267
- reset();
268
- }
269
-
270
- function destroyInstance(instance: OuiDraggable, state: OuiDraggableState): void {
271
- unsetContainer({
272
- instance,
273
- state,
274
- });
275
-
276
- state.element.removeAttribute(state.attribute);
277
- state.styling.remove();
278
-
279
- state.container = undefined;
280
- state.element = undefined as never;
281
- state.options = undefined as never;
282
- state.styling = undefined as never;
283
- }
284
-
285
- export function getDraggableStates(element: HTMLElement): OuiDraggableStates | undefined {
286
- return globals.states.get(element);
287
- }
288
-
289
- function getHandle(event: Event, isMovable: boolean): HTMLElement | null {
290
- return findAncestor(
291
- event,
292
- isMovable ? SELECTOR_MOVABLE_HANDLE : SELECTOR_SORTABLE_HANDLE,
293
- ) as HTMLElement;
294
- }
295
-
296
- function getNextPosition(item: OuiDraggableItem, position: EventPosition): EventPosition {
297
- let x = globals.original?.x ?? 0;
298
- let y = globals.original?.y ?? 0;
299
-
300
- if (item.state.horizontal) {
301
- x = position.x - (globals.offset?.x ?? 0);
302
-
303
- if (globals.container != null && globals.element != null) {
304
- x = clamp(
305
- x,
306
- globals.container.left,
307
- globals.container.right - globals.element.rectangle.width,
308
- );
309
- }
310
- }
311
-
312
- if (item.state.vertical) {
313
- y = position.y - (globals.offset?.y ?? 0);
314
-
315
- if (globals.container != null && globals.element != null) {
316
- y = clamp(
317
- y,
318
- globals.container.top,
319
- globals.container.bottom - globals.element.rectangle.height,
320
- );
321
- }
322
- }
323
-
324
- return {x, y};
325
- }
326
-
327
- function onKeydown(event: KeyboardEvent): void {
328
- if (current != null && event.key === KEY_ESCAPE) {
329
- cancelDrag(current);
330
- }
331
- }
332
-
333
- function onPointerdown(event: MouseEvent | TouchEvent): void {
334
- if (
335
- event.altKey ||
336
- event.ctrlKey ||
337
- event.metaKey ||
338
- event.shiftKey ||
339
- (supportsTouch.value
340
- ? event.type === 'mousedown'
341
- : event.type === 'touchstart' || (event as MouseEvent).button !== 0)
342
- ) {
343
- return;
344
- }
345
-
346
- const container = findAncestor(event, SELECTOR)! as HTMLElement;
347
-
348
- const instances = globals.instances.get(container!);
349
- const states = globals.states.get(container);
350
-
351
- if (instances == null || states == null) {
352
- return;
353
- }
354
-
355
- const isMovable = container.hasAttribute(ATTRIBUTE_MOVABLE);
356
-
357
- const item: OuiDraggableItem = {
358
- instance: (isMovable ? instances.movable : instances.sortable) as OuiDraggable,
359
- state: (isMovable ? states.movable : states.sortable) as OuiDraggableState,
360
- };
361
-
362
- if (item.instance == null || item.state == null) {
363
- return;
364
- }
365
-
366
- if (supportsTouch.value) {
367
- event.preventDefault();
368
- }
369
-
370
- let element: HTMLElement | null = container;
371
-
372
- if (!isMovable) {
373
- element = findAncestor(event, SELECTOR_SORTABLE_ITEM) as HTMLElement;
374
-
375
- if (element == null || element.parentElement !== container) {
376
- return;
377
- }
378
- }
379
-
380
- let handle: HTMLElement | null = element;
381
-
382
- item.state.hasHandles ??= element.querySelector(SELECTOR_SORTABLE_HANDLE) != null;
383
-
384
- if (item.state.hasHandles) {
385
- handle = getHandle(event, isMovable);
386
- }
387
-
388
- if (handle == null) {
389
- return;
390
- }
391
-
392
- const dragged = item.state.options.getDragged();
393
- const rectangle = dragged.getBoundingClientRect();
394
-
395
- const position = getEventPosition(event) ?? {x: 0, y: 0};
396
-
397
- current = item;
398
-
399
- globals.container = item.state.container?.getBoundingClientRect();
400
-
401
- globals.element = {
402
- rectangle,
403
- node: dragged,
404
- };
405
-
406
- globals.offset = item.state.options.position.getOffset(globals, item, element, position);
407
- globals.original = item.state.options.position.getOriginal(globals, item, position);
408
-
409
- if (
410
- dispatch(item.state.element, `oui:${item.state.name}:begin`, {
411
- detail: {
412
- element,
413
- position: {...globals.original},
414
- },
415
- }).defaultPrevented
416
- ) {
417
- item.state.options.drag.onCancel?.(globals, item);
418
-
419
- reset();
420
-
421
- return;
422
- }
423
-
424
- const next = getNextPosition(item, position);
425
-
426
- setStyles(dragged, {
427
- position: 'fixed',
428
- inset: `${next.y}px auto auto ${next.x}px`,
429
- transform: 'translate3d(0, 0, 0)',
430
- });
431
-
432
- item.state.options.drag.onBegin?.(event, globals, item, element, handle, next);
433
-
434
- item.state.styling.set();
435
- styleToggler.set();
436
- }
437
-
438
- function onPointermove(event: MouseEvent | TouchEvent): void {
439
- if (current == null) {
440
- return;
441
- }
442
-
443
- const position = getEventPosition(event);
444
-
445
- if (position == null) {
446
- return;
447
- }
448
-
449
- const next = getNextPosition(current, position);
450
-
451
- if (globals.element != null) {
452
- setStyle(globals.element.node, 'inset', `${next.y}px auto auto ${next.x}px`);
453
- }
454
-
455
- const detail = current.state.options.drag.onMove(event, globals, current, {
456
- calculated: next,
457
- original: position,
458
- });
459
-
460
- if (
461
- dispatch(current.state.element, `oui:${current.state.name}:move`, {
462
- detail,
463
- }).defaultPrevented
464
- ) {
465
- cancelDrag(current);
466
- }
467
- }
468
-
469
- function onPointerup(event: MouseEvent | TouchEvent): void {
470
- current?.state.options.drag.onEnd?.(event, globals, current, reset);
471
- }
472
-
473
- export function removeDraggable<
474
- Property extends keyof OuiDraggableInstances,
475
- Instance extends OuiDraggableInstances[Property],
476
- >(
477
- this: {
478
- constructor: new (element: HTMLElement) => Instance;
479
- property: Property;
480
- },
481
- element: HTMLElement,
482
- ): void {
483
- const {property} = this;
484
-
485
- removeInstance(globals.instances, property, element);
486
- removeInstance(globals.states, property, element);
487
- }
488
-
489
- function removeInstance(
490
- map: WeakMap<HTMLElement, OuiDraggableInstances | OuiDraggableStates>,
491
- name: keyof OuiDraggableInstances | keyof OuiDraggableStates,
492
- element: HTMLElement,
493
- ): void {
494
- const instances = map.get(element);
495
-
496
- if (instances == null || instances[name] == null) {
497
- return;
498
- }
499
-
500
- if (typeof (instances[name] as OuiDraggable).destroy === 'function') {
501
- (instances[name] as OuiDraggable).destroy();
502
- }
503
-
504
- instances[name] = undefined;
505
-
506
- if (instances[properties[name]] == null) {
507
- map.delete(element);
508
- }
509
- }
510
-
511
- function reset(): void {
512
- current?.state.styling.remove();
513
- styleToggler.remove();
514
-
515
- current = undefined;
516
-
517
- globals.container = undefined;
518
- globals.element = undefined;
519
- globals.offset = undefined;
520
- globals.original = undefined;
521
- }
522
-
523
- function setContainer(item: OuiDraggableItem): void {
524
- const {container} = item.state.options.input ?? {};
525
-
526
- if (isHTMLOrSVGElement(container)) {
527
- setContainerElement(item, container);
528
-
529
- return;
530
- }
531
-
532
- const selector =
533
- container ?? getAttribute(item.instance.element, item.state.options.container.attribute);
534
-
535
- if (typeof selector !== 'string') {
536
- return;
537
- }
538
-
539
- const element = containers.has(selector)
540
- ? item.state.element.ownerDocument.body
541
- : (document.querySelector(selector) ?? undefined);
542
-
543
- if (isHTMLOrSVGElement(element)) {
544
- setContainerElement(item, element);
545
- }
546
- }
547
-
548
- function setContainerElement(item: OuiDraggableItem, element: HTMLElement): void {
549
- item.state.container = element;
550
-
551
- const set = item.state.options.container.map.get(element);
552
-
553
- if (set == null) {
554
- item.state.options.container.map.set(element, new Set([item.instance]));
555
- } else {
556
- set.add(item.instance);
557
- }
558
-
559
- item.state.options.container.onInitialize?.(item);
560
- }
561
-
562
- function setDirection(item: OuiDraggableItem): void {
563
- const direction = getAttribute(item.state.element, item.state.options.direction.attribute);
564
-
565
- if (horizontals.has(direction as OuiDraggableDirection)) {
566
- item.state.vertical = false;
567
- } else if (verticals.has(direction as OuiDraggableDirection)) {
568
- item.state.horizontal = false;
569
- }
570
-
571
- item.state.options.direction.onAfter?.(item);
572
- }
573
-
574
- function unsetContainer(item: OuiDraggableItem): void {
575
- const {container} = item.state;
576
-
577
- if (container == null) {
578
- return;
579
- }
580
-
581
- const set = item.state.options.container.map.get(container);
582
-
583
- let empty = false;
584
-
585
- if (set != null) {
586
- set.delete(item.instance);
587
-
588
- if (set.size === 0) {
589
- empty = true;
590
-
591
- item.state.options.container.map.delete(container);
592
- }
593
- }
594
-
595
- item.state.options.container.onDestroy?.(item, container, empty);
596
- }
597
-
598
- // #endregion
599
-
600
- // #region Variables
601
-
602
- const ATTRIBUTE_MOVABLE = 'oui-movable';
603
-
604
- const ATTRIBUTE_SORTABLE = 'oui-sortable';
605
-
606
- const KEY_ESCAPE = 'Escape';
607
-
608
- const SELECTOR = `[${ATTRIBUTE_MOVABLE}], [${ATTRIBUTE_SORTABLE}]`;
609
-
610
- const SELECTOR_MOVABLE_HANDLE = `[${ATTRIBUTE_MOVABLE}-handle]`;
611
-
612
- const SELECTOR_SORTABLE_HANDLE = `[${ATTRIBUTE_SORTABLE}-handle]`;
613
-
614
- const SELECTOR_SORTABLE_ITEM = `[${ATTRIBUTE_SORTABLE}] > *`;
615
-
616
- const containers = new Set<string>(['body', 'document', 'window']);
617
-
618
- const horizontals = new Set<OuiDraggableDirection>(['horizontal', 'x']);
619
-
620
- const properties: Record<keyof OuiDraggableInstances, keyof OuiDraggableInstances> = {
621
- movable: 'sortable',
622
- sortable: 'movable',
623
- };
624
-
625
- const globals: OuiDraggableGlobals = {
626
- container: undefined,
627
- element: undefined,
628
- instances: new WeakMap(),
629
- offset: undefined,
630
- original: undefined,
631
- states: new WeakMap(),
632
- };
633
-
634
- const styles = {
635
- touchAction: 'none',
636
- userSelect: 'none',
637
- webkitUserSelect: 'none',
638
- };
639
-
640
- const styleToggler = toggleStyles(document.body, styles);
641
-
642
- const verticals = new Set<OuiDraggableDirection>(['vertical', 'y']);
643
-
644
- let current: OuiDraggableItem | undefined;
645
-
646
- // #endregion
647
-
648
- // #region Initialization
649
-
650
- on(document, 'keydown', onKeydown);
651
- on(document, 'mousedown', onPointerdown);
652
- on(document, 'pointermove', onPointermove);
653
- on(document, 'pointerup', onPointerup);
654
- on(document, 'touchcancel', onPointerup);
655
- on(document, 'touchstart', onPointerdown, {passive: false});
656
-
657
- // #endregion
@@ -1,25 +0,0 @@
1
- import type {OuiListboxType} from './listbox.model';
2
-
3
- // #region Variables
4
-
5
- const keysActivation = new Set([' ', 'Backspace', 'Delete', 'Enter']);
6
-
7
- const keysNavigation = new Set(['ArrowDown', 'ArrowUp', 'PageDown', 'PageUp']);
8
-
9
- const keysSelection = new Set(['ArrowRight', 'End']);
10
-
11
- export const LISTBOX_KEYS = {
12
- activation: keysActivation,
13
- navigation: keysNavigation,
14
- selection: keysSelection,
15
- };
16
-
17
- export const LISTBOX_TYPES = new Set<OuiListboxType>(['autocomplete', 'select']);
18
-
19
- export const listboxScrollOptions: ScrollIntoViewOptions = {
20
- behavior: 'auto',
21
- block: 'nearest',
22
- inline: 'nearest',
23
- };
24
-
25
- // #endregion