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.
Files changed (80) hide show
  1. package/LICENSE +20 -0
  2. package/README.md +554 -0
  3. package/lib/module/components/DragLayer.js +71 -0
  4. package/lib/module/components/DragLayer.js.map +1 -0
  5. package/lib/module/components/DraggableTile.js +79 -0
  6. package/lib/module/components/DraggableTile.js.map +1 -0
  7. package/lib/module/components/GhostTile.js +37 -0
  8. package/lib/module/components/GhostTile.js.map +1 -0
  9. package/lib/module/components/GridTile.js +25 -0
  10. package/lib/module/components/GridTile.js.map +1 -0
  11. package/lib/module/components/ResizeHandle.js +72 -0
  12. package/lib/module/components/ResizeHandle.js.map +1 -0
  13. package/lib/module/components/SmartGrid.js +363 -0
  14. package/lib/module/components/SmartGrid.js.map +1 -0
  15. package/lib/module/context/GridDragContext.js +130 -0
  16. package/lib/module/context/GridDragContext.js.map +1 -0
  17. package/lib/module/engine/GridEngine.js +148 -0
  18. package/lib/module/engine/GridEngine.js.map +1 -0
  19. package/lib/module/engine/autoArrange.js +54 -0
  20. package/lib/module/engine/autoArrange.js.map +1 -0
  21. package/lib/module/engine/collisions.js +67 -0
  22. package/lib/module/engine/collisions.js.map +1 -0
  23. package/lib/module/hooks/useTileGesture.js +62 -0
  24. package/lib/module/hooks/useTileGesture.js.map +1 -0
  25. package/lib/module/index.js +9 -0
  26. package/lib/module/index.js.map +1 -0
  27. package/lib/module/layout/LayoutCalculator.js +29 -0
  28. package/lib/module/layout/LayoutCalculator.js.map +1 -0
  29. package/lib/module/package.json +1 -0
  30. package/lib/module/types.js +2 -0
  31. package/lib/module/types.js.map +1 -0
  32. package/lib/module/utils/pixelToGrid.js +22 -0
  33. package/lib/module/utils/pixelToGrid.js.map +1 -0
  34. package/lib/typescript/package.json +1 -0
  35. package/lib/typescript/src/components/DragLayer.d.ts +11 -0
  36. package/lib/typescript/src/components/DragLayer.d.ts.map +1 -0
  37. package/lib/typescript/src/components/DraggableTile.d.ts +14 -0
  38. package/lib/typescript/src/components/DraggableTile.d.ts.map +1 -0
  39. package/lib/typescript/src/components/GhostTile.d.ts +9 -0
  40. package/lib/typescript/src/components/GhostTile.d.ts.map +1 -0
  41. package/lib/typescript/src/components/GridTile.d.ts +9 -0
  42. package/lib/typescript/src/components/GridTile.d.ts.map +1 -0
  43. package/lib/typescript/src/components/ResizeHandle.d.ts +9 -0
  44. package/lib/typescript/src/components/ResizeHandle.d.ts.map +1 -0
  45. package/lib/typescript/src/components/SmartGrid.d.ts +214 -0
  46. package/lib/typescript/src/components/SmartGrid.d.ts.map +1 -0
  47. package/lib/typescript/src/context/GridDragContext.d.ts +44 -0
  48. package/lib/typescript/src/context/GridDragContext.d.ts.map +1 -0
  49. package/lib/typescript/src/engine/GridEngine.d.ts +35 -0
  50. package/lib/typescript/src/engine/GridEngine.d.ts.map +1 -0
  51. package/lib/typescript/src/engine/autoArrange.d.ts +4 -0
  52. package/lib/typescript/src/engine/autoArrange.d.ts.map +1 -0
  53. package/lib/typescript/src/engine/collisions.d.ts +3 -0
  54. package/lib/typescript/src/engine/collisions.d.ts.map +1 -0
  55. package/lib/typescript/src/hooks/useTileGesture.d.ts +13 -0
  56. package/lib/typescript/src/hooks/useTileGesture.d.ts.map +1 -0
  57. package/lib/typescript/src/index.d.ts +10 -0
  58. package/lib/typescript/src/index.d.ts.map +1 -0
  59. package/lib/typescript/src/layout/LayoutCalculator.d.ts +15 -0
  60. package/lib/typescript/src/layout/LayoutCalculator.d.ts.map +1 -0
  61. package/lib/typescript/src/types.d.ts +105 -0
  62. package/lib/typescript/src/types.d.ts.map +1 -0
  63. package/lib/typescript/src/utils/pixelToGrid.d.ts +9 -0
  64. package/lib/typescript/src/utils/pixelToGrid.d.ts.map +1 -0
  65. package/package.json +161 -0
  66. package/src/components/DragLayer.tsx +71 -0
  67. package/src/components/DraggableTile.tsx +88 -0
  68. package/src/components/GhostTile.tsx +42 -0
  69. package/src/components/GridTile.tsx +27 -0
  70. package/src/components/ResizeHandle.tsx +74 -0
  71. package/src/components/SmartGrid.tsx +506 -0
  72. package/src/context/GridDragContext.tsx +191 -0
  73. package/src/engine/GridEngine.ts +148 -0
  74. package/src/engine/autoArrange.ts +59 -0
  75. package/src/engine/collisions.ts +87 -0
  76. package/src/hooks/useTileGesture.ts +88 -0
  77. package/src/index.tsx +29 -0
  78. package/src/layout/LayoutCalculator.ts +50 -0
  79. package/src/types.ts +113 -0
  80. 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":[]}