@oscarpalmer/oui 0.37.0 → 0.39.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 (183) hide show
  1. package/dist/css/a11y.css +1 -0
  2. package/dist/css/badge.css +12 -8
  3. package/dist/css/button.css +111 -14
  4. package/dist/css/color-picker.css +859 -0
  5. package/dist/css/color.css +86 -87
  6. package/dist/css/combobox.css +105 -4
  7. package/dist/css/content.css +8 -6
  8. package/dist/css/floatable.css +3 -3
  9. package/dist/css/form.css +106 -6
  10. package/dist/css/icon.css +99 -0
  11. package/dist/css/listbox.css +5 -0
  12. package/dist/css/message.css +6 -3
  13. package/dist/css/mixins/badge.mixins.css +2 -0
  14. package/dist/css/mixins/button.mixins.css +3 -0
  15. package/dist/css/mixins/message.mixins.css +1 -0
  16. package/dist/css/mixins/misc.mixins.css +2 -0
  17. package/dist/css/mixins/shadow.mixins.css +1 -0
  18. package/dist/css/reset.css +3 -3
  19. package/dist/css/splitter.css +1 -1
  20. package/dist/css/tabs.css +115 -23
  21. package/dist/css/typography.css +90 -0
  22. package/dist/js/color-picker/constants.color-picker.d.mts +2 -0
  23. package/dist/js/color-picker/constants.color-picker.mjs +59 -0
  24. package/dist/js/color-picker/dom.color-picker.d.mts +8 -0
  25. package/dist/js/color-picker/dom.color-picker.mjs +191 -0
  26. package/dist/js/color-picker/event.color-picker.d.mts +9 -0
  27. package/dist/js/color-picker/event.color-picker.mjs +2 -0
  28. package/dist/js/color-picker/form.color-picker.d.mts +5 -0
  29. package/dist/js/color-picker/form.color-picker.mjs +24 -0
  30. package/dist/js/color-picker/index.d.mts +2 -0
  31. package/dist/js/color-picker/index.mjs +303 -0
  32. package/dist/js/color-picker/misc.color-picker.d.mts +2 -0
  33. package/dist/js/color-picker/misc.color-picker.mjs +2 -0
  34. package/dist/js/color-picker/models.color-picker.d.mts +2 -0
  35. package/dist/js/color-picker/models.color-picker.mjs +24 -0
  36. package/dist/js/color-picker/output.color-picker.d.mts +8 -0
  37. package/dist/js/color-picker/output.color-picker.mjs +233 -0
  38. package/dist/js/color-picker/state.color-picker.d.mts +8 -0
  39. package/dist/js/color-picker/state.color-picker.mjs +2 -0
  40. package/dist/js/combobox/constants.combobox.d.mts +1 -1
  41. package/dist/js/combobox/dom.combobox.d.mts +12 -13
  42. package/dist/js/combobox/dom.combobox.mjs +12 -5
  43. package/dist/js/combobox/event.combobox.d.mts +20 -21
  44. package/dist/js/combobox/event.combobox.mjs +1 -1
  45. package/dist/js/combobox/index.d.mts +1 -1
  46. package/dist/js/combobox/index.mjs +56 -2
  47. package/dist/js/combobox/misc.combobox.d.mts +1 -1
  48. package/dist/js/combobox/misc.combobox.mjs +1 -1
  49. package/dist/js/combobox/models.combobox.d.mts +12 -13
  50. package/dist/js/combobox/state.combobox.d.mts +8 -9
  51. package/dist/js/combobox/state.combobox.mjs +1 -1
  52. package/dist/js/constants.color-picker-B-gFjL8m.d.mts +364 -0
  53. package/dist/js/constants.combobox-8EMRmv09.d.mts +18 -0
  54. package/dist/js/constants.listbox-DGnX32kv.d.mts +8 -0
  55. package/dist/js/dialog.d.mts +2 -2
  56. package/dist/js/dialog.mjs +1 -1
  57. package/dist/js/{draggable-a6w0J1OD.d.mts → draggable-B5-70SZm.d.mts} +5 -4
  58. package/dist/js/event.color-picker-BEpq0Adu.mjs +485 -0
  59. package/dist/js/floatable/floatable.embedded.d.mts +1 -1
  60. package/dist/js/floatable/floatable.embedded.mjs +11 -8
  61. package/dist/js/floatable/floatable.standalone.d.mts +1 -1
  62. package/dist/js/{floatable.embedded-Bct4U5Dm.d.mts → floatable.embedded-DQYkXt8X.d.mts} +1 -1
  63. package/dist/js/focus-trap/focus-trap.embedded.d.mts +1 -1
  64. package/dist/js/focus-trap/focus-trap.standalone.d.mts +1 -1
  65. package/dist/js/{focus-trap.embedded-DR8NpZfr.d.mts → focus-trap.embedded-CjyFQYow.d.mts} +2 -2
  66. package/dist/js/{index-EfkUSals.d.mts → index-C5D3-oiI.d.mts} +41 -3
  67. package/dist/js/index.d.mts +8 -7
  68. package/dist/js/index.mjs +6 -3
  69. package/dist/js/internal/attributable.d.mts +2 -3
  70. package/dist/js/internal/draggable.d.mts +1 -1
  71. package/dist/js/internal/draggable.mjs +1 -1
  72. package/dist/js/internal/listbox/listbox.constants.d.mts +7 -10
  73. package/dist/js/internal/listbox/listbox.constants.mjs +15 -16
  74. package/dist/js/internal/listbox/listbox.data.d.mts +9 -10
  75. package/dist/js/internal/listbox/listbox.data.mjs +1 -1
  76. package/dist/js/internal/listbox/listbox.dom.d.mts +19 -20
  77. package/dist/js/internal/listbox/listbox.dom.mjs +1 -1
  78. package/dist/js/internal/listbox/listbox.event.d.mts +3 -4
  79. package/dist/js/internal/listbox/listbox.event.mjs +4 -4
  80. package/dist/js/internal/listbox/listbox.form.d.mts +4 -5
  81. package/dist/js/internal/listbox/listbox.form.mjs +16 -15
  82. package/dist/js/internal/listbox/listbox.misc.d.mts +10 -11
  83. package/dist/js/internal/listbox/listbox.misc.mjs +1 -1
  84. package/dist/js/internal/listbox/listbox.model.d.mts +1 -1
  85. package/dist/js/internal/listbox/listbox.state.d.mts +5 -6
  86. package/dist/js/internal/listbox/listbox.state.mjs +3 -3
  87. package/dist/js/internal/misc.d.mts +4 -4
  88. package/dist/js/internal/misc.mjs +9 -1
  89. package/dist/js/internal/navigable.d.mts +9 -10
  90. package/dist/js/internal/navigable.mjs +1 -0
  91. package/dist/js/listbox/constants.listbox.d.mts +1 -1
  92. package/dist/js/listbox/event.listbox.d.mts +6 -7
  93. package/dist/js/listbox/event.listbox.mjs +1 -1
  94. package/dist/js/listbox/index.d.mts +43 -5
  95. package/dist/js/listbox/index.mjs +56 -2
  96. package/dist/js/listbox/misc.listbox.d.mts +1 -1
  97. package/dist/js/listbox/misc.listbox.mjs +1 -1
  98. package/dist/js/listbox/state.listbox.d.mts +7 -8
  99. package/dist/js/listbox/state.listbox.mjs +1 -1
  100. package/dist/js/{listbox.data-BWd0PCy7.mjs → listbox.data-DQ7-x2uY.mjs} +8 -7
  101. package/dist/js/{listbox.model-CRReGOmu.d.mts → listbox.model-BHPA7GM4.d.mts} +3 -3
  102. package/dist/js/menu.mjs +1 -1
  103. package/dist/js/{misc.listbox-BI-XsTOf.mjs → misc.listbox-DKB-j0UK.mjs} +4 -5
  104. package/dist/js/{misc.listbox-gnoJhrTr.d.mts → misc.listbox-mZMuYOxg.d.mts} +1 -1
  105. package/dist/js/movable/movable.embedded.d.mts +1 -1
  106. package/dist/js/movable/movable.standalone.d.mts +1 -1
  107. package/dist/js/popover.d.mts +2 -2
  108. package/dist/js/popover.mjs +1 -1
  109. package/dist/js/resizable/resizable.embedded.d.mts +1 -1
  110. package/dist/js/resizable/resizable.embedded.mjs +1 -1
  111. package/dist/js/resizable/resizable.standalone.d.mts +1 -1
  112. package/dist/js/{resizable.embedded-3qoR0Bjm.d.mts → resizable.embedded-dvhdfQgt.d.mts} +1 -1
  113. package/dist/js/sortable/sortable.embedded.d.mts +1 -1
  114. package/dist/js/sortable/sortable.standalone.d.mts +1 -1
  115. package/dist/js/splitter.d.mts +2 -3
  116. package/dist/js/splitter.mjs +2 -2
  117. package/dist/js/{state.combobox-4xq0FPCF.mjs → state.combobox-BWDFHwoi.mjs} +9 -9
  118. package/dist/js/tabs.d.mts +4 -5
  119. package/dist/js/tabs.mjs +4 -7
  120. package/dist/js/tooltip.d.mts +1 -1
  121. package/package.json +24 -22
  122. package/dist/js/constants.combobox-DmRAMC64.d.mts +0 -26
  123. package/dist/js/constants.listbox-DRsXUxd3.d.mts +0 -14
  124. package/src/css/a11y.scss +0 -13
  125. package/src/css/badge.scss +0 -62
  126. package/src/css/button.scss +0 -50
  127. package/src/css/color.scss +0 -115
  128. package/src/css/combobox.scss +0 -252
  129. package/src/css/content.scss +0 -180
  130. package/src/css/flex.scss +0 -107
  131. package/src/css/floatable.scss +0 -152
  132. package/src/css/form.scss +0 -573
  133. package/src/css/listbox.scss +0 -120
  134. package/src/css/message.scss +0 -73
  135. package/src/css/mixins.scss +0 -419
  136. package/src/css/reset.scss +0 -392
  137. package/src/css/splitter.scss +0 -89
  138. package/src/css/table.scss +0 -107
  139. package/src/css/tabs.scss +0 -85
  140. package/src/js/combobox/constants.combobox.ts +0 -83
  141. package/src/js/combobox/dom.combobox.ts +0 -407
  142. package/src/js/combobox/event.combobox.ts +0 -365
  143. package/src/js/combobox/index.ts +0 -320
  144. package/src/js/combobox/misc.combobox.ts +0 -104
  145. package/src/js/combobox/models.combobox.ts +0 -54
  146. package/src/js/combobox/state.combobox.ts +0 -246
  147. package/src/js/dialog.ts +0 -255
  148. package/src/js/floatable/floatable.embedded.ts +0 -332
  149. package/src/js/floatable/floatable.standalone.ts +0 -6
  150. package/src/js/focus-trap/focus-trap.embedded.ts +0 -411
  151. package/src/js/focus-trap/focus-trap.standalone.ts +0 -1
  152. package/src/js/index.ts +0 -15
  153. package/src/js/internal/attributable.ts +0 -73
  154. package/src/js/internal/draggable.ts +0 -657
  155. package/src/js/internal/listbox/listbox.constants.ts +0 -25
  156. package/src/js/internal/listbox/listbox.data.ts +0 -287
  157. package/src/js/internal/listbox/listbox.dom.ts +0 -445
  158. package/src/js/internal/listbox/listbox.event.ts +0 -129
  159. package/src/js/internal/listbox/listbox.form.ts +0 -115
  160. package/src/js/internal/listbox/listbox.misc.ts +0 -135
  161. package/src/js/internal/listbox/listbox.model.ts +0 -169
  162. package/src/js/internal/listbox/listbox.state.ts +0 -82
  163. package/src/js/internal/misc.ts +0 -27
  164. package/src/js/internal/navigable.ts +0 -315
  165. package/src/js/l10n.ts +0 -192
  166. package/src/js/listbox/constants.listbox.ts +0 -61
  167. package/src/js/listbox/event.listbox.ts +0 -106
  168. package/src/js/listbox/index.ts +0 -302
  169. package/src/js/listbox/misc.listbox.ts +0 -70
  170. package/src/js/listbox/state.listbox.ts +0 -196
  171. package/src/js/menu.ts +0 -348
  172. package/src/js/movable/movable.embedded.ts +0 -318
  173. package/src/js/movable/movable.standalone.ts +0 -2
  174. package/src/js/popover.ts +0 -229
  175. package/src/js/resizable/resizable.embedded.ts +0 -413
  176. package/src/js/resizable/resizable.standalone.ts +0 -5
  177. package/src/js/sortable/sortable.embedded.ts +0 -527
  178. package/src/js/sortable/sortable.standalone.ts +0 -2
  179. package/src/js/splitter.ts +0 -583
  180. package/src/js/tabs.ts +0 -447
  181. package/src/js/toolbar.ts +0 -63
  182. package/src/js/tooltip.ts +0 -367
  183. /package/dist/css/{mixins.css → mixins/input.mixins.css} +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';