@proyecto-viviana/solidaria-components 0.3.2 → 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 +4 -4
- 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 +6 -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 -23932
- package/dist/index.jsx +70 -18337
- 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 +22 -2
- 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 +50 -6
- package/src/DateField.tsx +20 -2
- package/src/DatePicker.tsx +57 -5
- 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 +252 -128
- package/src/Meter.tsx +3 -1
- package/src/Modal.tsx +100 -52
- package/src/NumberField.tsx +51 -8
- package/src/Popover.tsx +40 -10
- 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 +3 -1
- package/src/Text.tsx +31 -10
- package/src/TextField.tsx +43 -5
- 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 +3 -1
- 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,751 @@
|
|
|
1
|
+
import { filterDOMProps } from "./utils.js";
|
|
2
|
+
import { CollectionRendererContext } from "./Collection.js";
|
|
3
|
+
import { createComponent, effect, getNextElement, insert, mergeProps, runHydrationEvents, setStyleProperty, spread, template, use } from "solid-js/web";
|
|
4
|
+
import { createContext, createMemo, createSignal, onCleanup, onMount, splitProps, useContext } from "solid-js";
|
|
5
|
+
//#region src/VirtualizerLayouts.ts
|
|
6
|
+
function clampRange(itemCount, start, end, itemSize) {
|
|
7
|
+
const safeStart = Math.max(0, Math.min(start, itemCount));
|
|
8
|
+
const safeEnd = Math.max(safeStart, Math.min(end, itemCount));
|
|
9
|
+
return {
|
|
10
|
+
start: safeStart,
|
|
11
|
+
end: safeEnd,
|
|
12
|
+
offsetTop: safeStart * itemSize,
|
|
13
|
+
offsetBottom: Math.max(0, (itemCount - safeEnd) * itemSize)
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
function calculateLinearVisibleRange(itemCount, scrollOffset, viewportSize, itemSize, overscan) {
|
|
17
|
+
if (itemCount <= 0) return {
|
|
18
|
+
start: 0,
|
|
19
|
+
end: 0,
|
|
20
|
+
offsetTop: 0,
|
|
21
|
+
offsetBottom: 0
|
|
22
|
+
};
|
|
23
|
+
const safeItemSize = Math.max(1, itemSize);
|
|
24
|
+
const safeViewport = Math.max(1, viewportSize);
|
|
25
|
+
const safeOverscan = Math.max(0, overscan);
|
|
26
|
+
const start = Math.floor(scrollOffset / safeItemSize) - safeOverscan;
|
|
27
|
+
return clampRange(itemCount, start, start + (Math.ceil(safeViewport / safeItemSize) + safeOverscan * 2), safeItemSize);
|
|
28
|
+
}
|
|
29
|
+
var ListLayout = class {
|
|
30
|
+
getVisibleRange(ctx, options) {
|
|
31
|
+
return calculateLinearVisibleRange(ctx.itemCount, ctx.scrollOffset, ctx.viewportSize, options?.itemSize ?? 40, options?.overscan ?? ctx.overscan);
|
|
32
|
+
}
|
|
33
|
+
getLayoutInfo(index, context, options) {
|
|
34
|
+
const itemSize = Math.max(1, options?.itemSize ?? 40);
|
|
35
|
+
if ((options?.orientation ?? "vertical") === "horizontal") return {
|
|
36
|
+
key: String(index),
|
|
37
|
+
index,
|
|
38
|
+
rect: {
|
|
39
|
+
x: index * itemSize,
|
|
40
|
+
y: 0,
|
|
41
|
+
width: itemSize,
|
|
42
|
+
height: Math.max(0, context.viewportHeight ?? 0)
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
return {
|
|
46
|
+
key: String(index),
|
|
47
|
+
index,
|
|
48
|
+
rect: {
|
|
49
|
+
x: 0,
|
|
50
|
+
y: index * itemSize,
|
|
51
|
+
width: Math.max(0, context.viewportWidth),
|
|
52
|
+
height: itemSize
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
getDropTargetFromPoint(point, itemCount, options) {
|
|
57
|
+
if (itemCount <= 0) return {
|
|
58
|
+
type: "root",
|
|
59
|
+
index: -1,
|
|
60
|
+
position: "on"
|
|
61
|
+
};
|
|
62
|
+
const itemSize = Math.max(1, options?.itemSize ?? 40);
|
|
63
|
+
const offset = (options?.orientation ?? "vertical") === "horizontal" ? point.x : point.y;
|
|
64
|
+
if (offset < 0) return {
|
|
65
|
+
type: "item",
|
|
66
|
+
index: 0,
|
|
67
|
+
position: "before"
|
|
68
|
+
};
|
|
69
|
+
if (offset >= itemCount * itemSize) return {
|
|
70
|
+
type: "item",
|
|
71
|
+
index: itemCount - 1,
|
|
72
|
+
position: "after"
|
|
73
|
+
};
|
|
74
|
+
const rawIndex = Math.floor(offset / itemSize);
|
|
75
|
+
const index = Math.max(0, Math.min(rawIndex, itemCount - 1));
|
|
76
|
+
const offsetWithinItem = Math.max(0, offset - index * itemSize);
|
|
77
|
+
const threshold = itemSize / 3;
|
|
78
|
+
return {
|
|
79
|
+
type: "item",
|
|
80
|
+
index,
|
|
81
|
+
position: offsetWithinItem < threshold ? "before" : offsetWithinItem > threshold * 2 ? "after" : "on"
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
};
|
|
85
|
+
var TableLayout = class extends ListLayout {};
|
|
86
|
+
var GridLayout = class {
|
|
87
|
+
getVisibleRange(ctx, options) {
|
|
88
|
+
if (ctx.itemCount <= 0) return {
|
|
89
|
+
start: 0,
|
|
90
|
+
end: 0,
|
|
91
|
+
offsetTop: 0,
|
|
92
|
+
offsetBottom: 0
|
|
93
|
+
};
|
|
94
|
+
const rowHeight = Math.max(1, options?.rowHeight ?? options?.itemSize ?? 40);
|
|
95
|
+
const columns = Math.max(1, options?.columnCount ?? 1);
|
|
96
|
+
const safeViewport = Math.max(1, ctx.viewportSize);
|
|
97
|
+
const safeOverscan = Math.max(0, options?.overscan ?? ctx.overscan);
|
|
98
|
+
const startRow = Math.max(0, Math.floor(ctx.scrollOffset / rowHeight) - safeOverscan);
|
|
99
|
+
const endRow = startRow + (Math.ceil(safeViewport / rowHeight) + safeOverscan * 2);
|
|
100
|
+
const start = startRow * columns;
|
|
101
|
+
const end = Math.min(ctx.itemCount, endRow * columns);
|
|
102
|
+
const totalRows = Math.ceil(ctx.itemCount / columns);
|
|
103
|
+
const clampedStartRow = Math.floor(start / columns);
|
|
104
|
+
const renderedRows = Math.ceil((end - start) / columns);
|
|
105
|
+
return {
|
|
106
|
+
start,
|
|
107
|
+
end,
|
|
108
|
+
offsetTop: clampedStartRow * rowHeight,
|
|
109
|
+
offsetBottom: Math.max(0, (totalRows - clampedStartRow - renderedRows) * rowHeight)
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
getLayoutInfo(index, context, options) {
|
|
113
|
+
const rowHeight = Math.max(1, options?.rowHeight ?? options?.itemSize ?? 40);
|
|
114
|
+
const columns = Math.max(1, options?.columnCount ?? 1);
|
|
115
|
+
const row = Math.floor(index / columns);
|
|
116
|
+
const col = index % columns;
|
|
117
|
+
const width = Math.max(1, context.viewportWidth);
|
|
118
|
+
const cellWidth = Math.floor(width / columns);
|
|
119
|
+
return {
|
|
120
|
+
key: String(index),
|
|
121
|
+
index,
|
|
122
|
+
rect: {
|
|
123
|
+
x: col * cellWidth,
|
|
124
|
+
y: row * rowHeight,
|
|
125
|
+
width: cellWidth,
|
|
126
|
+
height: rowHeight
|
|
127
|
+
}
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
getDropTargetFromPoint(point, itemCount, options) {
|
|
131
|
+
if (itemCount <= 0) return {
|
|
132
|
+
type: "root",
|
|
133
|
+
index: -1,
|
|
134
|
+
position: "on"
|
|
135
|
+
};
|
|
136
|
+
const rowHeight = Math.max(1, options?.rowHeight ?? options?.itemSize ?? 40);
|
|
137
|
+
const columns = Math.max(1, options?.columnCount ?? 1);
|
|
138
|
+
const totalHeight = Math.ceil(itemCount / columns) * rowHeight;
|
|
139
|
+
if (point.y < 0) return {
|
|
140
|
+
type: "item",
|
|
141
|
+
index: 0,
|
|
142
|
+
position: "before"
|
|
143
|
+
};
|
|
144
|
+
if (point.y >= totalHeight) return {
|
|
145
|
+
type: "item",
|
|
146
|
+
index: itemCount - 1,
|
|
147
|
+
position: "after"
|
|
148
|
+
};
|
|
149
|
+
const cellWidth = Math.max(1, options?.viewportWidth ?? 320) / columns;
|
|
150
|
+
const row = Math.max(0, Math.floor(point.y / rowHeight));
|
|
151
|
+
const col = Math.max(0, Math.min(columns - 1, Math.floor(Math.max(0, point.x) / cellWidth)));
|
|
152
|
+
const index = Math.max(0, Math.min(itemCount - 1, row * columns + col));
|
|
153
|
+
const withinRow = Math.max(0, point.y - row * rowHeight);
|
|
154
|
+
const threshold = rowHeight / 3;
|
|
155
|
+
return {
|
|
156
|
+
type: "item",
|
|
157
|
+
index,
|
|
158
|
+
position: withinRow < threshold ? "before" : withinRow > threshold * 2 ? "after" : "on"
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
};
|
|
162
|
+
var WaterfallLayout = class extends GridLayout {
|
|
163
|
+
getVisibleRange(ctx, options) {
|
|
164
|
+
const width = Math.max(1, options?.viewportWidth ?? 320);
|
|
165
|
+
const minColumnWidth = Math.max(1, options?.minColumnWidth ?? 200);
|
|
166
|
+
const gap = Math.max(0, options?.gap ?? 0);
|
|
167
|
+
const columnCount = Math.max(1, Math.floor((width + gap) / (minColumnWidth + gap)));
|
|
168
|
+
return super.getVisibleRange(ctx, {
|
|
169
|
+
...options,
|
|
170
|
+
columnCount
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
getLayoutInfo(index, context, options) {
|
|
174
|
+
const width = Math.max(1, options?.viewportWidth ?? context.viewportWidth);
|
|
175
|
+
const minColumnWidth = Math.max(1, options?.minColumnWidth ?? 200);
|
|
176
|
+
const gap = Math.max(0, options?.gap ?? 0);
|
|
177
|
+
const columnCount = Math.max(1, Math.floor((width + gap) / (minColumnWidth + gap)));
|
|
178
|
+
return super.getLayoutInfo(index, context, {
|
|
179
|
+
...options,
|
|
180
|
+
columnCount
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
getDropTargetFromPoint(point, itemCount, options) {
|
|
184
|
+
const width = Math.max(1, options?.viewportWidth ?? 320);
|
|
185
|
+
const minColumnWidth = Math.max(1, options?.minColumnWidth ?? 200);
|
|
186
|
+
const gap = Math.max(0, options?.gap ?? 0);
|
|
187
|
+
const columnCount = Math.max(1, Math.floor((width + gap) / (minColumnWidth + gap)));
|
|
188
|
+
return super.getDropTargetFromPoint(point, itemCount, {
|
|
189
|
+
...options,
|
|
190
|
+
columnCount
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
};
|
|
194
|
+
//#endregion
|
|
195
|
+
//#region src/Virtualizer.tsx
|
|
196
|
+
/**
|
|
197
|
+
* Virtualizer primitive for solidaria-components.
|
|
198
|
+
*
|
|
199
|
+
* Phase 1 parity: provides RAC-like API and context contract with
|
|
200
|
+
* a safe non-virtualized fallback render path.
|
|
201
|
+
*/
|
|
202
|
+
var _tmpl$ = /*#__PURE__*/ template(`<div><div data-virtualizer-content>`);
|
|
203
|
+
const VirtualizerContext = createContext(null);
|
|
204
|
+
function useVirtualizerContext() {
|
|
205
|
+
return useContext(VirtualizerContext);
|
|
206
|
+
}
|
|
207
|
+
function getObjectValue(value, key) {
|
|
208
|
+
return value?.[key];
|
|
209
|
+
}
|
|
210
|
+
function isSameRange(a, b) {
|
|
211
|
+
return a.start === b.start && a.end === b.end && a.offsetTop === b.offsetTop && a.offsetBottom === b.offsetBottom;
|
|
212
|
+
}
|
|
213
|
+
function isSameLayoutInfo(a, b) {
|
|
214
|
+
return a.key === b.key && a.index === b.index && a.rect.x === b.rect.x && a.rect.y === b.rect.y && a.rect.width === b.rect.width && a.rect.height === b.rect.height;
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* A Virtualizer renders collection content under a virtualized layout contract.
|
|
218
|
+
* Current implementation supports fixed-size visible range virtualization.
|
|
219
|
+
*/
|
|
220
|
+
function Virtualizer(props) {
|
|
221
|
+
const [local, domProps] = splitProps(props, [
|
|
222
|
+
"children",
|
|
223
|
+
"layout",
|
|
224
|
+
"layoutOptions",
|
|
225
|
+
"renderDropIndicator",
|
|
226
|
+
"getDropOperation",
|
|
227
|
+
"allowsWindowScrolling",
|
|
228
|
+
"class",
|
|
229
|
+
"style"
|
|
230
|
+
]);
|
|
231
|
+
const [scrollOffset, setScrollOffset] = createSignal(0);
|
|
232
|
+
const [scrollOffsetX, setScrollOffsetX] = createSignal(0);
|
|
233
|
+
const [viewportOffset, setViewportOffset] = createSignal(0);
|
|
234
|
+
const [windowViewportSize, setWindowViewportSize] = createSignal(0);
|
|
235
|
+
const [measuredViewportSize, setMeasuredViewportSize] = createSignal(0);
|
|
236
|
+
const [measuredViewportWidth, setMeasuredViewportWidth] = createSignal(0);
|
|
237
|
+
const allowsWindowScrolling = createMemo(() => local.allowsWindowScrolling ?? true);
|
|
238
|
+
const [isScrolling, setIsScrolling] = createSignal(false);
|
|
239
|
+
const [dropTargetResolver, setDropTargetResolver] = createSignal(void 0);
|
|
240
|
+
const [dropTargetItemCountResolver, setDropTargetItemCountResolver] = createSignal(void 0);
|
|
241
|
+
const [dropTargetIndexResolver, setDropTargetIndexResolver] = createSignal(void 0);
|
|
242
|
+
const [dropOperationResolver, setDropOperationResolver] = createSignal(void 0);
|
|
243
|
+
const [keyboardNavigationOverride, setKeyboardNavigationOverride] = createSignal(void 0);
|
|
244
|
+
let containerRef;
|
|
245
|
+
const fallbackLayout = new ListLayout();
|
|
246
|
+
const visibleRangeCache = /* @__PURE__ */ new Map();
|
|
247
|
+
const layoutInfoCache = /* @__PURE__ */ new Map();
|
|
248
|
+
const layout = createMemo(() => {
|
|
249
|
+
if (typeof local.layout === "function") return new local.layout();
|
|
250
|
+
return local.layout;
|
|
251
|
+
});
|
|
252
|
+
const resolvedLayout = createMemo(() => {
|
|
253
|
+
return layout() ?? new ListLayout();
|
|
254
|
+
});
|
|
255
|
+
const resolvedLayoutOptions = createMemo(() => {
|
|
256
|
+
const fromLayout = resolvedLayout().useLayoutOptions?.();
|
|
257
|
+
if (local.layoutOptions && fromLayout) return {
|
|
258
|
+
...local.layoutOptions,
|
|
259
|
+
...fromLayout
|
|
260
|
+
};
|
|
261
|
+
return local.layoutOptions ?? fromLayout;
|
|
262
|
+
});
|
|
263
|
+
const virtualOptions = createMemo(() => resolvedLayoutOptions());
|
|
264
|
+
const layoutOptionsWithViewport = createMemo(() => {
|
|
265
|
+
const options = resolvedLayoutOptions();
|
|
266
|
+
if (options && typeof options === "object") return {
|
|
267
|
+
...options,
|
|
268
|
+
viewportWidth: measuredViewportWidth()
|
|
269
|
+
};
|
|
270
|
+
return { viewportWidth: measuredViewportWidth() };
|
|
271
|
+
});
|
|
272
|
+
const itemSize = createMemo(() => getObjectValue(virtualOptions(), "itemSize") ?? 40);
|
|
273
|
+
const overscan = createMemo(() => getObjectValue(virtualOptions(), "overscan") ?? 2);
|
|
274
|
+
const orientation = createMemo(() => getObjectValue(virtualOptions(), "orientation") ?? "vertical");
|
|
275
|
+
const viewportSize = createMemo(() => {
|
|
276
|
+
const explicit = getObjectValue(virtualOptions(), "viewportSize");
|
|
277
|
+
if (explicit != null) return explicit;
|
|
278
|
+
const elementSize = measuredViewportSize() ?? 0;
|
|
279
|
+
if (allowsWindowScrolling()) return Math.max(0, Math.min(elementSize - viewportOffset(), windowViewportSize()));
|
|
280
|
+
return elementSize;
|
|
281
|
+
});
|
|
282
|
+
const effectiveScrollOffset = createMemo(() => allowsWindowScrolling() ? scrollOffset() + viewportOffset() : scrollOffset());
|
|
283
|
+
const mainScrollOffset = createMemo(() => orientation() === "horizontal" ? scrollOffsetX() : effectiveScrollOffset());
|
|
284
|
+
const mainViewportSize = createMemo(() => {
|
|
285
|
+
if (orientation() !== "horizontal") return viewportSize();
|
|
286
|
+
const explicit = getObjectValue(virtualOptions(), "viewportSize");
|
|
287
|
+
return explicit != null ? explicit : measuredViewportWidth();
|
|
288
|
+
});
|
|
289
|
+
const getVisibleRange = (itemCount) => {
|
|
290
|
+
const ctx = {
|
|
291
|
+
itemCount,
|
|
292
|
+
scrollOffset: mainScrollOffset(),
|
|
293
|
+
viewportSize: mainViewportSize(),
|
|
294
|
+
overscan: overscan(),
|
|
295
|
+
viewportWidth: measuredViewportWidth()
|
|
296
|
+
};
|
|
297
|
+
const nextRange = resolvedLayout().getVisibleRange?.(ctx, layoutOptionsWithViewport()) ?? calculateLinearVisibleRange(itemCount, ctx.scrollOffset, ctx.viewportSize, itemSize(), ctx.overscan);
|
|
298
|
+
const cachedRange = visibleRangeCache.get(itemCount);
|
|
299
|
+
if (cachedRange && isSameRange(cachedRange, nextRange)) return cachedRange;
|
|
300
|
+
visibleRangeCache.set(itemCount, nextRange);
|
|
301
|
+
return nextRange;
|
|
302
|
+
};
|
|
303
|
+
const getLayoutInfo = (index) => {
|
|
304
|
+
const ctx = {
|
|
305
|
+
viewportWidth: measuredViewportWidth(),
|
|
306
|
+
viewportHeight: measuredViewportSize()
|
|
307
|
+
};
|
|
308
|
+
const nextInfo = resolvedLayout().getLayoutInfo?.(index, ctx, layoutOptionsWithViewport()) ?? (orientation() === "horizontal" ? {
|
|
309
|
+
key: String(index),
|
|
310
|
+
index,
|
|
311
|
+
rect: {
|
|
312
|
+
x: index * itemSize(),
|
|
313
|
+
y: 0,
|
|
314
|
+
width: itemSize(),
|
|
315
|
+
height: Math.max(0, measuredViewportSize())
|
|
316
|
+
}
|
|
317
|
+
} : {
|
|
318
|
+
key: String(index),
|
|
319
|
+
index,
|
|
320
|
+
rect: {
|
|
321
|
+
x: 0,
|
|
322
|
+
y: index * itemSize(),
|
|
323
|
+
width: Math.max(0, measuredViewportWidth()),
|
|
324
|
+
height: itemSize()
|
|
325
|
+
}
|
|
326
|
+
});
|
|
327
|
+
const cachedInfo = layoutInfoCache.get(index);
|
|
328
|
+
if (cachedInfo && isSameLayoutInfo(cachedInfo, nextInfo)) return cachedInfo;
|
|
329
|
+
layoutInfoCache.set(index, nextInfo);
|
|
330
|
+
return nextInfo;
|
|
331
|
+
};
|
|
332
|
+
const getDropTargetFromPoint = (point, itemCount) => {
|
|
333
|
+
const target = resolvedLayout().getDropTargetFromPoint?.(point, itemCount, layoutOptionsWithViewport()) ?? fallbackLayout.getDropTargetFromPoint(point, itemCount, virtualOptions());
|
|
334
|
+
if (!target) return null;
|
|
335
|
+
const resolver = dropTargetResolver();
|
|
336
|
+
return resolver ? resolver(target) : target;
|
|
337
|
+
};
|
|
338
|
+
const assignDropTargetResolver = (resolver) => {
|
|
339
|
+
setDropTargetResolver(() => resolver);
|
|
340
|
+
};
|
|
341
|
+
const assignDropTargetItemCountResolver = (resolver) => {
|
|
342
|
+
setDropTargetItemCountResolver(() => resolver);
|
|
343
|
+
};
|
|
344
|
+
const assignDropTargetIndexResolver = (resolver) => {
|
|
345
|
+
setDropTargetIndexResolver(() => resolver);
|
|
346
|
+
};
|
|
347
|
+
const assignDropOperationResolver = (resolver) => {
|
|
348
|
+
setDropOperationResolver(() => resolver);
|
|
349
|
+
};
|
|
350
|
+
const assignKeyboardNavigationOverride = (override) => {
|
|
351
|
+
setKeyboardNavigationOverride(() => override);
|
|
352
|
+
};
|
|
353
|
+
const toCollectionDropTarget = (target) => {
|
|
354
|
+
if (target.type === "root") return { type: "root" };
|
|
355
|
+
return {
|
|
356
|
+
type: "item",
|
|
357
|
+
key: target.key ?? target.index,
|
|
358
|
+
dropPosition: target.position
|
|
359
|
+
};
|
|
360
|
+
};
|
|
361
|
+
const getCollectionDropTargetFromPoint = (x, y, isValidDropTarget) => {
|
|
362
|
+
const itemCount = dropTargetItemCountResolver()?.() ?? 0;
|
|
363
|
+
const virtualTarget = getDropTargetFromPoint({
|
|
364
|
+
x,
|
|
365
|
+
y
|
|
366
|
+
}, itemCount);
|
|
367
|
+
if (!virtualTarget) return null;
|
|
368
|
+
const mappedTarget = toCollectionDropTarget(virtualTarget);
|
|
369
|
+
if (isValidDropTarget(mappedTarget)) return mappedTarget;
|
|
370
|
+
if (mappedTarget.type === "item") {
|
|
371
|
+
const alternatePositions = mappedTarget.dropPosition === "on" ? ["before", "after"] : mappedTarget.dropPosition === "before" ? ["on", "after"] : ["on", "before"];
|
|
372
|
+
for (const position of alternatePositions) {
|
|
373
|
+
const alternateTarget = {
|
|
374
|
+
...mappedTarget,
|
|
375
|
+
dropPosition: position
|
|
376
|
+
};
|
|
377
|
+
if (isValidDropTarget(alternateTarget)) return alternateTarget;
|
|
378
|
+
}
|
|
379
|
+
const rootTarget = { type: "root" };
|
|
380
|
+
if (isValidDropTarget(rootTarget)) return rootTarget;
|
|
381
|
+
}
|
|
382
|
+
return null;
|
|
383
|
+
};
|
|
384
|
+
const getCollectionDropOperation = (target, types, allowedOperations) => {
|
|
385
|
+
const resolver = dropOperationResolver() ?? local.getDropOperation;
|
|
386
|
+
if (resolver) return resolver(target, types, allowedOperations);
|
|
387
|
+
if (allowedOperations.length === 0) return "cancel";
|
|
388
|
+
if (target.type === "root") {
|
|
389
|
+
if (allowedOperations.includes("copy")) return "copy";
|
|
390
|
+
if (allowedOperations.includes("move")) return "move";
|
|
391
|
+
} else if (target.dropPosition === "on") {
|
|
392
|
+
if (allowedOperations.includes("copy")) return "copy";
|
|
393
|
+
if (allowedOperations.includes("move")) return "move";
|
|
394
|
+
} else {
|
|
395
|
+
if (allowedOperations.includes("move")) return "move";
|
|
396
|
+
if (allowedOperations.includes("copy")) return "copy";
|
|
397
|
+
}
|
|
398
|
+
if (allowedOperations.includes("link")) return "link";
|
|
399
|
+
return allowedOperations.find((operation) => operation !== "cancel") ?? "cancel";
|
|
400
|
+
};
|
|
401
|
+
const getBaseKeyboardNavigationTarget = (target, direction, isValidDropTarget) => {
|
|
402
|
+
const itemCount = dropTargetItemCountResolver()?.() ?? 0;
|
|
403
|
+
if (itemCount <= 0) {
|
|
404
|
+
const rootTarget = { type: "root" };
|
|
405
|
+
return isValidDropTarget(rootTarget) ? rootTarget : null;
|
|
406
|
+
}
|
|
407
|
+
const resolveCurrentIndex = (currentTarget) => {
|
|
408
|
+
if (!currentTarget || currentTarget.type === "root") return null;
|
|
409
|
+
const resolver = dropTargetIndexResolver();
|
|
410
|
+
if (resolver) {
|
|
411
|
+
const fromResolver = resolver(currentTarget.key);
|
|
412
|
+
if (fromResolver != null && fromResolver >= 0 && fromResolver < itemCount) return fromResolver;
|
|
413
|
+
return null;
|
|
414
|
+
}
|
|
415
|
+
if (typeof currentTarget.key === "number" && currentTarget.key >= 0 && currentTarget.key < itemCount) return currentTarget.key;
|
|
416
|
+
return null;
|
|
417
|
+
};
|
|
418
|
+
const getCurrentIndex = (currentTarget) => {
|
|
419
|
+
if (!currentTarget || currentTarget.type === "root") return direction === "next" ? -1 : itemCount;
|
|
420
|
+
const resolvedIndex = resolveCurrentIndex(currentTarget);
|
|
421
|
+
if (resolvedIndex != null) return resolvedIndex;
|
|
422
|
+
return direction === "next" ? -1 : itemCount;
|
|
423
|
+
};
|
|
424
|
+
const tryCurrentItemTransition = (currentTarget) => {
|
|
425
|
+
if (!currentTarget || currentTarget.type !== "item") return null;
|
|
426
|
+
const tryPosition = (position) => {
|
|
427
|
+
if (currentTarget.dropPosition === position) return null;
|
|
428
|
+
const nextTarget = {
|
|
429
|
+
type: "item",
|
|
430
|
+
key: currentTarget.key,
|
|
431
|
+
dropPosition: position
|
|
432
|
+
};
|
|
433
|
+
return isValidDropTarget(nextTarget) ? nextTarget : null;
|
|
434
|
+
};
|
|
435
|
+
if (direction === "next") {
|
|
436
|
+
if (currentTarget.dropPosition === "before") return tryPosition("on") ?? tryPosition("after");
|
|
437
|
+
if (currentTarget.dropPosition === "on") return tryPosition("after");
|
|
438
|
+
} else {
|
|
439
|
+
if (currentTarget.dropPosition === "after") return tryPosition("on") ?? tryPosition("before");
|
|
440
|
+
if (currentTarget.dropPosition === "on") return tryPosition("before");
|
|
441
|
+
}
|
|
442
|
+
return null;
|
|
443
|
+
};
|
|
444
|
+
const scanFromIndex = (startIndex, step, directionForInsertion) => {
|
|
445
|
+
for (let index = startIndex; index >= 0 && index < itemCount; index += step) {
|
|
446
|
+
const onTarget = tryTarget(index, "on");
|
|
447
|
+
if (onTarget) return onTarget;
|
|
448
|
+
const insertionOrder = directionForInsertion === "next" ? ["before", "after"] : ["after", "before"];
|
|
449
|
+
for (const position of insertionOrder) {
|
|
450
|
+
const insertionTarget = tryTarget(index, position);
|
|
451
|
+
if (insertionTarget) return insertionTarget;
|
|
452
|
+
}
|
|
453
|
+
}
|
|
454
|
+
return null;
|
|
455
|
+
};
|
|
456
|
+
const findNavigationTarget = (currentIndex, step = 1) => {
|
|
457
|
+
const delta = direction === "next" ? 1 : -1;
|
|
458
|
+
const nextStart = currentIndex + delta * Math.max(1, step);
|
|
459
|
+
const clampedStart = Math.max(0, Math.min(itemCount - 1, nextStart));
|
|
460
|
+
if (nextStart < 0 || nextStart >= itemCount) {
|
|
461
|
+
const rootTarget = { type: "root" };
|
|
462
|
+
return isValidDropTarget(rootTarget) ? rootTarget : null;
|
|
463
|
+
}
|
|
464
|
+
const primaryTarget = scanFromIndex(clampedStart, delta, direction);
|
|
465
|
+
if (primaryTarget) return primaryTarget;
|
|
466
|
+
const oppositeDirection = direction === "next" ? "previous" : "next";
|
|
467
|
+
const oppositeTarget = scanFromIndex(clampedStart - delta, -delta, oppositeDirection);
|
|
468
|
+
if (oppositeTarget) return oppositeTarget;
|
|
469
|
+
const rootTarget = { type: "root" };
|
|
470
|
+
return isValidDropTarget(rootTarget) ? rootTarget : null;
|
|
471
|
+
};
|
|
472
|
+
const tryTarget = (index, position) => {
|
|
473
|
+
const layoutInfo = getLayoutInfo(index);
|
|
474
|
+
const virtualTarget = getDropTargetFromPoint({
|
|
475
|
+
x: layoutInfo.rect.x + 1,
|
|
476
|
+
y: layoutInfo.rect.y + layoutInfo.rect.height / 2
|
|
477
|
+
}, itemCount);
|
|
478
|
+
if (!virtualTarget || virtualTarget.type === "root") return null;
|
|
479
|
+
const nextTarget = toCollectionDropTarget({
|
|
480
|
+
...virtualTarget,
|
|
481
|
+
position
|
|
482
|
+
});
|
|
483
|
+
return isValidDropTarget(nextTarget) ? nextTarget : null;
|
|
484
|
+
};
|
|
485
|
+
const tryBoundaryTarget = (boundaryDirection) => {
|
|
486
|
+
const boundaryIndex = boundaryDirection === "next" ? 0 : itemCount - 1;
|
|
487
|
+
const boundaryOrder = boundaryDirection === "next" ? [
|
|
488
|
+
"before",
|
|
489
|
+
"on",
|
|
490
|
+
"after"
|
|
491
|
+
] : [
|
|
492
|
+
"after",
|
|
493
|
+
"on",
|
|
494
|
+
"before"
|
|
495
|
+
];
|
|
496
|
+
for (const position of boundaryOrder) {
|
|
497
|
+
const candidate = tryTarget(boundaryIndex, position);
|
|
498
|
+
if (candidate) return candidate;
|
|
499
|
+
}
|
|
500
|
+
return null;
|
|
501
|
+
};
|
|
502
|
+
const directTransition = resolveCurrentIndex(target) != null ? tryCurrentItemTransition(target) : null;
|
|
503
|
+
if (directTransition) return directTransition;
|
|
504
|
+
if (!target || target.type === "root") {
|
|
505
|
+
const boundaryTarget = tryBoundaryTarget(direction);
|
|
506
|
+
if (boundaryTarget) return boundaryTarget;
|
|
507
|
+
const rootTarget = { type: "root" };
|
|
508
|
+
return isValidDropTarget(rootTarget) ? rootTarget : null;
|
|
509
|
+
}
|
|
510
|
+
const currentIndex = getCurrentIndex(target);
|
|
511
|
+
const nextStart = currentIndex + (direction === "next" ? 1 : -1);
|
|
512
|
+
if (nextStart < 0 || nextStart >= itemCount) {
|
|
513
|
+
const rootTarget = { type: "root" };
|
|
514
|
+
if (isValidDropTarget(rootTarget)) return rootTarget;
|
|
515
|
+
const wrappedBoundary = tryBoundaryTarget(direction);
|
|
516
|
+
if (wrappedBoundary) return wrappedBoundary;
|
|
517
|
+
return null;
|
|
518
|
+
}
|
|
519
|
+
return findNavigationTarget(currentIndex, 1);
|
|
520
|
+
};
|
|
521
|
+
const getKeyboardNavigationTarget = (target, direction, isValidDropTarget) => {
|
|
522
|
+
const override = keyboardNavigationOverride();
|
|
523
|
+
if (override) return override(target, direction, isValidDropTarget);
|
|
524
|
+
return getBaseKeyboardNavigationTarget(target, direction, isValidDropTarget);
|
|
525
|
+
};
|
|
526
|
+
const getKeyboardPageNavigationTarget = (target, direction, isValidDropTarget) => {
|
|
527
|
+
const itemCount = dropTargetItemCountResolver()?.() ?? 0;
|
|
528
|
+
if (itemCount <= 0) {
|
|
529
|
+
const rootTarget = { type: "root" };
|
|
530
|
+
return isValidDropTarget(rootTarget) ? rootTarget : null;
|
|
531
|
+
}
|
|
532
|
+
if (!target || target.type === "root") {
|
|
533
|
+
const startIndex = direction === "next" ? 0 : itemCount - 1;
|
|
534
|
+
const delta = direction === "next" ? 1 : -1;
|
|
535
|
+
const boundaryOrder = direction === "next" ? [
|
|
536
|
+
"before",
|
|
537
|
+
"on",
|
|
538
|
+
"after"
|
|
539
|
+
] : [
|
|
540
|
+
"after",
|
|
541
|
+
"on",
|
|
542
|
+
"before"
|
|
543
|
+
];
|
|
544
|
+
for (let index = startIndex; index >= 0 && index < itemCount; index += delta) {
|
|
545
|
+
const layoutInfo = getLayoutInfo(index);
|
|
546
|
+
const virtualTarget = getDropTargetFromPoint({
|
|
547
|
+
x: layoutInfo.rect.x + 1,
|
|
548
|
+
y: layoutInfo.rect.y + layoutInfo.rect.height / 2
|
|
549
|
+
}, itemCount);
|
|
550
|
+
if (!virtualTarget || virtualTarget.type === "root") continue;
|
|
551
|
+
for (const position of boundaryOrder) {
|
|
552
|
+
const candidate = toCollectionDropTarget({
|
|
553
|
+
...virtualTarget,
|
|
554
|
+
position
|
|
555
|
+
});
|
|
556
|
+
if (isValidDropTarget(candidate)) return candidate;
|
|
557
|
+
}
|
|
558
|
+
}
|
|
559
|
+
const rootTarget = { type: "root" };
|
|
560
|
+
return isValidDropTarget(rootTarget) ? rootTarget : null;
|
|
561
|
+
}
|
|
562
|
+
const resolver = dropTargetIndexResolver();
|
|
563
|
+
const resolvedIndex = resolver?.(target.key);
|
|
564
|
+
const currentIndex = resolvedIndex != null ? resolvedIndex : resolver ? direction === "next" ? -1 : itemCount : typeof target.key === "number" ? target.key : direction === "next" ? -1 : itemCount;
|
|
565
|
+
const pageSize = Math.max(1, Math.floor(mainViewportSize() / Math.max(1, itemSize())));
|
|
566
|
+
const delta = direction === "next" ? 1 : -1;
|
|
567
|
+
const nextStart = currentIndex + delta * pageSize;
|
|
568
|
+
const clampedStart = Math.max(0, Math.min(itemCount - 1, nextStart));
|
|
569
|
+
const tryTarget = (index, position) => {
|
|
570
|
+
const layoutInfo = getLayoutInfo(index);
|
|
571
|
+
const virtualTarget = getDropTargetFromPoint({
|
|
572
|
+
x: layoutInfo.rect.x + 1,
|
|
573
|
+
y: layoutInfo.rect.y + layoutInfo.rect.height / 2
|
|
574
|
+
}, itemCount);
|
|
575
|
+
if (!virtualTarget || virtualTarget.type === "root") return null;
|
|
576
|
+
const nextTarget = toCollectionDropTarget({
|
|
577
|
+
...virtualTarget,
|
|
578
|
+
position
|
|
579
|
+
});
|
|
580
|
+
return isValidDropTarget(nextTarget) ? nextTarget : null;
|
|
581
|
+
};
|
|
582
|
+
const scanFromIndex = (startIndex, step) => {
|
|
583
|
+
const insertionOrder = step > 0 ? ["before", "after"] : ["after", "before"];
|
|
584
|
+
for (let index = startIndex; index >= 0 && index < itemCount; index += step) {
|
|
585
|
+
const onTarget = tryTarget(index, "on");
|
|
586
|
+
if (onTarget) return onTarget;
|
|
587
|
+
for (const position of insertionOrder) {
|
|
588
|
+
const insertionTarget = tryTarget(index, position);
|
|
589
|
+
if (insertionTarget) return insertionTarget;
|
|
590
|
+
}
|
|
591
|
+
}
|
|
592
|
+
return null;
|
|
593
|
+
};
|
|
594
|
+
if (nextStart < 0 || nextStart >= itemCount) {
|
|
595
|
+
if (direction === "next") {
|
|
596
|
+
const endBoundaryTarget = tryTarget(itemCount - 1, "after") ?? tryTarget(itemCount - 1, "on") ?? tryTarget(itemCount - 1, "before");
|
|
597
|
+
if (endBoundaryTarget) return endBoundaryTarget;
|
|
598
|
+
const backwardFallback = scanFromIndex(itemCount - 1, -1);
|
|
599
|
+
if (backwardFallback) return backwardFallback;
|
|
600
|
+
} else {
|
|
601
|
+
if (currentIndex <= 0) {
|
|
602
|
+
const rootTarget = { type: "root" };
|
|
603
|
+
if (isValidDropTarget(rootTarget)) return rootTarget;
|
|
604
|
+
}
|
|
605
|
+
const startBoundaryTarget = tryTarget(0, "before") ?? tryTarget(0, "on") ?? tryTarget(0, "after");
|
|
606
|
+
if (startBoundaryTarget) return startBoundaryTarget;
|
|
607
|
+
const forwardFallback = scanFromIndex(0, 1);
|
|
608
|
+
if (forwardFallback) return forwardFallback;
|
|
609
|
+
}
|
|
610
|
+
const rootTarget = { type: "root" };
|
|
611
|
+
return isValidDropTarget(rootTarget) ? rootTarget : null;
|
|
612
|
+
}
|
|
613
|
+
const primaryTarget = scanFromIndex(clampedStart, delta);
|
|
614
|
+
if (primaryTarget) return primaryTarget;
|
|
615
|
+
const oppositeTarget = scanFromIndex(clampedStart - delta, -delta);
|
|
616
|
+
if (oppositeTarget) return oppositeTarget;
|
|
617
|
+
const rootTarget = { type: "root" };
|
|
618
|
+
return isValidDropTarget(rootTarget) ? rootTarget : null;
|
|
619
|
+
};
|
|
620
|
+
const contextValue = createMemo(() => ({
|
|
621
|
+
layout: resolvedLayout(),
|
|
622
|
+
layoutOptions: resolvedLayoutOptions(),
|
|
623
|
+
isVirtualized: true,
|
|
624
|
+
orientation: orientation(),
|
|
625
|
+
getVisibleRange,
|
|
626
|
+
getLayoutInfo,
|
|
627
|
+
getDropTargetFromPoint,
|
|
628
|
+
setDropTargetResolver: assignDropTargetResolver,
|
|
629
|
+
setDropTargetItemCountResolver: assignDropTargetItemCountResolver,
|
|
630
|
+
setDropTargetIndexResolver: assignDropTargetIndexResolver,
|
|
631
|
+
setDropOperationResolver: assignDropOperationResolver,
|
|
632
|
+
setKeyboardNavigationOverride: assignKeyboardNavigationOverride,
|
|
633
|
+
getBaseKeyboardNavigationTarget
|
|
634
|
+
}));
|
|
635
|
+
const collectionRenderer = createMemo(() => ({
|
|
636
|
+
renderItem: (item) => item,
|
|
637
|
+
isVirtualized: true,
|
|
638
|
+
layoutDelegate: resolvedLayout(),
|
|
639
|
+
dropTargetDelegate: {
|
|
640
|
+
getDropTargetFromPoint: getCollectionDropTargetFromPoint,
|
|
641
|
+
getDropOperation: getCollectionDropOperation,
|
|
642
|
+
getKeyboardNavigationTarget,
|
|
643
|
+
getKeyboardPageNavigationTarget
|
|
644
|
+
},
|
|
645
|
+
renderDropIndicator: local.renderDropIndicator
|
|
646
|
+
}));
|
|
647
|
+
const filteredDomProps = createMemo(() => filterDOMProps(domProps, { global: true }));
|
|
648
|
+
const updateViewportSize = () => {
|
|
649
|
+
if (!containerRef) return;
|
|
650
|
+
const nextHeight = containerRef.clientHeight;
|
|
651
|
+
const nextWidth = containerRef.clientWidth;
|
|
652
|
+
if (nextHeight !== measuredViewportSize()) setMeasuredViewportSize(nextHeight);
|
|
653
|
+
if (nextWidth !== measuredViewportWidth()) setMeasuredViewportWidth(nextWidth);
|
|
654
|
+
};
|
|
655
|
+
const updateWindowViewport = () => {
|
|
656
|
+
if (typeof window === "undefined") return;
|
|
657
|
+
const next = window.innerHeight;
|
|
658
|
+
if (next !== windowViewportSize()) setWindowViewportSize(next);
|
|
659
|
+
};
|
|
660
|
+
const updateViewportOffset = () => {
|
|
661
|
+
if (!containerRef || !allowsWindowScrolling()) return;
|
|
662
|
+
const rect = containerRef.getBoundingClientRect();
|
|
663
|
+
const next = rect.y < 0 ? -rect.y : 0;
|
|
664
|
+
if (next !== viewportOffset()) setViewportOffset(next);
|
|
665
|
+
};
|
|
666
|
+
let scrollFrame;
|
|
667
|
+
let scrollEndTimeout;
|
|
668
|
+
onCleanup(() => {
|
|
669
|
+
if (scrollFrame != null) cancelAnimationFrame(scrollFrame);
|
|
670
|
+
if (scrollEndTimeout != null) clearTimeout(scrollEndTimeout);
|
|
671
|
+
});
|
|
672
|
+
onMount(() => {
|
|
673
|
+
updateViewportSize();
|
|
674
|
+
updateWindowViewport();
|
|
675
|
+
updateViewportOffset();
|
|
676
|
+
const handleResize = () => {
|
|
677
|
+
updateViewportSize();
|
|
678
|
+
updateWindowViewport();
|
|
679
|
+
updateViewportOffset();
|
|
680
|
+
};
|
|
681
|
+
window.addEventListener("resize", handleResize);
|
|
682
|
+
const resizeObserver = typeof ResizeObserver !== "undefined" ? new ResizeObserver(() => updateViewportSize()) : null;
|
|
683
|
+
if (containerRef && resizeObserver) resizeObserver.observe(containerRef);
|
|
684
|
+
const handleDocumentScroll = (e) => {
|
|
685
|
+
if (!containerRef) return;
|
|
686
|
+
const target = e.target;
|
|
687
|
+
const isContainer = target === containerRef;
|
|
688
|
+
const isAncestor = target === document || target === window || target instanceof Node && target.contains(containerRef);
|
|
689
|
+
if (!isContainer && !isAncestor) return;
|
|
690
|
+
if (!isContainer && !allowsWindowScrolling()) return;
|
|
691
|
+
if (!isScrolling()) setIsScrolling(true);
|
|
692
|
+
if (scrollEndTimeout != null) clearTimeout(scrollEndTimeout);
|
|
693
|
+
scrollEndTimeout = setTimeout(() => {
|
|
694
|
+
scrollEndTimeout = void 0;
|
|
695
|
+
setIsScrolling(false);
|
|
696
|
+
}, 300);
|
|
697
|
+
if (scrollFrame != null) cancelAnimationFrame(scrollFrame);
|
|
698
|
+
scrollFrame = requestAnimationFrame(() => {
|
|
699
|
+
scrollFrame = void 0;
|
|
700
|
+
if (isContainer) {
|
|
701
|
+
const next = Math.max(0, containerRef.scrollTop);
|
|
702
|
+
if (next !== scrollOffset()) setScrollOffset(next);
|
|
703
|
+
const nextX = Math.max(0, containerRef.scrollLeft);
|
|
704
|
+
if (nextX !== scrollOffsetX()) setScrollOffsetX(nextX);
|
|
705
|
+
} else updateViewportOffset();
|
|
706
|
+
updateViewportSize();
|
|
707
|
+
});
|
|
708
|
+
};
|
|
709
|
+
document.addEventListener("scroll", handleDocumentScroll, true);
|
|
710
|
+
onCleanup(() => {
|
|
711
|
+
window.removeEventListener("resize", handleResize);
|
|
712
|
+
resizeObserver?.disconnect();
|
|
713
|
+
document.removeEventListener("scroll", handleDocumentScroll, true);
|
|
714
|
+
});
|
|
715
|
+
});
|
|
716
|
+
return createComponent(CollectionRendererContext.Provider, {
|
|
717
|
+
get value() {
|
|
718
|
+
return collectionRenderer();
|
|
719
|
+
},
|
|
720
|
+
get children() {
|
|
721
|
+
return createComponent(VirtualizerContext.Provider, {
|
|
722
|
+
get value() {
|
|
723
|
+
return contextValue();
|
|
724
|
+
},
|
|
725
|
+
get children() {
|
|
726
|
+
var _el$ = getNextElement(_tmpl$), _el$2 = _el$.firstChild;
|
|
727
|
+
use((el) => {
|
|
728
|
+
containerRef = el;
|
|
729
|
+
}, _el$);
|
|
730
|
+
spread(_el$, mergeProps(filteredDomProps, {
|
|
731
|
+
get ["class"]() {
|
|
732
|
+
return local.class;
|
|
733
|
+
},
|
|
734
|
+
get style() {
|
|
735
|
+
return local.style;
|
|
736
|
+
},
|
|
737
|
+
"data-virtualizer": ""
|
|
738
|
+
}), false, true);
|
|
739
|
+
insert(_el$2, () => local.children);
|
|
740
|
+
effect((_$p) => setStyleProperty(_el$2, "pointer-events", isScrolling() ? "none" : void 0));
|
|
741
|
+
runHydrationEvents();
|
|
742
|
+
return _el$;
|
|
743
|
+
}
|
|
744
|
+
});
|
|
745
|
+
}
|
|
746
|
+
});
|
|
747
|
+
}
|
|
748
|
+
//#endregion
|
|
749
|
+
export { ListLayout as a, GridLayout as i, VirtualizerContext as n, TableLayout as o, useVirtualizerContext as r, WaterfallLayout as s, Virtualizer as t };
|
|
750
|
+
|
|
751
|
+
//# sourceMappingURL=Virtualizer2.js.map
|