@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,527 +0,0 @@
1
- import type {EventPosition, PlainObject} from '@oscarpalmer/atoms/models';
2
- import {getAttribute, setAttribute, setAttributes} from '@oscarpalmer/toretto/attribute';
3
- import {createElement} from '@oscarpalmer/toretto/create';
4
- import {dispatch, getEventPosition} from '@oscarpalmer/toretto/event';
5
- import {findAncestor, getElementFromPosition} from '@oscarpalmer/toretto/find';
6
- import {isHTMLOrSVGElement} from '@oscarpalmer/toretto/is';
7
- import {setStyle} from '@oscarpalmer/toretto/style';
8
- import {attributable} from '../internal/attributable';
9
- import {
10
- addDraggable,
11
- getDraggableStates,
12
- OuiDraggable,
13
- removeDraggable,
14
- type CreateOuiDraggableOptions,
15
- type OuiDraggableBound,
16
- type OuiDraggableGlobals,
17
- type OuiDraggableItem,
18
- type OuiDraggableState,
19
- type OuiDragMovePosition,
20
- } from '../internal/draggable';
21
-
22
- // #region Types
23
-
24
- export class OuiSortable extends OuiDraggable<OuiSortableState> {
25
- constructor(element: HTMLElement, options?: CreateOuiDraggableOptions) {
26
- super(
27
- 'sortable',
28
- 'sort',
29
- ATTRIBUTE,
30
- element,
31
- {
32
- container: {
33
- attribute: ATTRIBUTE_CONTAINER,
34
- map: CONTAINERS,
35
- },
36
- direction: {
37
- attribute: ATTRIBUTE_DIRECTION,
38
- },
39
- drag: {
40
- onBegin,
41
- onCancel,
42
- onEnd,
43
- onMove,
44
- },
45
- input: options,
46
- position: {
47
- getOffset: getOffsetPosition,
48
- getOriginal: getOriginalPosition,
49
- },
50
- getDragged: getDragPlaceholder,
51
- getOrigin: () =>
52
- (getDraggableStates(element)?.sortable as OuiDraggableState & OuiSortableState)?.origin,
53
- },
54
- {
55
- connections: getAttribute(element, ATTRIBUTE_CONNECTIONS),
56
- },
57
- );
58
- }
59
- }
60
-
61
- type OuiSortablePlaceholder = {
62
- drag: OuiSortablePlaceholderDrag;
63
- position: HTMLElement | undefined;
64
- };
65
-
66
- type OuiSortablePlaceholderDrag = {
67
- custom: HTMLElement | undefined;
68
- default: HTMLElement | undefined;
69
- };
70
-
71
- type OuiSortableState = {
72
- connections: string | null | undefined;
73
- origin?: HTMLElement;
74
- };
75
-
76
- // #endregion
77
-
78
- // #region Functions
79
-
80
- function afterEnd(
81
- insert: 'append' | 'insert' | 'prepend' | undefined,
82
- from: OuiDraggableItem<OuiSortableState>,
83
- events: [CustomEvent, CustomEvent | undefined],
84
- elements: {origin?: HTMLElement; target: HTMLElement},
85
- position: EventPosition | undefined,
86
- valid: boolean,
87
- ): void {
88
- elements.origin?.removeAttribute(ATTRIBUTE_ORIGIN);
89
-
90
- from.state.origin = undefined;
91
-
92
- resetPlaceholders();
93
-
94
- if (!valid || events.some(event => event?.defaultPrevented)) {
95
- return;
96
- }
97
-
98
- if (insert !== 'insert') {
99
- elements.target.append(elements.origin!);
100
-
101
- return;
102
- }
103
-
104
- if (position == null) {
105
- return;
106
- }
107
-
108
- const {height, top} = elements.target.getBoundingClientRect();
109
-
110
- let insertion: 'afterend' | 'beforebegin';
111
-
112
- if (position.y < top + height / 2) {
113
- insertion = 'beforebegin';
114
- } else {
115
- insertion = 'afterend';
116
- }
117
-
118
- elements.target?.insertAdjacentElement(insertion, elements.origin!);
119
-
120
- document.body.removeAttribute(ATTRIBUTE_ACTIVE);
121
- }
122
-
123
- /**
124
- * Creates _(or retrieves)_ a _OuiSortable_ instance for an element
125
- *
126
- * @param element Element to make sortable
127
- * @returns _OuiSortable_ instance
128
- */
129
- export function createSortable(
130
- element: HTMLElement,
131
- options?: CreateOuiDraggableOptions,
132
- ): OuiSortable {
133
- if (!isHTMLOrSVGElement(element)) {
134
- throw new TypeError(MESSAGE);
135
- }
136
-
137
- return addSortable(element, options) as OuiSortable;
138
- }
139
-
140
- function getDragPlaceholder(): HTMLElement {
141
- placeholder.drag.default ??= createElement('div');
142
-
143
- return placeholder.drag.custom ?? placeholder.drag.default;
144
- }
145
-
146
- function getOffsetPosition(
147
- _: OuiDraggableGlobals,
148
- item: OuiDraggableItem,
149
- element: HTMLElement,
150
- position: EventPosition,
151
- ): EventPosition {
152
- const rectangle = element.getBoundingClientRect();
153
-
154
- return {
155
- x: item.state.horizontal ? 0 : position.x - rectangle.left,
156
- y: item.state.vertical ? 0 : position.y - rectangle.top,
157
- };
158
- }
159
-
160
- function getOriginalPosition(
161
- _: OuiDraggableGlobals,
162
- __: OuiDraggableItem,
163
- position: EventPosition,
164
- ): EventPosition {
165
- return position;
166
- }
167
-
168
- function getPositionPlaceholder(item: OuiDraggableItem<OuiSortableState>): HTMLElement {
169
- placeholder.position ??= createElement('div');
170
-
171
- setAttribute(placeholder.position, ATTRIBUTE_PLACEHOLDER_POSITION, '');
172
-
173
- if (item.state.origin != null) {
174
- setStyle(
175
- placeholder.position,
176
- '--placeholder-height',
177
- `${item.state.origin.getBoundingClientRect().height}px`,
178
- );
179
- }
180
-
181
- return placeholder.position;
182
- }
183
-
184
- function onBegin(
185
- _: MouseEvent | TouchEvent,
186
- globals: OuiDraggableGlobals,
187
- item: OuiDraggableItem<OuiSortableState>,
188
- element: HTMLElement,
189
- ): void {
190
- item.state.origin = element;
191
-
192
- setPlaceholder(globals, item, element);
193
-
194
- setAttribute(element, ATTRIBUTE_ORIGIN, '');
195
-
196
- setAttribute(document.body, ATTRIBUTE_ACTIVE, '');
197
- }
198
-
199
- function onCancel(_: OuiDraggableGlobals, item: OuiDraggableItem<OuiSortableState>): void {
200
- item.state.origin?.removeAttribute(ATTRIBUTE_ORIGIN);
201
-
202
- document.body.removeAttribute(ATTRIBUTE_ACTIVE);
203
-
204
- resetPlaceholders();
205
-
206
- item.state.origin = undefined;
207
- }
208
-
209
- function onEnd(
210
- event: MouseEvent | TouchEvent,
211
- globals: OuiDraggableGlobals,
212
- item: OuiDraggableItem<OuiSortableState>,
213
- reset: () => void,
214
- ): void {
215
- const {origin} = item.state;
216
-
217
- const position = getEventPosition(event) ?? {x: 0, y: 0};
218
-
219
- const target = getElementFromPosition(position)[0];
220
-
221
- let element = findAncestor(target, SELECTOR_ITEM) as HTMLElement;
222
-
223
- if (element?.hasAttribute(ATTRIBUTE_PLACEHOLDER_POSITION)) {
224
- const position = getAttribute(element, ATTRIBUTE_PLACEHOLDER_POSITION);
225
-
226
- if (position === 'after') {
227
- element = element.previousElementSibling as HTMLElement;
228
- } else {
229
- element = element.nextElementSibling as HTMLElement;
230
- }
231
- }
232
-
233
- let insert: 'append' | 'insert' | 'prepend' | undefined = 'insert';
234
- let toInstance: OuiSortable | undefined;
235
- let toState: OuiDraggableState | undefined;
236
-
237
- if (element == null) {
238
- element = findAncestor(target, SELECTOR) as HTMLElement;
239
-
240
- toInstance = globals.instances.get(element)?.sortable;
241
- toState = globals.states.get(element)?.sortable;
242
-
243
- insert = element == null ? undefined : element.children.length === 0 ? 'append' : 'prepend';
244
- } else {
245
- toInstance = globals.instances.get(element.parentElement!)?.sortable;
246
- toState = globals.states.get(element.parentElement!)?.sortable;
247
- }
248
-
249
- const valid =
250
- insert != null &&
251
- validatePosition(
252
- globals,
253
- item,
254
- {
255
- instance: toInstance as OuiDraggable<OuiSortableState>,
256
- state: toState as OuiDraggableState & OuiSortableState,
257
- },
258
- position,
259
- );
260
-
261
- const detail = valid
262
- ? {
263
- from: {
264
- element: origin,
265
- position: {...globals.original},
266
- },
267
- to: {
268
- element: element,
269
- position: {...position},
270
- },
271
- }
272
- : undefined;
273
-
274
- const options = {
275
- detail,
276
- bubbles: false,
277
- cancelable: true,
278
- };
279
-
280
- const dispatchedFrom = dispatch(item.instance.element, 'sortable:end', options);
281
-
282
- let dispatchedTo: CustomEvent | undefined;
283
-
284
- if (item.instance !== toInstance && toInstance != null) {
285
- dispatchedTo = dispatch(toInstance.element, 'sortable:end', options);
286
- }
287
-
288
- setTimeout(() => {
289
- afterEnd(
290
- insert,
291
- item,
292
- [dispatchedFrom, dispatchedTo],
293
- {origin, target: element},
294
- position,
295
- valid,
296
- );
297
-
298
- reset();
299
- });
300
- }
301
-
302
- function onMove(
303
- event: MouseEvent | TouchEvent,
304
- globals: OuiDraggableGlobals,
305
- item: OuiDraggableItem<OuiSortableState>,
306
- position: OuiDragMovePosition,
307
- ): PlainObject | undefined {
308
- const fromElement = item.state.origin;
309
- const toElement = findAncestor(event, SELECTOR_ITEM) as HTMLElement;
310
-
311
- let toInstance: OuiSortable | undefined;
312
- let toState: OuiDraggableState | undefined;
313
-
314
- if (toElement == null) {
315
- const element = findAncestor(event, SELECTOR) as HTMLElement;
316
-
317
- toInstance = globals.instances.get(element)?.sortable;
318
- toState = globals.states.get(element)?.sortable;
319
- } else {
320
- toInstance = globals.instances.get(toElement.parentElement!)?.sortable;
321
- toState = globals.states.get(toElement.parentElement!)?.sortable;
322
- }
323
-
324
- if (
325
- toInstance == null ||
326
- !validatePosition(
327
- globals,
328
- item,
329
- {
330
- instance: toInstance as OuiDraggable<OuiSortableState>,
331
- state: toState as OuiDraggableState & OuiSortableState,
332
- },
333
- position.original,
334
- )
335
- ) {
336
- return;
337
- }
338
-
339
- const placeholder = getPositionPlaceholder(item);
340
-
341
- if (toElement != null && toElement !== fromElement) {
342
- const {height, top} = toElement.getBoundingClientRect();
343
-
344
- let place: 'after' | 'before';
345
-
346
- if (position.calculated.y < top + height / 2) {
347
- place = 'before';
348
-
349
- toElement.insertAdjacentElement('beforebegin', placeholder);
350
- } else {
351
- place = 'after';
352
-
353
- toElement.insertAdjacentElement('afterend', placeholder);
354
- }
355
-
356
- setAttribute(placeholder, ATTRIBUTE_PLACEHOLDER_POSITION, place);
357
- } else {
358
- placeholder.remove();
359
- }
360
-
361
- return {
362
- from: {
363
- element: fromElement,
364
- position: {...globals.original},
365
- },
366
- to: {
367
- element: toElement,
368
- position: {...position.calculated},
369
- },
370
- };
371
- }
372
-
373
- function resetPlaceholders(): void {
374
- placeholder.drag.custom?.remove();
375
- placeholder.drag.default?.remove();
376
- placeholder.position?.remove();
377
-
378
- placeholder.drag.custom = undefined;
379
- }
380
-
381
- function setPlaceholder(
382
- state: OuiDraggableGlobals,
383
- item: OuiDraggableItem<OuiSortableState>,
384
- origin: HTMLElement,
385
- ): void {
386
- const element = getDragPlaceholder();
387
-
388
- placeholder.drag.default!.innerHTML = '';
389
-
390
- updatePlaceholder(item, element);
391
-
392
- const dispatched = dispatch(item.instance.element, 'sortable:placeholder', {
393
- detail: {
394
- origin,
395
- parent: item.state.element,
396
- placeholder: element,
397
- create: (value: unknown) => {
398
- if (!isHTMLOrSVGElement(value)) {
399
- return;
400
- }
401
-
402
- const element = value as HTMLElement;
403
-
404
- placeholder.drag.custom = element;
405
-
406
- updatePlaceholder(item, element);
407
-
408
- state.element = {
409
- rectangle: element.getBoundingClientRect(),
410
- node: element,
411
- };
412
- },
413
- },
414
- });
415
-
416
- setTimeout(() => {
417
- if (!dispatched.defaultPrevented && placeholder.drag.custom == null) {
418
- placeholder.drag.default?.append(element.cloneNode(true));
419
- }
420
-
421
- document.body.append(placeholder.drag.custom ?? placeholder.drag.default ?? '');
422
- });
423
- }
424
-
425
- function updatePlaceholder(item: OuiDraggableItem<OuiSortableState>, element: HTMLElement): void {
426
- setAttribute(element, ATTRIBUTE_PLACEHOLDER_DRAG, '');
427
- setStyle(element, 'position', 'fixed');
428
-
429
- const state = getDraggableStates(item.state.element)?.sortable;
430
-
431
- if (state == null) {
432
- return;
433
- }
434
-
435
- setAttributes(element, {
436
- [ATTRIBUTE_HORIZONTAL]: state.horizontal ? '' : undefined,
437
- [ATTRIBUTE_VERTICAL]: state.vertical ? '' : undefined,
438
- });
439
- }
440
-
441
- function validatePosition(
442
- _: OuiDraggableGlobals,
443
- from: OuiDraggableItem<OuiSortableState>,
444
- to: OuiDraggableItem<OuiSortableState> | undefined,
445
- position: EventPosition,
446
- ): boolean {
447
- let valid = true;
448
-
449
- const rectangle = from.state.origin?.getBoundingClientRect();
450
-
451
- const fromState = getDraggableStates(from.state.element)?.sortable;
452
-
453
- if (rectangle != null && !(fromState?.horizontal ?? true)) {
454
- valid = position.x >= rectangle.left && position.x <= rectangle.right;
455
- }
456
-
457
- if (valid && rectangle != null && !(fromState?.vertical ?? true)) {
458
- valid = position.y >= rectangle.top && position.y <= rectangle.bottom;
459
- }
460
-
461
- if (valid && from.state.connections != null) {
462
- valid = to?.state.element.matches(from.state.connections) ?? true;
463
- }
464
-
465
- if (valid && to?.state.connections != null) {
466
- valid = from.state.element.matches(to.state.connections);
467
- }
468
-
469
- return valid;
470
- }
471
-
472
- // #endregion
473
-
474
- // #region Variables
475
-
476
- const ATTRIBUTE = 'oui-sortable';
477
-
478
- const ATTRIBUTE_ACTIVE = `${ATTRIBUTE}-active`;
479
-
480
- const ATTRIBUTE_CONNECTIONS = `${ATTRIBUTE}-connections`;
481
-
482
- const ATTRIBUTE_CONTAINER = `${ATTRIBUTE}-container`;
483
-
484
- const ATTRIBUTE_DIRECTION = `${ATTRIBUTE}-direction`;
485
-
486
- const ATTRIBUTE_HORIZONTAL = `${ATTRIBUTE}-horizontal`;
487
-
488
- const ATTRIBUTE_ORIGIN = `${ATTRIBUTE}-origin`;
489
-
490
- const ATTRIBUTE_PLACEHOLDER_DRAG = `${ATTRIBUTE}-placeholder-drag`;
491
-
492
- const ATTRIBUTE_PLACEHOLDER_POSITION = `${ATTRIBUTE}-placeholder-position`;
493
-
494
- const ATTRIBUTE_VERTICAL = `${ATTRIBUTE}-vertical`;
495
-
496
- const CONTAINERS = new Map<HTMLElement, Set<OuiSortable>>();
497
-
498
- const MESSAGE = 'The element must be an instance of HTMLElement or SVGElement';
499
-
500
- const SELECTOR = `[${ATTRIBUTE}]`;
501
-
502
- const SELECTOR_ITEM = `[${ATTRIBUTE}] > *`;
503
-
504
- const bound: OuiDraggableBound = {
505
- constructor: OuiSortable,
506
- property: 'sortable',
507
- };
508
-
509
- const placeholder: OuiSortablePlaceholder = {
510
- drag: {
511
- custom: undefined,
512
- default: undefined,
513
- },
514
- position: undefined,
515
- };
516
-
517
- const addSortable = addDraggable.bind(bound);
518
-
519
- const removeSortable = removeDraggable.bind(bound);
520
-
521
- // #endregion
522
-
523
- // #region Initialization
524
-
525
- attributable(ATTRIBUTE, addSortable, removeSortable);
526
-
527
- // #endregion
@@ -1,2 +0,0 @@
1
- export type {CreateOuiDraggableOptions as CreateOuiSortableOptions} from '../internal/draggable';
2
- export {createSortable, type OuiSortable} from './sortable.embedded';