@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.
- package/LICENSE +21 -0
- package/dist/actiongroup/createActionGroup.d.ts +29 -0
- package/dist/actiongroup/createActionGroup.d.ts.map +1 -0
- package/dist/actiongroup/index.d.ts +2 -0
- package/dist/actiongroup/index.d.ts.map +1 -0
- package/dist/autocomplete/createAutocomplete.d.ts +6 -2
- package/dist/autocomplete/createAutocomplete.d.ts.map +1 -1
- package/dist/breadcrumbs/createBreadcrumbs.d.ts +2 -0
- package/dist/breadcrumbs/createBreadcrumbs.d.ts.map +1 -1
- package/dist/button/createToggleButtonGroup.d.ts +32 -0
- package/dist/button/createToggleButtonGroup.d.ts.map +1 -0
- package/dist/button/index.d.ts +2 -0
- package/dist/button/index.d.ts.map +1 -1
- package/dist/calendar/createCalendarCell.d.ts +2 -0
- package/dist/calendar/createCalendarCell.d.ts.map +1 -1
- package/dist/calendar/createCalendarGrid.d.ts.map +1 -1
- package/dist/calendar/createRangeCalendarCell.d.ts +3 -1
- package/dist/calendar/createRangeCalendarCell.d.ts.map +1 -1
- package/dist/checkbox/createCheckboxGroup.d.ts +5 -1
- package/dist/checkbox/createCheckboxGroup.d.ts.map +1 -1
- package/dist/collections/index.d.ts +56 -0
- package/dist/collections/index.d.ts.map +1 -0
- package/dist/color/createColorArea.d.ts.map +1 -1
- package/dist/color/createColorSlider.d.ts.map +1 -1
- package/dist/color/createColorWheel.d.ts.map +1 -1
- package/dist/combobox/createComboBox.d.ts +6 -0
- package/dist/combobox/createComboBox.d.ts.map +1 -1
- package/dist/datepicker/createDatePicker.d.ts +6 -0
- package/dist/datepicker/createDatePicker.d.ts.map +1 -1
- package/dist/datepicker/createDateRangePicker.d.ts +40 -0
- package/dist/datepicker/createDateRangePicker.d.ts.map +1 -0
- package/dist/datepicker/createDateSegment.d.ts +1 -1
- package/dist/datepicker/createDateSegment.d.ts.map +1 -1
- package/dist/datepicker/createTimeSegment.d.ts +29 -0
- package/dist/datepicker/createTimeSegment.d.ts.map +1 -0
- package/dist/datepicker/index.d.ts +2 -0
- package/dist/datepicker/index.d.ts.map +1 -1
- package/dist/disclosure/createDisclosureGroup.d.ts +2 -1
- package/dist/disclosure/createDisclosureGroup.d.ts.map +1 -1
- package/dist/dnd/createDrag.d.ts.map +1 -1
- package/dist/dnd/createDraggableCollection.d.ts +4 -0
- package/dist/dnd/createDraggableCollection.d.ts.map +1 -1
- package/dist/dnd/createDraggableItem.d.ts.map +1 -1
- package/dist/dnd/createDrop.d.ts.map +1 -1
- package/dist/dnd/createDroppableCollection.d.ts +32 -1
- package/dist/dnd/createDroppableCollection.d.ts.map +1 -1
- package/dist/dnd/createDroppableItem.d.ts.map +1 -1
- package/dist/dnd/index.d.ts +1 -1
- package/dist/dnd/index.d.ts.map +1 -1
- package/dist/grid/createGrid.d.ts.map +1 -1
- package/dist/gridlist/createGridList.d.ts.map +1 -1
- package/dist/index.d.ts +6 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4659 -3452
- package/dist/index.js.map +1 -7
- package/dist/index.ssr.js +4659 -3452
- package/dist/index.ssr.js.map +1 -7
- package/dist/interactions/createFocus.d.ts.map +1 -1
- package/dist/interactions/createFocusWithin.d.ts.map +1 -1
- package/dist/link/createLink.d.ts +10 -0
- package/dist/link/createLink.d.ts.map +1 -1
- package/dist/listbox/createListBox.d.ts +1 -0
- package/dist/listbox/createListBox.d.ts.map +1 -1
- package/dist/listbox/createOption.d.ts.map +1 -1
- package/dist/menu/createMenu.d.ts +1 -0
- package/dist/menu/createMenu.d.ts.map +1 -1
- package/dist/meter/createMeter.d.ts.map +1 -1
- package/dist/numberfield/createNumberField.d.ts +18 -0
- package/dist/numberfield/createNumberField.d.ts.map +1 -1
- package/dist/overlays/createModal.d.ts +16 -0
- package/dist/overlays/createModal.d.ts.map +1 -1
- package/dist/overlays/createOverlay.d.ts.map +1 -1
- package/dist/overlays/index.d.ts +1 -1
- package/dist/overlays/index.d.ts.map +1 -1
- package/dist/popover/createOverlayPosition.d.ts.map +1 -1
- package/dist/popover/createPopover.d.ts.map +1 -1
- package/dist/progress/createProgressBar.d.ts.map +1 -1
- package/dist/radio/createRadioGroup.d.ts +2 -2
- package/dist/radio/createRadioGroup.d.ts.map +1 -1
- package/dist/searchfield/createSearchField.d.ts.map +1 -1
- package/dist/select/createHiddenSelect.d.ts.map +1 -1
- package/dist/select/createSelect.d.ts.map +1 -1
- package/dist/slider/createSlider.d.ts.map +1 -1
- package/dist/table/createTable.d.ts.map +1 -1
- package/dist/tabs/createTabs.d.ts +1 -1
- package/dist/tabs/createTabs.d.ts.map +1 -1
- package/dist/tag/createTag.d.ts.map +1 -1
- package/dist/tag/createTagGroup.d.ts.map +1 -1
- package/dist/toast/createToast.d.ts +4 -0
- package/dist/toast/createToast.d.ts.map +1 -1
- package/dist/toast/createToastRegion.d.ts.map +1 -1
- package/dist/toolbar/createToolbar.d.ts.map +1 -1
- package/dist/tooltip/createTooltipTrigger.d.ts.map +1 -1
- package/dist/tree/createTree.d.ts.map +1 -1
- package/dist/tree/createTreeItem.d.ts.map +1 -1
- package/dist/tree/types.d.ts +4 -0
- package/dist/tree/types.d.ts.map +1 -1
- package/dist/utils/env.d.ts +1 -1
- package/dist/utils/env.d.ts.map +1 -1
- package/dist/utils/platform.d.ts.map +1 -1
- package/dist/visually-hidden/createVisuallyHidden.d.ts.map +1 -1
- package/package.json +8 -6
- package/src/actiongroup/createActionGroup.ts +324 -0
- package/src/actiongroup/index.ts +8 -0
- package/src/autocomplete/createAutocomplete.ts +32 -9
- package/src/breadcrumbs/createBreadcrumbs.ts +10 -15
- package/src/button/createButton.ts +1 -1
- package/src/button/createToggleButtonGroup.ts +128 -0
- package/src/button/index.ts +9 -0
- package/src/calendar/createCalendarCell.ts +6 -4
- package/src/calendar/createCalendarGrid.ts +27 -18
- package/src/calendar/createRangeCalendarCell.ts +26 -9
- package/src/checkbox/createCheckboxGroup.ts +21 -4
- package/src/collections/index.ts +242 -0
- package/src/color/createColorArea.ts +380 -314
- package/src/color/createColorField.ts +137 -137
- package/src/color/createColorSlider.ts +286 -197
- package/src/color/createColorSwatch.ts +40 -40
- package/src/color/createColorWheel.ts +218 -208
- package/src/color/index.ts +24 -24
- package/src/color/types.ts +116 -116
- package/src/combobox/createComboBox.ts +670 -647
- package/src/combobox/index.ts +6 -6
- package/src/datepicker/createDatePicker.ts +54 -16
- package/src/datepicker/createDateRangePicker.ts +246 -0
- package/src/datepicker/createDateSegment.ts +185 -31
- package/src/datepicker/createTimeSegment.ts +370 -0
- package/src/datepicker/index.ts +14 -0
- package/src/dialog/createDialog.ts +120 -120
- package/src/dialog/index.ts +2 -2
- package/src/dialog/types.ts +19 -19
- package/src/disclosure/createDisclosureGroup.ts +5 -2
- package/src/dnd/createDrag.ts +224 -209
- package/src/dnd/createDraggableCollection.ts +96 -63
- package/src/dnd/createDraggableItem.ts +259 -243
- package/src/dnd/createDrop.ts +322 -321
- package/src/dnd/createDroppableCollection.ts +682 -293
- package/src/dnd/createDroppableItem.ts +215 -213
- package/src/dnd/index.ts +55 -47
- package/src/dnd/types.ts +89 -89
- package/src/dnd/utils.ts +294 -294
- package/src/focus/createAutoFocus.ts +321 -321
- package/src/focus/createFocusRestore.ts +313 -313
- package/src/focus/createVirtualFocus.ts +396 -396
- package/src/form/createFormValidation.ts +224 -224
- package/src/form/index.ts +11 -11
- package/src/grid/createGrid.ts +3 -1
- package/src/gridlist/createGridList.ts +16 -0
- package/src/gridlist/createGridListItem.ts +1 -1
- package/src/i18n/NumberFormatter.ts +266 -266
- package/src/i18n/createCollator.ts +79 -79
- package/src/i18n/createDateFormatter.ts +83 -83
- package/src/i18n/createFilter.ts +131 -131
- package/src/i18n/createNumberFormatter.ts +52 -52
- package/src/i18n/index.ts +40 -40
- package/src/i18n/locale.tsx +188 -188
- package/src/i18n/utils.ts +99 -99
- package/src/index.ts +51 -0
- package/src/interactions/createFocus.ts +6 -5
- package/src/interactions/createFocusWithin.ts +6 -5
- package/src/interactions/createLongPress.ts +174 -174
- package/src/interactions/createMove.ts +289 -289
- package/src/interactions/createPress.ts +5 -5
- package/src/landmark/createLandmark.ts +377 -377
- package/src/landmark/index.ts +8 -8
- package/src/link/createLink.ts +23 -8
- package/src/listbox/createListBox.ts +308 -269
- package/src/listbox/createOption.ts +162 -151
- package/src/listbox/index.ts +12 -12
- package/src/live-announcer/announce.ts +322 -322
- package/src/live-announcer/index.ts +9 -9
- package/src/menu/createMenu.ts +405 -396
- package/src/menu/createMenuItem.ts +149 -149
- package/src/menu/createMenuTrigger.ts +88 -88
- package/src/menu/index.ts +18 -18
- package/src/meter/createMeter.ts +1 -6
- package/src/numberfield/createNumberField.ts +311 -268
- package/src/numberfield/index.ts +5 -5
- package/src/overlays/ariaHideOutside.ts +219 -219
- package/src/overlays/createInteractOutside.ts +149 -149
- package/src/overlays/createModal.tsx +238 -202
- package/src/overlays/createOverlay.ts +165 -155
- package/src/overlays/createOverlayTrigger.ts +85 -85
- package/src/overlays/createPreventScroll.ts +266 -266
- package/src/overlays/index.ts +48 -44
- package/src/popover/calculatePosition.ts +6 -6
- package/src/popover/createOverlayPosition.ts +7 -4
- package/src/popover/createPopover.ts +21 -7
- package/src/progress/createProgressBar.ts +6 -1
- package/src/radio/createRadioGroup.ts +88 -14
- package/src/searchfield/createSearchField.ts +241 -186
- package/src/searchfield/index.ts +2 -2
- package/src/select/createHiddenSelect.tsx +263 -236
- package/src/select/createSelect.ts +373 -395
- package/src/select/index.ts +14 -14
- package/src/slider/createSlider.ts +364 -349
- package/src/slider/index.ts +2 -2
- package/src/ssr/index.tsx +370 -370
- package/src/table/createTable.ts +3 -1
- package/src/table/createTableColumnHeader.ts +1 -1
- package/src/table/createTableRow.ts +1 -1
- package/src/tabs/createTabs.ts +80 -51
- package/src/tag/createTag.ts +135 -6
- package/src/tag/createTagGroup.ts +7 -2
- package/src/toast/createToast.ts +8 -2
- package/src/toast/createToastRegion.ts +0 -1
- package/src/toolbar/createToolbar.ts +75 -1
- package/src/tooltip/createTooltip.ts +79 -79
- package/src/tooltip/createTooltipTrigger.ts +226 -222
- package/src/tooltip/index.ts +6 -6
- package/src/tree/createTree.ts +261 -246
- package/src/tree/createTreeItem.ts +282 -233
- package/src/tree/createTreeSelectionCheckbox.ts +68 -68
- package/src/tree/index.ts +16 -16
- package/src/tree/types.ts +91 -87
- package/src/utils/env.ts +55 -54
- package/src/utils/platform.ts +16 -6
- package/src/visually-hidden/createVisuallyHidden.ts +139 -124
- package/src/visually-hidden/index.ts +6 -6
|
@@ -1,243 +1,259 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* createDraggableItem - ARIA hook for draggable items within a collection.
|
|
3
|
-
*
|
|
4
|
-
* Provides accessibility props for items that can be dragged from a collection.
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
import { createMemo, type Accessor } from 'solid-js';
|
|
8
|
-
import type { JSX } from 'solid-js';
|
|
9
|
-
import type {
|
|
10
|
-
DraggableCollectionState,
|
|
11
|
-
DragPreviewRenderer,
|
|
12
|
-
} from '@proyecto-viviana/solid-stately';
|
|
13
|
-
import {
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
/**
|
|
27
|
-
|
|
28
|
-
/** Whether
|
|
29
|
-
|
|
30
|
-
/**
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
/** Props for the
|
|
38
|
-
|
|
39
|
-
/**
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
*
|
|
47
|
-
*
|
|
48
|
-
* @
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
//
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
e.
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
e.
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
}
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
1
|
+
/**
|
|
2
|
+
* createDraggableItem - ARIA hook for draggable items within a collection.
|
|
3
|
+
*
|
|
4
|
+
* Provides accessibility props for items that can be dragged from a collection.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { createMemo, type Accessor } from 'solid-js';
|
|
8
|
+
import type { JSX } from 'solid-js';
|
|
9
|
+
import type {
|
|
10
|
+
DraggableCollectionState,
|
|
11
|
+
DragPreviewRenderer,
|
|
12
|
+
} from '@proyecto-viviana/solid-stately';
|
|
13
|
+
import {
|
|
14
|
+
getTypes,
|
|
15
|
+
writeToDataTransfer,
|
|
16
|
+
DROP_OPERATION,
|
|
17
|
+
EFFECT_ALLOWED,
|
|
18
|
+
DROP_EFFECT_TO_DROP_OPERATION,
|
|
19
|
+
setGlobalAllowedDropOperations,
|
|
20
|
+
setGlobalDropEffect,
|
|
21
|
+
getGlobalDropEffect,
|
|
22
|
+
} from './utils';
|
|
23
|
+
import { setGlobalDraggingTypes } from './createDraggableCollection';
|
|
24
|
+
|
|
25
|
+
export interface DraggableItemOptions {
|
|
26
|
+
/** The unique key of the item. */
|
|
27
|
+
key: string | number;
|
|
28
|
+
/** Whether the item has a separate drag button affordance. */
|
|
29
|
+
hasDragButton?: boolean;
|
|
30
|
+
/** Whether this item is disabled for dragging. */
|
|
31
|
+
isDisabled?: boolean;
|
|
32
|
+
/** Preview renderer function ref. */
|
|
33
|
+
preview?: { current: DragPreviewRenderer | null };
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export interface DraggableItemAria {
|
|
37
|
+
/** Props for the draggable item element. */
|
|
38
|
+
dragProps: JSX.HTMLAttributes<HTMLElement>;
|
|
39
|
+
/** Props for the explicit drag button affordance, if any. */
|
|
40
|
+
dragButtonProps: JSX.ButtonHTMLAttributes<HTMLButtonElement>;
|
|
41
|
+
/** Whether the item is currently being dragged. */
|
|
42
|
+
isDragging: boolean;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Creates ARIA props for a draggable item within a collection.
|
|
47
|
+
*
|
|
48
|
+
* @param options - Accessor returning item options
|
|
49
|
+
* @param state - Draggable collection state
|
|
50
|
+
* @returns Draggable item ARIA props
|
|
51
|
+
*/
|
|
52
|
+
export function createDraggableItem(
|
|
53
|
+
options: Accessor<DraggableItemOptions>,
|
|
54
|
+
state: DraggableCollectionState
|
|
55
|
+
): DraggableItemAria {
|
|
56
|
+
const getOptions = createMemo(() => options());
|
|
57
|
+
|
|
58
|
+
// Track position for drag move
|
|
59
|
+
let lastX = 0;
|
|
60
|
+
let lastY = 0;
|
|
61
|
+
|
|
62
|
+
const isDragging = createMemo(() => {
|
|
63
|
+
const key = getOptions().key;
|
|
64
|
+
return state.draggingKeys.has(key);
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
const getKeysForDrag = (): Set<string | number> => {
|
|
68
|
+
const { key } = getOptions();
|
|
69
|
+
// If the key is not selected, only drag that item
|
|
70
|
+
// If it is selected, drag all selected items
|
|
71
|
+
// For now, just return the single key
|
|
72
|
+
return new Set([key]);
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
const onDragStart = (e: DragEvent) => {
|
|
76
|
+
if (e.defaultPrevented) return;
|
|
77
|
+
e.stopPropagation();
|
|
78
|
+
|
|
79
|
+
const opts = getOptions();
|
|
80
|
+
if (opts.isDisabled || state.isDisabled) return;
|
|
81
|
+
|
|
82
|
+
const keys = getKeysForDrag();
|
|
83
|
+
|
|
84
|
+
// Start drag state
|
|
85
|
+
state.startDrag(keys, e.clientX, e.clientY);
|
|
86
|
+
|
|
87
|
+
// Get items and write to data transfer
|
|
88
|
+
const items = state.getItems(keys);
|
|
89
|
+
setGlobalDraggingTypes(getTypes(items));
|
|
90
|
+
e.dataTransfer?.clearData?.();
|
|
91
|
+
if (e.dataTransfer) {
|
|
92
|
+
writeToDataTransfer(e.dataTransfer, items);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// Set allowed drop operations
|
|
96
|
+
let allowed = DROP_OPERATION.all;
|
|
97
|
+
const allowedOps = state.getAllowedDropOperations();
|
|
98
|
+
if (allowedOps.length > 0) {
|
|
99
|
+
allowed = DROP_OPERATION.none;
|
|
100
|
+
for (const op of allowedOps) {
|
|
101
|
+
allowed |= DROP_OPERATION[op] || DROP_OPERATION.none;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
setGlobalAllowedDropOperations(allowed);
|
|
106
|
+
const effectAllowed = EFFECT_ALLOWED[allowed] || 'none';
|
|
107
|
+
if (e.dataTransfer) {
|
|
108
|
+
e.dataTransfer.effectAllowed =
|
|
109
|
+
(effectAllowed === 'cancel' ? 'none' : effectAllowed) as DataTransfer['effectAllowed'];
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
// Handle custom preview from item options or collection state.
|
|
113
|
+
const preview = opts.preview ?? state.preview;
|
|
114
|
+
if (typeof preview?.current === 'function' && e.dataTransfer) {
|
|
115
|
+
preview.current(items, (node, userX, userY) => {
|
|
116
|
+
if (!node || !e.dataTransfer) return;
|
|
117
|
+
|
|
118
|
+
const size = node.getBoundingClientRect();
|
|
119
|
+
const rect = (e.currentTarget as HTMLElement).getBoundingClientRect();
|
|
120
|
+
let defaultX = e.clientX - rect.x;
|
|
121
|
+
let defaultY = e.clientY - rect.y;
|
|
122
|
+
|
|
123
|
+
if (defaultX > size.width || defaultY > size.height) {
|
|
124
|
+
defaultX = size.width / 2;
|
|
125
|
+
defaultY = size.height / 2;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
let offsetX = typeof userX === 'number' ? userX : defaultX;
|
|
129
|
+
let offsetY = typeof userY === 'number' ? userY : defaultY;
|
|
130
|
+
|
|
131
|
+
offsetX = Math.max(0, Math.min(offsetX, size.width));
|
|
132
|
+
offsetY = Math.max(0, Math.min(offsetY, size.height));
|
|
133
|
+
|
|
134
|
+
e.dataTransfer.setDragImage(node, offsetX, offsetY);
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
lastX = e.clientX;
|
|
139
|
+
lastY = e.clientY;
|
|
140
|
+
};
|
|
141
|
+
|
|
142
|
+
const onDrag = (e: DragEvent) => {
|
|
143
|
+
e.stopPropagation();
|
|
144
|
+
|
|
145
|
+
if (e.clientX === lastX && e.clientY === lastY) {
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
state.moveDrag(e.clientX, e.clientY);
|
|
150
|
+
|
|
151
|
+
lastX = e.clientX;
|
|
152
|
+
lastY = e.clientY;
|
|
153
|
+
};
|
|
154
|
+
|
|
155
|
+
const onDragEnd = (e: DragEvent) => {
|
|
156
|
+
e.stopPropagation();
|
|
157
|
+
|
|
158
|
+
let dropEffect: string = e.dataTransfer?.dropEffect ?? 'none';
|
|
159
|
+
// Chrome Android fix - use global drop effect
|
|
160
|
+
if (getGlobalDropEffect()) {
|
|
161
|
+
dropEffect = getGlobalDropEffect()!;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
const dropOperation = DROP_EFFECT_TO_DROP_OPERATION[dropEffect];
|
|
165
|
+
const isInternal = false; // Would check global state
|
|
166
|
+
state.endDrag(e.clientX, e.clientY, dropOperation, isInternal);
|
|
167
|
+
|
|
168
|
+
setGlobalAllowedDropOperations(DROP_OPERATION.none);
|
|
169
|
+
setGlobalDraggingTypes(new Set());
|
|
170
|
+
setGlobalDropEffect(undefined);
|
|
171
|
+
};
|
|
172
|
+
|
|
173
|
+
// Keyboard/screen reader drag initiation
|
|
174
|
+
const onKeyDown = (e: KeyboardEvent) => {
|
|
175
|
+
if (e.key === 'Enter' && e.target === e.currentTarget) {
|
|
176
|
+
e.preventDefault();
|
|
177
|
+
e.stopPropagation();
|
|
178
|
+
}
|
|
179
|
+
};
|
|
180
|
+
|
|
181
|
+
const onKeyUp = (e: KeyboardEvent) => {
|
|
182
|
+
if (e.key === 'Enter' && e.target === e.currentTarget) {
|
|
183
|
+
e.preventDefault();
|
|
184
|
+
e.stopPropagation();
|
|
185
|
+
|
|
186
|
+
const opts = getOptions();
|
|
187
|
+
if (opts.isDisabled || state.isDisabled) return;
|
|
188
|
+
|
|
189
|
+
const keys = getKeysForDrag();
|
|
190
|
+
const rect = (e.target as HTMLElement).getBoundingClientRect();
|
|
191
|
+
state.startDrag(keys, rect.x + rect.width / 2, rect.y + rect.height / 2);
|
|
192
|
+
const items = state.getItems(keys);
|
|
193
|
+
setGlobalDraggingTypes(getTypes(items));
|
|
194
|
+
let allowed = DROP_OPERATION.all;
|
|
195
|
+
const allowedOps = state.getAllowedDropOperations();
|
|
196
|
+
if (allowedOps.length > 0) {
|
|
197
|
+
allowed = DROP_OPERATION.none;
|
|
198
|
+
for (const op of allowedOps) {
|
|
199
|
+
allowed |= DROP_OPERATION[op] || DROP_OPERATION.none;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
setGlobalAllowedDropOperations(allowed);
|
|
203
|
+
}
|
|
204
|
+
};
|
|
205
|
+
|
|
206
|
+
const dragProps = createMemo(() => {
|
|
207
|
+
const opts = getOptions();
|
|
208
|
+
|
|
209
|
+
if (opts.isDisabled || state.isDisabled) {
|
|
210
|
+
return {
|
|
211
|
+
draggable: false as const,
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
const baseProps: Record<string, unknown> = {
|
|
216
|
+
draggable: true as const,
|
|
217
|
+
onDragStart,
|
|
218
|
+
onDrag,
|
|
219
|
+
onDragEnd,
|
|
220
|
+
};
|
|
221
|
+
|
|
222
|
+
// Add keyboard handlers if no separate drag button
|
|
223
|
+
if (!opts.hasDragButton) {
|
|
224
|
+
baseProps.onKeyDown = onKeyDown;
|
|
225
|
+
baseProps.onKeyUp = onKeyUp;
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
return baseProps;
|
|
229
|
+
});
|
|
230
|
+
|
|
231
|
+
const dragButtonProps = createMemo(() => {
|
|
232
|
+
const opts = getOptions();
|
|
233
|
+
|
|
234
|
+
if (opts.isDisabled || state.isDisabled) {
|
|
235
|
+
return {
|
|
236
|
+
disabled: true,
|
|
237
|
+
};
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
return {
|
|
241
|
+
type: 'button' as const,
|
|
242
|
+
'aria-label': 'Drag',
|
|
243
|
+
onKeyDown,
|
|
244
|
+
onKeyUp,
|
|
245
|
+
};
|
|
246
|
+
});
|
|
247
|
+
|
|
248
|
+
return {
|
|
249
|
+
get dragProps() {
|
|
250
|
+
return dragProps() as DraggableItemAria['dragProps'];
|
|
251
|
+
},
|
|
252
|
+
get dragButtonProps() {
|
|
253
|
+
return dragButtonProps() as DraggableItemAria['dragButtonProps'];
|
|
254
|
+
},
|
|
255
|
+
get isDragging() {
|
|
256
|
+
return isDragging();
|
|
257
|
+
},
|
|
258
|
+
};
|
|
259
|
+
}
|