@proyecto-viviana/solidaria 0.2.4 → 0.2.8

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 (219) hide show
  1. package/LICENSE +21 -0
  2. package/dist/actiongroup/createActionGroup.d.ts +29 -0
  3. package/dist/actiongroup/createActionGroup.d.ts.map +1 -0
  4. package/dist/actiongroup/index.d.ts +2 -0
  5. package/dist/actiongroup/index.d.ts.map +1 -0
  6. package/dist/autocomplete/createAutocomplete.d.ts +6 -2
  7. package/dist/autocomplete/createAutocomplete.d.ts.map +1 -1
  8. package/dist/breadcrumbs/createBreadcrumbs.d.ts +2 -0
  9. package/dist/breadcrumbs/createBreadcrumbs.d.ts.map +1 -1
  10. package/dist/button/createToggleButtonGroup.d.ts +32 -0
  11. package/dist/button/createToggleButtonGroup.d.ts.map +1 -0
  12. package/dist/button/index.d.ts +2 -0
  13. package/dist/button/index.d.ts.map +1 -1
  14. package/dist/calendar/createCalendarCell.d.ts +2 -0
  15. package/dist/calendar/createCalendarCell.d.ts.map +1 -1
  16. package/dist/calendar/createCalendarGrid.d.ts.map +1 -1
  17. package/dist/calendar/createRangeCalendarCell.d.ts +3 -1
  18. package/dist/calendar/createRangeCalendarCell.d.ts.map +1 -1
  19. package/dist/checkbox/createCheckboxGroup.d.ts +5 -1
  20. package/dist/checkbox/createCheckboxGroup.d.ts.map +1 -1
  21. package/dist/collections/index.d.ts +56 -0
  22. package/dist/collections/index.d.ts.map +1 -0
  23. package/dist/color/createColorArea.d.ts.map +1 -1
  24. package/dist/color/createColorSlider.d.ts.map +1 -1
  25. package/dist/color/createColorWheel.d.ts.map +1 -1
  26. package/dist/combobox/createComboBox.d.ts +6 -0
  27. package/dist/combobox/createComboBox.d.ts.map +1 -1
  28. package/dist/datepicker/createDatePicker.d.ts +6 -0
  29. package/dist/datepicker/createDatePicker.d.ts.map +1 -1
  30. package/dist/datepicker/createDateRangePicker.d.ts +40 -0
  31. package/dist/datepicker/createDateRangePicker.d.ts.map +1 -0
  32. package/dist/datepicker/createDateSegment.d.ts +1 -1
  33. package/dist/datepicker/createDateSegment.d.ts.map +1 -1
  34. package/dist/datepicker/createTimeSegment.d.ts +29 -0
  35. package/dist/datepicker/createTimeSegment.d.ts.map +1 -0
  36. package/dist/datepicker/index.d.ts +2 -0
  37. package/dist/datepicker/index.d.ts.map +1 -1
  38. package/dist/disclosure/createDisclosureGroup.d.ts +2 -1
  39. package/dist/disclosure/createDisclosureGroup.d.ts.map +1 -1
  40. package/dist/dnd/createDrag.d.ts.map +1 -1
  41. package/dist/dnd/createDraggableCollection.d.ts +4 -0
  42. package/dist/dnd/createDraggableCollection.d.ts.map +1 -1
  43. package/dist/dnd/createDraggableItem.d.ts.map +1 -1
  44. package/dist/dnd/createDrop.d.ts.map +1 -1
  45. package/dist/dnd/createDroppableCollection.d.ts +32 -1
  46. package/dist/dnd/createDroppableCollection.d.ts.map +1 -1
  47. package/dist/dnd/createDroppableItem.d.ts.map +1 -1
  48. package/dist/dnd/index.d.ts +1 -1
  49. package/dist/dnd/index.d.ts.map +1 -1
  50. package/dist/grid/createGrid.d.ts.map +1 -1
  51. package/dist/gridlist/createGridList.d.ts.map +1 -1
  52. package/dist/index.d.ts +6 -4
  53. package/dist/index.d.ts.map +1 -1
  54. package/dist/index.js +4659 -3452
  55. package/dist/index.js.map +1 -7
  56. package/dist/index.ssr.js +4659 -3452
  57. package/dist/index.ssr.js.map +1 -7
  58. package/dist/interactions/createFocus.d.ts.map +1 -1
  59. package/dist/interactions/createFocusWithin.d.ts.map +1 -1
  60. package/dist/link/createLink.d.ts +10 -0
  61. package/dist/link/createLink.d.ts.map +1 -1
  62. package/dist/listbox/createListBox.d.ts +1 -0
  63. package/dist/listbox/createListBox.d.ts.map +1 -1
  64. package/dist/listbox/createOption.d.ts.map +1 -1
  65. package/dist/menu/createMenu.d.ts +1 -0
  66. package/dist/menu/createMenu.d.ts.map +1 -1
  67. package/dist/meter/createMeter.d.ts.map +1 -1
  68. package/dist/numberfield/createNumberField.d.ts +18 -0
  69. package/dist/numberfield/createNumberField.d.ts.map +1 -1
  70. package/dist/overlays/createModal.d.ts +16 -0
  71. package/dist/overlays/createModal.d.ts.map +1 -1
  72. package/dist/overlays/createOverlay.d.ts.map +1 -1
  73. package/dist/overlays/index.d.ts +1 -1
  74. package/dist/overlays/index.d.ts.map +1 -1
  75. package/dist/popover/createOverlayPosition.d.ts.map +1 -1
  76. package/dist/popover/createPopover.d.ts.map +1 -1
  77. package/dist/progress/createProgressBar.d.ts.map +1 -1
  78. package/dist/radio/createRadioGroup.d.ts +2 -2
  79. package/dist/radio/createRadioGroup.d.ts.map +1 -1
  80. package/dist/searchfield/createSearchField.d.ts.map +1 -1
  81. package/dist/select/createHiddenSelect.d.ts.map +1 -1
  82. package/dist/select/createSelect.d.ts.map +1 -1
  83. package/dist/slider/createSlider.d.ts.map +1 -1
  84. package/dist/table/createTable.d.ts.map +1 -1
  85. package/dist/tabs/createTabs.d.ts +1 -1
  86. package/dist/tabs/createTabs.d.ts.map +1 -1
  87. package/dist/tag/createTag.d.ts.map +1 -1
  88. package/dist/tag/createTagGroup.d.ts.map +1 -1
  89. package/dist/toast/createToast.d.ts +4 -0
  90. package/dist/toast/createToast.d.ts.map +1 -1
  91. package/dist/toast/createToastRegion.d.ts.map +1 -1
  92. package/dist/toolbar/createToolbar.d.ts.map +1 -1
  93. package/dist/tooltip/createTooltipTrigger.d.ts.map +1 -1
  94. package/dist/tree/createTree.d.ts.map +1 -1
  95. package/dist/tree/createTreeItem.d.ts.map +1 -1
  96. package/dist/tree/types.d.ts +4 -0
  97. package/dist/tree/types.d.ts.map +1 -1
  98. package/dist/utils/env.d.ts +1 -1
  99. package/dist/utils/env.d.ts.map +1 -1
  100. package/dist/utils/platform.d.ts.map +1 -1
  101. package/dist/visually-hidden/createVisuallyHidden.d.ts.map +1 -1
  102. package/package.json +8 -6
  103. package/src/actiongroup/createActionGroup.ts +324 -0
  104. package/src/actiongroup/index.ts +8 -0
  105. package/src/autocomplete/createAutocomplete.ts +32 -9
  106. package/src/breadcrumbs/createBreadcrumbs.ts +10 -15
  107. package/src/button/createButton.ts +1 -1
  108. package/src/button/createToggleButtonGroup.ts +128 -0
  109. package/src/button/index.ts +9 -0
  110. package/src/calendar/createCalendarCell.ts +6 -4
  111. package/src/calendar/createCalendarGrid.ts +27 -18
  112. package/src/calendar/createRangeCalendarCell.ts +26 -9
  113. package/src/checkbox/createCheckboxGroup.ts +21 -4
  114. package/src/collections/index.ts +242 -0
  115. package/src/color/createColorArea.ts +380 -314
  116. package/src/color/createColorField.ts +137 -137
  117. package/src/color/createColorSlider.ts +286 -197
  118. package/src/color/createColorSwatch.ts +40 -40
  119. package/src/color/createColorWheel.ts +218 -208
  120. package/src/color/index.ts +24 -24
  121. package/src/color/types.ts +116 -116
  122. package/src/combobox/createComboBox.ts +670 -647
  123. package/src/combobox/index.ts +6 -6
  124. package/src/datepicker/createDatePicker.ts +54 -16
  125. package/src/datepicker/createDateRangePicker.ts +246 -0
  126. package/src/datepicker/createDateSegment.ts +185 -31
  127. package/src/datepicker/createTimeSegment.ts +370 -0
  128. package/src/datepicker/index.ts +14 -0
  129. package/src/dialog/createDialog.ts +120 -120
  130. package/src/dialog/index.ts +2 -2
  131. package/src/dialog/types.ts +19 -19
  132. package/src/disclosure/createDisclosureGroup.ts +5 -2
  133. package/src/dnd/createDrag.ts +224 -209
  134. package/src/dnd/createDraggableCollection.ts +96 -63
  135. package/src/dnd/createDraggableItem.ts +259 -243
  136. package/src/dnd/createDrop.ts +322 -321
  137. package/src/dnd/createDroppableCollection.ts +682 -293
  138. package/src/dnd/createDroppableItem.ts +215 -213
  139. package/src/dnd/index.ts +55 -47
  140. package/src/dnd/types.ts +89 -89
  141. package/src/dnd/utils.ts +294 -294
  142. package/src/focus/createAutoFocus.ts +321 -321
  143. package/src/focus/createFocusRestore.ts +313 -313
  144. package/src/focus/createVirtualFocus.ts +396 -396
  145. package/src/form/createFormValidation.ts +224 -224
  146. package/src/form/index.ts +11 -11
  147. package/src/grid/createGrid.ts +3 -1
  148. package/src/gridlist/createGridList.ts +16 -0
  149. package/src/gridlist/createGridListItem.ts +1 -1
  150. package/src/i18n/NumberFormatter.ts +266 -266
  151. package/src/i18n/createCollator.ts +79 -79
  152. package/src/i18n/createDateFormatter.ts +83 -83
  153. package/src/i18n/createFilter.ts +131 -131
  154. package/src/i18n/createNumberFormatter.ts +52 -52
  155. package/src/i18n/index.ts +40 -40
  156. package/src/i18n/locale.tsx +188 -188
  157. package/src/i18n/utils.ts +99 -99
  158. package/src/index.ts +51 -0
  159. package/src/interactions/createFocus.ts +6 -5
  160. package/src/interactions/createFocusWithin.ts +6 -5
  161. package/src/interactions/createLongPress.ts +174 -174
  162. package/src/interactions/createMove.ts +289 -289
  163. package/src/interactions/createPress.ts +5 -5
  164. package/src/landmark/createLandmark.ts +377 -377
  165. package/src/landmark/index.ts +8 -8
  166. package/src/link/createLink.ts +23 -8
  167. package/src/listbox/createListBox.ts +308 -269
  168. package/src/listbox/createOption.ts +162 -151
  169. package/src/listbox/index.ts +12 -12
  170. package/src/live-announcer/announce.ts +322 -322
  171. package/src/live-announcer/index.ts +9 -9
  172. package/src/menu/createMenu.ts +405 -396
  173. package/src/menu/createMenuItem.ts +149 -149
  174. package/src/menu/createMenuTrigger.ts +88 -88
  175. package/src/menu/index.ts +18 -18
  176. package/src/meter/createMeter.ts +1 -6
  177. package/src/numberfield/createNumberField.ts +311 -268
  178. package/src/numberfield/index.ts +5 -5
  179. package/src/overlays/ariaHideOutside.ts +219 -219
  180. package/src/overlays/createInteractOutside.ts +149 -149
  181. package/src/overlays/createModal.tsx +238 -202
  182. package/src/overlays/createOverlay.ts +165 -155
  183. package/src/overlays/createOverlayTrigger.ts +85 -85
  184. package/src/overlays/createPreventScroll.ts +266 -266
  185. package/src/overlays/index.ts +48 -44
  186. package/src/popover/calculatePosition.ts +6 -6
  187. package/src/popover/createOverlayPosition.ts +7 -4
  188. package/src/popover/createPopover.ts +21 -7
  189. package/src/progress/createProgressBar.ts +6 -1
  190. package/src/radio/createRadioGroup.ts +88 -14
  191. package/src/searchfield/createSearchField.ts +241 -186
  192. package/src/searchfield/index.ts +2 -2
  193. package/src/select/createHiddenSelect.tsx +263 -236
  194. package/src/select/createSelect.ts +373 -395
  195. package/src/select/index.ts +14 -14
  196. package/src/slider/createSlider.ts +364 -349
  197. package/src/slider/index.ts +2 -2
  198. package/src/ssr/index.tsx +370 -370
  199. package/src/table/createTable.ts +3 -1
  200. package/src/table/createTableColumnHeader.ts +1 -1
  201. package/src/table/createTableRow.ts +1 -1
  202. package/src/tabs/createTabs.ts +80 -51
  203. package/src/tag/createTag.ts +135 -6
  204. package/src/tag/createTagGroup.ts +7 -2
  205. package/src/toast/createToast.ts +8 -2
  206. package/src/toast/createToastRegion.ts +0 -1
  207. package/src/toolbar/createToolbar.ts +75 -1
  208. package/src/tooltip/createTooltip.ts +79 -79
  209. package/src/tooltip/createTooltipTrigger.ts +226 -222
  210. package/src/tooltip/index.ts +6 -6
  211. package/src/tree/createTree.ts +261 -246
  212. package/src/tree/createTreeItem.ts +282 -233
  213. package/src/tree/createTreeSelectionCheckbox.ts +68 -68
  214. package/src/tree/index.ts +16 -16
  215. package/src/tree/types.ts +91 -87
  216. package/src/utils/env.ts +55 -54
  217. package/src/utils/platform.ts +16 -6
  218. package/src/visually-hidden/createVisuallyHidden.ts +139 -124
  219. package/src/visually-hidden/index.ts +6 -6
