react-native-smart-grid 0.1.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 +554 -0
- package/lib/module/components/DragLayer.js +71 -0
- package/lib/module/components/DragLayer.js.map +1 -0
- package/lib/module/components/DraggableTile.js +79 -0
- package/lib/module/components/DraggableTile.js.map +1 -0
- package/lib/module/components/GhostTile.js +37 -0
- package/lib/module/components/GhostTile.js.map +1 -0
- package/lib/module/components/GridTile.js +25 -0
- package/lib/module/components/GridTile.js.map +1 -0
- package/lib/module/components/ResizeHandle.js +72 -0
- package/lib/module/components/ResizeHandle.js.map +1 -0
- package/lib/module/components/SmartGrid.js +363 -0
- package/lib/module/components/SmartGrid.js.map +1 -0
- package/lib/module/context/GridDragContext.js +130 -0
- package/lib/module/context/GridDragContext.js.map +1 -0
- package/lib/module/engine/GridEngine.js +148 -0
- package/lib/module/engine/GridEngine.js.map +1 -0
- package/lib/module/engine/autoArrange.js +54 -0
- package/lib/module/engine/autoArrange.js.map +1 -0
- package/lib/module/engine/collisions.js +67 -0
- package/lib/module/engine/collisions.js.map +1 -0
- package/lib/module/hooks/useTileGesture.js +62 -0
- package/lib/module/hooks/useTileGesture.js.map +1 -0
- package/lib/module/index.js +9 -0
- package/lib/module/index.js.map +1 -0
- package/lib/module/layout/LayoutCalculator.js +29 -0
- package/lib/module/layout/LayoutCalculator.js.map +1 -0
- package/lib/module/package.json +1 -0
- package/lib/module/types.js +2 -0
- package/lib/module/types.js.map +1 -0
- package/lib/module/utils/pixelToGrid.js +22 -0
- package/lib/module/utils/pixelToGrid.js.map +1 -0
- package/lib/typescript/package.json +1 -0
- package/lib/typescript/src/components/DragLayer.d.ts +11 -0
- package/lib/typescript/src/components/DragLayer.d.ts.map +1 -0
- package/lib/typescript/src/components/DraggableTile.d.ts +14 -0
- package/lib/typescript/src/components/DraggableTile.d.ts.map +1 -0
- package/lib/typescript/src/components/GhostTile.d.ts +9 -0
- package/lib/typescript/src/components/GhostTile.d.ts.map +1 -0
- package/lib/typescript/src/components/GridTile.d.ts +9 -0
- package/lib/typescript/src/components/GridTile.d.ts.map +1 -0
- package/lib/typescript/src/components/ResizeHandle.d.ts +9 -0
- package/lib/typescript/src/components/ResizeHandle.d.ts.map +1 -0
- package/lib/typescript/src/components/SmartGrid.d.ts +214 -0
- package/lib/typescript/src/components/SmartGrid.d.ts.map +1 -0
- package/lib/typescript/src/context/GridDragContext.d.ts +44 -0
- package/lib/typescript/src/context/GridDragContext.d.ts.map +1 -0
- package/lib/typescript/src/engine/GridEngine.d.ts +35 -0
- package/lib/typescript/src/engine/GridEngine.d.ts.map +1 -0
- package/lib/typescript/src/engine/autoArrange.d.ts +4 -0
- package/lib/typescript/src/engine/autoArrange.d.ts.map +1 -0
- package/lib/typescript/src/engine/collisions.d.ts +3 -0
- package/lib/typescript/src/engine/collisions.d.ts.map +1 -0
- package/lib/typescript/src/hooks/useTileGesture.d.ts +13 -0
- package/lib/typescript/src/hooks/useTileGesture.d.ts.map +1 -0
- package/lib/typescript/src/index.d.ts +10 -0
- package/lib/typescript/src/index.d.ts.map +1 -0
- package/lib/typescript/src/layout/LayoutCalculator.d.ts +15 -0
- package/lib/typescript/src/layout/LayoutCalculator.d.ts.map +1 -0
- package/lib/typescript/src/types.d.ts +105 -0
- package/lib/typescript/src/types.d.ts.map +1 -0
- package/lib/typescript/src/utils/pixelToGrid.d.ts +9 -0
- package/lib/typescript/src/utils/pixelToGrid.d.ts.map +1 -0
- package/package.json +161 -0
- package/src/components/DragLayer.tsx +71 -0
- package/src/components/DraggableTile.tsx +88 -0
- package/src/components/GhostTile.tsx +42 -0
- package/src/components/GridTile.tsx +27 -0
- package/src/components/ResizeHandle.tsx +74 -0
- package/src/components/SmartGrid.tsx +506 -0
- package/src/context/GridDragContext.tsx +191 -0
- package/src/engine/GridEngine.ts +148 -0
- package/src/engine/autoArrange.ts +59 -0
- package/src/engine/collisions.ts +87 -0
- package/src/hooks/useTileGesture.ts +88 -0
- package/src/index.tsx +29 -0
- package/src/layout/LayoutCalculator.ts +50 -0
- package/src/types.ts +113 -0
- package/src/utils/pixelToGrid.ts +31 -0
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import React, { memo, useEffect } from 'react';
|
|
4
|
+
import { StyleSheet } from 'react-native';
|
|
5
|
+
import { GestureDetector } from 'react-native-gesture-handler';
|
|
6
|
+
import Animated, { useSharedValue, useAnimatedStyle, withSpring } from 'react-native-reanimated';
|
|
7
|
+
import { useGridDrag } from "../context/GridDragContext.js";
|
|
8
|
+
import { useTileGesture } from "../hooks/useTileGesture.js";
|
|
9
|
+
import { ResizeHandle } from "./ResizeHandle.js";
|
|
10
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
11
|
+
const SPRING = {
|
|
12
|
+
damping: 20,
|
|
13
|
+
stiffness: 220,
|
|
14
|
+
mass: 0.5
|
|
15
|
+
};
|
|
16
|
+
function DraggableTileInner({
|
|
17
|
+
tile,
|
|
18
|
+
rect,
|
|
19
|
+
config,
|
|
20
|
+
containerWidth,
|
|
21
|
+
children
|
|
22
|
+
}) {
|
|
23
|
+
const {
|
|
24
|
+
activeTile,
|
|
25
|
+
isEditing
|
|
26
|
+
} = useGridDrag();
|
|
27
|
+
const {
|
|
28
|
+
gesture
|
|
29
|
+
} = useTileGesture({
|
|
30
|
+
tile,
|
|
31
|
+
rect,
|
|
32
|
+
config,
|
|
33
|
+
containerWidth
|
|
34
|
+
});
|
|
35
|
+
const isActive = activeTile?.id === tile.id;
|
|
36
|
+
const animX = useSharedValue(rect.x);
|
|
37
|
+
const animY = useSharedValue(rect.y);
|
|
38
|
+
const animW = useSharedValue(rect.width);
|
|
39
|
+
const animH = useSharedValue(rect.height);
|
|
40
|
+
useEffect(() => {
|
|
41
|
+
animX.value = withSpring(rect.x, SPRING);
|
|
42
|
+
animY.value = withSpring(rect.y, SPRING);
|
|
43
|
+
animW.value = withSpring(rect.width, SPRING);
|
|
44
|
+
animH.value = withSpring(rect.height, SPRING);
|
|
45
|
+
}, [rect.x, rect.y, rect.width, rect.height]); // eslint-disable-line react-hooks/exhaustive-deps
|
|
46
|
+
|
|
47
|
+
const animStyle = useAnimatedStyle(() => ({
|
|
48
|
+
left: animX.value,
|
|
49
|
+
top: animY.value,
|
|
50
|
+
width: animW.value,
|
|
51
|
+
height: animH.value
|
|
52
|
+
}));
|
|
53
|
+
return /*#__PURE__*/_jsx(GestureDetector, {
|
|
54
|
+
gesture: gesture,
|
|
55
|
+
children: /*#__PURE__*/_jsxs(Animated.View, {
|
|
56
|
+
style: [styles.tile, animStyle, isActive && styles.tileActive, isEditing && styles.tileEditing],
|
|
57
|
+
children: [children, isEditing && !tile.locked && /*#__PURE__*/_jsx(ResizeHandle, {
|
|
58
|
+
tile: tile,
|
|
59
|
+
config: config,
|
|
60
|
+
containerWidth: containerWidth
|
|
61
|
+
})]
|
|
62
|
+
})
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
export const DraggableTile = /*#__PURE__*/memo(DraggableTileInner);
|
|
66
|
+
const styles = StyleSheet.create({
|
|
67
|
+
tile: {
|
|
68
|
+
position: 'absolute'
|
|
69
|
+
},
|
|
70
|
+
tileActive: {
|
|
71
|
+
opacity: 0.3
|
|
72
|
+
},
|
|
73
|
+
tileEditing: {
|
|
74
|
+
borderWidth: 1,
|
|
75
|
+
borderColor: 'rgba(255,255,255,0.3)',
|
|
76
|
+
borderRadius: 12
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
//# sourceMappingURL=DraggableTile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["React","memo","useEffect","StyleSheet","GestureDetector","Animated","useSharedValue","useAnimatedStyle","withSpring","useGridDrag","useTileGesture","ResizeHandle","jsx","_jsx","jsxs","_jsxs","SPRING","damping","stiffness","mass","DraggableTileInner","tile","rect","config","containerWidth","children","activeTile","isEditing","gesture","isActive","id","animX","x","animY","y","animW","width","animH","height","value","animStyle","left","top","View","style","styles","tileActive","tileEditing","locked","DraggableTile","create","position","opacity","borderWidth","borderColor","borderRadius"],"sourceRoot":"..\\..\\..\\src","sources":["components/DraggableTile.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { memo } from 'react';
|
|
4
|
+
import { StyleSheet, View } from 'react-native';
|
|
5
|
+
import { tileToPixelRect } from "../layout/LayoutCalculator.js";
|
|
6
|
+
import { useGridDrag } from "../context/GridDragContext.js";
|
|
7
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
8
|
+
export const GhostTile = /*#__PURE__*/memo(function GhostTile({
|
|
9
|
+
activeTile,
|
|
10
|
+
config,
|
|
11
|
+
containerWidth
|
|
12
|
+
}) {
|
|
13
|
+
const {
|
|
14
|
+
ghostPosition
|
|
15
|
+
} = useGridDrag();
|
|
16
|
+
if (!ghostPosition) return null;
|
|
17
|
+
const rect = tileToPixelRect(ghostPosition, activeTile.size, config, containerWidth);
|
|
18
|
+
return /*#__PURE__*/_jsx(View, {
|
|
19
|
+
style: [styles.ghost, {
|
|
20
|
+
left: rect.x,
|
|
21
|
+
top: rect.y,
|
|
22
|
+
width: rect.width,
|
|
23
|
+
height: rect.height
|
|
24
|
+
}]
|
|
25
|
+
});
|
|
26
|
+
});
|
|
27
|
+
const styles = StyleSheet.create({
|
|
28
|
+
ghost: {
|
|
29
|
+
position: 'absolute',
|
|
30
|
+
borderRadius: 12,
|
|
31
|
+
borderWidth: 2,
|
|
32
|
+
borderColor: 'rgba(255,255,255,0.4)',
|
|
33
|
+
borderStyle: 'dashed',
|
|
34
|
+
backgroundColor: 'rgba(255,255,255,0.08)'
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
//# sourceMappingURL=GhostTile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["memo","StyleSheet","View","tileToPixelRect","useGridDrag","jsx","_jsx","GhostTile","activeTile","config","containerWidth","ghostPosition","rect","size","style","styles","ghost","left","x","top","y","width","height","create","position","borderRadius","borderWidth","borderColor","borderStyle","backgroundColor"],"sourceRoot":"..\\..\\..\\src","sources":["components/GhostTile.tsx"],"mappings":";;AAAA,SAASA,IAAI,QAAQ,OAAO;AAC5B,SAASC,UAAU,EAAEC,IAAI,QAAQ,cAAc;AAE/C,SAASC,eAAe,QAAQ,+BAA4B;AAC5D,SAASC,WAAW,QAAQ,+BAA4B;AAAC,SAAAC,GAAA,IAAAC,IAAA;AAQzD,OAAO,MAAMC,SAAS,gBAAGP,IAAI,CAAC,SAASO,SAASA,CAAC;EAC/CC,UAAU;EACVC,MAAM;EACNC;AACK,CAAC,EAAE;EACR,MAAM;IAAEC;EAAc,CAAC,GAAGP,WAAW,CAAC,CAAC;EACvC,IAAI,CAACO,aAAa,EAAE,OAAO,IAAI;EAE/B,MAAMC,IAAI,GAAGT,eAAe,CAACQ,aAAa,EAAEH,UAAU,CAACK,IAAI,EAAEJ,MAAM,EAAEC,cAAc,CAAC;EAEpF,oBACEJ,IAAA,CAACJ,IAAI;IACHY,KAAK,EAAE,CACLC,MAAM,CAACC,KAAK,EACZ;MAAEC,IAAI,EAAEL,IAAI,CAACM,CAAC;MAAEC,GAAG,EAAEP,IAAI,CAACQ,CAAC;MAAEC,KAAK,EAAET,IAAI,CAACS,KAAK;MAAEC,MAAM,EAAEV,IAAI,CAACU;IAAO,CAAC;EACrE,CACH,CAAC;AAEN,CAAC,CAAC;AAEF,MAAMP,MAAM,GAAGd,UAAU,CAACsB,MAAM,CAAC;EAC/BP,KAAK,EAAE;IACLQ,QAAQ,EAAE,UAAU;IACpBC,YAAY,EAAE,EAAE;IAChBC,WAAW,EAAE,CAAC;IACdC,WAAW,EAAE,uBAAuB;IACpCC,WAAW,EAAE,QAAQ;IACrBC,eAAe,EAAE;EACnB;AACF,CAAC,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import React, { memo } from 'react';
|
|
4
|
+
import { StyleSheet, View } from 'react-native';
|
|
5
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
6
|
+
export const GridTile = /*#__PURE__*/memo(function GridTile({
|
|
7
|
+
rect,
|
|
8
|
+
children
|
|
9
|
+
}) {
|
|
10
|
+
return /*#__PURE__*/_jsx(View, {
|
|
11
|
+
style: [styles.tile, {
|
|
12
|
+
left: rect.x,
|
|
13
|
+
top: rect.y,
|
|
14
|
+
width: rect.width,
|
|
15
|
+
height: rect.height
|
|
16
|
+
}],
|
|
17
|
+
children: children
|
|
18
|
+
});
|
|
19
|
+
});
|
|
20
|
+
const styles = StyleSheet.create({
|
|
21
|
+
tile: {
|
|
22
|
+
position: 'absolute'
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
//# sourceMappingURL=GridTile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["React","memo","StyleSheet","View","jsx","_jsx","GridTile","rect","children","style","styles","tile","left","x","top","y","width","height","create","position"],"sourceRoot":"..\\..\\..\\src","sources":["components/GridTile.tsx"],"mappings":";;AAAA,OAAOA,KAAK,IAAIC,IAAI,QAAQ,OAAO;AACnC,SAASC,UAAU,EAAEC,IAAI,QAAQ,cAAc;AAAC,SAAAC,GAAA,IAAAC,IAAA;AAQhD,OAAO,MAAMC,QAAQ,gBAAGL,IAAI,CAAC,SAASK,QAAQA,CAAC;EAAEC,IAAI;EAAEC;AAAgB,CAAC,EAAE;EACxE,oBACEH,IAAA,CAACF,IAAI;IACHM,KAAK,EAAE,CACLC,MAAM,CAACC,IAAI,EACX;MAAEC,IAAI,EAAEL,IAAI,CAACM,CAAC;MAAEC,GAAG,EAAEP,IAAI,CAACQ,CAAC;MAAEC,KAAK,EAAET,IAAI,CAACS,KAAK;MAAEC,MAAM,EAAEV,IAAI,CAACU;IAAO,CAAC,CACrE;IAAAT,QAAA,EAEDA;EAAQ,CACL,CAAC;AAEX,CAAC,CAAC;AAEF,MAAME,MAAM,GAAGR,UAAU,CAACgB,MAAM,CAAC;EAC/BP,IAAI,EAAE;IACJQ,QAAQ,EAAE;EACZ;AACF,CAAC,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { useRef } from 'react';
|
|
4
|
+
import { StyleSheet } from 'react-native';
|
|
5
|
+
import { Gesture, GestureDetector } from 'react-native-gesture-handler';
|
|
6
|
+
import Animated, { useAnimatedStyle, useSharedValue, runOnJS } from 'react-native-reanimated';
|
|
7
|
+
import { columnWidth } from "../layout/LayoutCalculator.js";
|
|
8
|
+
import { useGridDrag } from "../context/GridDragContext.js";
|
|
9
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
10
|
+
export function ResizeHandle({
|
|
11
|
+
tile,
|
|
12
|
+
config,
|
|
13
|
+
containerWidth
|
|
14
|
+
}) {
|
|
15
|
+
const {
|
|
16
|
+
commitResize
|
|
17
|
+
} = useGridDrag();
|
|
18
|
+
const initSize = useRef(tile.size);
|
|
19
|
+
const deltaW = useSharedValue(0);
|
|
20
|
+
const deltaH = useSharedValue(0);
|
|
21
|
+
const colW = columnWidth(config, containerWidth);
|
|
22
|
+
function onCommit(w, h) {
|
|
23
|
+
const minW = tile.minSize?.w ?? 1;
|
|
24
|
+
const minH = tile.minSize?.h ?? 1;
|
|
25
|
+
const maxW = tile.maxSize?.w ?? config.columns;
|
|
26
|
+
const maxH = tile.maxSize?.h ?? 99;
|
|
27
|
+
const newSize = {
|
|
28
|
+
w: Math.max(minW, Math.min(maxW, w)),
|
|
29
|
+
h: Math.max(minH, Math.min(maxH, h))
|
|
30
|
+
};
|
|
31
|
+
commitResize(tile, newSize);
|
|
32
|
+
}
|
|
33
|
+
const gesture = Gesture.Pan().onBegin(() => {
|
|
34
|
+
initSize.current = tile.size;
|
|
35
|
+
deltaW.value = 0;
|
|
36
|
+
deltaH.value = 0;
|
|
37
|
+
}).onUpdate(e => {
|
|
38
|
+
deltaW.value = Math.round(e.translationX / (colW + config.gap));
|
|
39
|
+
deltaH.value = Math.round(e.translationY / (config.rowHeight + config.gap));
|
|
40
|
+
}).onEnd(() => {
|
|
41
|
+
const newW = initSize.current.w + deltaW.value;
|
|
42
|
+
const newH = initSize.current.h + deltaH.value;
|
|
43
|
+
deltaW.value = 0;
|
|
44
|
+
deltaH.value = 0;
|
|
45
|
+
runOnJS(onCommit)(newW, newH);
|
|
46
|
+
});
|
|
47
|
+
const animStyle = useAnimatedStyle(() => ({
|
|
48
|
+
transform: [{
|
|
49
|
+
translateX: deltaW.value * (colW + config.gap)
|
|
50
|
+
}, {
|
|
51
|
+
translateY: deltaH.value * (config.rowHeight + config.gap)
|
|
52
|
+
}]
|
|
53
|
+
}));
|
|
54
|
+
return /*#__PURE__*/_jsx(GestureDetector, {
|
|
55
|
+
gesture: gesture,
|
|
56
|
+
children: /*#__PURE__*/_jsx(Animated.View, {
|
|
57
|
+
style: [styles.handle, animStyle]
|
|
58
|
+
})
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
const styles = StyleSheet.create({
|
|
62
|
+
handle: {
|
|
63
|
+
position: 'absolute',
|
|
64
|
+
bottom: 4,
|
|
65
|
+
right: 4,
|
|
66
|
+
width: 20,
|
|
67
|
+
height: 20,
|
|
68
|
+
borderRadius: 4,
|
|
69
|
+
backgroundColor: 'rgba(255,255,255,0.9)'
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
//# sourceMappingURL=ResizeHandle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["useRef","StyleSheet","Gesture","GestureDetector","Animated","useAnimatedStyle","useSharedValue","runOnJS","columnWidth","useGridDrag","jsx","_jsx","ResizeHandle","tile","config","containerWidth","commitResize","initSize","size","deltaW","deltaH","colW","onCommit","w","h","minW","minSize","minH","maxW","maxSize","columns","maxH","newSize","Math","max","min","gesture","Pan","onBegin","current","value","onUpdate","e","round","translationX","gap","translationY","rowHeight","onEnd","newW","newH","animStyle","transform","translateX","translateY","children","View","style","styles","handle","create","position","bottom","right","width","height","borderRadius","backgroundColor"],"sourceRoot":"..\\..\\..\\src","sources":["components/ResizeHandle.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,363 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import React, { forwardRef, useCallback, useImperativeHandle, useMemo, useRef, useState } from 'react';
|
|
4
|
+
import { ScrollView, StyleSheet, View } from 'react-native';
|
|
5
|
+
import { GridEngine } from "../engine/GridEngine.js";
|
|
6
|
+
import { resolveCollisions } from "../engine/collisions.js";
|
|
7
|
+
import { autoArrange as autoArrangeAlgo, applyGravity } from "../engine/autoArrange.js";
|
|
8
|
+
import { tileToPixelRect, gridTotalHeight, isInViewport } from "../layout/LayoutCalculator.js";
|
|
9
|
+
import { GridDragProvider, useGridDrag } from "../context/GridDragContext.js";
|
|
10
|
+
import { DraggableTile } from "./DraggableTile.js";
|
|
11
|
+
import { GhostTile } from "./GhostTile.js";
|
|
12
|
+
import { DragLayer } from "./DragLayer.js";
|
|
13
|
+
|
|
14
|
+
/** Imperative handle exposed via `ref`. */
|
|
15
|
+
|
|
16
|
+
/** Argument passed to `renderTile`. */
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Props for `SmartGrid`.
|
|
20
|
+
*
|
|
21
|
+
* `position` and `size` on each tile are optional:
|
|
22
|
+
* - Both provided → tile is placed exactly where specified.
|
|
23
|
+
* - `size` only → tile is auto-placed via bin-packing.
|
|
24
|
+
* - Neither → tile defaults to 1×1 and is auto-placed in order.
|
|
25
|
+
*/
|
|
26
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
27
|
+
// ── Normalization ─────────────────────────────────────────────────────────────
|
|
28
|
+
|
|
29
|
+
function normalizeTiles(tiles, columns) {
|
|
30
|
+
const sized = tiles.map(t => ({
|
|
31
|
+
...t,
|
|
32
|
+
size: t.size ?? {
|
|
33
|
+
w: 1,
|
|
34
|
+
h: 1
|
|
35
|
+
}
|
|
36
|
+
}));
|
|
37
|
+
const withPos = sized.filter(t => t.position != null);
|
|
38
|
+
const withoutPos = sized.filter(t => t.position == null);
|
|
39
|
+
if (withoutPos.length === 0) return withPos;
|
|
40
|
+
const engine = new GridEngine(columns);
|
|
41
|
+
for (const t of withPos) engine.placeAt(t.id, t.position, t.size);
|
|
42
|
+
const result = [...withPos];
|
|
43
|
+
for (const t of withoutPos) {
|
|
44
|
+
const pos = engine.findFirstFit(t.size);
|
|
45
|
+
if (pos) {
|
|
46
|
+
engine.placeAt(t.id, pos, t.size);
|
|
47
|
+
result.push({
|
|
48
|
+
...t,
|
|
49
|
+
position: pos
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return result;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// ── Inner component (has access to GridDragContext) ───────────────────────────
|
|
57
|
+
|
|
58
|
+
function SmartGridInner({
|
|
59
|
+
data,
|
|
60
|
+
renderTile,
|
|
61
|
+
columns = 4,
|
|
62
|
+
rowHeight = 100,
|
|
63
|
+
gap = 8,
|
|
64
|
+
padding = 8
|
|
65
|
+
}) {
|
|
66
|
+
const [containerWidth, setContainerWidth] = useState(0);
|
|
67
|
+
const [viewportHeight, setViewportHeight] = useState(0);
|
|
68
|
+
const scrollTickRef = useRef(0);
|
|
69
|
+
const [scrollTick, setScrollTick] = useState(0);
|
|
70
|
+
|
|
71
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
72
|
+
const containerRef = useRef(null);
|
|
73
|
+
const drag = useGridDrag();
|
|
74
|
+
const config = useMemo(() => ({
|
|
75
|
+
columns,
|
|
76
|
+
rowHeight,
|
|
77
|
+
gap,
|
|
78
|
+
padding
|
|
79
|
+
}), [columns, rowHeight, gap, padding]);
|
|
80
|
+
const totalHeight = useMemo(() => gridTotalHeight(data, config), [data, config]);
|
|
81
|
+
const handleLayout = useCallback(e => {
|
|
82
|
+
setContainerWidth(e.nativeEvent.layout.width);
|
|
83
|
+
setViewportHeight(e.nativeEvent.layout.height);
|
|
84
|
+
containerRef.current?.measure((_x, _y, _w, _h, pageX, pageY) => {
|
|
85
|
+
drag.containerPageX.current = pageX;
|
|
86
|
+
drag.containerPageY.current = pageY;
|
|
87
|
+
});
|
|
88
|
+
}, [drag]);
|
|
89
|
+
const handleScroll = useCallback(e => {
|
|
90
|
+
drag.scrollYRef.current = e.nativeEvent.contentOffset.y;
|
|
91
|
+
scrollTickRef.current += 1;
|
|
92
|
+
setScrollTick(scrollTickRef.current);
|
|
93
|
+
}, [drag]);
|
|
94
|
+
|
|
95
|
+
// Compute rect once per tile and keep it alongside the tile — avoids a second
|
|
96
|
+
// tileToPixelRect call in the map below.
|
|
97
|
+
const visibleTiles = useMemo(() => {
|
|
98
|
+
if (containerWidth === 0) return [];
|
|
99
|
+
const result = [];
|
|
100
|
+
for (const tile of data) {
|
|
101
|
+
const rect = tileToPixelRect(tile.position, tile.size, config, containerWidth);
|
|
102
|
+
if (isInViewport(rect, drag.scrollYRef.current, viewportHeight)) {
|
|
103
|
+
result.push({
|
|
104
|
+
tile,
|
|
105
|
+
rect
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
return result;
|
|
110
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
111
|
+
}, [data, config, containerWidth, viewportHeight, scrollTick]);
|
|
112
|
+
|
|
113
|
+
// Set for O(1) isSelected lookup instead of O(n) Array.includes per rendered tile
|
|
114
|
+
const selectedSet = useMemo(() => new Set(drag.selectedTileIds), [drag.selectedTileIds]);
|
|
115
|
+
return /*#__PURE__*/_jsxs(View, {
|
|
116
|
+
style: styles.root,
|
|
117
|
+
ref: containerRef,
|
|
118
|
+
onLayout: handleLayout,
|
|
119
|
+
children: [/*#__PURE__*/_jsx(ScrollView, {
|
|
120
|
+
onScroll: handleScroll,
|
|
121
|
+
scrollEventThrottle: 16,
|
|
122
|
+
scrollEnabled: !drag.activeTile,
|
|
123
|
+
style: styles.scroll,
|
|
124
|
+
children: /*#__PURE__*/_jsxs(View, {
|
|
125
|
+
style: [styles.canvas, {
|
|
126
|
+
height: totalHeight
|
|
127
|
+
}],
|
|
128
|
+
children: [containerWidth > 0 && visibleTiles.map(({
|
|
129
|
+
tile,
|
|
130
|
+
rect
|
|
131
|
+
}) => {
|
|
132
|
+
const isActive = drag.activeTile?.id === tile.id;
|
|
133
|
+
const isSelected = selectedSet.has(tile.id);
|
|
134
|
+
return /*#__PURE__*/_jsx(DraggableTile, {
|
|
135
|
+
tile: tile,
|
|
136
|
+
rect: rect,
|
|
137
|
+
config: config,
|
|
138
|
+
containerWidth: containerWidth,
|
|
139
|
+
children: renderTile({
|
|
140
|
+
item: tile,
|
|
141
|
+
isActive,
|
|
142
|
+
isSelected
|
|
143
|
+
})
|
|
144
|
+
}, tile.id);
|
|
145
|
+
}), drag.activeTile && containerWidth > 0 && /*#__PURE__*/_jsx(GhostTile, {
|
|
146
|
+
activeTile: drag.activeTile,
|
|
147
|
+
config: config,
|
|
148
|
+
containerWidth: containerWidth
|
|
149
|
+
})]
|
|
150
|
+
})
|
|
151
|
+
}), drag.activeTile && drag.initialRect && /*#__PURE__*/_jsx(DragLayer, {
|
|
152
|
+
tile: drag.activeTile,
|
|
153
|
+
initialRect: drag.initialRect,
|
|
154
|
+
children: renderTile({
|
|
155
|
+
item: drag.activeTile,
|
|
156
|
+
isActive: true,
|
|
157
|
+
isSelected: false
|
|
158
|
+
})
|
|
159
|
+
})]
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
// ── Public component (provides context + ref handle) ─────────────────────────
|
|
164
|
+
|
|
165
|
+
function SmartGridWithRef(props, ref) {
|
|
166
|
+
const columns = props.columns ?? 4;
|
|
167
|
+
const gravity = props.gravity ?? 'none';
|
|
168
|
+
const [selectedTileIds, setSelectedTileIds] = useState([]);
|
|
169
|
+
const normalizedData = useMemo(() => normalizeTiles(props.data, columns), [props.data, columns]);
|
|
170
|
+
const handleSelect = useCallback(ids => {
|
|
171
|
+
setSelectedTileIds(ids);
|
|
172
|
+
props.onSelectionChange?.(ids);
|
|
173
|
+
},
|
|
174
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
175
|
+
[props.onSelectionChange]);
|
|
176
|
+
useImperativeHandle(ref, () => ({
|
|
177
|
+
autoArrange() {
|
|
178
|
+
const arranged = autoArrangeAlgo(normalizedData, columns);
|
|
179
|
+
props.onLayoutChange?.(arranged.map(t => ({
|
|
180
|
+
id: t.id,
|
|
181
|
+
position: t.position,
|
|
182
|
+
size: t.size
|
|
183
|
+
})));
|
|
184
|
+
},
|
|
185
|
+
serializeLayout() {
|
|
186
|
+
return normalizedData.map(t => ({
|
|
187
|
+
id: t.id,
|
|
188
|
+
position: t.position,
|
|
189
|
+
size: t.size
|
|
190
|
+
}));
|
|
191
|
+
},
|
|
192
|
+
restoreLayout(layout) {
|
|
193
|
+
props.onLayoutChange?.(layout);
|
|
194
|
+
},
|
|
195
|
+
clearSelection() {
|
|
196
|
+
handleSelect([]);
|
|
197
|
+
},
|
|
198
|
+
setSelection(ids) {
|
|
199
|
+
handleSelect(ids);
|
|
200
|
+
}
|
|
201
|
+
}),
|
|
202
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
203
|
+
[normalizedData, columns, props.onLayoutChange, handleSelect]);
|
|
204
|
+
const handleDrop = useCallback((tile, newPosition) => {
|
|
205
|
+
const afterCollision = resolveCollisions(normalizedData, tile.id, newPosition, props.collisionBehavior ?? 'push', columns);
|
|
206
|
+
const afterGravity = applyGravity(afterCollision, columns, gravity);
|
|
207
|
+
const newLayout = afterGravity.map(t => ({
|
|
208
|
+
id: t.id,
|
|
209
|
+
position: t.position,
|
|
210
|
+
size: t.size
|
|
211
|
+
}));
|
|
212
|
+
const layoutChanged = newLayout.some(item => {
|
|
213
|
+
const prev = normalizedData.find(t => t.id === item.id);
|
|
214
|
+
return !prev || prev.position.x !== item.position.x || prev.position.y !== item.position.y;
|
|
215
|
+
});
|
|
216
|
+
if (!layoutChanged) return;
|
|
217
|
+
props.onTileDrop?.(tile, newPosition);
|
|
218
|
+
props.onLayoutChange?.(newLayout);
|
|
219
|
+
},
|
|
220
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
221
|
+
[normalizedData, props.collisionBehavior, columns, gravity, props.onTileDrop, props.onLayoutChange]);
|
|
222
|
+
const handleResize = useCallback((tile, newSize) => {
|
|
223
|
+
const withNewSize = normalizedData.map(t => t.id === tile.id ? {
|
|
224
|
+
...t,
|
|
225
|
+
size: newSize
|
|
226
|
+
} : t);
|
|
227
|
+
const afterCollision = resolveCollisions(withNewSize, tile.id, tile.position, props.collisionBehavior ?? 'push', columns);
|
|
228
|
+
const newLayout = afterCollision.map(t => ({
|
|
229
|
+
id: t.id,
|
|
230
|
+
position: t.position,
|
|
231
|
+
size: t.size
|
|
232
|
+
}));
|
|
233
|
+
props.onTileResize?.(tile, newSize);
|
|
234
|
+
props.onLayoutChange?.(newLayout);
|
|
235
|
+
},
|
|
236
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
237
|
+
[normalizedData, props.collisionBehavior, columns, props.onTileResize, props.onLayoutChange]);
|
|
238
|
+
return /*#__PURE__*/_jsx(GridDragProvider, {
|
|
239
|
+
isEditing: props.isEditing ?? false,
|
|
240
|
+
draggable: props.draggable ?? true,
|
|
241
|
+
selectable: props.selectable ?? true,
|
|
242
|
+
multiSelect: props.multiSelect ?? true,
|
|
243
|
+
selectedTileIds: selectedTileIds,
|
|
244
|
+
onDrop: handleDrop,
|
|
245
|
+
onResize: handleResize,
|
|
246
|
+
onSelect: handleSelect,
|
|
247
|
+
onTilePress: props.onTilePress,
|
|
248
|
+
onHaptic: props.onHaptic,
|
|
249
|
+
children: /*#__PURE__*/_jsx(SmartGridInner, {
|
|
250
|
+
...props,
|
|
251
|
+
data: normalizedData
|
|
252
|
+
})
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
/**
|
|
257
|
+
* A draggable, variable-sized tile grid for React Native.
|
|
258
|
+
*
|
|
259
|
+
* ---
|
|
260
|
+
*
|
|
261
|
+
* ### Basic usage
|
|
262
|
+
* ```tsx
|
|
263
|
+
* const gridRef = useRef<SmartGridRef>(null);
|
|
264
|
+
*
|
|
265
|
+
* <SmartGrid
|
|
266
|
+
* ref={gridRef}
|
|
267
|
+
* data={tiles}
|
|
268
|
+
* columns={4}
|
|
269
|
+
* rowHeight={100}
|
|
270
|
+
* gap={8}
|
|
271
|
+
* collisionBehavior="push"
|
|
272
|
+
* gravity="up"
|
|
273
|
+
* isEditing={isEditing}
|
|
274
|
+
* onLayoutChange={(layout) =>
|
|
275
|
+
* setTiles(prev =>
|
|
276
|
+
* prev.map(t => {
|
|
277
|
+
* const updated = layout.find(l => l.id === t.id);
|
|
278
|
+
* return updated ? { ...t, ...updated } : t;
|
|
279
|
+
* })
|
|
280
|
+
* )
|
|
281
|
+
* }
|
|
282
|
+
* renderTile={({ item, isActive, isSelected }) => (
|
|
283
|
+
* <View style={{ flex: 1, opacity: isActive ? 0.5 : 1,
|
|
284
|
+
* borderWidth: isSelected ? 2 : 0, borderColor: '#fff' }}>
|
|
285
|
+
* <Text>{item.data.label}</Text>
|
|
286
|
+
* </View>
|
|
287
|
+
* )}
|
|
288
|
+
* />
|
|
289
|
+
* ```
|
|
290
|
+
*
|
|
291
|
+
* ---
|
|
292
|
+
*
|
|
293
|
+
* ### Selection (long press + release)
|
|
294
|
+
* Long-pressing a tile and releasing without moving selects it.
|
|
295
|
+
* Tapping any tile while a selection is active toggles that tile too.
|
|
296
|
+
*
|
|
297
|
+
* ```tsx
|
|
298
|
+
* // Multi-select (default) — accumulate selections
|
|
299
|
+
* <SmartGrid
|
|
300
|
+
* multiSelect // true by default, can omit
|
|
301
|
+
* onSelectionChange={(ids) => console.log('selected:', ids)}
|
|
302
|
+
* renderTile={({ item, isSelected }) => (
|
|
303
|
+
* <View>
|
|
304
|
+
* <Text>{item.data.label}</Text>
|
|
305
|
+
* {isSelected && <Text>✕ Delete</Text>}
|
|
306
|
+
* </View>
|
|
307
|
+
* )}
|
|
308
|
+
* />
|
|
309
|
+
*
|
|
310
|
+
* // Single-select — picking a new tile deselects the previous one
|
|
311
|
+
* <SmartGrid
|
|
312
|
+
* multiSelect={false}
|
|
313
|
+
* onSelectionChange={([id]) => setActive(id ?? null)}
|
|
314
|
+
* />
|
|
315
|
+
*
|
|
316
|
+
* // Clear selection imperatively
|
|
317
|
+
* gridRef.current?.clearSelection();
|
|
318
|
+
*
|
|
319
|
+
* // Or set it programmatically
|
|
320
|
+
* gridRef.current?.setSelection(['tile-1', 'tile-3']);
|
|
321
|
+
* ```
|
|
322
|
+
*
|
|
323
|
+
* ---
|
|
324
|
+
*
|
|
325
|
+
* ### Grid-level draggable / selectable master switches
|
|
326
|
+
* These override all per-tile flags when set to `false`.
|
|
327
|
+
* ```tsx
|
|
328
|
+
* // View-only mode — nothing can be dragged or selected
|
|
329
|
+
* <SmartGrid draggable={false} selectable={false} data={tiles} ... />
|
|
330
|
+
*
|
|
331
|
+
* // Read-only layout — tiles are visible but locked in place
|
|
332
|
+
* <SmartGrid draggable={false} data={tiles} ... />
|
|
333
|
+
*
|
|
334
|
+
* // Selection disabled — long press does nothing (onTilePress still fires on tap)
|
|
335
|
+
* <SmartGrid selectable={false} data={tiles} ... />
|
|
336
|
+
* ```
|
|
337
|
+
*
|
|
338
|
+
* ### Per-tile draggable / selectable flags
|
|
339
|
+
* Fine-grained control per tile when the grid-level switches are on.
|
|
340
|
+
* ```tsx
|
|
341
|
+
* const tiles: Tile<MyData>[] = [
|
|
342
|
+
* { id: '1', data: { label: 'Free' } },
|
|
343
|
+
* // Stays pinned in place — cannot be dragged
|
|
344
|
+
* { id: '2', data: { label: 'Pinned' }, draggable: false },
|
|
345
|
+
* // Ignored by selection — tapping fires onTilePress instead
|
|
346
|
+
* { id: '3', data: { label: 'Info' }, selectable: false },
|
|
347
|
+
* ];
|
|
348
|
+
* ```
|
|
349
|
+
*/
|
|
350
|
+
// Cast preserves the generic type parameter through forwardRef
|
|
351
|
+
export const SmartGrid = /*#__PURE__*/forwardRef(SmartGridWithRef);
|
|
352
|
+
const styles = StyleSheet.create({
|
|
353
|
+
root: {
|
|
354
|
+
flex: 1
|
|
355
|
+
},
|
|
356
|
+
scroll: {
|
|
357
|
+
flex: 1
|
|
358
|
+
},
|
|
359
|
+
canvas: {
|
|
360
|
+
position: 'relative'
|
|
361
|
+
}
|
|
362
|
+
});
|
|
363
|
+
//# sourceMappingURL=SmartGrid.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["React","forwardRef","useCallback","useImperativeHandle","useMemo","useRef","useState","ScrollView","StyleSheet","View","GridEngine","resolveCollisions","autoArrange","autoArrangeAlgo","applyGravity","tileToPixelRect","gridTotalHeight","isInViewport","GridDragProvider","useGridDrag","DraggableTile","GhostTile","DragLayer","jsx","_jsx","jsxs","_jsxs","normalizeTiles","tiles","columns","sized","map","t","size","w","h","withPos","filter","position","withoutPos","length","engine","placeAt","id","result","pos","findFirstFit","push","SmartGridInner","data","renderTile","rowHeight","gap","padding","containerWidth","setContainerWidth","viewportHeight","setViewportHeight","scrollTickRef","scrollTick","setScrollTick","containerRef","drag","config","totalHeight","handleLayout","e","nativeEvent","layout","width","height","current","measure","_x","_y","_w","_h","pageX","pageY","containerPageX","containerPageY","handleScroll","scrollYRef","contentOffset","y","visibleTiles","tile","rect","selectedSet","Set","selectedTileIds","style","styles","root","ref","onLayout","children","onScroll","scrollEventThrottle","scrollEnabled","activeTile","scroll","canvas","isActive","isSelected","has","item","initialRect","SmartGridWithRef","props","gravity","setSelectedTileIds","normalizedData","handleSelect","ids","onSelectionChange","arranged","onLayoutChange","serializeLayout","restoreLayout","clearSelection","setSelection","handleDrop","newPosition","afterCollision","collisionBehavior","afterGravity","newLayout","layoutChanged","some","prev","find","x","onTileDrop","handleResize","newSize","withNewSize","onTileResize","isEditing","draggable","selectable","multiSelect","onDrop","onResize","onSelect","onTilePress","onHaptic","SmartGrid","create","flex"],"sourceRoot":"..\\..\\..\\src","sources":["components/SmartGrid.tsx"],"mappings":"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,UAAW;IACnBqB,QAAQ,EAAET,YAAa;IACvBU,QAAQ,EAAE/B,YAAa;IACvBgC,WAAW,EAAEpC,KAAK,CAACoC,WAAwD;IAC3EC,QAAQ,EAAErC,KAAK,CAACqC,QAAS;IAAAlD,QAAA,eAEzBxE,IAAA,CAACwB,cAAc;MAAA,GAAK6D,KAAK;MAAE5D,IAAI,EAAE+D;IAAe,CAAE;EAAC,CACnC,CAAC;AAEvB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMmC,SAAS,gBAAGlJ,UAAU,CAAC2G,gBAAgB,CAEtB;AAE9B,MAAMhB,MAAM,GAAGpF,UAAU,CAAC4I,MAAM,CAAC;EAC/BvD,IAAI,EAAE;IAAEwD,IAAI,EAAE;EAAE,CAAC;EACjBhD,MAAM,EAAE;IAAEgD,IAAI,EAAE;EAAE,CAAC;EACnB/C,MAAM,EAAE;IAAEhE,QAAQ,EAAE;EAAW;AACjC,CAAC,CAAC","ignoreList":[]}
|