react-native-layout-dnd 0.1.0-alpha.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/LICENSE +20 -0
- package/README.md +262 -0
- package/lib/module/adapters/coordinates.js +135 -0
- package/lib/module/adapters/coordinates.js.map +1 -0
- package/lib/module/adapters/scroll.js +81 -0
- package/lib/module/adapters/scroll.js.map +1 -0
- package/lib/module/adapters/virtualizedList.js +69 -0
- package/lib/module/adapters/virtualizedList.js.map +1 -0
- package/lib/module/components/DndProvider.js +1144 -0
- package/lib/module/components/DndProvider.js.map +1 -0
- package/lib/module/components/DragHandle.js +65 -0
- package/lib/module/components/DragHandle.js.map +1 -0
- package/lib/module/components/GridController.js +151 -0
- package/lib/module/components/GridController.js.map +1 -0
- package/lib/module/components/GridDragHandle.js +15 -0
- package/lib/module/components/GridDragHandle.js.map +1 -0
- package/lib/module/components/GridZoneView.js +59 -0
- package/lib/module/components/GridZoneView.js.map +1 -0
- package/lib/module/components/SortableGrid.js +305 -0
- package/lib/module/components/SortableGrid.js.map +1 -0
- package/lib/module/components/SortableList.js +714 -0
- package/lib/module/components/SortableList.js.map +1 -0
- package/lib/module/components/dndTypes.js +4 -0
- package/lib/module/components/dndTypes.js.map +1 -0
- package/lib/module/components/gridTypes.js +4 -0
- package/lib/module/components/gridTypes.js.map +1 -0
- package/lib/module/components/handleViewProps.js +13 -0
- package/lib/module/components/handleViewProps.js.map +1 -0
- package/lib/module/contracts.js +4 -0
- package/lib/module/contracts.js.map +1 -0
- package/lib/module/controller/approval.js +98 -0
- package/lib/module/controller/approval.js.map +1 -0
- package/lib/module/controller/coordinatorBase.js +93 -0
- package/lib/module/controller/coordinatorBase.js.map +1 -0
- package/lib/module/controller/dndSession.js +621 -0
- package/lib/module/controller/dndSession.js.map +1 -0
- package/lib/module/controller/dndState.js +103 -0
- package/lib/module/controller/dndState.js.map +1 -0
- package/lib/module/controller/gridAdapter.js +191 -0
- package/lib/module/controller/gridAdapter.js.map +1 -0
- package/lib/module/controller/gridState.js +101 -0
- package/lib/module/controller/gridState.js.map +1 -0
- package/lib/module/controller/locations.js +48 -0
- package/lib/module/controller/locations.js.map +1 -0
- package/lib/module/controller/previewPath.js +73 -0
- package/lib/module/controller/previewPath.js.map +1 -0
- package/lib/module/controller/sessionCore.js +222 -0
- package/lib/module/controller/sessionCore.js.map +1 -0
- package/lib/module/controller/useDndState.js +9 -0
- package/lib/module/controller/useDndState.js.map +1 -0
- package/lib/module/controller/useGridState.js +9 -0
- package/lib/module/controller/useGridState.js.map +1 -0
- package/lib/module/controller/useStoreState.js +15 -0
- package/lib/module/controller/useStoreState.js.map +1 -0
- package/lib/module/defaults.js +7 -0
- package/lib/module/defaults.js.map +1 -0
- package/lib/module/diagnostics.js +16 -0
- package/lib/module/diagnostics.js.map +1 -0
- package/lib/module/engine/gridPlacements.js +54 -0
- package/lib/module/engine/gridPlacements.js.map +1 -0
- package/lib/module/engine/index.js +19 -0
- package/lib/module/engine/index.js.map +1 -0
- package/lib/module/engine/layout.js +36 -0
- package/lib/module/engine/layout.js.map +1 -0
- package/lib/module/engine/layoutMove.js +326 -0
- package/lib/module/engine/layoutMove.js.map +1 -0
- package/lib/module/engine/layoutState.js +344 -0
- package/lib/module/engine/layoutState.js.map +1 -0
- package/lib/module/engine/list.js +172 -0
- package/lib/module/engine/list.js.map +1 -0
- package/lib/module/engine/listIndex.js +125 -0
- package/lib/module/engine/listIndex.js.map +1 -0
- package/lib/module/engine/move.js +216 -0
- package/lib/module/engine/move.js.map +1 -0
- package/lib/module/engine/movementPolicy.js +77 -0
- package/lib/module/engine/movementPolicy.js.map +1 -0
- package/lib/module/engine/orderedTarget.js +71 -0
- package/lib/module/engine/orderedTarget.js.map +1 -0
- package/lib/module/engine/pack.js +30 -0
- package/lib/module/engine/pack.js.map +1 -0
- package/lib/module/engine/rectangles.js +12 -0
- package/lib/module/engine/rectangles.js.map +1 -0
- package/lib/module/engine/sameLayout.js +29 -0
- package/lib/module/engine/sameLayout.js.map +1 -0
- package/lib/module/engine/search.js +159 -0
- package/lib/module/engine/search.js.map +1 -0
- package/lib/module/engine/spatial.js +27 -0
- package/lib/module/engine/spatial.js.map +1 -0
- package/lib/module/engine/spatialAppRotation.js +39 -0
- package/lib/module/engine/spatialAppRotation.js.map +1 -0
- package/lib/module/engine/spatialExchange.js +164 -0
- package/lib/module/engine/spatialExchange.js.map +1 -0
- package/lib/module/engine/spatialInsertion.js +135 -0
- package/lib/module/engine/spatialInsertion.js.map +1 -0
- package/lib/module/engine/spatialPolicy.js +41 -0
- package/lib/module/engine/spatialPolicy.js.map +1 -0
- package/lib/module/engine/spatialRotation.js +48 -0
- package/lib/module/engine/spatialRotation.js.map +1 -0
- package/lib/module/engine/validation.js +205 -0
- package/lib/module/engine/validation.js.map +1 -0
- package/lib/module/gesture/DndGestureGroup.js +268 -0
- package/lib/module/gesture/DndGestureGroup.js.map +1 -0
- package/lib/module/gesture/DndGestureHost.js +32 -0
- package/lib/module/gesture/DndGestureHost.js.map +1 -0
- package/lib/module/gesture/gestureConfig.js +81 -0
- package/lib/module/gesture/gestureConfig.js.map +1 -0
- package/lib/module/gesture/gestureGrouping.js +122 -0
- package/lib/module/gesture/gestureGrouping.js.map +1 -0
- package/lib/module/gesture/gestureHost.js +106 -0
- package/lib/module/gesture/gestureHost.js.map +1 -0
- package/lib/module/index.js +23 -0
- package/lib/module/index.js.map +1 -0
- package/lib/module/package.json +1 -0
- package/lib/module/pointer/dndTarget.js +101 -0
- package/lib/module/pointer/dndTarget.js.map +1 -0
- package/lib/module/pointer/geometry.js +363 -0
- package/lib/module/pointer/geometry.js.map +1 -0
- package/lib/module/pointer/layoutTarget.js +307 -0
- package/lib/module/pointer/layoutTarget.js.map +1 -0
- package/lib/module/pointer/listCellMotion.js +99 -0
- package/lib/module/pointer/listCellMotion.js.map +1 -0
- package/lib/module/pointer/listTarget.js +42 -0
- package/lib/module/pointer/listTarget.js.map +1 -0
- package/lib/module/pointer/motion.js +37 -0
- package/lib/module/pointer/motion.js.map +1 -0
- package/lib/module/runtime/dndPresentation.js +81 -0
- package/lib/module/runtime/dndPresentation.js.map +1 -0
- package/lib/module/runtime/dndRenderStore.js +129 -0
- package/lib/module/runtime/dndRenderStore.js.map +1 -0
- package/lib/module/runtime/dndRuntime.js +135 -0
- package/lib/module/runtime/dndRuntime.js.map +1 -0
- package/lib/module/runtime/dndSettlement.js +77 -0
- package/lib/module/runtime/dndSettlement.js.map +1 -0
- package/lib/module/runtime/gridRuntime.js +37 -0
- package/lib/module/runtime/gridRuntime.js.map +1 -0
- package/lib/module/types.js +4 -0
- package/lib/module/types.js.map +1 -0
- package/lib/typescript/package.json +1 -0
- package/lib/typescript/src/adapters/coordinates.d.ts +9 -0
- package/lib/typescript/src/adapters/coordinates.d.ts.map +1 -0
- package/lib/typescript/src/adapters/scroll.d.ts +49 -0
- package/lib/typescript/src/adapters/scroll.d.ts.map +1 -0
- package/lib/typescript/src/adapters/virtualizedList.d.ts +22 -0
- package/lib/typescript/src/adapters/virtualizedList.d.ts.map +1 -0
- package/lib/typescript/src/components/DndProvider.d.ts +4 -0
- package/lib/typescript/src/components/DndProvider.d.ts.map +1 -0
- package/lib/typescript/src/components/DragHandle.d.ts +4 -0
- package/lib/typescript/src/components/DragHandle.d.ts.map +1 -0
- package/lib/typescript/src/components/GridController.d.ts +21 -0
- package/lib/typescript/src/components/GridController.d.ts.map +1 -0
- package/lib/typescript/src/components/GridDragHandle.d.ts +8 -0
- package/lib/typescript/src/components/GridDragHandle.d.ts.map +1 -0
- package/lib/typescript/src/components/GridZoneView.d.ts +8 -0
- package/lib/typescript/src/components/GridZoneView.d.ts.map +1 -0
- package/lib/typescript/src/components/SortableGrid.d.ts +4 -0
- package/lib/typescript/src/components/SortableGrid.d.ts.map +1 -0
- package/lib/typescript/src/components/SortableList.d.ts +4 -0
- package/lib/typescript/src/components/SortableList.d.ts.map +1 -0
- package/lib/typescript/src/components/dndTypes.d.ts +94 -0
- package/lib/typescript/src/components/dndTypes.d.ts.map +1 -0
- package/lib/typescript/src/components/gridTypes.d.ts +84 -0
- package/lib/typescript/src/components/gridTypes.d.ts.map +1 -0
- package/lib/typescript/src/components/handleViewProps.d.ts +6 -0
- package/lib/typescript/src/components/handleViewProps.d.ts.map +1 -0
- package/lib/typescript/src/contracts.d.ts +145 -0
- package/lib/typescript/src/contracts.d.ts.map +1 -0
- package/lib/typescript/src/controller/approval.d.ts +66 -0
- package/lib/typescript/src/controller/approval.d.ts.map +1 -0
- package/lib/typescript/src/controller/coordinatorBase.d.ts +37 -0
- package/lib/typescript/src/controller/coordinatorBase.d.ts.map +1 -0
- package/lib/typescript/src/controller/dndSession.d.ts +152 -0
- package/lib/typescript/src/controller/dndSession.d.ts.map +1 -0
- package/lib/typescript/src/controller/dndState.d.ts +27 -0
- package/lib/typescript/src/controller/dndState.d.ts.map +1 -0
- package/lib/typescript/src/controller/gridAdapter.d.ts +44 -0
- package/lib/typescript/src/controller/gridAdapter.d.ts.map +1 -0
- package/lib/typescript/src/controller/gridState.d.ts +18 -0
- package/lib/typescript/src/controller/gridState.d.ts.map +1 -0
- package/lib/typescript/src/controller/locations.d.ts +9 -0
- package/lib/typescript/src/controller/locations.d.ts.map +1 -0
- package/lib/typescript/src/controller/previewPath.d.ts +49 -0
- package/lib/typescript/src/controller/previewPath.d.ts.map +1 -0
- package/lib/typescript/src/controller/sessionCore.d.ts +106 -0
- package/lib/typescript/src/controller/sessionCore.d.ts.map +1 -0
- package/lib/typescript/src/controller/useDndState.d.ts +8 -0
- package/lib/typescript/src/controller/useDndState.d.ts.map +1 -0
- package/lib/typescript/src/controller/useGridState.d.ts +8 -0
- package/lib/typescript/src/controller/useGridState.d.ts.map +1 -0
- package/lib/typescript/src/controller/useStoreState.d.ts +16 -0
- package/lib/typescript/src/controller/useStoreState.d.ts.map +1 -0
- package/lib/typescript/src/defaults.d.ts +5 -0
- package/lib/typescript/src/defaults.d.ts.map +1 -0
- package/lib/typescript/src/diagnostics.d.ts +9 -0
- package/lib/typescript/src/diagnostics.d.ts.map +1 -0
- package/lib/typescript/src/engine/gridPlacements.d.ts +22 -0
- package/lib/typescript/src/engine/gridPlacements.d.ts.map +1 -0
- package/lib/typescript/src/engine/index.d.ts +28 -0
- package/lib/typescript/src/engine/index.d.ts.map +1 -0
- package/lib/typescript/src/engine/layout.d.ts +4 -0
- package/lib/typescript/src/engine/layout.d.ts.map +1 -0
- package/lib/typescript/src/engine/layoutMove.d.ts +46 -0
- package/lib/typescript/src/engine/layoutMove.d.ts.map +1 -0
- package/lib/typescript/src/engine/layoutState.d.ts +22 -0
- package/lib/typescript/src/engine/layoutState.d.ts.map +1 -0
- package/lib/typescript/src/engine/list.d.ts +68 -0
- package/lib/typescript/src/engine/list.d.ts.map +1 -0
- package/lib/typescript/src/engine/listIndex.d.ts +32 -0
- package/lib/typescript/src/engine/listIndex.d.ts.map +1 -0
- package/lib/typescript/src/engine/move.d.ts +10 -0
- package/lib/typescript/src/engine/move.d.ts.map +1 -0
- package/lib/typescript/src/engine/movementPolicy.d.ts +34 -0
- package/lib/typescript/src/engine/movementPolicy.d.ts.map +1 -0
- package/lib/typescript/src/engine/orderedTarget.d.ts +32 -0
- package/lib/typescript/src/engine/orderedTarget.d.ts.map +1 -0
- package/lib/typescript/src/engine/pack.d.ts +3 -0
- package/lib/typescript/src/engine/pack.d.ts.map +1 -0
- package/lib/typescript/src/engine/rectangles.d.ts +9 -0
- package/lib/typescript/src/engine/rectangles.d.ts.map +1 -0
- package/lib/typescript/src/engine/sameLayout.d.ts +4 -0
- package/lib/typescript/src/engine/sameLayout.d.ts.map +1 -0
- package/lib/typescript/src/engine/search.d.ts +28 -0
- package/lib/typescript/src/engine/search.d.ts.map +1 -0
- package/lib/typescript/src/engine/spatial.d.ts +16 -0
- package/lib/typescript/src/engine/spatial.d.ts.map +1 -0
- package/lib/typescript/src/engine/spatialAppRotation.d.ts +4 -0
- package/lib/typescript/src/engine/spatialAppRotation.d.ts.map +1 -0
- package/lib/typescript/src/engine/spatialExchange.d.ts +5 -0
- package/lib/typescript/src/engine/spatialExchange.d.ts.map +1 -0
- package/lib/typescript/src/engine/spatialInsertion.d.ts +5 -0
- package/lib/typescript/src/engine/spatialInsertion.d.ts.map +1 -0
- package/lib/typescript/src/engine/spatialPolicy.d.ts +9 -0
- package/lib/typescript/src/engine/spatialPolicy.d.ts.map +1 -0
- package/lib/typescript/src/engine/spatialRotation.d.ts +8 -0
- package/lib/typescript/src/engine/spatialRotation.d.ts.map +1 -0
- package/lib/typescript/src/engine/validation.d.ts +9 -0
- package/lib/typescript/src/engine/validation.d.ts.map +1 -0
- package/lib/typescript/src/gesture/DndGestureGroup.d.ts +33 -0
- package/lib/typescript/src/gesture/DndGestureGroup.d.ts.map +1 -0
- package/lib/typescript/src/gesture/DndGestureHost.d.ts +12 -0
- package/lib/typescript/src/gesture/DndGestureHost.d.ts.map +1 -0
- package/lib/typescript/src/gesture/gestureConfig.d.ts +15 -0
- package/lib/typescript/src/gesture/gestureConfig.d.ts.map +1 -0
- package/lib/typescript/src/gesture/gestureGrouping.d.ts +66 -0
- package/lib/typescript/src/gesture/gestureGrouping.d.ts.map +1 -0
- package/lib/typescript/src/gesture/gestureHost.d.ts +23 -0
- package/lib/typescript/src/gesture/gestureHost.d.ts.map +1 -0
- package/lib/typescript/src/index.d.ts +38 -0
- package/lib/typescript/src/index.d.ts.map +1 -0
- package/lib/typescript/src/pointer/dndTarget.d.ts +14 -0
- package/lib/typescript/src/pointer/dndTarget.d.ts.map +1 -0
- package/lib/typescript/src/pointer/geometry.d.ts +28 -0
- package/lib/typescript/src/pointer/geometry.d.ts.map +1 -0
- package/lib/typescript/src/pointer/layoutTarget.d.ts +43 -0
- package/lib/typescript/src/pointer/layoutTarget.d.ts.map +1 -0
- package/lib/typescript/src/pointer/listCellMotion.d.ts +43 -0
- package/lib/typescript/src/pointer/listCellMotion.d.ts.map +1 -0
- package/lib/typescript/src/pointer/listTarget.d.ts +7 -0
- package/lib/typescript/src/pointer/listTarget.d.ts.map +1 -0
- package/lib/typescript/src/pointer/motion.d.ts +20 -0
- package/lib/typescript/src/pointer/motion.d.ts.map +1 -0
- package/lib/typescript/src/runtime/dndPresentation.d.ts +37 -0
- package/lib/typescript/src/runtime/dndPresentation.d.ts.map +1 -0
- package/lib/typescript/src/runtime/dndRenderStore.d.ts +46 -0
- package/lib/typescript/src/runtime/dndRenderStore.d.ts.map +1 -0
- package/lib/typescript/src/runtime/dndRuntime.d.ts +138 -0
- package/lib/typescript/src/runtime/dndRuntime.d.ts.map +1 -0
- package/lib/typescript/src/runtime/dndSettlement.d.ts +18 -0
- package/lib/typescript/src/runtime/dndSettlement.d.ts.map +1 -0
- package/lib/typescript/src/runtime/gridRuntime.d.ts +54 -0
- package/lib/typescript/src/runtime/gridRuntime.d.ts.map +1 -0
- package/lib/typescript/src/types.d.ts +180 -0
- package/lib/typescript/src/types.d.ts.map +1 -0
- package/package.json +136 -0
- package/src/adapters/coordinates.ts +181 -0
- package/src/adapters/scroll.ts +147 -0
- package/src/adapters/virtualizedList.ts +112 -0
- package/src/components/DndProvider.tsx +1836 -0
- package/src/components/DragHandle.tsx +89 -0
- package/src/components/GridController.tsx +213 -0
- package/src/components/GridDragHandle.tsx +11 -0
- package/src/components/GridZoneView.tsx +57 -0
- package/src/components/SortableGrid.tsx +449 -0
- package/src/components/SortableList.tsx +1028 -0
- package/src/components/dndTypes.ts +102 -0
- package/src/components/gridTypes.ts +90 -0
- package/src/components/handleViewProps.ts +35 -0
- package/src/contracts.ts +149 -0
- package/src/controller/approval.ts +179 -0
- package/src/controller/coordinatorBase.ts +118 -0
- package/src/controller/dndSession.ts +1058 -0
- package/src/controller/dndState.ts +198 -0
- package/src/controller/gridAdapter.ts +268 -0
- package/src/controller/gridState.ts +187 -0
- package/src/controller/locations.ts +67 -0
- package/src/controller/previewPath.ts +90 -0
- package/src/controller/sessionCore.ts +390 -0
- package/src/controller/useDndState.ts +26 -0
- package/src/controller/useGridState.ts +22 -0
- package/src/controller/useStoreState.ts +27 -0
- package/src/defaults.ts +4 -0
- package/src/diagnostics.ts +23 -0
- package/src/engine/gridPlacements.ts +85 -0
- package/src/engine/index.ts +99 -0
- package/src/engine/layout.ts +29 -0
- package/src/engine/layoutMove.ts +401 -0
- package/src/engine/layoutState.ts +490 -0
- package/src/engine/list.ts +307 -0
- package/src/engine/listIndex.ts +174 -0
- package/src/engine/move.ts +274 -0
- package/src/engine/movementPolicy.ts +151 -0
- package/src/engine/orderedTarget.ts +131 -0
- package/src/engine/pack.ts +24 -0
- package/src/engine/rectangles.ts +18 -0
- package/src/engine/sameLayout.ts +50 -0
- package/src/engine/search.ts +174 -0
- package/src/engine/spatial.ts +36 -0
- package/src/engine/spatialAppRotation.ts +53 -0
- package/src/engine/spatialExchange.ts +212 -0
- package/src/engine/spatialInsertion.ts +157 -0
- package/src/engine/spatialPolicy.ts +48 -0
- package/src/engine/spatialRotation.ts +56 -0
- package/src/engine/validation.ts +358 -0
- package/src/gesture/DndGestureGroup.tsx +357 -0
- package/src/gesture/DndGestureHost.tsx +50 -0
- package/src/gesture/gestureConfig.ts +123 -0
- package/src/gesture/gestureGrouping.ts +210 -0
- package/src/gesture/gestureHost.tsx +163 -0
- package/src/index.ts +162 -0
- package/src/pointer/dndTarget.ts +213 -0
- package/src/pointer/geometry.ts +584 -0
- package/src/pointer/layoutTarget.ts +515 -0
- package/src/pointer/listCellMotion.ts +174 -0
- package/src/pointer/listTarget.ts +56 -0
- package/src/pointer/motion.ts +66 -0
- package/src/runtime/dndPresentation.ts +113 -0
- package/src/runtime/dndRenderStore.ts +246 -0
- package/src/runtime/dndRuntime.ts +311 -0
- package/src/runtime/dndSettlement.ts +117 -0
- package/src/runtime/gridRuntime.ts +73 -0
- package/src/types.ts +189 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 baesumin
|
|
4
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
5
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
6
|
+
in the Software without restriction, including without limitation the rights
|
|
7
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
8
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
9
|
+
furnished to do so, subject to the following conditions:
|
|
10
|
+
|
|
11
|
+
The above copyright notice and this permission notice shall be included in all
|
|
12
|
+
copies or substantial portions of the Software.
|
|
13
|
+
|
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
15
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
16
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
17
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
18
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
19
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
20
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
# React Native Layout DnD
|
|
2
|
+
|
|
3
|
+
Drag and drop for React Native grids and lists, built on Reanimated worklets and
|
|
4
|
+
Gesture Handler.
|
|
5
|
+
|
|
6
|
+
One provider owns a normalized layout state. An item can be reordered inside a
|
|
7
|
+
list, placed by coordinates in a grid, or moved between the two, and every move
|
|
8
|
+
arrives at your state layer as one complete candidate that you can accept or
|
|
9
|
+
reject.
|
|
10
|
+
|
|
11
|
+
> **Pre-release.** This package is not on npm yet, and its peer versions are
|
|
12
|
+
> pinned to the exact combination it has been verified against. Read
|
|
13
|
+
> [Status and limitations](#status-and-limitations) before adopting it.
|
|
14
|
+
|
|
15
|
+
## Why this library
|
|
16
|
+
|
|
17
|
+
- **Grids and lists in one drag session.** A single `DndProvider` hosts any
|
|
18
|
+
number of list and grid zones. List-to-list, grid-to-grid and list-to-grid
|
|
19
|
+
moves all produce one candidate and one approval.
|
|
20
|
+
- **Grids with mixed spans.** Items occupy `rows x cols` cells at explicit
|
|
21
|
+
coordinates. Insertion and exchange are separate placement policies, and
|
|
22
|
+
rules such as full-width row rotation are configurable per provider.
|
|
23
|
+
- **Ordered grid zones.** Give a grid zone an `itemSpan` and it behaves like a
|
|
24
|
+
dock: array order is item order, a move inserts at the addressed slot,
|
|
25
|
+
removal closes the gap, and capacity is the slot count.
|
|
26
|
+
- **Lists that scroll.** Vertical and horizontal, fixed or measured variable
|
|
27
|
+
sizes, edge auto-scroll during a drag, and optional `FlatList` windowing for
|
|
28
|
+
long lists.
|
|
29
|
+
- **Your state stays in control.** Every move is a revisioned proposal. Reject
|
|
30
|
+
it synchronously with `canDrop`, or answer asynchronously within a timeout.
|
|
31
|
+
Rejection, cancellation and expiry restore the current layout without
|
|
32
|
+
overwriting a later external edit.
|
|
33
|
+
- **A pure engine you can call directly.** `react-native-layout-dnd/engine`
|
|
34
|
+
computes moves, packing and layout without loading React Native components,
|
|
35
|
+
so input that is not a gesture, such as a screen-reader action or an undo,
|
|
36
|
+
uses exactly the same rules as dragging.
|
|
37
|
+
|
|
38
|
+
## Requirements
|
|
39
|
+
|
|
40
|
+
| Peer dependency | Accepted range | Verified |
|
|
41
|
+
| ---------------------------- | ---------------- | -------- |
|
|
42
|
+
| React Native | `>=0.78.0` | 0.87.1 |
|
|
43
|
+
| React Native Gesture Handler | `>=3.0.0 <4.0.0` | 3.3.0 |
|
|
44
|
+
| React Native Reanimated | `>=4.0.0 <5.0.0` | 4.6.0 |
|
|
45
|
+
| React Native Worklets | `>=0.5.0 <1.0.0` | 0.12.2 |
|
|
46
|
+
|
|
47
|
+
React is a peer too, at 19 or newer, but your React Native version already
|
|
48
|
+
decides it. The New Architecture is required, because Reanimated 4 supports
|
|
49
|
+
nothing else.
|
|
50
|
+
|
|
51
|
+
Each lower bound is the release that introduced an API this package calls: the
|
|
52
|
+
v3 gesture hooks in Gesture Handler 3.0.0, the worklets package split in
|
|
53
|
+
Reanimated 4.0.0, and `scheduleOnUI`, `scheduleOnRN` and `runOnUISync` in
|
|
54
|
+
Worklets 0.5.0. Only the **Verified** column has actually been built and run
|
|
55
|
+
end to end, so treat the rest of the range as accepted rather than tested, and
|
|
56
|
+
pin what works for you. Reanimated and Worklets constrain your React Native
|
|
57
|
+
version further through their own peer ranges.
|
|
58
|
+
|
|
59
|
+
Your app must also render the provider under `GestureHandlerRootView` and enable
|
|
60
|
+
the Worklets Babel plugin. This package ships worklet directives uncompiled so
|
|
61
|
+
that your plugin version transforms them:
|
|
62
|
+
|
|
63
|
+
```js
|
|
64
|
+
// babel.config.js
|
|
65
|
+
module.exports = {
|
|
66
|
+
presets: ['module:@react-native/babel-preset'],
|
|
67
|
+
plugins: ['react-native-worklets/plugin'],
|
|
68
|
+
};
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
## Installation
|
|
72
|
+
|
|
73
|
+
Not published yet. Build a tarball from a clone and install it by path:
|
|
74
|
+
|
|
75
|
+
```sh
|
|
76
|
+
git clone https://github.com/baesumin/react-native-layout-dnd.git
|
|
77
|
+
cd react-native-layout-dnd
|
|
78
|
+
yarn install
|
|
79
|
+
npm pack
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
```sh
|
|
83
|
+
# in your app
|
|
84
|
+
yarn add /absolute/path/to/react-native-layout-dnd-0.1.0-alpha.0.tgz
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
Installing straight from the Git URL does not work, because the entry points
|
|
88
|
+
come from a build that only runs while packing.
|
|
89
|
+
|
|
90
|
+
## Quick start
|
|
91
|
+
|
|
92
|
+
A sortable vertical list. `useDndState` holds the layout and acknowledges each
|
|
93
|
+
proposal for you, and `DragHandle` marks the part of an item that starts a drag.
|
|
94
|
+
|
|
95
|
+
```tsx
|
|
96
|
+
import { Text, View } from 'react-native';
|
|
97
|
+
import {
|
|
98
|
+
DndProvider,
|
|
99
|
+
DragHandle,
|
|
100
|
+
SortableList,
|
|
101
|
+
useDndState,
|
|
102
|
+
type LayoutState,
|
|
103
|
+
} from 'react-native-layout-dnd';
|
|
104
|
+
|
|
105
|
+
type Task = { title: string };
|
|
106
|
+
|
|
107
|
+
const initial: LayoutState<Task> = {
|
|
108
|
+
revision: 0,
|
|
109
|
+
items: [
|
|
110
|
+
{ id: 'a', data: { title: 'Notes' } },
|
|
111
|
+
{ id: 'b', data: { title: 'Plan' } },
|
|
112
|
+
],
|
|
113
|
+
zones: [
|
|
114
|
+
{ id: 'tasks', kind: 'list', orientation: 'vertical', itemIds: ['a', 'b'] },
|
|
115
|
+
],
|
|
116
|
+
};
|
|
117
|
+
|
|
118
|
+
export function Tasks() {
|
|
119
|
+
const { value, onChange } = useDndState(initial);
|
|
120
|
+
return (
|
|
121
|
+
<DndProvider value={value} onChange={onChange} style={{ flex: 1 }}>
|
|
122
|
+
<SortableList<Task>
|
|
123
|
+
zoneId="tasks"
|
|
124
|
+
style={{ flex: 1 }}
|
|
125
|
+
estimatedItemSize={72}
|
|
126
|
+
gap={8}
|
|
127
|
+
renderItem={({ item }) => (
|
|
128
|
+
<View style={{ padding: 12 }}>
|
|
129
|
+
<DragHandle>
|
|
130
|
+
<Text>{item.data.title}</Text>
|
|
131
|
+
</DragHandle>
|
|
132
|
+
</View>
|
|
133
|
+
)}
|
|
134
|
+
/>
|
|
135
|
+
</DndProvider>
|
|
136
|
+
);
|
|
137
|
+
}
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
The provider and every zone need a bounded viewport, for example `flex: 1`
|
|
141
|
+
inside a bounded parent. A drag starts after a 250 ms long press by default.
|
|
142
|
+
|
|
143
|
+
### Moving between a list and a grid
|
|
144
|
+
|
|
145
|
+
Add a `SortableGrid` to the same provider. A list item carries no grid
|
|
146
|
+
footprint, so `getGridItemLayout` decides the span an incoming item takes. Keep
|
|
147
|
+
that function stable, because it is captured once per drag.
|
|
148
|
+
|
|
149
|
+
```tsx
|
|
150
|
+
<DndProvider
|
|
151
|
+
value={value}
|
|
152
|
+
onChange={onChange}
|
|
153
|
+
getGridItemLayout={({ item }) => ({
|
|
154
|
+
span: item.data.span,
|
|
155
|
+
placement: 'insert',
|
|
156
|
+
})}
|
|
157
|
+
style={{ flex: 1 }}
|
|
158
|
+
>
|
|
159
|
+
<SortableList<Card> zoneId="library" virtualization ... />
|
|
160
|
+
<SortableGrid<Card>
|
|
161
|
+
zoneId="board"
|
|
162
|
+
style={{ height: 240 }}
|
|
163
|
+
geometry={{
|
|
164
|
+
mode: 'fit',
|
|
165
|
+
rowGap: 8,
|
|
166
|
+
columnGap: 8,
|
|
167
|
+
padding: { top: 8, right: 8, bottom: 8, left: 8 },
|
|
168
|
+
}}
|
|
169
|
+
renderItem={({ item, width, height }) => (
|
|
170
|
+
<View style={{ width, height }}>
|
|
171
|
+
<DragHandle>
|
|
172
|
+
<Text>{item.data.title}</Text>
|
|
173
|
+
</DragHandle>
|
|
174
|
+
</View>
|
|
175
|
+
)}
|
|
176
|
+
/>
|
|
177
|
+
</DndProvider>
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
A grid zone with `rows`, `columns` and `placements` is spatial. Add `itemSpan`
|
|
181
|
+
and it becomes an ordered zone instead, which is how a dock behaves.
|
|
182
|
+
|
|
183
|
+
## How a move reaches your state
|
|
184
|
+
|
|
185
|
+
1. The gesture resolves a target cell or index.
|
|
186
|
+
2. The engine computes the **whole next layout**, including every item the move
|
|
187
|
+
displaces. It never commits partial work, so a move that cannot be placed
|
|
188
|
+
fails as a whole.
|
|
189
|
+
3. `canDrop(proposal)` may reject the candidate synchronously, during the
|
|
190
|
+
preview and again at release.
|
|
191
|
+
4. `onChange(next, proposal)` publishes the candidate together with
|
|
192
|
+
`proposal.baseRevision`. Answer it by committing a value whose revision is
|
|
193
|
+
that base plus one, or by rejecting it. `useDndState` and
|
|
194
|
+
`createDndStateStore` do this for you.
|
|
195
|
+
5. `onDragEnd` reports the outcome: `accepted`, `rejected`, `expired`,
|
|
196
|
+
`mismatch`, `interrupted`, or a cancellation with its reason.
|
|
197
|
+
|
|
198
|
+
An unanswered proposal expires after `responseTimeoutMs`, 2000 ms by default,
|
|
199
|
+
and an external edit during a drag interrupts the session instead of being
|
|
200
|
+
overwritten.
|
|
201
|
+
|
|
202
|
+
For input that is not a gesture, compute the same move and commit it yourself:
|
|
203
|
+
|
|
204
|
+
```ts
|
|
205
|
+
import { computeLayoutMove } from 'react-native-layout-dnd/engine';
|
|
206
|
+
|
|
207
|
+
const result = computeLayoutMove({
|
|
208
|
+
value,
|
|
209
|
+
itemId,
|
|
210
|
+
to: { kind: 'list', zoneId: 'tasks', index: targetIndex },
|
|
211
|
+
});
|
|
212
|
+
if (result.status === 'ok' && result.changed) setValue(result.value);
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
## Documentation
|
|
216
|
+
|
|
217
|
+
- [Lists and scrolling](docs/list-scroll-api.md) covers `DndProvider`,
|
|
218
|
+
`SortableList`, `DragHandle`, `useDndState`, virtualization, auto-scroll and
|
|
219
|
+
accessibility.
|
|
220
|
+
- [Grids and mixed layouts](docs/mixed-layout-api.md) covers `SortableGrid`,
|
|
221
|
+
spans, transfers between zones, approval and failure reasons.
|
|
222
|
+
- [Grid contracts and the `GridController` API](docs/api.md) covers the shared
|
|
223
|
+
layout contract, movement policies and preview rules, plus the grid-only API
|
|
224
|
+
kept for existing consumers, which is now an adapter over the same provider.
|
|
225
|
+
- [Contributing](CONTRIBUTING.md) lists the checks and the native test
|
|
226
|
+
checklist.
|
|
227
|
+
|
|
228
|
+
Runnable examples live in [`example/`](example/), including a 580-item
|
|
229
|
+
`FlatList` tab and a mixed grid and list screen:
|
|
230
|
+
|
|
231
|
+
```sh
|
|
232
|
+
yarn install
|
|
233
|
+
yarn example start
|
|
234
|
+
yarn example ios # or: yarn example android
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
## Status and limitations
|
|
238
|
+
|
|
239
|
+
Automated verification passes 51 suites and 1,215 tests, seven
|
|
240
|
+
performance-tooling tests, TypeScript, ESLint, the build, and an isolated check
|
|
241
|
+
of the packed API and its types.
|
|
242
|
+
|
|
243
|
+
Known gaps, stated so you can judge the risk:
|
|
244
|
+
|
|
245
|
+
- **Not published.** The package stays `private` until the release criteria are
|
|
246
|
+
met, and the public API may still change.
|
|
247
|
+
- **One verified combination.** The peer ranges above come from the APIs this
|
|
248
|
+
package calls, not from a test matrix. Only the versions in the Verified
|
|
249
|
+
column have been built and run, and Expo has not been tried.
|
|
250
|
+
- **Device verification is incomplete.** iOS simulator measurement and an
|
|
251
|
+
Android emulator driver pass. Dragging across rotation and app backgrounding,
|
|
252
|
+
Android release-build touch input, and a physical-device run are still open.
|
|
253
|
+
- **Screen readers.** Handles forward accessibility view props and reduced
|
|
254
|
+
motion follows the system setting, but the drag state itself is not announced
|
|
255
|
+
and no move actions are wired up for you. See the
|
|
256
|
+
[accessibility support level](docs/list-scroll-api.md#accessibility-reduced-motion-and-alternative-movement).
|
|
257
|
+
- **Virtualization is list-only.** Grid zones render every placement, and there
|
|
258
|
+
are no FlashList or LegendList adapters.
|
|
259
|
+
|
|
260
|
+
## License
|
|
261
|
+
|
|
262
|
+
[MIT](LICENSE) — baesumin.
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { isRecord } from "../engine/validation.js";
|
|
4
|
+
function isPoint(value) {
|
|
5
|
+
return isRecord(value) && typeof value.x === 'number' && Number.isFinite(value.x) && typeof value.y === 'number' && Number.isFinite(value.y);
|
|
6
|
+
}
|
|
7
|
+
function isRect(value) {
|
|
8
|
+
return isPoint(value) && 'width' in value && typeof value.width === 'number' && Number.isFinite(value.width) && value.width > 0 && 'height' in value && typeof value.height === 'number' && Number.isFinite(value.height) && value.height > 0;
|
|
9
|
+
}
|
|
10
|
+
function isNonnegativeFinite(value) {
|
|
11
|
+
return typeof value === 'number' && Number.isFinite(value) && value >= 0;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/** Estimates remain estimates after validation; callers must inspect source. */
|
|
15
|
+
export function validateRectMeasurement(measurement, freshness) {
|
|
16
|
+
if (!isRecord(freshness) || !Number.isSafeInteger(freshness.revision) || freshness.revision < 0 || freshness.nowMs === undefined !== (freshness.maxAgeMs === undefined) || freshness.nowMs !== undefined && (!isNonnegativeFinite(freshness.nowMs) || !isNonnegativeFinite(freshness.maxAgeMs))) {
|
|
17
|
+
return {
|
|
18
|
+
valid: false,
|
|
19
|
+
reason: 'invalid-freshness'
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
if (!isRecord(measurement) || measurement.source !== 'measured' && measurement.source !== 'estimated' || measurement.space !== 'screen' && measurement.space !== 'content' || !isRect(measurement.rect) || !Number.isSafeInteger(measurement.revision) || measurement.revision < 0 || !isNonnegativeFinite(measurement.timestampMs)) {
|
|
23
|
+
return {
|
|
24
|
+
valid: false,
|
|
25
|
+
reason: 'invalid-measurement'
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
if (measurement.revision !== freshness.revision || freshness.nowMs !== undefined && (measurement.timestampMs > freshness.nowMs || freshness.nowMs - measurement.timestampMs > freshness.maxAgeMs)) {
|
|
29
|
+
return {
|
|
30
|
+
valid: false,
|
|
31
|
+
reason: 'stale-measurement'
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
return {
|
|
35
|
+
valid: true,
|
|
36
|
+
value: measurement
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
function validateContext(context, freshness) {
|
|
40
|
+
if (!isRecord(context) || !isPoint(context.scrollOffset)) {
|
|
41
|
+
return {
|
|
42
|
+
valid: false,
|
|
43
|
+
reason: 'invalid-context'
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
const measurement = validateRectMeasurement(context.viewport, freshness);
|
|
47
|
+
if (!measurement.valid) return measurement;
|
|
48
|
+
if (measurement.value.source !== 'measured' || measurement.value.space !== 'screen') {
|
|
49
|
+
return {
|
|
50
|
+
valid: false,
|
|
51
|
+
reason: 'invalid-context'
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
return {
|
|
55
|
+
valid: true,
|
|
56
|
+
value: context
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
function convertPoint(point, context, freshness, direction) {
|
|
60
|
+
if (!isPoint(point)) return {
|
|
61
|
+
valid: false,
|
|
62
|
+
reason: 'invalid-coordinate'
|
|
63
|
+
};
|
|
64
|
+
const validation = validateContext(context, freshness);
|
|
65
|
+
if (!validation.valid) return validation;
|
|
66
|
+
const {
|
|
67
|
+
rect
|
|
68
|
+
} = context.viewport;
|
|
69
|
+
const {
|
|
70
|
+
scrollOffset
|
|
71
|
+
} = context;
|
|
72
|
+
const value = direction === 'to-content' ? {
|
|
73
|
+
x: point.x - rect.x + scrollOffset.x,
|
|
74
|
+
y: point.y - rect.y + scrollOffset.y
|
|
75
|
+
} : {
|
|
76
|
+
x: point.x - scrollOffset.x + rect.x,
|
|
77
|
+
y: point.y - scrollOffset.y + rect.y
|
|
78
|
+
};
|
|
79
|
+
return isPoint(value) ? {
|
|
80
|
+
valid: true,
|
|
81
|
+
value
|
|
82
|
+
} : {
|
|
83
|
+
valid: false,
|
|
84
|
+
reason: 'invalid-coordinate'
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/** Convert absolute screen pixels to zone content pixels using the current offset. */
|
|
89
|
+
export function screenToContent(point, context, freshness) {
|
|
90
|
+
return convertPoint(point, context, freshness, 'to-content');
|
|
91
|
+
}
|
|
92
|
+
export function contentToScreen(point, context, freshness) {
|
|
93
|
+
return convertPoint(point, context, freshness, 'to-screen');
|
|
94
|
+
}
|
|
95
|
+
export function screenRectToContent(measurement, context, freshness) {
|
|
96
|
+
const validation = validateRectMeasurement(measurement, freshness);
|
|
97
|
+
if (!validation.valid) return validation;
|
|
98
|
+
if (measurement.space !== 'screen') return {
|
|
99
|
+
valid: false,
|
|
100
|
+
reason: 'invalid-measurement'
|
|
101
|
+
};
|
|
102
|
+
const converted = screenToContent(measurement.rect, context, freshness);
|
|
103
|
+
return converted.valid ? {
|
|
104
|
+
valid: true,
|
|
105
|
+
value: {
|
|
106
|
+
...measurement,
|
|
107
|
+
space: 'content',
|
|
108
|
+
rect: {
|
|
109
|
+
...measurement.rect,
|
|
110
|
+
...converted.value
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
} : converted;
|
|
114
|
+
}
|
|
115
|
+
export function contentRectToScreen(measurement, context, freshness) {
|
|
116
|
+
const validation = validateRectMeasurement(measurement, freshness);
|
|
117
|
+
if (!validation.valid) return validation;
|
|
118
|
+
if (measurement.space !== 'content') return {
|
|
119
|
+
valid: false,
|
|
120
|
+
reason: 'invalid-measurement'
|
|
121
|
+
};
|
|
122
|
+
const converted = contentToScreen(measurement.rect, context, freshness);
|
|
123
|
+
return converted.valid ? {
|
|
124
|
+
valid: true,
|
|
125
|
+
value: {
|
|
126
|
+
...measurement,
|
|
127
|
+
space: 'screen',
|
|
128
|
+
rect: {
|
|
129
|
+
...measurement.rect,
|
|
130
|
+
...converted.value
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
} : converted;
|
|
134
|
+
}
|
|
135
|
+
//# sourceMappingURL=coordinates.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["isRecord","isPoint","value","x","Number","isFinite","y","isRect","width","height","isNonnegativeFinite","validateRectMeasurement","measurement","freshness","isSafeInteger","revision","nowMs","undefined","maxAgeMs","valid","reason","source","space","rect","timestampMs","validateContext","context","scrollOffset","viewport","convertPoint","point","direction","validation","screenToContent","contentToScreen","screenRectToContent","converted","contentRectToScreen"],"sourceRoot":"../../../src","sources":["adapters/coordinates.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
/** The permitted drag direction is independent of a list's orientation. */
|
|
4
|
+
|
|
5
|
+
/** One axis of a measured scroll viewport, using logical pixels throughout. */
|
|
6
|
+
|
|
7
|
+
/** Validate public options before activating a gesture or executing a frame. */
|
|
8
|
+
export function validateAutoScrollOptions(options) {
|
|
9
|
+
'worklet';
|
|
10
|
+
|
|
11
|
+
if (options !== undefined && (!options || typeof options !== 'object' || Array.isArray(options) || options.enabled !== undefined && typeof options.enabled !== 'boolean' || options.edgeThreshold !== undefined && (!Number.isFinite(options.edgeThreshold) || options.edgeThreshold <= 0) || options.maxSpeed !== undefined && (!Number.isFinite(options.maxSpeed) || options.maxSpeed < 0))) return {
|
|
12
|
+
valid: false,
|
|
13
|
+
reason: 'invalid-options'
|
|
14
|
+
};
|
|
15
|
+
return {
|
|
16
|
+
valid: true
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Compute one frame of edge scrolling for either orientation. Adapters should
|
|
22
|
+
* call scrollTo only for nonzero velocity, preserving native bounce while idle.
|
|
23
|
+
* Call only during an active drag, and re-read its candidate after scrolling.
|
|
24
|
+
*/
|
|
25
|
+
export function computeAutoScroll(input) {
|
|
26
|
+
'worklet';
|
|
27
|
+
|
|
28
|
+
if (!input || typeof input !== 'object' || Array.isArray(input) || !Number.isFinite(input.pointer) || !Number.isFinite(input.viewportStart) || !Number.isFinite(input.viewportSize) || input.viewportSize <= 0 || !Number.isFinite(input.offset) || !Number.isFinite(input.contentSize) || input.contentSize < 0 || !Number.isFinite(input.deltaTimeMs) || input.deltaTimeMs < 0) return {
|
|
29
|
+
valid: false,
|
|
30
|
+
reason: 'invalid-input'
|
|
31
|
+
};
|
|
32
|
+
const {
|
|
33
|
+
options
|
|
34
|
+
} = input;
|
|
35
|
+
const validation = validateAutoScrollOptions(options);
|
|
36
|
+
if (!validation.valid) return validation;
|
|
37
|
+
const maximum = Math.max(0, input.contentSize - input.viewportSize);
|
|
38
|
+
const offset = Math.max(0, Math.min(maximum, input.offset));
|
|
39
|
+
const idle = {
|
|
40
|
+
valid: true,
|
|
41
|
+
offset,
|
|
42
|
+
velocity: 0
|
|
43
|
+
};
|
|
44
|
+
const pointer = input.pointer - input.viewportStart;
|
|
45
|
+
if (!Number.isFinite(pointer)) return {
|
|
46
|
+
valid: false,
|
|
47
|
+
reason: 'invalid-input'
|
|
48
|
+
};
|
|
49
|
+
if (options?.enabled === false || pointer < 0 || pointer > input.viewportSize || maximum === 0 || input.deltaTimeMs === 0) return idle;
|
|
50
|
+
|
|
51
|
+
// Cap overlapping edge bands at the midpoint so tiny viewports do not bias
|
|
52
|
+
// toward the first edge. The exact midpoint has no preferred direction.
|
|
53
|
+
const threshold = Math.min(options?.edgeThreshold ?? 48, input.viewportSize / 2);
|
|
54
|
+
if (threshold === 0) return idle;
|
|
55
|
+
const trailingDistance = input.viewportSize - pointer;
|
|
56
|
+
const direction = pointer < threshold ? -1 : trailingDistance < threshold ? 1 : 0;
|
|
57
|
+
if (direction === 0) return idle;
|
|
58
|
+
const distance = direction < 0 ? pointer : trailingDistance;
|
|
59
|
+
const speed = (options?.maxSpeed ?? 600) * (1 - distance / threshold);
|
|
60
|
+
// A paused/resumed frame must not skip a large portion of the list.
|
|
61
|
+
const seconds = Math.min(input.deltaTimeMs, 64) / 1000;
|
|
62
|
+
if (seconds === 0 || speed === 0) return idle;
|
|
63
|
+
const nextOffset = Math.max(0, Math.min(maximum, offset + direction * speed * seconds));
|
|
64
|
+
const movement = nextOffset - offset;
|
|
65
|
+
return {
|
|
66
|
+
valid: true,
|
|
67
|
+
offset: nextOffset,
|
|
68
|
+
velocity: movement === 0 ? 0 : direction * Math.min(speed, Math.abs(movement / seconds))
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/** Project a validated screen point onto the configured axis through origin. */
|
|
73
|
+
export function constrainDragPoint(point, origin, axis) {
|
|
74
|
+
'worklet';
|
|
75
|
+
|
|
76
|
+
return {
|
|
77
|
+
x: axis === 'y' ? origin.x : point.x,
|
|
78
|
+
y: axis === 'x' ? origin.y : point.y
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=scroll.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["validateAutoScrollOptions","options","undefined","Array","isArray","enabled","edgeThreshold","Number","isFinite","maxSpeed","valid","reason","computeAutoScroll","input","pointer","viewportStart","viewportSize","offset","contentSize","deltaTimeMs","validation","maximum","Math","max","min","idle","velocity","threshold","trailingDistance","direction","distance","speed","seconds","nextOffset","movement","abs","constrainDragPoint","point","origin","axis","x","y"],"sourceRoot":"../../../src","sources":["adapters/scroll.ts"],"mappings":";;AAEA;;AAWA;;AA0BA;AACA,OAAO,SAASA,yBAAyBA,CACvCC,OAA2B,EACQ;EACnC,SAAS;;EACT,IACEA,OAAO,KAAKC,SAAS,KACpB,CAACD,OAAO,IACP,OAAOA,OAAO,KAAK,QAAQ,IAC3BE,KAAK,CAACC,OAAO,CAACH,OAAO,CAAC,IACrBA,OAAO,CAACI,OAAO,KAAKH,SAAS,IAAI,OAAOD,OAAO,CAACI,OAAO,KAAK,SAAU,IACtEJ,OAAO,CAACK,aAAa,KAAKJ,SAAS,KACjC,CAACK,MAAM,CAACC,QAAQ,CAACP,OAAO,CAACK,aAAa,CAAC,IACtCL,OAAO,CAACK,aAAa,IAAI,CAAC,CAAE,IAC/BL,OAAO,CAACQ,QAAQ,KAAKP,SAAS,KAC5B,CAACK,MAAM,CAACC,QAAQ,CAACP,OAAO,CAACQ,QAAQ,CAAC,IAAIR,OAAO,CAACQ,QAAQ,GAAG,CAAC,CAAE,CAAC,EAElE,OAAO;IAAEC,KAAK,EAAE,KAAK;IAAEC,MAAM,EAAE;EAAkB,CAAC;EACpD,OAAO;IAAED,KAAK,EAAE;EAAK,CAAC;AACxB;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASE,iBAAiBA,CAACC,KAAsB,EAAoB;EAC1E,SAAS;;EACT,IACE,CAACA,KAAK,IACN,OAAOA,KAAK,KAAK,QAAQ,IACzBV,KAAK,CAACC,OAAO,CAACS,KAAK,CAAC,IACpB,CAACN,MAAM,CAACC,QAAQ,CAACK,KAAK,CAACC,OAAO,CAAC,IAC/B,CAACP,MAAM,CAACC,QAAQ,CAACK,KAAK,CAACE,aAAa,CAAC,IACrC,CAACR,MAAM,CAACC,QAAQ,CAACK,KAAK,CAACG,YAAY,CAAC,IACpCH,KAAK,CAACG,YAAY,IAAI,CAAC,IACvB,CAACT,MAAM,CAACC,QAAQ,CAACK,KAAK,CAACI,MAAM,CAAC,IAC9B,CAACV,MAAM,CAACC,QAAQ,CAACK,KAAK,CAACK,WAAW,CAAC,IACnCL,KAAK,CAACK,WAAW,GAAG,CAAC,IACrB,CAACX,MAAM,CAACC,QAAQ,CAACK,KAAK,CAACM,WAAW,CAAC,IACnCN,KAAK,CAACM,WAAW,GAAG,CAAC,EAErB,OAAO;IAAET,KAAK,EAAE,KAAK;IAAEC,MAAM,EAAE;EAAgB,CAAC;EAElD,MAAM;IAAEV;EAAQ,CAAC,GAAGY,KAAK;EACzB,MAAMO,UAAU,GAAGpB,yBAAyB,CAACC,OAAO,CAAC;EACrD,IAAI,CAACmB,UAAU,CAACV,KAAK,EAAE,OAAOU,UAAU;EAExC,MAAMC,OAAO,GAAGC,IAAI,CAACC,GAAG,CAAC,CAAC,EAAEV,KAAK,CAACK,WAAW,GAAGL,KAAK,CAACG,YAAY,CAAC;EACnE,MAAMC,MAAM,GAAGK,IAAI,CAACC,GAAG,CAAC,CAAC,EAAED,IAAI,CAACE,GAAG,CAACH,OAAO,EAAER,KAAK,CAACI,MAAM,CAAC,CAAC;EAC3D,MAAMQ,IAAsB,GAAG;IAAEf,KAAK,EAAE,IAAI;IAAEO,MAAM;IAAES,QAAQ,EAAE;EAAE,CAAC;EACnE,MAAMZ,OAAO,GAAGD,KAAK,CAACC,OAAO,GAAGD,KAAK,CAACE,aAAa;EACnD,IAAI,CAACR,MAAM,CAACC,QAAQ,CAACM,OAAO,CAAC,EAC3B,OAAO;IAAEJ,KAAK,EAAE,KAAK;IAAEC,MAAM,EAAE;EAAgB,CAAC;EAElD,IACEV,OAAO,EAAEI,OAAO,KAAK,KAAK,IAC1BS,OAAO,GAAG,CAAC,IACXA,OAAO,GAAGD,KAAK,CAACG,YAAY,IAC5BK,OAAO,KAAK,CAAC,IACbR,KAAK,CAACM,WAAW,KAAK,CAAC,EAEvB,OAAOM,IAAI;;EAEb;EACA;EACA,MAAME,SAAS,GAAGL,IAAI,CAACE,GAAG,CACxBvB,OAAO,EAAEK,aAAa,IAAI,EAAE,EAC5BO,KAAK,CAACG,YAAY,GAAG,CACvB,CAAC;EACD,IAAIW,SAAS,KAAK,CAAC,EAAE,OAAOF,IAAI;EAChC,MAAMG,gBAAgB,GAAGf,KAAK,CAACG,YAAY,GAAGF,OAAO;EACrD,MAAMe,SAAS,GACbf,OAAO,GAAGa,SAAS,GAAG,CAAC,CAAC,GAAGC,gBAAgB,GAAGD,SAAS,GAAG,CAAC,GAAG,CAAC;EACjE,IAAIE,SAAS,KAAK,CAAC,EAAE,OAAOJ,IAAI;EAEhC,MAAMK,QAAQ,GAAGD,SAAS,GAAG,CAAC,GAAGf,OAAO,GAAGc,gBAAgB;EAC3D,MAAMG,KAAK,GAAG,CAAC9B,OAAO,EAAEQ,QAAQ,IAAI,GAAG,KAAK,CAAC,GAAGqB,QAAQ,GAAGH,SAAS,CAAC;EACrE;EACA,MAAMK,OAAO,GAAGV,IAAI,CAACE,GAAG,CAACX,KAAK,CAACM,WAAW,EAAE,EAAE,CAAC,GAAG,IAAI;EACtD,IAAIa,OAAO,KAAK,CAAC,IAAID,KAAK,KAAK,CAAC,EAAE,OAAON,IAAI;EAC7C,MAAMQ,UAAU,GAAGX,IAAI,CAACC,GAAG,CACzB,CAAC,EACDD,IAAI,CAACE,GAAG,CAACH,OAAO,EAAEJ,MAAM,GAAGY,SAAS,GAAGE,KAAK,GAAGC,OAAO,CACxD,CAAC;EACD,MAAME,QAAQ,GAAGD,UAAU,GAAGhB,MAAM;EACpC,OAAO;IACLP,KAAK,EAAE,IAAI;IACXO,MAAM,EAAEgB,UAAU;IAClBP,QAAQ,EACNQ,QAAQ,KAAK,CAAC,GACV,CAAC,GACDL,SAAS,GAAGP,IAAI,CAACE,GAAG,CAACO,KAAK,EAAET,IAAI,CAACa,GAAG,CAACD,QAAQ,GAAGF,OAAO,CAAC;EAChE,CAAC;AACH;;AAEA;AACA,OAAO,SAASI,kBAAkBA,CAChCC,KAAkB,EAClBC,MAAmB,EACnBC,IAAc,EACD;EACb,SAAS;;EACT,OAAO;IACLC,CAAC,EAAED,IAAI,KAAK,GAAG,GAAGD,MAAM,CAACE,CAAC,GAAGH,KAAK,CAACG,CAAC;IACpCC,CAAC,EAAEF,IAAI,KAAK,GAAG,GAAGD,MAAM,CAACG,CAAC,GAAGJ,KAAK,CAACI;EACrC,CAAC;AACH","ignoreList":[]}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { isPositiveInteger, isRecord } from "../engine/validation.js";
|
|
4
|
+
|
|
5
|
+
/** FlatList rendering limits; enabling virtualization preserves the layout API. */
|
|
6
|
+
|
|
7
|
+
const DEFAULT_OPTIONS = Object.freeze({
|
|
8
|
+
initialNumToRender: 12,
|
|
9
|
+
maxToRenderPerBatch: 12,
|
|
10
|
+
windowSize: 7,
|
|
11
|
+
updateCellsBatchingPeriod: 50
|
|
12
|
+
});
|
|
13
|
+
function invalid(message) {
|
|
14
|
+
return {
|
|
15
|
+
valid: false,
|
|
16
|
+
issues: [{
|
|
17
|
+
code: 'invalid-configuration',
|
|
18
|
+
message
|
|
19
|
+
}]
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/** Undefined/false selects ScrollView; true or an options object selects FlatList. */
|
|
24
|
+
export function resolveListVirtualization(value) {
|
|
25
|
+
if (value === undefined || value === false) {
|
|
26
|
+
return {
|
|
27
|
+
valid: true,
|
|
28
|
+
options: null
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
if (value === true) return {
|
|
32
|
+
valid: true,
|
|
33
|
+
options: {
|
|
34
|
+
...DEFAULT_OPTIONS
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
if (!isRecord(value)) {
|
|
38
|
+
return invalid('virtualization must be a boolean or an options object.');
|
|
39
|
+
}
|
|
40
|
+
if (Object.keys(value).some(key => key !== 'initialNumToRender' && key !== 'maxToRenderPerBatch' && key !== 'windowSize' && key !== 'updateCellsBatchingPeriod')) {
|
|
41
|
+
return invalid('virtualization supports only initialNumToRender, maxToRenderPerBatch, windowSize and updateCellsBatchingPeriod.');
|
|
42
|
+
}
|
|
43
|
+
const initialNumToRender = value.initialNumToRender === undefined ? DEFAULT_OPTIONS.initialNumToRender : value.initialNumToRender;
|
|
44
|
+
const maxToRenderPerBatch = value.maxToRenderPerBatch === undefined ? DEFAULT_OPTIONS.maxToRenderPerBatch : value.maxToRenderPerBatch;
|
|
45
|
+
const windowSize = value.windowSize === undefined ? DEFAULT_OPTIONS.windowSize : value.windowSize;
|
|
46
|
+
const updateCellsBatchingPeriod = value.updateCellsBatchingPeriod === undefined ? DEFAULT_OPTIONS.updateCellsBatchingPeriod : value.updateCellsBatchingPeriod;
|
|
47
|
+
if (!isPositiveInteger(initialNumToRender)) {
|
|
48
|
+
return invalid('virtualization.initialNumToRender must be a positive safe integer.');
|
|
49
|
+
}
|
|
50
|
+
if (!isPositiveInteger(maxToRenderPerBatch)) {
|
|
51
|
+
return invalid('virtualization.maxToRenderPerBatch must be a positive safe integer.');
|
|
52
|
+
}
|
|
53
|
+
if (typeof windowSize !== 'number' || !Number.isFinite(windowSize) || windowSize <= 1) {
|
|
54
|
+
return invalid('virtualization.windowSize must be finite and greater than 1.');
|
|
55
|
+
}
|
|
56
|
+
if (typeof updateCellsBatchingPeriod !== 'number' || !Number.isFinite(updateCellsBatchingPeriod) || updateCellsBatchingPeriod < 0) {
|
|
57
|
+
return invalid('virtualization.updateCellsBatchingPeriod must be finite and nonnegative.');
|
|
58
|
+
}
|
|
59
|
+
return {
|
|
60
|
+
valid: true,
|
|
61
|
+
options: {
|
|
62
|
+
initialNumToRender,
|
|
63
|
+
maxToRenderPerBatch,
|
|
64
|
+
windowSize,
|
|
65
|
+
updateCellsBatchingPeriod
|
|
66
|
+
}
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=virtualizedList.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["isPositiveInteger","isRecord","DEFAULT_OPTIONS","Object","freeze","initialNumToRender","maxToRenderPerBatch","windowSize","updateCellsBatchingPeriod","invalid","message","valid","issues","code","resolveListVirtualization","value","undefined","options","keys","some","key","Number","isFinite"],"sourceRoot":"../../../src","sources":["adapters/virtualizedList.ts"],"mappings":";;AACA,SAASA,iBAAiB,EAAEC,QAAQ,QAAQ,yBAAsB;;AAElE;;AAgBA,MAAMC,eAA8D,GAClEC,MAAM,CAACC,MAAM,CAAC;EACZC,kBAAkB,EAAE,EAAE;EACtBC,mBAAmB,EAAE,EAAE;EACvBC,UAAU,EAAE,CAAC;EACbC,yBAAyB,EAAE;AAC7B,CAAC,CAAC;AAEJ,SAASC,OAAOA,CAACC,OAAe,EAA4B;EAC1D,OAAO;IACLC,KAAK,EAAE,KAAK;IACZC,MAAM,EAAE,CAAC;MAAEC,IAAI,EAAE,uBAAuB;MAAEH;IAAQ,CAAC;EACrD,CAAC;AACH;;AAEA;AACA,OAAO,SAASI,yBAAyBA,CACvCC,KAAc,EACY;EAC1B,IAAIA,KAAK,KAAKC,SAAS,IAAID,KAAK,KAAK,KAAK,EAAE;IAC1C,OAAO;MAAEJ,KAAK,EAAE,IAAI;MAAEM,OAAO,EAAE;IAAK,CAAC;EACvC;EACA,IAAIF,KAAK,KAAK,IAAI,EAAE,OAAO;IAAEJ,KAAK,EAAE,IAAI;IAAEM,OAAO,EAAE;MAAE,GAAGf;IAAgB;EAAE,CAAC;EAC3E,IAAI,CAACD,QAAQ,CAACc,KAAK,CAAC,EAAE;IACpB,OAAON,OAAO,CAAC,wDAAwD,CAAC;EAC1E;EACA,IACEN,MAAM,CAACe,IAAI,CAACH,KAAK,CAAC,CAACI,IAAI,CACrBC,GAAG,IACDA,GAAG,KAAK,oBAAoB,IAC5BA,GAAG,KAAK,qBAAqB,IAC7BA,GAAG,KAAK,YAAY,IACpBA,GAAG,KAAK,2BACZ,CAAC,EACD;IACA,OAAOX,OAAO,CACZ,iHACF,CAAC;EACH;EACA,MAAMJ,kBAAkB,GACtBU,KAAK,CAACV,kBAAkB,KAAKW,SAAS,GAClCd,eAAe,CAACG,kBAAkB,GAClCU,KAAK,CAACV,kBAAkB;EAC9B,MAAMC,mBAAmB,GACvBS,KAAK,CAACT,mBAAmB,KAAKU,SAAS,GACnCd,eAAe,CAACI,mBAAmB,GACnCS,KAAK,CAACT,mBAAmB;EAC/B,MAAMC,UAAU,GACdQ,KAAK,CAACR,UAAU,KAAKS,SAAS,GAC1Bd,eAAe,CAACK,UAAU,GAC1BQ,KAAK,CAACR,UAAU;EACtB,MAAMC,yBAAyB,GAC7BO,KAAK,CAACP,yBAAyB,KAAKQ,SAAS,GACzCd,eAAe,CAACM,yBAAyB,GACzCO,KAAK,CAACP,yBAAyB;EACrC,IAAI,CAACR,iBAAiB,CAACK,kBAAkB,CAAC,EAAE;IAC1C,OAAOI,OAAO,CACZ,oEACF,CAAC;EACH;EACA,IAAI,CAACT,iBAAiB,CAACM,mBAAmB,CAAC,EAAE;IAC3C,OAAOG,OAAO,CACZ,qEACF,CAAC;EACH;EACA,IACE,OAAOF,UAAU,KAAK,QAAQ,IAC9B,CAACc,MAAM,CAACC,QAAQ,CAACf,UAAU,CAAC,IAC5BA,UAAU,IAAI,CAAC,EACf;IACA,OAAOE,OAAO,CACZ,8DACF,CAAC;EACH;EACA,IACE,OAAOD,yBAAyB,KAAK,QAAQ,IAC7C,CAACa,MAAM,CAACC,QAAQ,CAACd,yBAAyB,CAAC,IAC3CA,yBAAyB,GAAG,CAAC,EAC7B;IACA,OAAOC,OAAO,CACZ,0EACF,CAAC;EACH;EACA,OAAO;IACLE,KAAK,EAAE,IAAI;IACXM,OAAO,EAAE;MACPZ,kBAAkB;MAClBC,mBAAmB;MACnBC,UAAU;MACVC;IACF;EACF,CAAC;AACH","ignoreList":[]}
|