@@ -1,213 +1,215 @@
1
- /**
2
- * createDroppableItem - ARIA hook for droppable items within a collection.
3
- *
4
- * Provides accessibility props for items that can receive drops.
5
- */
6
-
7
- import { createMemo, type Accessor } from 'solid-js';
8
- import type { JSX } from 'solid-js';
9
- import type {
10
- DroppableCollectionState,
11
- DropTarget,
12
- DropOperation,
13
- } from '@proyecto-viviana/solid-stately';
14
- import {
15
- DragTypesImpl,
16
- DROP_OPERATION,
17
- DROP_OPERATION_ALLOWED,
18
- DROP_OPERATION_TO_DROP_EFFECT,
19
- getGlobalAllowedDropOperations,
20
- } from './utils';
21
-
22
- export interface DroppableItemOptions {
23
- /** The unique key of the item. */
24
- key: string | number;
25
- /** Reference to the item element. */
26
- ref: Accessor<HTMLElement | null>;
27
- /** Whether this item is disabled for dropping. */
28
- isDisabled?: boolean;
29
- }
30
-
31
- export interface DroppableItemAria {
32
- /** Props for the droppable item element. */
33
- dropProps: JSX.HTMLAttributes<HTMLElement>;
34
- /** Whether the item is currently a drop target. */
35
- isDropTarget: boolean;
36
- }
37
-
38
- /**
39
- * Creates ARIA props for a droppable item within a collection.
40
- *
41
- * @param options - Accessor returning item options
42
- * @param state - Droppable collection state
43
- * @returns Droppable item ARIA props
44
- */
45
- export function createDroppableItem(
46
- options: Accessor<DroppableItemOptions>,
47
- state: DroppableCollectionState
48
- ): DroppableItemAria {
49
- const getOptions = createMemo(() => options());
50
-
51
- const isDropTarget = createMemo(() => {
52
- const { key } = getOptions();
53
- const target = state.target;
54
- return target?.type === 'item' && target.key === key;
55
- });
56
-
57
- const getTarget = (dropPosition: 'before' | 'on' | 'after'): DropTarget => {
58
- const { key } = getOptions();
59
- return {
60
- type: 'item',
61
- key,
62
- dropPosition,
63
- };
64
- };
65
-
66
- const getDropOperation = (
67
- e: DragEvent,
68
- target: DropTarget
69
- ): DropOperation => {
70
- if (!e.dataTransfer) return 'cancel';
71
-
72
- const types = new DragTypesImpl(e.dataTransfer);
73
- let allowedBits =
74
- DROP_OPERATION_ALLOWED[e.dataTransfer.effectAllowed] || DROP_OPERATION.all;
75
-
76
- // Use global allowed operations for internal drags
77
- const globalAllowed = getGlobalAllowedDropOperations();
78
- if (globalAllowed) {
79
- allowedBits &= globalAllowed;
80
- }
81
-
82
- const allowedOperations: DropOperation[] = [];
83
- if (allowedBits & DROP_OPERATION.move) allowedOperations.push('move');
84
- if (allowedBits & DROP_OPERATION.copy) allowedOperations.push('copy');
85
- if (allowedBits & DROP_OPERATION.link) allowedOperations.push('link');
86
-
87
- return state.getDropOperation(target, types, allowedOperations);
88
- };
89
-
90
- let dropActivateTimer: ReturnType<typeof setTimeout> | undefined;
91
- const DROP_ACTIVATE_TIMEOUT = 800;
92
-
93
- const onDragEnter = (e: DragEvent) => {
94
- e.preventDefault();
95
- e.stopPropagation();
96
-
97
- const opts = getOptions();
98
- if (opts.isDisabled) return;
99
-
100
- // Determine drop position based on cursor position
101
- const rect = (e.currentTarget as HTMLElement).getBoundingClientRect();
102
- const y = e.clientY - rect.y;
103
- const height = rect.height;
104
-
105
- let dropPosition: 'before' | 'on' | 'after';
106
- if (y < height * 0.25) {
107
- dropPosition = 'before';
108
- } else if (y > height * 0.75) {
109
- dropPosition = 'after';
110
- } else {
111
- dropPosition = 'on';
112
- }
113
-
114
- const target = getTarget(dropPosition);
115
- const operation = getDropOperation(e, target);
116
-
117
- if (operation !== 'cancel') {
118
- state.setTarget(target);
119
- e.dataTransfer!.dropEffect = DROP_OPERATION_TO_DROP_EFFECT[operation] as DataTransfer['dropEffect'];
120
- }
121
- };
122
-
123
- const onDragOver = (e: DragEvent) => {
124
- e.preventDefault();
125
- e.stopPropagation();
126
-
127
- const opts = getOptions();
128
- if (opts.isDisabled) return;
129
-
130
- // Update drop position based on cursor
131
- const rect = (e.currentTarget as HTMLElement).getBoundingClientRect();
132
- const y = e.clientY - rect.y;
133
- const height = rect.height;
134
-
135
- let dropPosition: 'before' | 'on' | 'after';
136
- if (y < height * 0.25) {
137
- dropPosition = 'before';
138
- } else if (y > height * 0.75) {
139
- dropPosition = 'after';
140
- } else {
141
- dropPosition = 'on';
142
- }
143
-
144
- const target = getTarget(dropPosition);
145
- const operation = getDropOperation(e, target);
146
-
147
- if (operation !== 'cancel') {
148
- state.setTarget(target);
149
- e.dataTransfer!.dropEffect = DROP_OPERATION_TO_DROP_EFFECT[operation] as DataTransfer['dropEffect'];
150
-
151
- // Handle drop activate for 'on' position
152
- clearTimeout(dropActivateTimer);
153
- if (dropPosition === 'on') {
154
- dropActivateTimer = setTimeout(() => {
155
- // Would trigger onDropActivate
156
- }, DROP_ACTIVATE_TIMEOUT);
157
- }
158
- } else {
159
- e.dataTransfer!.dropEffect = 'none';
160
- }
161
- };
162
-
163
- const onDragLeave = (e: DragEvent) => {
164
- e.preventDefault();
165
- e.stopPropagation();
166
-
167
- clearTimeout(dropActivateTimer);
168
-
169
- // Only clear target if leaving this item
170
- const relatedTarget = e.relatedTarget as HTMLElement | null;
171
- const currentTarget = e.currentTarget as HTMLElement;
172
- if (!relatedTarget || !currentTarget.contains(relatedTarget)) {
173
- // Clear if no longer over this item
174
- const { key } = getOptions();
175
- if (state.target?.type === 'item' && state.target.key === key) {
176
- // State clearing handled by parent collection
177
- }
178
- }
179
- };
180
-
181
- const onDrop = (e: DragEvent) => {
182
- e.preventDefault();
183
- e.stopPropagation();
184
-
185
- clearTimeout(dropActivateTimer);
186
-
187
- // Drop handling is done by the parent collection
188
- };
189
-
190
- const dropProps = createMemo(() => {
191
- const opts = getOptions();
192
-
193
- if (opts.isDisabled) {
194
- return {};
195
- }
196
-
197
- return {
198
- onDragEnter,
199
- onDragOver,
200
- onDragLeave,
201
- onDrop,
202
- };
203
- });
204
-
205
- return {
206
- get dropProps() {
207
- return dropProps() as DroppableItemAria['dropProps'];
208
- },
209
- get isDropTarget() {
210
- return isDropTarget();
211
- },
212
- };
213
- }
1
+ /**
2
+ * createDroppableItem - ARIA hook for droppable items within a collection.
3
+ *
4
+ * Provides accessibility props for items that can receive drops.
5
+ */
6
+
7
+ import { createMemo, type Accessor } from 'solid-js';
8
+ import type { JSX } from 'solid-js';
9
+ import type {
10
+ DroppableCollectionState,
11
+ DropTarget,
12
+ DropOperation,
13
+ } from '@proyecto-viviana/solid-stately';
14
+ import {
15
+ DragTypesImpl,
16
+ DROP_OPERATION,
17
+ DROP_OPERATION_ALLOWED,
18
+ DROP_OPERATION_TO_DROP_EFFECT,
19
+ getGlobalAllowedDropOperations,
20
+ } from './utils';
21
+
22
+ export interface DroppableItemOptions {
23
+ /** The unique key of the item. */
24
+ key: string | number;
25
+ /** Reference to the item element. */
26
+ ref: Accessor<HTMLElement | null>;
27
+ /** Whether this item is disabled for dropping. */
28
+ isDisabled?: boolean;
29
+ }
30
+
31
+ export interface DroppableItemAria {
32
+ /** Props for the droppable item element. */
33
+ dropProps: JSX.HTMLAttributes<HTMLElement>;
34
+ /** Whether the item is currently a drop target. */
35
+ isDropTarget: boolean;
36
+ }
37
+
38
+ /**
39
+ * Creates ARIA props for a droppable item within a collection.
40
+ *
41
+ * @param options - Accessor returning item options
42
+ * @param state - Droppable collection state
43
+ * @returns Droppable item ARIA props
44
+ */
45
+ export function createDroppableItem(
46
+ options: Accessor<DroppableItemOptions>,
47
+ state: DroppableCollectionState
48
+ ): DroppableItemAria {
49
+ const getOptions = createMemo(() => options());
50
+
51
+ const isDropTarget = createMemo(() => {
52
+ const { key } = getOptions();
53
+ const target = state.target;
54
+ return target?.type === 'item' && target.key === key;
55
+ });
56
+
57
+ const getTarget = (dropPosition: 'before' | 'on' | 'after'): DropTarget => {
58
+ const { key } = getOptions();
59
+ return {
60
+ type: 'item',
61
+ key,
62
+ dropPosition,
63
+ };
64
+ };
65
+
66
+ const getDropOperation = (
67
+ e: DragEvent,
68
+ target: DropTarget
69
+ ): DropOperation => {
70
+ if (!e.dataTransfer) return 'cancel';
71
+
72
+ const types = new DragTypesImpl(e.dataTransfer);
73
+ let allowedBits =
74
+ DROP_OPERATION_ALLOWED[e.dataTransfer.effectAllowed] || DROP_OPERATION.all;
75
+
76
+ // Use global allowed operations for internal drags
77
+ const globalAllowed = getGlobalAllowedDropOperations();
78
+ if (globalAllowed) {
79
+ allowedBits &= globalAllowed;
80
+ }
81
+
82
+ const allowedOperations: DropOperation[] = [];
83
+ if (allowedBits & DROP_OPERATION.move) allowedOperations.push('move');
84
+ if (allowedBits & DROP_OPERATION.copy) allowedOperations.push('copy');
85
+ if (allowedBits & DROP_OPERATION.link) allowedOperations.push('link');
86
+
87
+ return state.getDropOperation(target, types, allowedOperations);
88
+ };
89
+
90
+ let dropActivateTimer: ReturnType<typeof setTimeout> | undefined;
91
+ const DROP_ACTIVATE_TIMEOUT = 800;
92
+
93
+ const onDragEnter = (e: DragEvent) => {
94
+ e.preventDefault();
95
+ e.stopPropagation();
96
+
97
+ const opts = getOptions();
98
+ if (opts.isDisabled) return;
99
+
100
+ // Determine drop position based on cursor position
101
+ const rect = (e.currentTarget as HTMLElement).getBoundingClientRect();
102
+ const x = e.clientX - rect.x;
103
+ const y = e.clientY - rect.y;
104
+ const height = rect.height;
105
+
106
+ let dropPosition: 'before' | 'on' | 'after';
107
+ if (y < height * 0.25) {
108
+ dropPosition = 'before';
109
+ } else if (y > height * 0.75) {
110
+ dropPosition = 'after';
111
+ } else {
112
+ dropPosition = 'on';
113
+ }
114
+
115
+ const target = getTarget(dropPosition);
116
+ const operation = getDropOperation(e, target);
117
+
118
+ if (operation !== 'cancel') {
119
+ state.setTarget(target);
120
+ e.dataTransfer!.dropEffect = DROP_OPERATION_TO_DROP_EFFECT[operation] as DataTransfer['dropEffect'];
121
+ }
122
+ };
123
+
124
+ const onDragOver = (e: DragEvent) => {
125
+ e.preventDefault();
126
+ e.stopPropagation();
127
+
128
+ const opts = getOptions();
129
+ if (opts.isDisabled) return;
130
+
131
+ // Update drop position based on cursor
132
+ const rect = (e.currentTarget as HTMLElement).getBoundingClientRect();
133
+ const x = e.clientX - rect.x;
134
+ const y = e.clientY - rect.y;
135
+ const height = rect.height;
136
+
137
+ let dropPosition: 'before' | 'on' | 'after';
138
+ if (y < height * 0.25) {
139
+ dropPosition = 'before';
140
+ } else if (y > height * 0.75) {
141
+ dropPosition = 'after';
142
+ } else {
143
+ dropPosition = 'on';
144
+ }
145
+
146
+ const target = getTarget(dropPosition);
147
+ const operation = getDropOperation(e, target);
148
+
149
+ if (operation !== 'cancel') {
150
+ state.setTarget(target);
151
+ e.dataTransfer!.dropEffect = DROP_OPERATION_TO_DROP_EFFECT[operation] as DataTransfer['dropEffect'];
152
+
153
+ // Handle drop activate for 'on' position
154
+ clearTimeout(dropActivateTimer);
155
+ if (dropPosition === 'on') {
156
+ dropActivateTimer = setTimeout(() => {
157
+ state.activateTarget(x, y);
158
+ }, DROP_ACTIVATE_TIMEOUT);
159
+ }
160
+ } else {
161
+ e.dataTransfer!.dropEffect = 'none';
162
+ }
163
+ };
164
+
165
+ const onDragLeave = (e: DragEvent) => {
166
+ e.preventDefault();
167
+ e.stopPropagation();
168
+
169
+ clearTimeout(dropActivateTimer);
170
+
171
+ // Only clear target if leaving this item
172
+ const relatedTarget = e.relatedTarget as HTMLElement | null;
173
+ const currentTarget = e.currentTarget as HTMLElement;
174
+ if (!relatedTarget || !currentTarget.contains(relatedTarget)) {
175
+ // Clear if no longer over this item
176
+ const { key } = getOptions();
177
+ if (state.target?.type === 'item' && state.target.key === key) {
178
+ // State clearing handled by parent collection
179
+ }
180
+ }
181
+ };
182
+
183
+ const onDrop = (e: DragEvent) => {
184
+ e.preventDefault();
185
+ e.stopPropagation();
186
+
187
+ clearTimeout(dropActivateTimer);
188
+
189
+ // Drop handling is done by the parent collection
190
+ };
191
+
192
+ const dropProps = createMemo(() => {
193
+ const opts = getOptions();
194
+
195
+ if (opts.isDisabled) {
196
+ return {};
197
+ }
198
+
199
+ return {
200
+ onDragEnter,
201
+ onDragOver,
202
+ onDragLeave,
203
+ onDrop,
204
+ };
205
+ });
206
+
207
+ return {
208
+ get dropProps() {
209
+ return dropProps() as DroppableItemAria['dropProps'];
210
+ },
211
+ get isDropTarget() {
212
+ return isDropTarget();
213
+ },
214
+ };
215
+ }
package/src/dnd/index.ts CHANGED
@@ -1,47 +1,55 @@
1
- /**
2
- * Drag and Drop module for solidaria.
3
- *
4
- * Provides ARIA hooks for drag and drop interactions.
5
- */
6
-
7
- // Basic drag/drop hooks
8
- export { createDrag } from './createDrag';
9
- export { createDrop } from './createDrop';
10
-
11
- // Collection hooks
12
- export { createDraggableCollection, setGlobalDraggingCollectionRef, getGlobalDraggingCollectionRef } from './createDraggableCollection';
13
- export { createDroppableCollection, setGlobalDropCollectionRef, getGlobalDropCollectionRef } from './createDroppableCollection';
14
-
15
- // Item hooks
16
- export { createDraggableItem } from './createDraggableItem';
17
- export { createDroppableItem } from './createDroppableItem';
18
-
19
- // Types
20
- export type { AriaDragOptions, DragAria, AriaDropOptions, DropAria } from './types';
21
- export type { DraggableCollectionOptions, DraggableCollectionAria } from './createDraggableCollection';
22
- export type { DroppableCollectionOptions, DroppableCollectionAria, DropTargetDelegate } from './createDroppableCollection';
23
- export type { DraggableItemOptions, DraggableItemAria } from './createDraggableItem';
24
- export type { DroppableItemOptions, DroppableItemAria } from './createDroppableItem';
25
-
26
- // Utilities
27
- export {
28
- CUSTOM_DRAG_TYPE,
29
- NATIVE_DRAG_TYPES,
30
- GENERIC_TYPE,
31
- DROP_OPERATION,
32
- DROP_OPERATION_ALLOWED,
33
- EFFECT_ALLOWED,
34
- DROP_EFFECT_TO_DROP_OPERATION,
35
- DROP_OPERATION_TO_DROP_EFFECT,
36
- getTypes,
37
- writeToDataTransfer,
38
- readFromDataTransfer,
39
- DragTypesImpl,
40
- isTextDropItem,
41
- isFileDropItem,
42
- isDirectoryDropItem,
43
- setGlobalDropEffect,
44
- getGlobalDropEffect,
45
- setGlobalAllowedDropOperations,
46
- getGlobalAllowedDropOperations,
47
- } from './utils';
1
+ /**
2
+ * Drag and Drop module for solidaria.
3
+ *
4
+ * Provides ARIA hooks for drag and drop interactions.
5
+ */
6
+
7
+ // Basic drag/drop hooks
8
+ export { createDrag } from './createDrag';
9
+ export { createDrop } from './createDrop';
10
+
11
+ // Collection hooks
12
+ export {
13
+ createDraggableCollection,
14
+ setGlobalDraggingCollectionRef,
15
+ getGlobalDraggingCollectionRef,
16
+ setGlobalDraggingKeys,
17
+ getGlobalDraggingKeys,
18
+ setGlobalDraggingTypes,
19
+ getGlobalDraggingTypes,
20
+ } from './createDraggableCollection';
21
+ export { createDroppableCollection, setGlobalDropCollectionRef, getGlobalDropCollectionRef } from './createDroppableCollection';
22
+
23
+ // Item hooks
24
+ export { createDraggableItem } from './createDraggableItem';
25
+ export { createDroppableItem } from './createDroppableItem';
26
+
27
+ // Types
28
+ export type { AriaDragOptions, DragAria, AriaDropOptions, DropAria } from './types';
29
+ export type { DraggableCollectionOptions, DraggableCollectionAria } from './createDraggableCollection';
30
+ export type { DroppableCollectionOptions, DroppableCollectionAria, DropTargetDelegate } from './createDroppableCollection';
31
+ export type { DraggableItemOptions, DraggableItemAria } from './createDraggableItem';
32
+ export type { DroppableItemOptions, DroppableItemAria } from './createDroppableItem';
33
+
34
+ // Utilities
35
+ export {
36
+ CUSTOM_DRAG_TYPE,
37
+ NATIVE_DRAG_TYPES,
38
+ GENERIC_TYPE,
39
+ DROP_OPERATION,
40
+ DROP_OPERATION_ALLOWED,
41
+ EFFECT_ALLOWED,
42
+ DROP_EFFECT_TO_DROP_OPERATION,
43
+ DROP_OPERATION_TO_DROP_EFFECT,
44
+ getTypes,
45
+ writeToDataTransfer,
46
+ readFromDataTransfer,
47
+ DragTypesImpl,
48
+ isTextDropItem,
49
+ isFileDropItem,
50
+ isDirectoryDropItem,
51
+ setGlobalDropEffect,
52
+ getGlobalDropEffect,
53
+ setGlobalAllowedDropOperations,
54
+ getGlobalAllowedDropOperations,
55
+ } from './utils';