@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,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