@proyecto-viviana/solidaria-components 0.3.1 → 0.4.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.
- package/dist/ActionBar.js +184 -0
- package/dist/ActionBar.js.map +1 -0
- package/dist/ActionBar.jsx +128 -0
- package/dist/ActionBar.jsx.map +1 -0
- package/dist/ActionGroup.js +179 -0
- package/dist/ActionGroup.js.map +1 -0
- package/dist/ActionGroup.jsx +129 -0
- package/dist/ActionGroup.jsx.map +1 -0
- package/dist/Alert.js +111 -0
- package/dist/Alert.js.map +1 -0
- package/dist/Alert.jsx +82 -0
- package/dist/Alert.jsx.map +1 -0
- package/dist/Autocomplete.js +130 -0
- package/dist/Autocomplete.js.map +1 -0
- package/dist/Autocomplete.jsx +116 -0
- package/dist/Autocomplete.jsx.map +1 -0
- package/dist/Breadcrumbs.d.ts.map +1 -1
- package/dist/Breadcrumbs.js +334 -0
- package/dist/Breadcrumbs.js.map +1 -0
- package/dist/Breadcrumbs.jsx +266 -0
- package/dist/Breadcrumbs.jsx.map +1 -0
- package/dist/Button.d.ts.map +1 -1
- package/dist/Button.js +348 -0
- package/dist/Button.js.map +1 -0
- package/dist/Button.jsx +314 -0
- package/dist/Button.jsx.map +1 -0
- package/dist/Calendar.d.ts +4 -4
- package/dist/Calendar.d.ts.map +1 -1
- package/dist/Calendar.js +538 -0
- package/dist/Calendar.js.map +1 -0
- package/dist/Calendar.jsx +333 -0
- package/dist/Calendar.jsx.map +1 -0
- package/dist/CalendarPicker.d.ts +33 -0
- package/dist/CalendarPicker.d.ts.map +1 -0
- package/dist/CalendarPicker.js +44 -0
- package/dist/CalendarPicker.js.map +1 -0
- package/dist/CalendarPicker.jsx +44 -0
- package/dist/CalendarPicker.jsx.map +1 -0
- package/dist/Checkbox.d.ts +83 -4
- package/dist/Checkbox.d.ts.map +1 -1
- package/dist/Checkbox.js +923 -0
- package/dist/Checkbox.js.map +1 -0
- package/dist/Checkbox.jsx +707 -0
- package/dist/Checkbox.jsx.map +1 -0
- package/dist/Collection.d.ts.map +1 -1
- package/dist/Collection.js +202 -0
- package/dist/Collection.js.map +1 -0
- package/dist/Collection.jsx +152 -0
- package/dist/Collection.jsx.map +1 -0
- package/dist/Color.d.ts.map +1 -1
- package/dist/Color.js +1720 -0
- package/dist/Color.js.map +1 -0
- package/dist/Color.jsx +1344 -0
- package/dist/Color.jsx.map +1 -0
- package/dist/ColorEditor.js +208 -0
- package/dist/ColorEditor.js.map +1 -0
- package/dist/ColorEditor.jsx +120 -0
- package/dist/ColorEditor.jsx.map +1 -0
- package/dist/ComboBox.d.ts +8 -5
- package/dist/ComboBox.d.ts.map +1 -1
- package/dist/ComboBox.js +992 -0
- package/dist/ComboBox.js.map +1 -0
- package/dist/ComboBox.jsx +714 -0
- package/dist/ComboBox.jsx.map +1 -0
- package/dist/ContextualHelpTrigger.js +146 -0
- package/dist/ContextualHelpTrigger.js.map +1 -0
- package/dist/ContextualHelpTrigger.jsx +109 -0
- package/dist/ContextualHelpTrigger.jsx.map +1 -0
- package/dist/DateField.d.ts +3 -3
- package/dist/DateField.d.ts.map +1 -1
- package/dist/DateField.js +4 -0
- package/dist/DateField.jsx +4 -0
- package/dist/DateField2.js +499 -0
- package/dist/DateField2.js.map +1 -0
- package/dist/DateField2.jsx +317 -0
- package/dist/DateField2.jsx.map +1 -0
- package/dist/DatePicker.d.ts +4 -4
- package/dist/DatePicker.d.ts.map +1 -1
- package/dist/DatePicker.js +991 -0
- package/dist/DatePicker.js.map +1 -0
- package/dist/DatePicker.jsx +682 -0
- package/dist/DatePicker.jsx.map +1 -0
- package/dist/Dialog.d.ts.map +1 -1
- package/dist/Dialog.js +337 -0
- package/dist/Dialog.js.map +1 -0
- package/dist/Dialog.jsx +192 -0
- package/dist/Dialog.jsx.map +1 -0
- package/dist/Disclosure.d.ts.map +1 -1
- package/dist/Disclosure.js +328 -0
- package/dist/Disclosure.js.map +1 -0
- package/dist/Disclosure.jsx +230 -0
- package/dist/Disclosure.jsx.map +1 -0
- package/dist/DragAndDrop.d.ts.map +1 -1
- package/dist/DragAndDrop.js +176 -0
- package/dist/DragAndDrop.js.map +1 -0
- package/dist/DragAndDrop.jsx +160 -0
- package/dist/DragAndDrop.jsx.map +1 -0
- package/dist/DropZone.d.ts.map +1 -1
- package/dist/DropZone.js +189 -0
- package/dist/DropZone.js.map +1 -0
- package/dist/DropZone.jsx +144 -0
- package/dist/DropZone.jsx.map +1 -0
- package/dist/FieldError.js +66 -0
- package/dist/FieldError.js.map +1 -0
- package/dist/FieldError.jsx +47 -0
- package/dist/FieldError.jsx.map +1 -0
- package/dist/FileTrigger.js +79 -0
- package/dist/FileTrigger.js.map +1 -0
- package/dist/FileTrigger.jsx +49 -0
- package/dist/FileTrigger.jsx.map +1 -0
- package/dist/Focusable.js +70 -0
- package/dist/Focusable.js.map +1 -0
- package/dist/Focusable.jsx +69 -0
- package/dist/Focusable.jsx.map +1 -0
- package/dist/Form.js +99 -0
- package/dist/Form.js.map +1 -0
- package/dist/Form.jsx +73 -0
- package/dist/Form.jsx.map +1 -0
- package/dist/GridList.d.ts +34 -2
- package/dist/GridList.d.ts.map +1 -1
- package/dist/GridList.js +723 -0
- package/dist/GridList.js.map +1 -0
- package/dist/GridList.jsx +552 -0
- package/dist/GridList.jsx.map +1 -0
- package/dist/HiddenTimeInput.js +104 -0
- package/dist/HiddenTimeInput.js.map +1 -0
- package/dist/HiddenTimeInput.jsx +69 -0
- package/dist/HiddenTimeInput.jsx.map +1 -0
- package/dist/Icon.d.ts.map +1 -1
- package/dist/Icon.js +127 -0
- package/dist/Icon.js.map +1 -0
- package/dist/Icon.jsx +72 -0
- package/dist/Icon.jsx.map +1 -0
- package/dist/Keyboard.js +30 -0
- package/dist/Keyboard.js.map +1 -0
- package/dist/Keyboard.jsx +24 -0
- package/dist/Keyboard.jsx.map +1 -0
- package/dist/Landmark.js +134 -0
- package/dist/Landmark.js.map +1 -0
- package/dist/Landmark.jsx +118 -0
- package/dist/Landmark.jsx.map +1 -0
- package/dist/Link.d.ts.map +1 -1
- package/dist/Link.js +219 -0
- package/dist/Link.js.map +1 -0
- package/dist/Link.jsx +189 -0
- package/dist/Link.jsx.map +1 -0
- package/dist/ListBox.d.ts.map +1 -1
- package/dist/ListBox.js +670 -0
- package/dist/ListBox.js.map +1 -0
- package/dist/ListBox.jsx +508 -0
- package/dist/ListBox.jsx.map +1 -0
- package/dist/Menu.d.ts +27 -9
- package/dist/Menu.d.ts.map +1 -1
- package/dist/Menu.js +1254 -0
- package/dist/Menu.js.map +1 -0
- package/dist/Menu.jsx +1042 -0
- package/dist/Menu.jsx.map +1 -0
- package/dist/Meter.d.ts.map +1 -1
- package/dist/Meter.js +123 -0
- package/dist/Meter.js.map +1 -0
- package/dist/Meter.jsx +107 -0
- package/dist/Meter.jsx.map +1 -0
- package/dist/Modal.d.ts.map +1 -1
- package/dist/Modal.js +380 -0
- package/dist/Modal.js.map +1 -0
- package/dist/Modal.jsx +314 -0
- package/dist/Modal.jsx.map +1 -0
- package/dist/NumberField.d.ts +3 -3
- package/dist/NumberField.d.ts.map +1 -1
- package/dist/NumberField.js +573 -0
- package/dist/NumberField.js.map +1 -0
- package/dist/NumberField.jsx +443 -0
- package/dist/NumberField.jsx.map +1 -0
- package/dist/Popover.d.ts +10 -2
- package/dist/Popover.d.ts.map +1 -1
- package/dist/Popover.js +464 -0
- package/dist/Popover.js.map +1 -0
- package/dist/Popover.jsx +333 -0
- package/dist/Popover.jsx.map +1 -0
- package/dist/Pressable.js +69 -0
- package/dist/Pressable.js.map +1 -0
- package/dist/Pressable.jsx +68 -0
- package/dist/Pressable.jsx.map +1 -0
- package/dist/ProgressBar.d.ts.map +1 -1
- package/dist/ProgressBar.js +130 -0
- package/dist/ProgressBar.js.map +1 -0
- package/dist/ProgressBar.jsx +114 -0
- package/dist/ProgressBar.jsx.map +1 -0
- package/dist/RadioGroup.d.ts +82 -4
- package/dist/RadioGroup.d.ts.map +1 -1
- package/dist/RadioGroup.js +931 -0
- package/dist/RadioGroup.js.map +1 -0
- package/dist/RadioGroup.jsx +681 -0
- package/dist/RadioGroup.jsx.map +1 -0
- package/dist/RangeCalendar.d.ts.map +1 -1
- package/dist/RangeCalendar.js +410 -0
- package/dist/RangeCalendar.js.map +1 -0
- package/dist/RangeCalendar.jsx +253 -0
- package/dist/RangeCalendar.jsx.map +1 -0
- package/dist/RouterProvider.js +118 -0
- package/dist/RouterProvider.js.map +1 -0
- package/dist/RouterProvider.jsx +112 -0
- package/dist/RouterProvider.jsx.map +1 -0
- package/dist/SearchField.d.ts +2 -2
- package/dist/SearchField.d.ts.map +1 -1
- package/dist/SearchField.js +643 -0
- package/dist/SearchField.js.map +1 -0
- package/dist/SearchField.jsx +526 -0
- package/dist/SearchField.jsx.map +1 -0
- package/dist/Select.d.ts.map +1 -1
- package/dist/Select.js +1031 -0
- package/dist/Select.js.map +1 -0
- package/dist/Select.jsx +744 -0
- package/dist/Select.jsx.map +1 -0
- package/dist/SelectionIndicator.d.ts.map +1 -1
- package/dist/SelectionIndicator.js +86 -0
- package/dist/SelectionIndicator.js.map +1 -0
- package/dist/SelectionIndicator.jsx +50 -0
- package/dist/SelectionIndicator.jsx.map +1 -0
- package/dist/Separator.js +97 -0
- package/dist/Separator.js.map +1 -0
- package/dist/Separator.jsx +85 -0
- package/dist/Separator.jsx.map +1 -0
- package/dist/SharedElementTransition.d.ts.map +1 -1
- package/dist/SharedElementTransition.js +165 -0
- package/dist/SharedElementTransition.js.map +1 -0
- package/dist/SharedElementTransition.jsx +138 -0
- package/dist/SharedElementTransition.jsx.map +1 -0
- package/dist/Slider.d.ts +33 -1
- package/dist/Slider.d.ts.map +1 -1
- package/dist/Slider.js +515 -0
- package/dist/Slider.js.map +1 -0
- package/dist/Slider.jsx +403 -0
- package/dist/Slider.jsx.map +1 -0
- package/dist/StepList.js +198 -0
- package/dist/StepList.js.map +1 -0
- package/dist/StepList.jsx +141 -0
- package/dist/StepList.jsx.map +1 -0
- package/dist/Switch.d.ts +65 -2
- package/dist/Switch.d.ts.map +1 -1
- package/dist/Switch.js +534 -0
- package/dist/Switch.js.map +1 -0
- package/dist/Switch.jsx +393 -0
- package/dist/Switch.jsx.map +1 -0
- package/dist/Table.d.ts +48 -0
- package/dist/Table.d.ts.map +1 -1
- package/dist/Table.js +1759 -0
- package/dist/Table.js.map +1 -0
- package/dist/Table.jsx +1348 -0
- package/dist/Table.jsx.map +1 -0
- package/dist/Tabs.d.ts +0 -4
- package/dist/Tabs.d.ts.map +1 -1
- package/dist/Tabs.js +595 -0
- package/dist/Tabs.js.map +1 -0
- package/dist/Tabs.jsx +367 -0
- package/dist/Tabs.jsx.map +1 -0
- package/dist/TagGroup.d.ts.map +1 -1
- package/dist/TagGroup.js +378 -0
- package/dist/TagGroup.js.map +1 -0
- package/dist/TagGroup.jsx +270 -0
- package/dist/TagGroup.jsx.map +1 -0
- package/dist/Text.d.ts +18 -6
- package/dist/Text.d.ts.map +1 -1
- package/dist/Text.js +42 -0
- package/dist/Text.js.map +1 -0
- package/dist/Text.jsx +35 -0
- package/dist/Text.jsx.map +1 -0
- package/dist/TextField.d.ts +7 -6
- package/dist/TextField.d.ts.map +1 -1
- package/dist/TextField.js +436 -0
- package/dist/TextField.js.map +1 -0
- package/dist/TextField.jsx +403 -0
- package/dist/TextField.jsx.map +1 -0
- package/dist/TimeField.d.ts +3 -3
- package/dist/TimeField.d.ts.map +1 -1
- package/dist/TimeField.js +372 -0
- package/dist/TimeField.js.map +1 -0
- package/dist/TimeField.jsx +224 -0
- package/dist/TimeField.jsx.map +1 -0
- package/dist/Toast.d.ts +14 -0
- package/dist/Toast.d.ts.map +1 -1
- package/dist/Toast.js +551 -0
- package/dist/Toast.js.map +1 -0
- package/dist/Toast.jsx +361 -0
- package/dist/Toast.jsx.map +1 -0
- package/dist/ToggleButton.d.ts.map +1 -1
- package/dist/ToggleButton.js +123 -0
- package/dist/ToggleButton.js.map +1 -0
- package/dist/ToggleButton.jsx +88 -0
- package/dist/ToggleButton.jsx.map +1 -0
- package/dist/ToggleButtonGroup.d.ts.map +1 -1
- package/dist/ToggleButtonGroup.js +114 -0
- package/dist/ToggleButtonGroup.js.map +1 -0
- package/dist/ToggleButtonGroup.jsx +85 -0
- package/dist/ToggleButtonGroup.jsx.map +1 -0
- package/dist/Toolbar.js +112 -0
- package/dist/Toolbar.js.map +1 -0
- package/dist/Toolbar.jsx +92 -0
- package/dist/Toolbar.jsx.map +1 -0
- package/dist/Tooltip.d.ts.map +1 -1
- package/dist/Tooltip.js +539 -0
- package/dist/Tooltip.js.map +1 -0
- package/dist/Tooltip.jsx +465 -0
- package/dist/Tooltip.jsx.map +1 -0
- package/dist/Tree.d.ts +14 -2
- package/dist/Tree.d.ts.map +1 -1
- package/dist/Tree.js +1424 -0
- package/dist/Tree.js.map +1 -0
- package/dist/Tree.jsx +1172 -0
- package/dist/Tree.jsx.map +1 -0
- package/dist/Virtualizer.d.ts +16 -2
- package/dist/Virtualizer.d.ts.map +1 -1
- package/dist/Virtualizer.js +2 -0
- package/dist/Virtualizer.jsx +2 -0
- package/dist/Virtualizer2.js +751 -0
- package/dist/Virtualizer2.js.map +1 -0
- package/dist/Virtualizer2.jsx +730 -0
- package/dist/Virtualizer2.jsx.map +1 -0
- package/dist/VirtualizerLayouts.d.ts +18 -0
- package/dist/VirtualizerLayouts.d.ts.map +1 -1
- package/dist/VisuallyHidden.js +42 -0
- package/dist/VisuallyHidden.js.map +1 -0
- package/dist/VisuallyHidden.jsx +35 -0
- package/dist/VisuallyHidden.jsx.map +1 -0
- package/dist/contexts.js +33 -0
- package/dist/contexts.js.map +1 -0
- package/dist/contexts.jsx +33 -0
- package/dist/contexts.jsx.map +1 -0
- package/dist/index.d.ts +7 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +70 -23711
- package/dist/index.jsx +70 -18116
- package/dist/useDragAndDrop.js +2 -0
- package/dist/useDragAndDrop.jsx +2 -0
- package/dist/useDragAndDrop2.js +395 -0
- package/dist/useDragAndDrop2.js.map +1 -0
- package/dist/useDragAndDrop2.jsx +395 -0
- package/dist/useDragAndDrop2.jsx.map +1 -0
- package/dist/utils.d.ts +83 -11
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +285 -0
- package/dist/utils.js.map +1 -0
- package/dist/utils.jsx +277 -0
- package/dist/utils.jsx.map +1 -0
- package/dist/virtualizer/Layout.js +144 -0
- package/dist/virtualizer/Layout.js.map +1 -0
- package/dist/virtualizer/Layout.jsx +144 -0
- package/dist/virtualizer/Layout.jsx.map +1 -0
- package/package.json +401 -4
- package/src/Breadcrumbs.tsx +3 -1
- package/src/Button.tsx +90 -23
- package/src/Calendar.tsx +27 -10
- package/src/CalendarPicker.tsx +73 -0
- package/src/Checkbox.tsx +539 -3
- package/src/Collection.tsx +9 -3
- package/src/Color.tsx +42 -14
- package/src/ComboBox.tsx +126 -14
- package/src/DateField.tsx +20 -2
- package/src/DatePicker.tsx +117 -10
- package/src/Dialog.tsx +13 -5
- package/src/Disclosure.tsx +3 -1
- package/src/DragAndDrop.tsx +3 -1
- package/src/DropZone.tsx +3 -1
- package/src/GridList.tsx +125 -24
- package/src/Icon.tsx +3 -1
- package/src/Link.tsx +3 -1
- package/src/ListBox.tsx +31 -4
- package/src/Menu.tsx +298 -131
- package/src/Meter.tsx +3 -1
- package/src/Modal.tsx +100 -52
- package/src/NumberField.tsx +73 -10
- package/src/Popover.tsx +49 -11
- package/src/ProgressBar.tsx +3 -1
- package/src/RadioGroup.tsx +468 -4
- package/src/RangeCalendar.tsx +3 -1
- package/src/SearchField.tsx +27 -3
- package/src/Select.tsx +22 -7
- package/src/SelectionIndicator.tsx +3 -1
- package/src/SharedElementTransition.tsx +3 -1
- package/src/Slider.tsx +159 -13
- package/src/Switch.tsx +395 -2
- package/src/Table.tsx +409 -95
- package/src/Tabs.tsx +16 -45
- package/src/TagGroup.tsx +4 -1
- package/src/Text.tsx +31 -10
- package/src/TextField.tsx +73 -10
- package/src/TimeField.tsx +20 -2
- package/src/Toast.tsx +79 -14
- package/src/ToggleButton.tsx +3 -1
- package/src/ToggleButtonGroup.tsx +3 -1
- package/src/Tooltip.tsx +55 -8
- package/src/Tree.tsx +77 -9
- package/src/Virtualizer.tsx +180 -31
- package/src/VirtualizerLayouts.ts +45 -10
- package/src/index.ts +50 -0
- package/src/utils.tsx +243 -27
- package/dist/index.js.map +0 -1
- package/dist/index.jsx.map +0 -1
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
import { dataAttr, useRenderProps } from "./utils.jsx";
|
|
2
|
+
import { createContext, createMemo, useContext } from "solid-js";
|
|
3
|
+
//#region src/DragAndDrop.tsx
|
|
4
|
+
/**
|
|
5
|
+
* Drag and drop composition helpers for solidaria-components.
|
|
6
|
+
*
|
|
7
|
+
* Compatibility target: react-aria-components DragAndDrop exports.
|
|
8
|
+
*/
|
|
9
|
+
const DragAndDropContext = createContext({});
|
|
10
|
+
const DropIndicatorContext = createContext(null);
|
|
11
|
+
function DefaultDropIndicator(props) {
|
|
12
|
+
const dnd = useContext(DragAndDropContext);
|
|
13
|
+
const isDropTarget = createMemo(() => {
|
|
14
|
+
const target = props.target;
|
|
15
|
+
return dnd.dropState?.isDropTarget?.(target) ?? false;
|
|
16
|
+
});
|
|
17
|
+
const renderProps = useRenderProps({
|
|
18
|
+
get children() {
|
|
19
|
+
return props.children;
|
|
20
|
+
},
|
|
21
|
+
class: props.class,
|
|
22
|
+
style: props.style,
|
|
23
|
+
defaultClassName: "solidaria-DropIndicator"
|
|
24
|
+
}, () => ({ isDropTarget: isDropTarget() }));
|
|
25
|
+
return <div role="option" aria-disabled={true} class={renderProps.class()} style={renderProps.style()} data-drop-target={dataAttr(isDropTarget())}>
|
|
26
|
+
{renderProps.renderChildren()}
|
|
27
|
+
</div>;
|
|
28
|
+
}
|
|
29
|
+
function DropIndicator(props) {
|
|
30
|
+
const context = useContext(DropIndicatorContext);
|
|
31
|
+
if (context) return context.render(props);
|
|
32
|
+
return <DefaultDropIndicator {...props} />;
|
|
33
|
+
}
|
|
34
|
+
function useRenderDropIndicator(hooksOrDropState, maybeDropState) {
|
|
35
|
+
const looksLikeDropState = (value) => {
|
|
36
|
+
return Boolean(value && typeof value === "object" && ("isDropTarget" in value || "target" in value));
|
|
37
|
+
};
|
|
38
|
+
const dragAndDropHooks = looksLikeDropState(hooksOrDropState) ? void 0 : hooksOrDropState;
|
|
39
|
+
const dropState = looksLikeDropState(hooksOrDropState) ? hooksOrDropState : maybeDropState;
|
|
40
|
+
if (dragAndDropHooks && !dragAndDropHooks.useDropIndicator) return void 0;
|
|
41
|
+
if (!dropState && !dragAndDropHooks?.renderDropIndicator) return void 0;
|
|
42
|
+
const targetsEqual = (a, b) => {
|
|
43
|
+
if (!a) return false;
|
|
44
|
+
if (a.type !== b.type) return false;
|
|
45
|
+
if (a.type === "root" && b.type === "root") return true;
|
|
46
|
+
if (a.type !== "item" || b.type !== "item") return false;
|
|
47
|
+
return a.key === b.key && a.dropPosition === b.dropPosition;
|
|
48
|
+
};
|
|
49
|
+
return (target) => {
|
|
50
|
+
const stateIsDropTarget = dropState?.isDropTarget;
|
|
51
|
+
const isTarget = typeof stateIsDropTarget === "function" ? stateIsDropTarget(target) : stateIsDropTarget === true ? targetsEqual(dropState?.target, target) : false;
|
|
52
|
+
const isVirtualDragging = dragAndDropHooks?.isVirtualDragging?.() ?? false;
|
|
53
|
+
if (!isTarget && !isVirtualDragging) return void 0;
|
|
54
|
+
return dragAndDropHooks?.renderDropIndicator ? dragAndDropHooks.renderDropIndicator(target) : <DropIndicator target={target} />;
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
function resolveKey(value) {
|
|
58
|
+
if (typeof value === "function") return value();
|
|
59
|
+
return value;
|
|
60
|
+
}
|
|
61
|
+
function getAfterDropNormalizedKey(target, collection) {
|
|
62
|
+
if (target.dropPosition !== "after" || !collection) return target.key;
|
|
63
|
+
let nextKey = collection.getKeyAfter(target.key);
|
|
64
|
+
let lastDescendantKey = null;
|
|
65
|
+
if (nextKey != null) {
|
|
66
|
+
const targetLevel = collection.getItem(target.key)?.level ?? 0;
|
|
67
|
+
while (nextKey != null) {
|
|
68
|
+
const node = collection.getItem(nextKey);
|
|
69
|
+
if (!node) break;
|
|
70
|
+
if (node.type && node.type !== "item") {
|
|
71
|
+
nextKey = collection.getKeyAfter(nextKey);
|
|
72
|
+
continue;
|
|
73
|
+
}
|
|
74
|
+
if ((node.level ?? 0) <= targetLevel) break;
|
|
75
|
+
lastDescendantKey = nextKey;
|
|
76
|
+
nextKey = collection.getKeyAfter(nextKey);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
return nextKey ?? lastDescendantKey ?? target.key;
|
|
80
|
+
}
|
|
81
|
+
function getNormalizedDropTargetKey(target, collection) {
|
|
82
|
+
if (!target || target.type !== "item") return null;
|
|
83
|
+
return getAfterDropNormalizedKey(target, collection);
|
|
84
|
+
}
|
|
85
|
+
function useDndPersistedKeys(selectionManager, dragAndDropHooks, dropState, collection) {
|
|
86
|
+
return createMemo(() => {
|
|
87
|
+
const focusedKey = resolveKey(selectionManager?.focusedKey);
|
|
88
|
+
let dropTargetKey;
|
|
89
|
+
if (dragAndDropHooks?.isVirtualDragging?.() && dropState?.target?.type === "item") dropTargetKey = getNormalizedDropTargetKey(dropState.target, collection) ?? void 0;
|
|
90
|
+
const keys = /* @__PURE__ */ new Set();
|
|
91
|
+
if (focusedKey != null) keys.add(focusedKey);
|
|
92
|
+
if (dropTargetKey != null) keys.add(dropTargetKey);
|
|
93
|
+
return keys;
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
function mergePersistedKeysIntoVirtualRange(baseRange, persistedIndexes, itemCount, layoutInfoProvider, maxExtraItems = 60, options) {
|
|
97
|
+
const validPersistedIndexes = Array.from(new Set(persistedIndexes.filter((index) => index >= 0 && index < itemCount))).sort((a, b) => a - b);
|
|
98
|
+
const forceIndexes = Array.from(new Set((options?.forceIncludeIndexes ?? []).filter((index) => index >= 0 && index < itemCount)));
|
|
99
|
+
if (itemCount <= 0) return baseRange;
|
|
100
|
+
if (validPersistedIndexes.length === 0 && forceIndexes.length === 0) return baseRange;
|
|
101
|
+
const baseSpan = Math.max(1, baseRange.end - baseRange.start);
|
|
102
|
+
const maxSpan = Math.max(baseSpan, baseSpan + maxExtraItems);
|
|
103
|
+
let start = baseRange.start;
|
|
104
|
+
let end = baseRange.end;
|
|
105
|
+
const distanceToBaseRange = (index) => {
|
|
106
|
+
if (index < baseRange.start) return baseRange.start - index;
|
|
107
|
+
if (index >= baseRange.end) return index - (baseRange.end - 1);
|
|
108
|
+
return 0;
|
|
109
|
+
};
|
|
110
|
+
for (const index of validPersistedIndexes.sort((a, b) => distanceToBaseRange(a) - distanceToBaseRange(b))) {
|
|
111
|
+
const nextStart = Math.min(start, index);
|
|
112
|
+
const nextEnd = Math.max(end, index + 1);
|
|
113
|
+
if (nextEnd - nextStart <= maxSpan) {
|
|
114
|
+
start = nextStart;
|
|
115
|
+
end = nextEnd;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
if (forceIndexes.length > 0) {
|
|
119
|
+
const forceMaxSpan = Math.max(maxSpan, options?.forceIncludeMaxSpan ?? Math.max(maxSpan, 300));
|
|
120
|
+
for (const index of forceIndexes) {
|
|
121
|
+
const nextStart = Math.min(start, index);
|
|
122
|
+
const nextEnd = Math.max(end, index + 1);
|
|
123
|
+
if (nextEnd - nextStart <= forceMaxSpan) {
|
|
124
|
+
start = nextStart;
|
|
125
|
+
end = nextEnd;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
if (options?.fallbackToForcedWindow !== false) {
|
|
129
|
+
const missingForced = forceIndexes.filter((index) => index < start || index >= end);
|
|
130
|
+
if (missingForced.length > 0) {
|
|
131
|
+
const nearestForced = missingForced[0];
|
|
132
|
+
const forceMaxSpan = Math.max(maxSpan, options?.forceIncludeMaxSpan ?? Math.max(maxSpan, 300));
|
|
133
|
+
const windowSpan = Math.min(itemCount, Math.max(baseSpan, forceMaxSpan));
|
|
134
|
+
const centeredStart = Math.max(0, Math.min(itemCount - windowSpan, nearestForced - Math.floor(windowSpan / 2)));
|
|
135
|
+
start = centeredStart;
|
|
136
|
+
end = Math.min(itemCount, centeredStart + windowSpan);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
if (start === baseRange.start && end === baseRange.end) return baseRange;
|
|
141
|
+
const startRect = start > 0 ? layoutInfoProvider.getLayoutInfo(start).rect : {
|
|
142
|
+
y: 0,
|
|
143
|
+
height: 0
|
|
144
|
+
};
|
|
145
|
+
const lastRect = layoutInfoProvider.getLayoutInfo(itemCount - 1).rect;
|
|
146
|
+
const endRect = end > 0 ? layoutInfoProvider.getLayoutInfo(end - 1).rect : {
|
|
147
|
+
y: 0,
|
|
148
|
+
height: 0
|
|
149
|
+
};
|
|
150
|
+
return {
|
|
151
|
+
start,
|
|
152
|
+
end,
|
|
153
|
+
offsetTop: Math.max(0, startRect.y),
|
|
154
|
+
offsetBottom: Math.max(0, lastRect.y + lastRect.height - (endRect.y + endRect.height))
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
//#endregion
|
|
158
|
+
export { DragAndDropContext, DropIndicator, DropIndicatorContext, getNormalizedDropTargetKey, mergePersistedKeysIntoVirtualRange, useDndPersistedKeys, useRenderDropIndicator };
|
|
159
|
+
|
|
160
|
+
//# sourceMappingURL=DragAndDrop.jsx.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DragAndDrop.jsx","names":[],"sources":["../src/DragAndDrop.tsx"],"sourcesContent":["/**\n * Drag and drop composition helpers for solidaria-components.\n *\n * Compatibility target: react-aria-components DragAndDrop exports.\n */\n\nimport { type JSX, type Accessor, createContext, createMemo, useContext } from \"solid-js\";\nimport type {\n DragTypes,\n DropOperation,\n DropTarget,\n ItemDropTarget,\n Key,\n} from \"@proyecto-viviana/solid-stately\";\nimport type { DragAndDropHooks } from \"./useDragAndDrop\";\nimport {\n type ClassNameOrFunction,\n type StyleOrFunction,\n type SlotProps,\n useRenderProps,\n dataAttr,\n} from \"./utils\";\n\nexport interface DragAndDropContextValue {\n dragAndDropHooks?: DragAndDropHooks<unknown>;\n dragState?: unknown;\n dropState?: {\n target?: DropTarget | null;\n isDropTarget?: (target: DropTarget) => boolean;\n };\n}\n\nexport const DragAndDropContext = createContext<DragAndDropContextValue>({});\n\nexport interface DropIndicatorRenderProps {\n isDropTarget: boolean;\n}\n\nexport interface DropIndicatorProps extends SlotProps {\n target: ItemDropTarget;\n children?: JSX.Element | ((props: DropIndicatorRenderProps) => JSX.Element);\n class?: ClassNameOrFunction<DropIndicatorRenderProps>;\n style?: StyleOrFunction<DropIndicatorRenderProps>;\n}\n\ninterface DropIndicatorContextValue {\n render: (props: DropIndicatorProps) => JSX.Element;\n}\n\nexport const DropIndicatorContext = createContext<DropIndicatorContextValue | null>(null);\n\nfunction DefaultDropIndicator(props: DropIndicatorProps): JSX.Element {\n const dnd = useContext(DragAndDropContext);\n const isDropTarget = createMemo(() => {\n const target = props.target;\n return dnd.dropState?.isDropTarget?.(target) ?? false;\n });\n\n const renderProps = useRenderProps(\n {\n get children() {\n return props.children;\n },\n class: props.class,\n style: props.style,\n defaultClassName: \"solidaria-DropIndicator\",\n },\n () => ({\n isDropTarget: isDropTarget(),\n }),\n );\n\n return (\n <div\n role=\"option\"\n aria-disabled={true}\n class={renderProps.class()}\n style={renderProps.style()}\n data-drop-target={dataAttr(isDropTarget())}\n >\n {renderProps.renderChildren()}\n </div>\n );\n}\n\nexport function DropIndicator(props: DropIndicatorProps): JSX.Element {\n const context = useContext(DropIndicatorContext);\n if (context) return context.render(props);\n return <DefaultDropIndicator {...props} />;\n}\n\nexport function useRenderDropIndicator(\n hooksOrDropState?:\n | Pick<\n DragAndDropHooks<unknown>,\n \"renderDropIndicator\" | \"isVirtualDragging\" | \"useDropIndicator\"\n >\n | {\n target?: DropTarget | null;\n isDropTarget?: ((target: DropTarget) => boolean) | boolean;\n },\n maybeDropState?: {\n target?: DropTarget | null;\n isDropTarget?: ((target: DropTarget) => boolean) | boolean;\n },\n): ((target: ItemDropTarget) => JSX.Element | undefined) | undefined {\n const looksLikeDropState = (\n value: unknown,\n ): value is {\n target?: DropTarget | null;\n isDropTarget?: ((target: DropTarget) => boolean) | boolean;\n } => {\n return Boolean(\n value &&\n typeof value === \"object\" &&\n (\"isDropTarget\" in (value as Record<string, unknown>) ||\n \"target\" in (value as Record<string, unknown>)),\n );\n };\n\n const dragAndDropHooks = looksLikeDropState(hooksOrDropState) ? undefined : hooksOrDropState;\n const dropState = looksLikeDropState(hooksOrDropState) ? hooksOrDropState : maybeDropState;\n\n // RAC only renders collection indicators when drop hooks are present.\n if (dragAndDropHooks && !dragAndDropHooks.useDropIndicator) return undefined;\n if (!dropState && !dragAndDropHooks?.renderDropIndicator) return undefined;\n\n const targetsEqual = (a: DropTarget | null | undefined, b: DropTarget): boolean => {\n if (!a) return false;\n if (a.type !== b.type) return false;\n if (a.type === \"root\" && b.type === \"root\") return true;\n if (a.type !== \"item\" || b.type !== \"item\") return false;\n return a.key === b.key && a.dropPosition === b.dropPosition;\n };\n\n return (target: ItemDropTarget) => {\n const stateIsDropTarget = dropState?.isDropTarget;\n const isTarget =\n typeof stateIsDropTarget === \"function\"\n ? stateIsDropTarget(target)\n : stateIsDropTarget === true\n ? targetsEqual(dropState?.target, target)\n : false;\n const isVirtualDragging = dragAndDropHooks?.isVirtualDragging?.() ?? false;\n if (!isTarget && !isVirtualDragging) return undefined;\n return dragAndDropHooks?.renderDropIndicator ? (\n dragAndDropHooks.renderDropIndicator(target)\n ) : (\n <DropIndicator target={target} />\n );\n };\n}\n\ntype KeyAccessor = Key | null | undefined | Accessor<Key | null | undefined>;\n\ninterface SelectionManagerLike {\n focusedKey?: KeyAccessor;\n}\n\ninterface CollectionLike {\n getKeyAfter: (key: Key) => Key | null;\n getItem: (key: Key) => { level?: number; type?: string } | null | undefined;\n}\n\ninterface DroppableCollectionStateLike {\n target?: DropTarget | null;\n}\n\nexport interface VirtualRangeLike {\n start: number;\n end: number;\n offsetTop: number;\n offsetBottom: number;\n}\n\nexport interface LayoutInfoProviderLike {\n getLayoutInfo: (index: number) => { rect: { y: number; height: number } };\n}\n\nfunction resolveKey(value: KeyAccessor): Key | null | undefined {\n if (typeof value === \"function\") {\n return (value as Accessor<Key | null | undefined>)();\n }\n return value;\n}\n\nfunction getAfterDropNormalizedKey(target: ItemDropTarget, collection?: CollectionLike): Key {\n if (target.dropPosition !== \"after\" || !collection) return target.key;\n\n let nextKey = collection.getKeyAfter(target.key);\n let lastDescendantKey: Key | null = null;\n\n if (nextKey != null) {\n const targetLevel = collection.getItem(target.key)?.level ?? 0;\n while (nextKey != null) {\n const node = collection.getItem(nextKey);\n if (!node) break;\n if (node.type && node.type !== \"item\") {\n nextKey = collection.getKeyAfter(nextKey);\n continue;\n }\n if ((node.level ?? 0) <= targetLevel) break;\n lastDescendantKey = nextKey;\n nextKey = collection.getKeyAfter(nextKey);\n }\n }\n\n return nextKey ?? lastDescendantKey ?? target.key;\n}\n\nexport function getNormalizedDropTargetKey(\n target: DropTarget | null | undefined,\n collection?: CollectionLike,\n): Key | null {\n if (!target || target.type !== \"item\") return null;\n return getAfterDropNormalizedKey(target, collection);\n}\n\nexport function useDndPersistedKeys(\n selectionManager: SelectionManagerLike | null | undefined,\n dragAndDropHooks?: Pick<DragAndDropHooks<unknown>, \"isVirtualDragging\">,\n dropState?: DroppableCollectionStateLike,\n collection?: CollectionLike,\n): Accessor<Set<Key>> {\n return createMemo(() => {\n const focusedKey = resolveKey(selectionManager?.focusedKey);\n let dropTargetKey: Key | null | undefined;\n\n if (dragAndDropHooks?.isVirtualDragging?.() && dropState?.target?.type === \"item\") {\n dropTargetKey = getNormalizedDropTargetKey(dropState.target, collection) ?? undefined;\n }\n\n const keys = new Set<Key>();\n if (focusedKey != null) keys.add(focusedKey);\n if (dropTargetKey != null) keys.add(dropTargetKey);\n return keys;\n });\n}\n\nexport function mergePersistedKeysIntoVirtualRange(\n baseRange: VirtualRangeLike,\n persistedIndexes: number[],\n itemCount: number,\n layoutInfoProvider: LayoutInfoProviderLike,\n maxExtraItems = 60,\n options?: {\n forceIncludeIndexes?: number[];\n forceIncludeMaxSpan?: number;\n fallbackToForcedWindow?: boolean;\n },\n): VirtualRangeLike {\n const validPersistedIndexes = Array.from(\n new Set(persistedIndexes.filter((index) => index >= 0 && index < itemCount)),\n ).sort((a, b) => a - b);\n const forceIndexes = Array.from(\n new Set(\n (options?.forceIncludeIndexes ?? []).filter((index) => index >= 0 && index < itemCount),\n ),\n );\n\n if (itemCount <= 0) return baseRange;\n if (validPersistedIndexes.length === 0 && forceIndexes.length === 0) return baseRange;\n\n const baseSpan = Math.max(1, baseRange.end - baseRange.start);\n const maxSpan = Math.max(baseSpan, baseSpan + maxExtraItems);\n\n let start = baseRange.start;\n let end = baseRange.end;\n\n const distanceToBaseRange = (index: number): number => {\n if (index < baseRange.start) return baseRange.start - index;\n if (index >= baseRange.end) return index - (baseRange.end - 1);\n return 0;\n };\n\n for (const index of validPersistedIndexes.sort(\n (a, b) => distanceToBaseRange(a) - distanceToBaseRange(b),\n )) {\n const nextStart = Math.min(start, index);\n const nextEnd = Math.max(end, index + 1);\n if (nextEnd - nextStart <= maxSpan) {\n start = nextStart;\n end = nextEnd;\n }\n }\n\n if (forceIndexes.length > 0) {\n const forceMaxSpan = Math.max(maxSpan, options?.forceIncludeMaxSpan ?? Math.max(maxSpan, 300));\n for (const index of forceIndexes) {\n const nextStart = Math.min(start, index);\n const nextEnd = Math.max(end, index + 1);\n if (nextEnd - nextStart <= forceMaxSpan) {\n start = nextStart;\n end = nextEnd;\n }\n }\n\n if (options?.fallbackToForcedWindow !== false) {\n const missingForced = forceIndexes.filter((index) => index < start || index >= end);\n if (missingForced.length > 0) {\n const nearestForced = missingForced[0];\n const forceMaxSpan = Math.max(\n maxSpan,\n options?.forceIncludeMaxSpan ?? Math.max(maxSpan, 300),\n );\n const windowSpan = Math.min(itemCount, Math.max(baseSpan, forceMaxSpan));\n const centeredStart = Math.max(\n 0,\n Math.min(itemCount - windowSpan, nearestForced - Math.floor(windowSpan / 2)),\n );\n start = centeredStart;\n end = Math.min(itemCount, centeredStart + windowSpan);\n }\n }\n }\n\n if (start === baseRange.start && end === baseRange.end) return baseRange;\n\n const startRect = start > 0 ? layoutInfoProvider.getLayoutInfo(start).rect : { y: 0, height: 0 };\n const lastRect = layoutInfoProvider.getLayoutInfo(itemCount - 1).rect;\n const endRect = end > 0 ? layoutInfoProvider.getLayoutInfo(end - 1).rect : { y: 0, height: 0 };\n\n return {\n start,\n end,\n offsetTop: Math.max(0, startRect.y),\n offsetBottom: Math.max(0, lastRect.y + lastRect.height - (endRect.y + endRect.height)),\n };\n}\n\nexport type DropTargetDelegate = {\n getDropTargetFromPoint: (\n x: number,\n y: number,\n isValidDropTarget: (target: DropTarget) => boolean,\n ) => DropTarget | null;\n getDropOperation: (\n target: DropTarget,\n types: DragTypes,\n allowedOperations: DropOperation[],\n ) => DropOperation;\n};\n"],"mappings":"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"}
|
package/dist/DropZone.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DropZone.d.ts","sourceRoot":"","sources":["../src/DropZone.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,KAAK,GAAG,EAOT,MAAM,UAAU,CAAC;AAClB,OAAO,EAKL,KAAK,WAAW,EAChB,KAAK,eAAe,EACrB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,KAAK,mBAAmB,EACxB,KAAK,eAAe,EACpB,KAAK,cAAc,EACnB,KAAK,SAAS,EAGf,MAAM,SAAS,CAAC;AAGjB,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;IACnB,cAAc,EAAE,OAAO,CAAC;IACxB,YAAY,EAAE,OAAO,CAAC;IACtB,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,aACf,SACE,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,UAAU,GAAG,OAAO,GAAG,OAAO,GAAG,QAAQ,CAAC,EACnF,IAAI,CAAC,eAAe,EAAE,eAAe,CAAC,EACtC,WAAW,EACX,SAAS;IACX,QAAQ,CAAC,EAAE,cAAc,CAAC,mBAAmB,CAAC,CAAC;IAC/C,KAAK,CAAC,EAAE,mBAAmB,CAAC,mBAAmB,CAAC,CAAC;IACjD,KAAK,CAAC,EAAE,eAAe,CAAC,mBAAmB,CAAC,CAAC;CAC9C;AAED,eAAO,MAAM,eAAe,kDAA4C,CAAC;AAgBzE;;GAEG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,aAAa,GAAG,GAAG,CAAC,OAAO,
|
|
1
|
+
{"version":3,"file":"DropZone.d.ts","sourceRoot":"","sources":["../src/DropZone.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,KAAK,GAAG,EAOT,MAAM,UAAU,CAAC;AAClB,OAAO,EAKL,KAAK,WAAW,EAChB,KAAK,eAAe,EACrB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,KAAK,mBAAmB,EACxB,KAAK,eAAe,EACpB,KAAK,cAAc,EACnB,KAAK,SAAS,EAGf,MAAM,SAAS,CAAC;AAGjB,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;IACnB,cAAc,EAAE,OAAO,CAAC;IACxB,YAAY,EAAE,OAAO,CAAC;IACtB,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,aACf,SACE,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,UAAU,GAAG,OAAO,GAAG,OAAO,GAAG,QAAQ,CAAC,EACnF,IAAI,CAAC,eAAe,EAAE,eAAe,CAAC,EACtC,WAAW,EACX,SAAS;IACX,QAAQ,CAAC,EAAE,cAAc,CAAC,mBAAmB,CAAC,CAAC;IAC/C,KAAK,CAAC,EAAE,mBAAmB,CAAC,mBAAmB,CAAC,CAAC;IACjD,KAAK,CAAC,EAAE,eAAe,CAAC,mBAAmB,CAAC,CAAC;CAC9C;AAED,eAAO,MAAM,eAAe,kDAA4C,CAAC;AAgBzE;;GAEG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,aAAa,GAAG,GAAG,CAAC,OAAO,CAkK1D"}
|
package/dist/DropZone.js
ADDED
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
import { filterDOMProps, useRenderProps } from "./utils.js";
|
|
2
|
+
import { VisuallyHidden } from "./VisuallyHidden.js";
|
|
3
|
+
import { createComponent, getNextElement, getNextMarker, insert, mergeProps, runHydrationEvents, spread, template, use } from "solid-js/web";
|
|
4
|
+
import { createContext, createMemo, createSignal, mergeProps as mergeProps$1, splitProps, useContext } from "solid-js";
|
|
5
|
+
import { createDrop, createFocusRing, createHover, readFromDataTransfer } from "@proyecto-viviana/solidaria";
|
|
6
|
+
//#region src/DropZone.tsx
|
|
7
|
+
/**
|
|
8
|
+
* DropZone primitive for solidaria-components.
|
|
9
|
+
*
|
|
10
|
+
* A drop target area for drag and drop operations.
|
|
11
|
+
* Parity target: react-aria-components/src/DropZone.tsx
|
|
12
|
+
*/
|
|
13
|
+
var _tmpl$ = /*#__PURE__*/ template(`<button>`), _tmpl$2 = /*#__PURE__*/ template(`<div><!$><!/><!$><!/>`);
|
|
14
|
+
const DropZoneContext = createContext(null);
|
|
15
|
+
const DEFAULT_DROPZONE_LABEL = "Drop files";
|
|
16
|
+
const FOCUSABLE_SELECTOR = [
|
|
17
|
+
"a[href]",
|
|
18
|
+
"button:not([disabled])",
|
|
19
|
+
"input:not([disabled]):not([type=\"hidden\"])",
|
|
20
|
+
"select:not([disabled])",
|
|
21
|
+
"textarea:not([disabled])",
|
|
22
|
+
"[tabindex]:not([tabindex=\"-1\"])",
|
|
23
|
+
"[contenteditable=\"true\"]"
|
|
24
|
+
].join(",");
|
|
25
|
+
function isFocusableElement(target) {
|
|
26
|
+
return target instanceof HTMLElement && target.matches(FOCUSABLE_SELECTOR);
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* A drop zone is an area into which one or multiple objects can be dropped.
|
|
30
|
+
*/
|
|
31
|
+
function DropZone(props) {
|
|
32
|
+
const [local, dropProps, hoverEventProps, domProps] = splitProps(mergeProps$1(useContext(DropZoneContext) ?? {}, props), [
|
|
33
|
+
"children",
|
|
34
|
+
"class",
|
|
35
|
+
"style",
|
|
36
|
+
"slot",
|
|
37
|
+
"aria-label",
|
|
38
|
+
"aria-labelledby"
|
|
39
|
+
], [
|
|
40
|
+
"getDropOperation",
|
|
41
|
+
"getDropOperationForPoint",
|
|
42
|
+
"onDropEnter",
|
|
43
|
+
"onDropMove",
|
|
44
|
+
"onDropActivate",
|
|
45
|
+
"onDropExit",
|
|
46
|
+
"onDrop",
|
|
47
|
+
"isDisabled"
|
|
48
|
+
], [
|
|
49
|
+
"onHoverStart",
|
|
50
|
+
"onHoverEnd",
|
|
51
|
+
"onHoverChange"
|
|
52
|
+
]);
|
|
53
|
+
const [dropZoneRef, setDropZoneRef] = createSignal(null);
|
|
54
|
+
const [dropButtonRef, setDropButtonRef] = createSignal(null);
|
|
55
|
+
const dropAria = createDrop(() => ({
|
|
56
|
+
getDropOperation: dropProps.getDropOperation,
|
|
57
|
+
getDropOperationForPoint: dropProps.getDropOperationForPoint,
|
|
58
|
+
onDropEnter: dropProps.onDropEnter,
|
|
59
|
+
onDropMove: dropProps.onDropMove,
|
|
60
|
+
onDropActivate: dropProps.onDropActivate,
|
|
61
|
+
onDropExit: dropProps.onDropExit,
|
|
62
|
+
onDrop: dropProps.onDrop,
|
|
63
|
+
hasDropButton: true,
|
|
64
|
+
isDisabled: dropProps.isDisabled
|
|
65
|
+
}));
|
|
66
|
+
const { isHovered, hoverProps } = createHover(() => ({
|
|
67
|
+
isDisabled: dropProps.isDisabled,
|
|
68
|
+
onHoverStart: hoverEventProps.onHoverStart,
|
|
69
|
+
onHoverEnd: hoverEventProps.onHoverEnd,
|
|
70
|
+
onHoverChange: hoverEventProps.onHoverChange
|
|
71
|
+
}));
|
|
72
|
+
const { isFocused, isFocusVisible, focusProps } = createFocusRing();
|
|
73
|
+
const renderValues = createMemo(() => ({
|
|
74
|
+
isHovered: isHovered(),
|
|
75
|
+
isFocused: isFocused(),
|
|
76
|
+
isFocusVisible: isFocusVisible(),
|
|
77
|
+
isDropTarget: dropAria.isDropTarget,
|
|
78
|
+
isDisabled: !!dropProps.isDisabled
|
|
79
|
+
}));
|
|
80
|
+
const renderProps = useRenderProps({
|
|
81
|
+
get children() {
|
|
82
|
+
return local.children;
|
|
83
|
+
},
|
|
84
|
+
class: local.class,
|
|
85
|
+
style: local.style,
|
|
86
|
+
defaultClassName: "solidaria-DropZone"
|
|
87
|
+
}, renderValues);
|
|
88
|
+
const filteredDomProps = createMemo(() => filterDOMProps(domProps, { global: true }));
|
|
89
|
+
const cleanDropProps = () => {
|
|
90
|
+
const { ref: _ref, ...rest } = dropAria.dropProps;
|
|
91
|
+
return rest;
|
|
92
|
+
};
|
|
93
|
+
const cleanHoverProps = () => {
|
|
94
|
+
const { ref: _ref, ...rest } = hoverProps;
|
|
95
|
+
return rest;
|
|
96
|
+
};
|
|
97
|
+
const cleanFocusProps = () => {
|
|
98
|
+
const { ref: _ref, ...rest } = focusProps;
|
|
99
|
+
return rest;
|
|
100
|
+
};
|
|
101
|
+
const cleanDropButtonProps = () => {
|
|
102
|
+
const { ref: _ref, ...rest } = dropAria.dropButtonProps;
|
|
103
|
+
return rest;
|
|
104
|
+
};
|
|
105
|
+
const onRootClick = (e) => {
|
|
106
|
+
const onClick = filteredDomProps().onClick;
|
|
107
|
+
onClick?.(e);
|
|
108
|
+
if (e.defaultPrevented || dropProps.isDisabled) return;
|
|
109
|
+
const root = dropZoneRef();
|
|
110
|
+
const hiddenButton = dropButtonRef();
|
|
111
|
+
if (!root || !hiddenButton) return;
|
|
112
|
+
let target = e.target instanceof Element ? e.target : root;
|
|
113
|
+
while (target && root.contains(target)) {
|
|
114
|
+
if (isFocusableElement(target)) return;
|
|
115
|
+
if (target === root) {
|
|
116
|
+
hiddenButton.focus();
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
target = target.parentElement;
|
|
120
|
+
}
|
|
121
|
+
};
|
|
122
|
+
const onHiddenButtonPaste = (e) => {
|
|
123
|
+
if (dropProps.isDisabled || !e.clipboardData) return;
|
|
124
|
+
const items = readFromDataTransfer(e.clipboardData);
|
|
125
|
+
if (items.length === 0) return;
|
|
126
|
+
e.preventDefault();
|
|
127
|
+
dropProps.onDrop?.({
|
|
128
|
+
type: "drop",
|
|
129
|
+
x: 0,
|
|
130
|
+
y: 0,
|
|
131
|
+
items,
|
|
132
|
+
dropOperation: "copy"
|
|
133
|
+
});
|
|
134
|
+
};
|
|
135
|
+
const dropButtonAriaLabel = createMemo(() => local["aria-label"] ?? (!local["aria-labelledby"] ? DEFAULT_DROPZONE_LABEL : void 0));
|
|
136
|
+
return (() => {
|
|
137
|
+
var _el$ = getNextElement(_tmpl$2), _el$3 = _el$.firstChild, [_el$4, _co$] = getNextMarker(_el$3.nextSibling), _el$5 = _el$4.nextSibling, [_el$6, _co$2] = getNextMarker(_el$5.nextSibling);
|
|
138
|
+
use(setDropZoneRef, _el$);
|
|
139
|
+
spread(_el$, mergeProps(filteredDomProps, cleanDropProps, cleanHoverProps, {
|
|
140
|
+
"onClick": onRootClick,
|
|
141
|
+
get ["class"]() {
|
|
142
|
+
return renderProps.class();
|
|
143
|
+
},
|
|
144
|
+
get style() {
|
|
145
|
+
return renderProps.style();
|
|
146
|
+
},
|
|
147
|
+
get slot() {
|
|
148
|
+
return local.slot;
|
|
149
|
+
},
|
|
150
|
+
get ["data-hovered"]() {
|
|
151
|
+
return isHovered() || void 0;
|
|
152
|
+
},
|
|
153
|
+
get ["data-focused"]() {
|
|
154
|
+
return isFocused() || void 0;
|
|
155
|
+
},
|
|
156
|
+
get ["data-focus-visible"]() {
|
|
157
|
+
return isFocusVisible() || void 0;
|
|
158
|
+
},
|
|
159
|
+
get ["data-drop-target"]() {
|
|
160
|
+
return dropAria.isDropTarget || void 0;
|
|
161
|
+
},
|
|
162
|
+
get ["data-disabled"]() {
|
|
163
|
+
return dropProps.isDisabled || void 0;
|
|
164
|
+
}
|
|
165
|
+
}), false, true);
|
|
166
|
+
insert(_el$, createComponent(VisuallyHidden, { get children() {
|
|
167
|
+
var _el$2 = getNextElement(_tmpl$);
|
|
168
|
+
use(setDropButtonRef, _el$2);
|
|
169
|
+
spread(_el$2, mergeProps(cleanDropButtonProps, cleanFocusProps, {
|
|
170
|
+
get ["aria-label"]() {
|
|
171
|
+
return dropButtonAriaLabel();
|
|
172
|
+
},
|
|
173
|
+
get ["aria-labelledby"]() {
|
|
174
|
+
return local["aria-labelledby"];
|
|
175
|
+
},
|
|
176
|
+
"onPaste": onHiddenButtonPaste
|
|
177
|
+
}), false, false);
|
|
178
|
+
runHydrationEvents();
|
|
179
|
+
return _el$2;
|
|
180
|
+
} }), _el$4, _co$);
|
|
181
|
+
insert(_el$, () => renderProps.renderChildren(), _el$6, _co$2);
|
|
182
|
+
runHydrationEvents();
|
|
183
|
+
return _el$;
|
|
184
|
+
})();
|
|
185
|
+
}
|
|
186
|
+
//#endregion
|
|
187
|
+
export { DropZone, DropZoneContext };
|
|
188
|
+
|
|
189
|
+
//# sourceMappingURL=DropZone.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DropZone.js","names":["JSX","createContext","createMemo","createSignal","mergeProps","splitProps","useContext","createDrop","createFocusRing","createHover","readFromDataTransfer","HoverEvents","AriaDropOptions","ClassNameOrFunction","StyleOrFunction","RenderChildren","SlotProps","useRenderProps","filterDOMProps","VisuallyHidden","DropZoneRenderProps","isHovered","isFocused","isFocusVisible","isDropTarget","isDisabled","DropZoneProps","Omit","HTMLAttributes","HTMLDivElement","children","class","style","DropZoneContext","DEFAULT_DROPZONE_LABEL","FOCUSABLE_SELECTOR","join","isFocusableElement","target","Element","HTMLElement","matches","DropZone","props","contextProps","mergedProps","local","dropProps","hoverEventProps","domProps","dropZoneRef","setDropZoneRef","dropButtonRef","setDropButtonRef","HTMLButtonElement","dropAria","getDropOperation","getDropOperationForPoint","onDropEnter","onDropMove","onDropActivate","onDropExit","onDrop","hasDropButton","hoverProps","onHoverStart","onHoverEnd","onHoverChange","focusProps","renderValues","renderProps","defaultClassName","filteredDomProps","global","cleanDropProps","ref","_ref","rest","Record","cleanHoverProps","cleanFocusProps","cleanDropButtonProps","dropButtonProps","onRootClick","EventHandler","MouseEvent","e","onClick","defaultPrevented","root","hiddenButton","contains","focus","parentElement","onHiddenButtonPaste","ClipboardEvent","clipboardData","items","length","preventDefault","type","x","y","dropOperation","dropButtonAriaLabel","undefined","_el$","_$getNextElement","_tmpl$2","_el$3","firstChild","_el$4","_co$","_$getNextMarker","nextSibling","_el$5","_el$6","_co$2","_$use","_$spread","_$mergeProps","slot","data-hovered","data-focused","data-focus-visible","data-drop-target","data-disabled","_$insert","_$createComponent","_el$2","_tmpl$","aria-label","aria-labelledby","_$runHydrationEvents","renderChildren"],"sources":["../src/DropZone.tsx"],"sourcesContent":["/**\n * DropZone primitive for solidaria-components.\n *\n * A drop target area for drag and drop operations.\n * Parity target: react-aria-components/src/DropZone.tsx\n */\n\nimport {\n type JSX,\n createContext,\n createMemo,\n createSignal,\n mergeProps,\n splitProps,\n useContext,\n} from \"solid-js\";\nimport {\n createDrop,\n createFocusRing,\n createHover,\n readFromDataTransfer,\n type HoverEvents,\n type AriaDropOptions,\n} from \"@proyecto-viviana/solidaria\";\nimport {\n type ClassNameOrFunction,\n type StyleOrFunction,\n type RenderChildren,\n type SlotProps,\n useRenderProps,\n filterDOMProps,\n} from \"./utils\";\nimport { VisuallyHidden } from \"./VisuallyHidden\";\n\nexport interface DropZoneRenderProps {\n isHovered: boolean;\n isFocused: boolean;\n isFocusVisible: boolean;\n isDropTarget: boolean;\n isDisabled: boolean;\n}\n\nexport interface DropZoneProps\n extends\n Omit<JSX.HTMLAttributes<HTMLDivElement>, \"children\" | \"class\" | \"style\" | \"onDrop\">,\n Omit<AriaDropOptions, \"hasDropButton\">,\n HoverEvents,\n SlotProps {\n children?: RenderChildren<DropZoneRenderProps>;\n class?: ClassNameOrFunction<DropZoneRenderProps>;\n style?: StyleOrFunction<DropZoneRenderProps>;\n}\n\nexport const DropZoneContext = createContext<DropZoneProps | null>(null);\nconst DEFAULT_DROPZONE_LABEL = \"Drop files\";\nconst FOCUSABLE_SELECTOR = [\n \"a[href]\",\n \"button:not([disabled])\",\n 'input:not([disabled]):not([type=\"hidden\"])',\n \"select:not([disabled])\",\n \"textarea:not([disabled])\",\n '[tabindex]:not([tabindex=\"-1\"])',\n '[contenteditable=\"true\"]',\n].join(\",\");\n\nfunction isFocusableElement(target: Element): boolean {\n return target instanceof HTMLElement && target.matches(FOCUSABLE_SELECTOR);\n}\n\n/**\n * A drop zone is an area into which one or multiple objects can be dropped.\n */\nexport function DropZone(props: DropZoneProps): JSX.Element {\n const contextProps = useContext(DropZoneContext);\n const mergedProps = mergeProps(contextProps ?? {}, props);\n const [local, dropProps, hoverEventProps, domProps] = splitProps(\n mergedProps,\n [\"children\", \"class\", \"style\", \"slot\", \"aria-label\", \"aria-labelledby\"],\n [\n \"getDropOperation\",\n \"getDropOperationForPoint\",\n \"onDropEnter\",\n \"onDropMove\",\n \"onDropActivate\",\n \"onDropExit\",\n \"onDrop\",\n \"isDisabled\",\n ],\n [\"onHoverStart\", \"onHoverEnd\", \"onHoverChange\"],\n );\n\n const [dropZoneRef, setDropZoneRef] = createSignal<HTMLDivElement | null>(null);\n const [dropButtonRef, setDropButtonRef] = createSignal<HTMLButtonElement | null>(null);\n\n const dropAria = createDrop(() => ({\n getDropOperation: dropProps.getDropOperation,\n getDropOperationForPoint: dropProps.getDropOperationForPoint,\n onDropEnter: dropProps.onDropEnter,\n onDropMove: dropProps.onDropMove,\n onDropActivate: dropProps.onDropActivate,\n onDropExit: dropProps.onDropExit,\n onDrop: dropProps.onDrop,\n hasDropButton: true,\n isDisabled: dropProps.isDisabled,\n }));\n\n const { isHovered, hoverProps } = createHover(() => ({\n isDisabled: dropProps.isDisabled,\n onHoverStart: hoverEventProps.onHoverStart,\n onHoverEnd: hoverEventProps.onHoverEnd,\n onHoverChange: hoverEventProps.onHoverChange,\n }));\n const { isFocused, isFocusVisible, focusProps } = createFocusRing();\n\n const renderValues = createMemo<DropZoneRenderProps>(() => ({\n isHovered: isHovered(),\n isFocused: isFocused(),\n isFocusVisible: isFocusVisible(),\n isDropTarget: dropAria.isDropTarget,\n isDisabled: !!dropProps.isDisabled,\n }));\n\n const renderProps = useRenderProps(\n {\n get children() {\n return local.children;\n },\n class: local.class,\n style: local.style,\n defaultClassName: \"solidaria-DropZone\",\n },\n renderValues,\n );\n\n const filteredDomProps = createMemo(() => filterDOMProps(domProps, { global: true }));\n\n const cleanDropProps = () => {\n const { ref: _ref, ...rest } = dropAria.dropProps as Record<string, unknown>;\n return rest;\n };\n const cleanHoverProps = () => {\n const { ref: _ref, ...rest } = hoverProps as Record<string, unknown>;\n return rest;\n };\n const cleanFocusProps = () => {\n const { ref: _ref, ...rest } = focusProps as Record<string, unknown>;\n return rest;\n };\n const cleanDropButtonProps = () => {\n const { ref: _ref, ...rest } = dropAria.dropButtonProps as Record<string, unknown>;\n return rest;\n };\n\n const onRootClick: JSX.EventHandler<HTMLDivElement, MouseEvent> = (e) => {\n const onClick = (filteredDomProps() as JSX.HTMLAttributes<HTMLDivElement>).onClick as\n | JSX.EventHandler<HTMLDivElement, MouseEvent>\n | undefined;\n onClick?.(e);\n if (e.defaultPrevented || dropProps.isDisabled) {\n return;\n }\n\n const root = dropZoneRef();\n const hiddenButton = dropButtonRef();\n if (!root || !hiddenButton) {\n return;\n }\n\n let target: Element | null = e.target instanceof Element ? e.target : root;\n while (target && root.contains(target)) {\n if (isFocusableElement(target)) {\n return;\n }\n if (target === root) {\n hiddenButton.focus();\n return;\n }\n target = target.parentElement;\n }\n };\n\n const onHiddenButtonPaste: JSX.EventHandler<HTMLButtonElement, ClipboardEvent> = (e) => {\n if (dropProps.isDisabled || !e.clipboardData) {\n return;\n }\n\n const items = readFromDataTransfer(e.clipboardData);\n if (items.length === 0) {\n return;\n }\n\n e.preventDefault();\n dropProps.onDrop?.({\n type: \"drop\",\n x: 0,\n y: 0,\n items,\n dropOperation: \"copy\",\n });\n };\n\n const dropButtonAriaLabel = createMemo(\n () => local[\"aria-label\"] ?? (!local[\"aria-labelledby\"] ? DEFAULT_DROPZONE_LABEL : undefined),\n );\n\n return (\n <div\n ref={setDropZoneRef}\n {...filteredDomProps()}\n {...cleanDropProps()}\n {...cleanHoverProps()}\n onClick={onRootClick}\n class={renderProps.class()}\n style={renderProps.style()}\n slot={local.slot}\n data-hovered={isHovered() || undefined}\n data-focused={isFocused() || undefined}\n data-focus-visible={isFocusVisible() || undefined}\n data-drop-target={dropAria.isDropTarget || undefined}\n data-disabled={dropProps.isDisabled || undefined}\n >\n <VisuallyHidden>\n <button\n ref={setDropButtonRef}\n {...cleanDropButtonProps()}\n {...cleanFocusProps()}\n aria-label={dropButtonAriaLabel()}\n aria-labelledby={local[\"aria-labelledby\"]}\n onPaste={onHiddenButtonPaste}\n />\n </VisuallyHidden>\n {renderProps.renderChildren()}\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import { filterDOMProps, useRenderProps } from "./utils.jsx";
|
|
2
|
+
import { VisuallyHidden } from "./VisuallyHidden.jsx";
|
|
3
|
+
import { createContext, createMemo, createSignal, mergeProps, splitProps, useContext } from "solid-js";
|
|
4
|
+
import { createDrop, createFocusRing, createHover, readFromDataTransfer } from "@proyecto-viviana/solidaria";
|
|
5
|
+
//#region src/DropZone.tsx
|
|
6
|
+
/**
|
|
7
|
+
* DropZone primitive for solidaria-components.
|
|
8
|
+
*
|
|
9
|
+
* A drop target area for drag and drop operations.
|
|
10
|
+
* Parity target: react-aria-components/src/DropZone.tsx
|
|
11
|
+
*/
|
|
12
|
+
const DropZoneContext = createContext(null);
|
|
13
|
+
const DEFAULT_DROPZONE_LABEL = "Drop files";
|
|
14
|
+
const FOCUSABLE_SELECTOR = [
|
|
15
|
+
"a[href]",
|
|
16
|
+
"button:not([disabled])",
|
|
17
|
+
"input:not([disabled]):not([type=\"hidden\"])",
|
|
18
|
+
"select:not([disabled])",
|
|
19
|
+
"textarea:not([disabled])",
|
|
20
|
+
"[tabindex]:not([tabindex=\"-1\"])",
|
|
21
|
+
"[contenteditable=\"true\"]"
|
|
22
|
+
].join(",");
|
|
23
|
+
function isFocusableElement(target) {
|
|
24
|
+
return target instanceof HTMLElement && target.matches(FOCUSABLE_SELECTOR);
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* A drop zone is an area into which one or multiple objects can be dropped.
|
|
28
|
+
*/
|
|
29
|
+
function DropZone(props) {
|
|
30
|
+
const [local, dropProps, hoverEventProps, domProps] = splitProps(mergeProps(useContext(DropZoneContext) ?? {}, props), [
|
|
31
|
+
"children",
|
|
32
|
+
"class",
|
|
33
|
+
"style",
|
|
34
|
+
"slot",
|
|
35
|
+
"aria-label",
|
|
36
|
+
"aria-labelledby"
|
|
37
|
+
], [
|
|
38
|
+
"getDropOperation",
|
|
39
|
+
"getDropOperationForPoint",
|
|
40
|
+
"onDropEnter",
|
|
41
|
+
"onDropMove",
|
|
42
|
+
"onDropActivate",
|
|
43
|
+
"onDropExit",
|
|
44
|
+
"onDrop",
|
|
45
|
+
"isDisabled"
|
|
46
|
+
], [
|
|
47
|
+
"onHoverStart",
|
|
48
|
+
"onHoverEnd",
|
|
49
|
+
"onHoverChange"
|
|
50
|
+
]);
|
|
51
|
+
const [dropZoneRef, setDropZoneRef] = createSignal(null);
|
|
52
|
+
const [dropButtonRef, setDropButtonRef] = createSignal(null);
|
|
53
|
+
const dropAria = createDrop(() => ({
|
|
54
|
+
getDropOperation: dropProps.getDropOperation,
|
|
55
|
+
getDropOperationForPoint: dropProps.getDropOperationForPoint,
|
|
56
|
+
onDropEnter: dropProps.onDropEnter,
|
|
57
|
+
onDropMove: dropProps.onDropMove,
|
|
58
|
+
onDropActivate: dropProps.onDropActivate,
|
|
59
|
+
onDropExit: dropProps.onDropExit,
|
|
60
|
+
onDrop: dropProps.onDrop,
|
|
61
|
+
hasDropButton: true,
|
|
62
|
+
isDisabled: dropProps.isDisabled
|
|
63
|
+
}));
|
|
64
|
+
const { isHovered, hoverProps } = createHover(() => ({
|
|
65
|
+
isDisabled: dropProps.isDisabled,
|
|
66
|
+
onHoverStart: hoverEventProps.onHoverStart,
|
|
67
|
+
onHoverEnd: hoverEventProps.onHoverEnd,
|
|
68
|
+
onHoverChange: hoverEventProps.onHoverChange
|
|
69
|
+
}));
|
|
70
|
+
const { isFocused, isFocusVisible, focusProps } = createFocusRing();
|
|
71
|
+
const renderValues = createMemo(() => ({
|
|
72
|
+
isHovered: isHovered(),
|
|
73
|
+
isFocused: isFocused(),
|
|
74
|
+
isFocusVisible: isFocusVisible(),
|
|
75
|
+
isDropTarget: dropAria.isDropTarget,
|
|
76
|
+
isDisabled: !!dropProps.isDisabled
|
|
77
|
+
}));
|
|
78
|
+
const renderProps = useRenderProps({
|
|
79
|
+
get children() {
|
|
80
|
+
return local.children;
|
|
81
|
+
},
|
|
82
|
+
class: local.class,
|
|
83
|
+
style: local.style,
|
|
84
|
+
defaultClassName: "solidaria-DropZone"
|
|
85
|
+
}, renderValues);
|
|
86
|
+
const filteredDomProps = createMemo(() => filterDOMProps(domProps, { global: true }));
|
|
87
|
+
const cleanDropProps = () => {
|
|
88
|
+
const { ref: _ref, ...rest } = dropAria.dropProps;
|
|
89
|
+
return rest;
|
|
90
|
+
};
|
|
91
|
+
const cleanHoverProps = () => {
|
|
92
|
+
const { ref: _ref, ...rest } = hoverProps;
|
|
93
|
+
return rest;
|
|
94
|
+
};
|
|
95
|
+
const cleanFocusProps = () => {
|
|
96
|
+
const { ref: _ref, ...rest } = focusProps;
|
|
97
|
+
return rest;
|
|
98
|
+
};
|
|
99
|
+
const cleanDropButtonProps = () => {
|
|
100
|
+
const { ref: _ref, ...rest } = dropAria.dropButtonProps;
|
|
101
|
+
return rest;
|
|
102
|
+
};
|
|
103
|
+
const onRootClick = (e) => {
|
|
104
|
+
const onClick = filteredDomProps().onClick;
|
|
105
|
+
onClick?.(e);
|
|
106
|
+
if (e.defaultPrevented || dropProps.isDisabled) return;
|
|
107
|
+
const root = dropZoneRef();
|
|
108
|
+
const hiddenButton = dropButtonRef();
|
|
109
|
+
if (!root || !hiddenButton) return;
|
|
110
|
+
let target = e.target instanceof Element ? e.target : root;
|
|
111
|
+
while (target && root.contains(target)) {
|
|
112
|
+
if (isFocusableElement(target)) return;
|
|
113
|
+
if (target === root) {
|
|
114
|
+
hiddenButton.focus();
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
target = target.parentElement;
|
|
118
|
+
}
|
|
119
|
+
};
|
|
120
|
+
const onHiddenButtonPaste = (e) => {
|
|
121
|
+
if (dropProps.isDisabled || !e.clipboardData) return;
|
|
122
|
+
const items = readFromDataTransfer(e.clipboardData);
|
|
123
|
+
if (items.length === 0) return;
|
|
124
|
+
e.preventDefault();
|
|
125
|
+
dropProps.onDrop?.({
|
|
126
|
+
type: "drop",
|
|
127
|
+
x: 0,
|
|
128
|
+
y: 0,
|
|
129
|
+
items,
|
|
130
|
+
dropOperation: "copy"
|
|
131
|
+
});
|
|
132
|
+
};
|
|
133
|
+
const dropButtonAriaLabel = createMemo(() => local["aria-label"] ?? (!local["aria-labelledby"] ? DEFAULT_DROPZONE_LABEL : void 0));
|
|
134
|
+
return <div ref={setDropZoneRef} {...filteredDomProps()} {...cleanDropProps()} {...cleanHoverProps()} onClick={onRootClick} class={renderProps.class()} style={renderProps.style()} slot={local.slot} data-hovered={isHovered() || void 0} data-focused={isFocused() || void 0} data-focus-visible={isFocusVisible() || void 0} data-drop-target={dropAria.isDropTarget || void 0} data-disabled={dropProps.isDisabled || void 0}>
|
|
135
|
+
<VisuallyHidden>
|
|
136
|
+
<button ref={setDropButtonRef} {...cleanDropButtonProps()} {...cleanFocusProps()} aria-label={dropButtonAriaLabel()} aria-labelledby={local["aria-labelledby"]} onPaste={onHiddenButtonPaste} />
|
|
137
|
+
</VisuallyHidden>
|
|
138
|
+
{renderProps.renderChildren()}
|
|
139
|
+
</div>;
|
|
140
|
+
}
|
|
141
|
+
//#endregion
|
|
142
|
+
export { DropZone, DropZoneContext };
|
|
143
|
+
|
|
144
|
+
//# sourceMappingURL=DropZone.jsx.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DropZone.jsx","names":[],"sources":["../src/DropZone.tsx"],"sourcesContent":["/**\n * DropZone primitive for solidaria-components.\n *\n * A drop target area for drag and drop operations.\n * Parity target: react-aria-components/src/DropZone.tsx\n */\n\nimport {\n type JSX,\n createContext,\n createMemo,\n createSignal,\n mergeProps,\n splitProps,\n useContext,\n} from \"solid-js\";\nimport {\n createDrop,\n createFocusRing,\n createHover,\n readFromDataTransfer,\n type HoverEvents,\n type AriaDropOptions,\n} from \"@proyecto-viviana/solidaria\";\nimport {\n type ClassNameOrFunction,\n type StyleOrFunction,\n type RenderChildren,\n type SlotProps,\n useRenderProps,\n filterDOMProps,\n} from \"./utils\";\nimport { VisuallyHidden } from \"./VisuallyHidden\";\n\nexport interface DropZoneRenderProps {\n isHovered: boolean;\n isFocused: boolean;\n isFocusVisible: boolean;\n isDropTarget: boolean;\n isDisabled: boolean;\n}\n\nexport interface DropZoneProps\n extends\n Omit<JSX.HTMLAttributes<HTMLDivElement>, \"children\" | \"class\" | \"style\" | \"onDrop\">,\n Omit<AriaDropOptions, \"hasDropButton\">,\n HoverEvents,\n SlotProps {\n children?: RenderChildren<DropZoneRenderProps>;\n class?: ClassNameOrFunction<DropZoneRenderProps>;\n style?: StyleOrFunction<DropZoneRenderProps>;\n}\n\nexport const DropZoneContext = createContext<DropZoneProps | null>(null);\nconst DEFAULT_DROPZONE_LABEL = \"Drop files\";\nconst FOCUSABLE_SELECTOR = [\n \"a[href]\",\n \"button:not([disabled])\",\n 'input:not([disabled]):not([type=\"hidden\"])',\n \"select:not([disabled])\",\n \"textarea:not([disabled])\",\n '[tabindex]:not([tabindex=\"-1\"])',\n '[contenteditable=\"true\"]',\n].join(\",\");\n\nfunction isFocusableElement(target: Element): boolean {\n return target instanceof HTMLElement && target.matches(FOCUSABLE_SELECTOR);\n}\n\n/**\n * A drop zone is an area into which one or multiple objects can be dropped.\n */\nexport function DropZone(props: DropZoneProps): JSX.Element {\n const contextProps = useContext(DropZoneContext);\n const mergedProps = mergeProps(contextProps ?? {}, props);\n const [local, dropProps, hoverEventProps, domProps] = splitProps(\n mergedProps,\n [\"children\", \"class\", \"style\", \"slot\", \"aria-label\", \"aria-labelledby\"],\n [\n \"getDropOperation\",\n \"getDropOperationForPoint\",\n \"onDropEnter\",\n \"onDropMove\",\n \"onDropActivate\",\n \"onDropExit\",\n \"onDrop\",\n \"isDisabled\",\n ],\n [\"onHoverStart\", \"onHoverEnd\", \"onHoverChange\"],\n );\n\n const [dropZoneRef, setDropZoneRef] = createSignal<HTMLDivElement | null>(null);\n const [dropButtonRef, setDropButtonRef] = createSignal<HTMLButtonElement | null>(null);\n\n const dropAria = createDrop(() => ({\n getDropOperation: dropProps.getDropOperation,\n getDropOperationForPoint: dropProps.getDropOperationForPoint,\n onDropEnter: dropProps.onDropEnter,\n onDropMove: dropProps.onDropMove,\n onDropActivate: dropProps.onDropActivate,\n onDropExit: dropProps.onDropExit,\n onDrop: dropProps.onDrop,\n hasDropButton: true,\n isDisabled: dropProps.isDisabled,\n }));\n\n const { isHovered, hoverProps } = createHover(() => ({\n isDisabled: dropProps.isDisabled,\n onHoverStart: hoverEventProps.onHoverStart,\n onHoverEnd: hoverEventProps.onHoverEnd,\n onHoverChange: hoverEventProps.onHoverChange,\n }));\n const { isFocused, isFocusVisible, focusProps } = createFocusRing();\n\n const renderValues = createMemo<DropZoneRenderProps>(() => ({\n isHovered: isHovered(),\n isFocused: isFocused(),\n isFocusVisible: isFocusVisible(),\n isDropTarget: dropAria.isDropTarget,\n isDisabled: !!dropProps.isDisabled,\n }));\n\n const renderProps = useRenderProps(\n {\n get children() {\n return local.children;\n },\n class: local.class,\n style: local.style,\n defaultClassName: \"solidaria-DropZone\",\n },\n renderValues,\n );\n\n const filteredDomProps = createMemo(() => filterDOMProps(domProps, { global: true }));\n\n const cleanDropProps = () => {\n const { ref: _ref, ...rest } = dropAria.dropProps as Record<string, unknown>;\n return rest;\n };\n const cleanHoverProps = () => {\n const { ref: _ref, ...rest } = hoverProps as Record<string, unknown>;\n return rest;\n };\n const cleanFocusProps = () => {\n const { ref: _ref, ...rest } = focusProps as Record<string, unknown>;\n return rest;\n };\n const cleanDropButtonProps = () => {\n const { ref: _ref, ...rest } = dropAria.dropButtonProps as Record<string, unknown>;\n return rest;\n };\n\n const onRootClick: JSX.EventHandler<HTMLDivElement, MouseEvent> = (e) => {\n const onClick = (filteredDomProps() as JSX.HTMLAttributes<HTMLDivElement>).onClick as\n | JSX.EventHandler<HTMLDivElement, MouseEvent>\n | undefined;\n onClick?.(e);\n if (e.defaultPrevented || dropProps.isDisabled) {\n return;\n }\n\n const root = dropZoneRef();\n const hiddenButton = dropButtonRef();\n if (!root || !hiddenButton) {\n return;\n }\n\n let target: Element | null = e.target instanceof Element ? e.target : root;\n while (target && root.contains(target)) {\n if (isFocusableElement(target)) {\n return;\n }\n if (target === root) {\n hiddenButton.focus();\n return;\n }\n target = target.parentElement;\n }\n };\n\n const onHiddenButtonPaste: JSX.EventHandler<HTMLButtonElement, ClipboardEvent> = (e) => {\n if (dropProps.isDisabled || !e.clipboardData) {\n return;\n }\n\n const items = readFromDataTransfer(e.clipboardData);\n if (items.length === 0) {\n return;\n }\n\n e.preventDefault();\n dropProps.onDrop?.({\n type: \"drop\",\n x: 0,\n y: 0,\n items,\n dropOperation: \"copy\",\n });\n };\n\n const dropButtonAriaLabel = createMemo(\n () => local[\"aria-label\"] ?? (!local[\"aria-labelledby\"] ? DEFAULT_DROPZONE_LABEL : undefined),\n );\n\n return (\n <div\n ref={setDropZoneRef}\n {...filteredDomProps()}\n {...cleanDropProps()}\n {...cleanHoverProps()}\n onClick={onRootClick}\n class={renderProps.class()}\n style={renderProps.style()}\n slot={local.slot}\n data-hovered={isHovered() || undefined}\n data-focused={isFocused() || undefined}\n data-focus-visible={isFocusVisible() || undefined}\n data-drop-target={dropAria.isDropTarget || undefined}\n data-disabled={dropProps.isDisabled || undefined}\n >\n <VisuallyHidden>\n <button\n ref={setDropButtonRef}\n {...cleanDropButtonProps()}\n {...cleanFocusProps()}\n aria-label={dropButtonAriaLabel()}\n aria-labelledby={local[\"aria-labelledby\"]}\n onPaste={onHiddenButtonPaste}\n />\n </VisuallyHidden>\n {renderProps.renderChildren()}\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { filterDOMProps, useRenderProps } from "./utils.js";
|
|
2
|
+
import { createComponent, getNextElement, insert, memo, mergeProps, runHydrationEvents, spread, template } from "solid-js/web";
|
|
3
|
+
import { Show, createContext, createMemo, splitProps, useContext } from "solid-js";
|
|
4
|
+
import { DEFAULT_VALIDATION_RESULT } from "@proyecto-viviana/solid-stately";
|
|
5
|
+
//#region src/FieldError.tsx
|
|
6
|
+
/**
|
|
7
|
+
* FieldError primitive for solidaria-components.
|
|
8
|
+
*
|
|
9
|
+
* Displays validation errors for a field from context or explicit validation prop.
|
|
10
|
+
* Port direction: react-aria-components/src/FieldError.tsx
|
|
11
|
+
*/
|
|
12
|
+
var _tmpl$ = /*#__PURE__*/ template(`<div>`);
|
|
13
|
+
const FieldErrorContext = createContext(null);
|
|
14
|
+
function FieldError(props) {
|
|
15
|
+
const contextValue = useContext(FieldErrorContext);
|
|
16
|
+
const contextValidation = () => {
|
|
17
|
+
if (contextValue && "validation" in contextValue) return contextValue.validation;
|
|
18
|
+
return contextValue;
|
|
19
|
+
};
|
|
20
|
+
const contextErrorMessageProps = () => {
|
|
21
|
+
if (contextValue && "validation" in contextValue) return contextValue.errorMessageProps ?? {};
|
|
22
|
+
return {};
|
|
23
|
+
};
|
|
24
|
+
const [local, domProps] = splitProps(props, [
|
|
25
|
+
"validation",
|
|
26
|
+
"children",
|
|
27
|
+
"class",
|
|
28
|
+
"style",
|
|
29
|
+
"slot"
|
|
30
|
+
]);
|
|
31
|
+
const validation = createMemo(() => local.validation ?? contextValidation());
|
|
32
|
+
const renderProps = useRenderProps({
|
|
33
|
+
children: local.children ?? ((currentValidation) => currentValidation.validationErrors.join(" ")),
|
|
34
|
+
class: local.class,
|
|
35
|
+
style: local.style,
|
|
36
|
+
defaultClassName: "solidaria-FieldError"
|
|
37
|
+
}, () => validation() ?? DEFAULT_VALIDATION_RESULT);
|
|
38
|
+
const filteredDomProps = filterDOMProps(domProps, { global: true });
|
|
39
|
+
const children = () => renderProps.renderChildren();
|
|
40
|
+
return createComponent(Show, {
|
|
41
|
+
get when() {
|
|
42
|
+
return memo(() => !!validation()?.isInvalid)() && children();
|
|
43
|
+
},
|
|
44
|
+
get children() {
|
|
45
|
+
var _el$ = getNextElement(_tmpl$);
|
|
46
|
+
spread(_el$, mergeProps(() => contextErrorMessageProps(), filteredDomProps, {
|
|
47
|
+
get slot() {
|
|
48
|
+
return local.slot ?? "errorMessage";
|
|
49
|
+
},
|
|
50
|
+
get ["class"]() {
|
|
51
|
+
return renderProps.class();
|
|
52
|
+
},
|
|
53
|
+
get style() {
|
|
54
|
+
return renderProps.style();
|
|
55
|
+
}
|
|
56
|
+
}), false, true);
|
|
57
|
+
insert(_el$, children);
|
|
58
|
+
runHydrationEvents();
|
|
59
|
+
return _el$;
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
//#endregion
|
|
64
|
+
export { FieldError, FieldErrorContext };
|
|
65
|
+
|
|
66
|
+
//# sourceMappingURL=FieldError.js.map
|