react-native-element-inspector 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 (213) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +134 -0
  3. package/lib/ElementCycler.d.ts +14 -0
  4. package/lib/ElementCycler.d.ts.map +1 -0
  5. package/lib/ElementCycler.js +33 -0
  6. package/lib/ElementCycler.js.map +1 -0
  7. package/lib/ElementHighlighter.d.ts +21 -0
  8. package/lib/ElementHighlighter.d.ts.map +1 -0
  9. package/lib/ElementHighlighter.js +89 -0
  10. package/lib/ElementHighlighter.js.map +1 -0
  11. package/lib/ElementInspector.d.ts +12 -0
  12. package/lib/ElementInspector.d.ts.map +1 -0
  13. package/lib/ElementInspector.js +74 -0
  14. package/lib/ElementInspector.js.map +1 -0
  15. package/lib/components/Checkbox.d.ts +7 -0
  16. package/lib/components/Checkbox.d.ts.map +1 -0
  17. package/lib/components/Checkbox.js +30 -0
  18. package/lib/components/Checkbox.js.map +1 -0
  19. package/lib/components/index.d.ts +2 -0
  20. package/lib/components/index.d.ts.map +1 -0
  21. package/lib/components/index.js +2 -0
  22. package/lib/components/index.js.map +1 -0
  23. package/lib/constants/colors.d.ts +24 -0
  24. package/lib/constants/colors.d.ts.map +1 -0
  25. package/lib/constants/colors.js +18 -0
  26. package/lib/constants/colors.js.map +1 -0
  27. package/lib/constants/index.d.ts +3 -0
  28. package/lib/constants/index.d.ts.map +1 -0
  29. package/lib/constants/index.js +3 -0
  30. package/lib/constants/index.js.map +1 -0
  31. package/lib/constants/ui.d.ts +56 -0
  32. package/lib/constants/ui.d.ts.map +1 -0
  33. package/lib/constants/ui.js +46 -0
  34. package/lib/constants/ui.js.map +1 -0
  35. package/lib/fiber/FiberAdapter.d.ts +52 -0
  36. package/lib/fiber/FiberAdapter.d.ts.map +1 -0
  37. package/lib/fiber/FiberAdapter.js +112 -0
  38. package/lib/fiber/FiberAdapter.js.map +1 -0
  39. package/lib/fiber/detectVersion.d.ts +9 -0
  40. package/lib/fiber/detectVersion.d.ts.map +1 -0
  41. package/lib/fiber/detectVersion.js +17 -0
  42. package/lib/fiber/detectVersion.js.map +1 -0
  43. package/lib/fiber/index.d.ts +5 -0
  44. package/lib/fiber/index.d.ts.map +1 -0
  45. package/lib/fiber/index.js +4 -0
  46. package/lib/fiber/index.js.map +1 -0
  47. package/lib/fiber/types.d.ts +35 -0
  48. package/lib/fiber/types.d.ts.map +1 -0
  49. package/lib/fiber/types.js +3 -0
  50. package/lib/fiber/types.js.map +1 -0
  51. package/lib/floatingPanel/AddPropertyRow.d.ts +13 -0
  52. package/lib/floatingPanel/AddPropertyRow.d.ts.map +1 -0
  53. package/lib/floatingPanel/AddPropertyRow.js +61 -0
  54. package/lib/floatingPanel/AddPropertyRow.js.map +1 -0
  55. package/lib/floatingPanel/CloseButton.d.ts +7 -0
  56. package/lib/floatingPanel/CloseButton.d.ts.map +1 -0
  57. package/lib/floatingPanel/CloseButton.js +21 -0
  58. package/lib/floatingPanel/CloseButton.js.map +1 -0
  59. package/lib/floatingPanel/EditableValue.d.ts +12 -0
  60. package/lib/floatingPanel/EditableValue.d.ts.map +1 -0
  61. package/lib/floatingPanel/EditableValue.js +67 -0
  62. package/lib/floatingPanel/EditableValue.js.map +1 -0
  63. package/lib/floatingPanel/FloatingPanel.d.ts +7 -0
  64. package/lib/floatingPanel/FloatingPanel.d.ts.map +1 -0
  65. package/lib/floatingPanel/FloatingPanel.js +70 -0
  66. package/lib/floatingPanel/FloatingPanel.js.map +1 -0
  67. package/lib/floatingPanel/HandleContent.d.ts +7 -0
  68. package/lib/floatingPanel/HandleContent.d.ts.map +1 -0
  69. package/lib/floatingPanel/HandleContent.js +35 -0
  70. package/lib/floatingPanel/HandleContent.js.map +1 -0
  71. package/lib/floatingPanel/InspectorBubble.d.ts +6 -0
  72. package/lib/floatingPanel/InspectorBubble.d.ts.map +1 -0
  73. package/lib/floatingPanel/InspectorBubble.js +91 -0
  74. package/lib/floatingPanel/InspectorBubble.js.map +1 -0
  75. package/lib/floatingPanel/PanelBody.d.ts +8 -0
  76. package/lib/floatingPanel/PanelBody.d.ts.map +1 -0
  77. package/lib/floatingPanel/PanelBody.js +72 -0
  78. package/lib/floatingPanel/PanelBody.js.map +1 -0
  79. package/lib/floatingPanel/PanelFooter.d.ts +9 -0
  80. package/lib/floatingPanel/PanelFooter.d.ts.map +1 -0
  81. package/lib/floatingPanel/PanelFooter.js +21 -0
  82. package/lib/floatingPanel/PanelFooter.js.map +1 -0
  83. package/lib/floatingPanel/PanelHeader.d.ts +13 -0
  84. package/lib/floatingPanel/PanelHeader.d.ts.map +1 -0
  85. package/lib/floatingPanel/PanelHeader.js +56 -0
  86. package/lib/floatingPanel/PanelHeader.js.map +1 -0
  87. package/lib/floatingPanel/index.d.ts +12 -0
  88. package/lib/floatingPanel/index.d.ts.map +1 -0
  89. package/lib/floatingPanel/index.js +11 -0
  90. package/lib/floatingPanel/index.js.map +1 -0
  91. package/lib/floatingPanel/panelUtils.d.ts +3 -0
  92. package/lib/floatingPanel/panelUtils.d.ts.map +1 -0
  93. package/lib/floatingPanel/panelUtils.js +12 -0
  94. package/lib/floatingPanel/panelUtils.js.map +1 -0
  95. package/lib/floatingPanel/types.d.ts +23 -0
  96. package/lib/floatingPanel/types.d.ts.map +1 -0
  97. package/lib/floatingPanel/types.js +2 -0
  98. package/lib/floatingPanel/types.js.map +1 -0
  99. package/lib/hooks/index.d.ts +8 -0
  100. package/lib/hooks/index.d.ts.map +1 -0
  101. package/lib/hooks/index.js +8 -0
  102. package/lib/hooks/index.js.map +1 -0
  103. package/lib/hooks/useDebouncedCallback.d.ts +2 -0
  104. package/lib/hooks/useDebouncedCallback.d.ts.map +1 -0
  105. package/lib/hooks/useDebouncedCallback.js +12 -0
  106. package/lib/hooks/useDebouncedCallback.js.map +1 -0
  107. package/lib/hooks/useDebouncedValue.d.ts +2 -0
  108. package/lib/hooks/useDebouncedValue.d.ts.map +1 -0
  109. package/lib/hooks/useDebouncedValue.js +10 -0
  110. package/lib/hooks/useDebouncedValue.js.map +1 -0
  111. package/lib/hooks/useFloatingPanel.d.ts +14 -0
  112. package/lib/hooks/useFloatingPanel.d.ts.map +1 -0
  113. package/lib/hooks/useFloatingPanel.js +132 -0
  114. package/lib/hooks/useFloatingPanel.js.map +1 -0
  115. package/lib/hooks/useLayoutSnapshot.d.ts +14 -0
  116. package/lib/hooks/useLayoutSnapshot.d.ts.map +1 -0
  117. package/lib/hooks/useLayoutSnapshot.js +39 -0
  118. package/lib/hooks/useLayoutSnapshot.js.map +1 -0
  119. package/lib/hooks/useStyleMutation.d.ts +14 -0
  120. package/lib/hooks/useStyleMutation.d.ts.map +1 -0
  121. package/lib/hooks/useStyleMutation.js +22 -0
  122. package/lib/hooks/useStyleMutation.js.map +1 -0
  123. package/lib/hooks/useStyleOverrides.d.ts +24 -0
  124. package/lib/hooks/useStyleOverrides.d.ts.map +1 -0
  125. package/lib/hooks/useStyleOverrides.js +165 -0
  126. package/lib/hooks/useStyleOverrides.js.map +1 -0
  127. package/lib/hooks/useTapToSelect.d.ts +20 -0
  128. package/lib/hooks/useTapToSelect.d.ts.map +1 -0
  129. package/lib/hooks/useTapToSelect.js +58 -0
  130. package/lib/hooks/useTapToSelect.js.map +1 -0
  131. package/lib/index.d.ts +3 -0
  132. package/lib/index.d.ts.map +1 -0
  133. package/lib/index.js +2 -0
  134. package/lib/index.js.map +1 -0
  135. package/lib/utils/clamp.d.ts +2 -0
  136. package/lib/utils/clamp.d.ts.map +1 -0
  137. package/lib/utils/clamp.js +2 -0
  138. package/lib/utils/clamp.js.map +1 -0
  139. package/lib/utils/flattenStyles.d.ts +6 -0
  140. package/lib/utils/flattenStyles.d.ts.map +1 -0
  141. package/lib/utils/flattenStyles.js +11 -0
  142. package/lib/utils/flattenStyles.js.map +1 -0
  143. package/lib/utils/hitTest.d.ts +7 -0
  144. package/lib/utils/hitTest.d.ts.map +1 -0
  145. package/lib/utils/hitTest.js +20 -0
  146. package/lib/utils/hitTest.js.map +1 -0
  147. package/lib/utils/index.d.ts +12 -0
  148. package/lib/utils/index.d.ts.map +1 -0
  149. package/lib/utils/index.js +9 -0
  150. package/lib/utils/index.js.map +1 -0
  151. package/lib/utils/layoutSnapshot.d.ts +7 -0
  152. package/lib/utils/layoutSnapshot.d.ts.map +1 -0
  153. package/lib/utils/layoutSnapshot.js +42 -0
  154. package/lib/utils/layoutSnapshot.js.map +1 -0
  155. package/lib/utils/sourceMapping.d.ts +26 -0
  156. package/lib/utils/sourceMapping.d.ts.map +1 -0
  157. package/lib/utils/sourceMapping.js +53 -0
  158. package/lib/utils/sourceMapping.js.map +1 -0
  159. package/lib/utils/styleFormatting.d.ts +5 -0
  160. package/lib/utils/styleFormatting.d.ts.map +1 -0
  161. package/lib/utils/styleFormatting.js +38 -0
  162. package/lib/utils/styleFormatting.js.map +1 -0
  163. package/lib/utils/styleInputParsing.d.ts +5 -0
  164. package/lib/utils/styleInputParsing.d.ts.map +1 -0
  165. package/lib/utils/styleInputParsing.js +33 -0
  166. package/lib/utils/styleInputParsing.js.map +1 -0
  167. package/lib/utils/yogaLayout.d.ts +33 -0
  168. package/lib/utils/yogaLayout.d.ts.map +1 -0
  169. package/lib/utils/yogaLayout.js +33 -0
  170. package/lib/utils/yogaLayout.js.map +1 -0
  171. package/package.json +74 -0
  172. package/src/ElementCycler.tsx +64 -0
  173. package/src/ElementHighlighter.tsx +122 -0
  174. package/src/ElementInspector.tsx +119 -0
  175. package/src/components/Checkbox.tsx +41 -0
  176. package/src/components/index.ts +1 -0
  177. package/src/constants/colors.ts +18 -0
  178. package/src/constants/index.ts +9 -0
  179. package/src/constants/ui.ts +51 -0
  180. package/src/fiber/FiberAdapter.ts +153 -0
  181. package/src/fiber/detectVersion.ts +19 -0
  182. package/src/fiber/index.ts +4 -0
  183. package/src/fiber/types.ts +36 -0
  184. package/src/floatingPanel/AddPropertyRow.tsx +102 -0
  185. package/src/floatingPanel/CloseButton.tsx +34 -0
  186. package/src/floatingPanel/EditableValue.tsx +109 -0
  187. package/src/floatingPanel/FloatingPanel.tsx +114 -0
  188. package/src/floatingPanel/HandleContent.tsx +45 -0
  189. package/src/floatingPanel/InspectorBubble.tsx +121 -0
  190. package/src/floatingPanel/PanelBody.tsx +162 -0
  191. package/src/floatingPanel/PanelFooter.tsx +36 -0
  192. package/src/floatingPanel/PanelHeader.tsx +111 -0
  193. package/src/floatingPanel/index.ts +11 -0
  194. package/src/floatingPanel/panelUtils.ts +13 -0
  195. package/src/floatingPanel/types.ts +26 -0
  196. package/src/hooks/index.ts +7 -0
  197. package/src/hooks/useDebouncedCallback.ts +18 -0
  198. package/src/hooks/useDebouncedValue.ts +12 -0
  199. package/src/hooks/useFloatingPanel.ts +191 -0
  200. package/src/hooks/useLayoutSnapshot.ts +42 -0
  201. package/src/hooks/useStyleMutation.ts +31 -0
  202. package/src/hooks/useStyleOverrides.ts +176 -0
  203. package/src/hooks/useTapToSelect.ts +76 -0
  204. package/src/index.ts +2 -0
  205. package/src/utils/clamp.ts +2 -0
  206. package/src/utils/flattenStyles.ts +12 -0
  207. package/src/utils/hitTest.ts +29 -0
  208. package/src/utils/index.ts +11 -0
  209. package/src/utils/layoutSnapshot.ts +48 -0
  210. package/src/utils/sourceMapping.ts +67 -0
  211. package/src/utils/styleFormatting.ts +34 -0
  212. package/src/utils/styleInputParsing.ts +33 -0
  213. package/src/utils/yogaLayout.ts +49 -0
@@ -0,0 +1,132 @@
1
+ import { useCallback, useEffect, useMemo, useRef } from 'react';
2
+ import { Animated, PanResponder } from 'react-native';
3
+ import { FLOATING_PANEL } from '../constants';
4
+ import { getPanelSize } from '../floatingPanel/panelUtils';
5
+ import { clamp } from '../utils';
6
+ /**
7
+ * Core animation/gesture hook for the floating inspector panel.
8
+ * Owns Animated.ValueXY for position, PanResponder for drag,
9
+ * and Animated.Value for expand/collapse transitions.
10
+ */
11
+ export const useFloatingPanel = ({ panelState, screenWidth, screenHeight, onTap, }) => {
12
+ // Mutable refs so PanResponder callbacks never capture stale values
13
+ const panelStateRef = useRef(panelState);
14
+ panelStateRef.current = panelState;
15
+ const onTapRef = useRef(onTap);
16
+ onTapRef.current = onTap;
17
+ const screenRef = useRef({ width: screenWidth, height: screenHeight });
18
+ screenRef.current = { width: screenWidth, height: screenHeight };
19
+ // Initial position: middle-left edge
20
+ const initialX = FLOATING_PANEL.EDGE_MARGIN;
21
+ const initialY = (screenHeight - FLOATING_PANEL.BUBBLE_SIZE) / 2;
22
+ const position = useRef(new Animated.ValueXY({ x: initialX, y: initialY })).current;
23
+ const expandProgress = useRef(new Animated.Value(0)).current;
24
+ // Track raw position for synchronous reads (Animated.Value doesn't expose current value)
25
+ const currentPosition = useRef({ x: initialX, y: initialY });
26
+ const isDragging = useRef(false);
27
+ const dragStart = useRef({ x: 0, y: 0 });
28
+ const panelSize = useMemo(() => getPanelSize(panelState), [panelState]);
29
+ const panelSizeRef = useRef(panelSize);
30
+ panelSizeRef.current = panelSize;
31
+ // Snap to nearest left/right edge with spring animation
32
+ const snapToEdge = useCallback(() => {
33
+ const { width } = screenRef.current;
34
+ const size = panelSizeRef.current;
35
+ const midpoint = width / 2;
36
+ const centerX = currentPosition.current.x + size.width / 2;
37
+ const targetX = centerX < midpoint
38
+ ? FLOATING_PANEL.EDGE_MARGIN
39
+ : width - size.width - FLOATING_PANEL.EDGE_MARGIN;
40
+ currentPosition.current.x = targetX;
41
+ Animated.spring(position.x, {
42
+ toValue: targetX,
43
+ friction: FLOATING_PANEL.SNAP_FRICTION,
44
+ tension: FLOATING_PANEL.SNAP_TENSION,
45
+ useNativeDriver: false,
46
+ }).start();
47
+ }, [position.x]);
48
+ // PanResponder — recreated when screen dimensions change
49
+ const panResponder = useMemo(() => PanResponder.create({
50
+ onStartShouldSetPanResponder: () => true,
51
+ onMoveShouldSetPanResponder: (_, gesture) => Math.abs(gesture.dx) > FLOATING_PANEL.TAP_THRESHOLD ||
52
+ Math.abs(gesture.dy) > FLOATING_PANEL.TAP_THRESHOLD,
53
+ onPanResponderGrant: () => {
54
+ isDragging.current = false;
55
+ dragStart.current = { ...currentPosition.current };
56
+ },
57
+ onPanResponderMove: (_, gesture) => {
58
+ const movedEnough = Math.abs(gesture.dx) > FLOATING_PANEL.TAP_THRESHOLD ||
59
+ Math.abs(gesture.dy) > FLOATING_PANEL.TAP_THRESHOLD;
60
+ if (movedEnough) {
61
+ isDragging.current = true;
62
+ }
63
+ if (!isDragging.current)
64
+ return;
65
+ const { width: screenW, height: screenH } = screenRef.current;
66
+ const size = panelSizeRef.current;
67
+ const newX = clamp(dragStart.current.x + gesture.dx, FLOATING_PANEL.EDGE_MARGIN, screenW - size.width - FLOATING_PANEL.EDGE_MARGIN);
68
+ const newY = clamp(dragStart.current.y + gesture.dy, FLOATING_PANEL.TOP_SAFE_AREA, screenH - size.height - FLOATING_PANEL.BOTTOM_SAFE_AREA);
69
+ position.setValue({ x: newX, y: newY });
70
+ currentPosition.current = { x: newX, y: newY };
71
+ },
72
+ onPanResponderRelease: () => {
73
+ if (!isDragging.current) {
74
+ onTapRef.current();
75
+ return;
76
+ }
77
+ // Bubble and handle snap to edge; expanded stays where dropped
78
+ if (panelStateRef.current !== 'expanded') {
79
+ snapToEdge();
80
+ }
81
+ },
82
+ }), [position, snapToEdge]);
83
+ // Animate expand/collapse when panelState changes
84
+ useEffect(() => {
85
+ Animated.timing(expandProgress, {
86
+ toValue: panelState === 'expanded' ? 1 : 0,
87
+ duration: FLOATING_PANEL.EXPAND_DURATION,
88
+ useNativeDriver: false,
89
+ }).start();
90
+ }, [panelState, expandProgress]);
91
+ // Reposition panel on state change so the new size stays on-screen.
92
+ // Bubble/handle: instantly snap to nearest edge.
93
+ // Expanded: spring-animate into screen bounds.
94
+ useEffect(() => {
95
+ const { x, y } = currentPosition.current;
96
+ const size = getPanelSize(panelState);
97
+ if (panelState === 'expanded') {
98
+ const targetX = clamp(x, FLOATING_PANEL.EDGE_MARGIN, screenWidth - size.width - FLOATING_PANEL.EDGE_MARGIN);
99
+ const targetY = clamp(y, FLOATING_PANEL.TOP_SAFE_AREA, screenHeight - size.height - FLOATING_PANEL.BOTTOM_SAFE_AREA);
100
+ if (targetX !== x || targetY !== y) {
101
+ currentPosition.current = { x: targetX, y: targetY };
102
+ Animated.spring(position, {
103
+ toValue: { x: targetX, y: targetY },
104
+ friction: FLOATING_PANEL.SNAP_FRICTION,
105
+ tension: FLOATING_PANEL.SNAP_TENSION,
106
+ useNativeDriver: false,
107
+ }).start();
108
+ }
109
+ }
110
+ else {
111
+ // Bubble / handle — snap instantly to nearest edge (no animation needed,
112
+ // the panel content swap already provides the visual transition)
113
+ const midpoint = screenWidth / 2;
114
+ const centerX = x + size.width / 2;
115
+ const targetX = centerX < midpoint
116
+ ? FLOATING_PANEL.EDGE_MARGIN
117
+ : screenWidth - size.width - FLOATING_PANEL.EDGE_MARGIN;
118
+ const targetY = clamp(y, FLOATING_PANEL.TOP_SAFE_AREA, screenHeight - size.height - FLOATING_PANEL.BOTTOM_SAFE_AREA);
119
+ if (targetX !== x || targetY !== y) {
120
+ currentPosition.current = { x: targetX, y: targetY };
121
+ position.setValue({ x: targetX, y: targetY });
122
+ }
123
+ }
124
+ }, [panelState, screenWidth, screenHeight, position]);
125
+ return {
126
+ position,
127
+ expandProgress,
128
+ panHandlers: panResponder.panHandlers,
129
+ panelSize,
130
+ };
131
+ };
132
+ //# sourceMappingURL=useFloatingPanel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useFloatingPanel.js","sourceRoot":"","sources":["../../src/hooks/useFloatingPanel.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { type MeasuredElement } from '../fiber';
2
+ /**
3
+ * Builds and caches the layout snapshot when inspect mode is activated.
4
+ * Call `buildSnapshot` on inspect-mode entry. Call `invalidate` after
5
+ * style mutations — it debounces and rebuilds automatically.
6
+ */
7
+ export declare const useLayoutSnapshot: () => {
8
+ snapshot: MeasuredElement[];
9
+ isBuilding: boolean;
10
+ buildSnapshot: () => Promise<number>;
11
+ invalidate: () => void;
12
+ ensureFresh: () => Promise<void>;
13
+ };
14
+ //# sourceMappingURL=useLayoutSnapshot.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useLayoutSnapshot.d.ts","sourceRoot":"","sources":["../../src/hooks/useLayoutSnapshot.ts"],"names":[],"mappings":"AACA,OAAO,EAAgB,KAAK,eAAe,EAAE,MAAM,UAAU,CAAC;AAI9D;;;;GAIG;AACH,eAAO,MAAM,iBAAiB;;;yBAKgB,OAAO,CAAC,MAAM,CAAC;;;CA0B5D,CAAC"}
@@ -0,0 +1,39 @@
1
+ import { useCallback, useRef, useState } from 'react';
2
+ import { FiberAdapter } from '../fiber';
3
+ import { buildLayoutSnapshot } from '../utils';
4
+ import { useDebouncedCallback } from './useDebouncedCallback';
5
+ /**
6
+ * Builds and caches the layout snapshot when inspect mode is activated.
7
+ * Call `buildSnapshot` on inspect-mode entry. Call `invalidate` after
8
+ * style mutations — it debounces and rebuilds automatically.
9
+ */
10
+ export const useLayoutSnapshot = () => {
11
+ const [snapshot, setSnapshot] = useState([]);
12
+ const [isBuilding, setIsBuilding] = useState(false);
13
+ const snapshotRef = useRef([]);
14
+ const buildSnapshot = useCallback(async () => {
15
+ const root = FiberAdapter.getFiberRoot();
16
+ if (!root)
17
+ return 0;
18
+ setIsBuilding(true);
19
+ try {
20
+ const elements = await buildLayoutSnapshot(root);
21
+ snapshotRef.current = elements;
22
+ setSnapshot(elements);
23
+ return elements.length;
24
+ }
25
+ finally {
26
+ setIsBuilding(false);
27
+ }
28
+ }, []);
29
+ /** Mark stale — debounced 300ms so rapid style edits don't rebuild every time. */
30
+ const invalidate = useDebouncedCallback(buildSnapshot, 300);
31
+ /** Rebuild only if the snapshot is empty (first time). */
32
+ const ensureFresh = useCallback(async () => {
33
+ if (snapshotRef.current.length === 0) {
34
+ await buildSnapshot();
35
+ }
36
+ }, [buildSnapshot]);
37
+ return { snapshot, isBuilding, buildSnapshot, invalidate, ensureFresh };
38
+ };
39
+ //# sourceMappingURL=useLayoutSnapshot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useLayoutSnapshot.js","sourceRoot":"","sources":["../../src/hooks/useLayoutSnapshot.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACtD,OAAO,EAAE,YAAY,EAAwB,MAAM,UAAU,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAC/C,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAE9D;;;;GAIG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,GAAG,EAAE;IACpC,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAoB,EAAE,CAAC,CAAC;IAChE,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACpD,MAAM,WAAW,GAAG,MAAM,CAAoB,EAAE,CAAC,CAAC;IAElD,MAAM,aAAa,GAAG,WAAW,CAAC,KAAK,IAAqB,EAAE;QAC5D,MAAM,IAAI,GAAG,YAAY,CAAC,YAAY,EAAE,CAAC;QACzC,IAAI,CAAC,IAAI;YAAE,OAAO,CAAC,CAAC;QAEpB,aAAa,CAAC,IAAI,CAAC,CAAC;QACpB,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,mBAAmB,CAAC,IAAI,CAAC,CAAC;YACjD,WAAW,CAAC,OAAO,GAAG,QAAQ,CAAC;YAC/B,WAAW,CAAC,QAAQ,CAAC,CAAC;YACtB,OAAO,QAAQ,CAAC,MAAM,CAAC;QACzB,CAAC;gBAAS,CAAC;YACT,aAAa,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC;IACH,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,kFAAkF;IAClF,MAAM,UAAU,GAAG,oBAAoB,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC;IAE5D,0DAA0D;IAC1D,MAAM,WAAW,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;QACzC,IAAI,WAAW,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACrC,MAAM,aAAa,EAAE,CAAC;QACxB,CAAC;IACH,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC;IAEpB,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,aAAa,EAAE,UAAU,EAAE,WAAW,EAAE,CAAC;AAC1E,CAAC,CAAC"}
@@ -0,0 +1,14 @@
1
+ import { type MeasuredElement } from '../fiber';
2
+ /**
3
+ * Captures the original flattened style for an element and provides
4
+ * a function to replace the element's entire style via overrideProps.
5
+ *
6
+ * All override/disabled tracking belongs in the consuming component —
7
+ * this hook only handles fiber interaction.
8
+ */
9
+ export declare const useStyleMutation: (element: MeasuredElement) => {
10
+ originalStyle: import("../utils").StyleObject;
11
+ applyStyle: (style: Record<string, unknown>) => boolean;
12
+ resetStyle: () => boolean;
13
+ };
14
+ //# sourceMappingURL=useStyleMutation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useStyleMutation.d.ts","sourceRoot":"","sources":["../../src/hooks/useStyleMutation.ts"],"names":[],"mappings":"AACA,OAAO,EAAgB,KAAK,eAAe,EAAE,MAAM,UAAU,CAAC;AAG9D;;;;;;GAMG;AACH,eAAO,MAAM,gBAAgB,YAAa,eAAe;;wBAQ7C,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;;CAWlC,CAAC"}
@@ -0,0 +1,22 @@
1
+ import { useCallback, useMemo } from 'react';
2
+ import { FiberAdapter } from '../fiber';
3
+ import { flattenStyles } from '../utils';
4
+ /**
5
+ * Captures the original flattened style for an element and provides
6
+ * a function to replace the element's entire style via overrideProps.
7
+ *
8
+ * All override/disabled tracking belongs in the consuming component —
9
+ * this hook only handles fiber interaction.
10
+ */
11
+ export const useStyleMutation = (element) => {
12
+ const originalStyle = useMemo(() => {
13
+ const flat = flattenStyles(element.fiber.memoizedProps?.style);
14
+ return flat ? structuredClone(flat) : {};
15
+ }, [element]);
16
+ /** Replace the element's entire style with a flat object. */
17
+ const applyStyle = useCallback((style) => FiberAdapter.setStyle(element.fiber, style), [element]);
18
+ /** Restore the element's original style. */
19
+ const resetStyle = useCallback(() => FiberAdapter.setStyle(element.fiber, originalStyle), [element, originalStyle]);
20
+ return { originalStyle, applyStyle, resetStyle };
21
+ };
22
+ //# sourceMappingURL=useStyleMutation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useStyleMutation.js","sourceRoot":"","sources":["../../src/hooks/useStyleMutation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAwB,MAAM,UAAU,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,OAAwB,EAAE,EAAE;IAC3D,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,EAAE;QACjC,MAAM,IAAI,GAAG,aAAa,CAAC,OAAO,CAAC,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;QAC/D,OAAO,IAAI,CAAC,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC3C,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAEd,6DAA6D;IAC7D,MAAM,UAAU,GAAG,WAAW,CAC5B,CAAC,KAA8B,EAAE,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,EAC/E,CAAC,OAAO,CAAC,CACV,CAAC;IAEF,4CAA4C;IAC5C,MAAM,UAAU,GAAG,WAAW,CAC5B,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,aAAa,CAAC,EACzD,CAAC,OAAO,EAAE,aAAa,CAAC,CACzB,CAAC;IAEF,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC;AACnD,CAAC,CAAC"}
@@ -0,0 +1,24 @@
1
+ import type { MeasuredElement } from '../fiber';
2
+ /**
3
+ * Manages style overrides, key renames, property toggling, and added properties
4
+ * for a selected element. Builds the final style object and applies it to the fiber
5
+ * on every change.
6
+ */
7
+ export declare const useStyleOverrides: (element: MeasuredElement) => {
8
+ originalStyle: import("../utils").StyleObject;
9
+ entries: [string, unknown][];
10
+ addedEntries: [string, unknown][];
11
+ resolveEntry: (originalKey: string, originalValue: unknown) => {
12
+ activeKey: string;
13
+ displayValue: unknown;
14
+ disabled: boolean;
15
+ };
16
+ handleToggle: (key: string) => void;
17
+ handleValueChange: (originalKey: string, newValue: unknown) => void;
18
+ handleKeyChange: (originalKey: string, newKey: string) => void;
19
+ handleAddProperty: (key: string, value: unknown) => void;
20
+ handleAddedValueChange: (key: string, newValue: unknown) => void;
21
+ handleAddedKeyChange: (oldKey: string, newKey: string) => void;
22
+ handleRemoveProperty: (key: string) => void;
23
+ };
24
+ //# sourceMappingURL=useStyleOverrides.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useStyleOverrides.d.ts","sourceRoot":"","sources":["../../src/hooks/useStyleOverrides.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAGhD;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,YAAa,eAAe;;;;gCAiJrB,MAAM,iBAAiB,OAAO;;;;;wBAtFtC,MAAM;qCAYO,MAAM,YAAY,OAAO;mCAQ3B,MAAM,UAAU,MAAM;6BAyB5B,MAAM,SAAS,OAAO;kCAWjB,MAAM,YAAY,OAAO;mCAOxB,MAAM,UAAU,MAAM;gCAczB,MAAM;CA6B1C,CAAC"}
@@ -0,0 +1,165 @@
1
+ import { useRef, useState } from 'react';
2
+ import { EDITABLE_VALUE } from '../constants';
3
+ import { useStyleMutation } from './useStyleMutation';
4
+ /**
5
+ * Manages style overrides, key renames, property toggling, and added properties
6
+ * for a selected element. Builds the final style object and applies it to the fiber
7
+ * on every change.
8
+ */
9
+ export const useStyleOverrides = (element) => {
10
+ const { originalStyle, applyStyle } = useStyleMutation(element);
11
+ const [overrides, setOverrides] = useState({});
12
+ const [disabledKeys, setDisabledKeys] = useState(new Set());
13
+ const [keyRenames, setKeyRenames] = useState({});
14
+ const [addedProperties, setAddedProperties] = useState({});
15
+ // Refs mirror state so handlers always read the latest values (no stale closures)
16
+ const overridesRef = useRef(overrides);
17
+ const disabledRef = useRef(disabledKeys);
18
+ const keyRenamesRef = useRef(keyRenames);
19
+ const addedRef = useRef(addedProperties);
20
+ const prevElementRef = useRef(element);
21
+ // Reset when element changes (render-phase setState — React's recommended
22
+ // pattern for adjusting state based on props, avoids stale flash from useEffect)
23
+ if (prevElementRef.current !== element) {
24
+ prevElementRef.current = element;
25
+ overridesRef.current = {};
26
+ disabledRef.current = new Set();
27
+ keyRenamesRef.current = {};
28
+ addedRef.current = {};
29
+ setOverrides({});
30
+ setDisabledKeys(new Set());
31
+ setKeyRenames({});
32
+ setAddedProperties({});
33
+ }
34
+ /** Check if a key collides with any active key (original, renamed, or added). */
35
+ const isKeyTaken = (key, excludeOriginalKey) => {
36
+ for (const originalKey of Object.keys(originalStyle)) {
37
+ if (originalKey === excludeOriginalKey)
38
+ continue;
39
+ const activeKey = keyRenamesRef.current[originalKey] ?? originalKey;
40
+ if (activeKey === key)
41
+ return true;
42
+ }
43
+ if (key in addedRef.current)
44
+ return true;
45
+ return false;
46
+ };
47
+ // Build a flat style from original + overrides − disabled + renames + added, then apply
48
+ const buildAndApply = (nextOverrides, nextDisabled, nextRenames, nextAdded) => {
49
+ const style = {};
50
+ for (const [originalKey, originalValue] of Object.entries(originalStyle)) {
51
+ if (nextDisabled.has(originalKey))
52
+ continue;
53
+ const activeKey = nextRenames[originalKey] ?? originalKey;
54
+ const value = activeKey in nextOverrides ? nextOverrides[activeKey] : originalValue;
55
+ style[activeKey] = value;
56
+ }
57
+ for (const [key, value] of Object.entries(nextAdded)) {
58
+ style[key] = value;
59
+ }
60
+ applyStyle(style);
61
+ };
62
+ const handleToggle = (key) => {
63
+ const nextDisabled = new Set(disabledRef.current);
64
+ if (nextDisabled.has(key)) {
65
+ nextDisabled.delete(key);
66
+ }
67
+ else {
68
+ nextDisabled.add(key);
69
+ }
70
+ disabledRef.current = nextDisabled;
71
+ buildAndApply(overridesRef.current, nextDisabled, keyRenamesRef.current, addedRef.current);
72
+ setDisabledKeys(nextDisabled);
73
+ };
74
+ const handleValueChange = (originalKey, newValue) => {
75
+ const activeKey = keyRenamesRef.current[originalKey] ?? originalKey;
76
+ const nextOverrides = { ...overridesRef.current, [activeKey]: newValue };
77
+ overridesRef.current = nextOverrides;
78
+ buildAndApply(nextOverrides, disabledRef.current, keyRenamesRef.current, addedRef.current);
79
+ setOverrides(nextOverrides);
80
+ };
81
+ const handleKeyChange = (originalKey, newKey) => {
82
+ const currentRenamedKey = keyRenamesRef.current[originalKey] ?? originalKey;
83
+ if (newKey === currentRenamedKey)
84
+ return;
85
+ if (isKeyTaken(newKey, originalKey))
86
+ return;
87
+ const nextRenames = { ...keyRenamesRef.current };
88
+ const nextOverrides = { ...overridesRef.current };
89
+ if (currentRenamedKey in nextOverrides) {
90
+ nextOverrides[newKey] = nextOverrides[currentRenamedKey];
91
+ delete nextOverrides[currentRenamedKey];
92
+ }
93
+ if (newKey === originalKey) {
94
+ delete nextRenames[originalKey];
95
+ }
96
+ else {
97
+ nextRenames[originalKey] = newKey;
98
+ }
99
+ overridesRef.current = nextOverrides;
100
+ keyRenamesRef.current = nextRenames;
101
+ buildAndApply(nextOverrides, disabledRef.current, nextRenames, addedRef.current);
102
+ setOverrides(nextOverrides);
103
+ setKeyRenames(nextRenames);
104
+ };
105
+ const handleAddProperty = (key, value) => {
106
+ const trimmed = key.trim();
107
+ if (!EDITABLE_VALUE.VALID_STYLE_KEY.test(trimmed))
108
+ return;
109
+ if (isKeyTaken(trimmed))
110
+ return;
111
+ const nextAdded = { ...addedRef.current, [trimmed]: value };
112
+ addedRef.current = nextAdded;
113
+ buildAndApply(overridesRef.current, disabledRef.current, keyRenamesRef.current, nextAdded);
114
+ setAddedProperties(nextAdded);
115
+ };
116
+ const handleAddedValueChange = (key, newValue) => {
117
+ const nextAdded = { ...addedRef.current, [key]: newValue };
118
+ addedRef.current = nextAdded;
119
+ buildAndApply(overridesRef.current, disabledRef.current, keyRenamesRef.current, nextAdded);
120
+ setAddedProperties(nextAdded);
121
+ };
122
+ const handleAddedKeyChange = (oldKey, newKey) => {
123
+ const trimmed = newKey.trim();
124
+ if (!trimmed || trimmed === oldKey)
125
+ return;
126
+ if (!EDITABLE_VALUE.VALID_STYLE_KEY.test(trimmed))
127
+ return;
128
+ if (isKeyTaken(trimmed))
129
+ return;
130
+ const nextAdded = { ...addedRef.current };
131
+ nextAdded[trimmed] = nextAdded[oldKey];
132
+ delete nextAdded[oldKey];
133
+ addedRef.current = nextAdded;
134
+ buildAndApply(overridesRef.current, disabledRef.current, keyRenamesRef.current, nextAdded);
135
+ setAddedProperties(nextAdded);
136
+ };
137
+ const handleRemoveProperty = (key) => {
138
+ const nextAdded = { ...addedRef.current };
139
+ delete nextAdded[key];
140
+ addedRef.current = nextAdded;
141
+ buildAndApply(overridesRef.current, disabledRef.current, keyRenamesRef.current, nextAdded);
142
+ setAddedProperties(nextAdded);
143
+ };
144
+ /** Resolve the active key and display value for an original style entry. */
145
+ const resolveEntry = (originalKey, originalValue) => {
146
+ const activeKey = keyRenames[originalKey] ?? originalKey;
147
+ const displayValue = activeKey in overrides ? overrides[activeKey] : originalValue;
148
+ const disabled = disabledKeys.has(originalKey);
149
+ return { activeKey, displayValue, disabled };
150
+ };
151
+ return {
152
+ originalStyle,
153
+ entries: Object.entries(originalStyle),
154
+ addedEntries: Object.entries(addedProperties),
155
+ resolveEntry,
156
+ handleToggle,
157
+ handleValueChange,
158
+ handleKeyChange,
159
+ handleAddProperty,
160
+ handleAddedValueChange,
161
+ handleAddedKeyChange,
162
+ handleRemoveProperty,
163
+ };
164
+ };
165
+ //# sourceMappingURL=useStyleOverrides.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useStyleOverrides.js","sourceRoot":"","sources":["../../src/hooks/useStyleOverrides.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import type { GestureResponderEvent } from 'react-native';
2
+ import type { MeasuredElement } from '../fiber';
3
+ /**
4
+ * Handles tap-to-select interaction.
5
+ * On tap, hit-tests the snapshot and selects the most specific element.
6
+ * Supports cycling through overlapping elements.
7
+ */
8
+ export declare const useTapToSelect: (snapshot: MeasuredElement[]) => {
9
+ handleTap: (event: GestureResponderEvent) => void;
10
+ cycleNext: () => void;
11
+ cyclePrevious: () => void;
12
+ clearSelection: () => void;
13
+ /** All overlapping elements at the tap point, sorted by area (smallest first) */
14
+ matches: MeasuredElement[];
15
+ /** Currently selected index in the matches array */
16
+ selectedIndex: number;
17
+ /** The currently selected element */
18
+ selected: MeasuredElement | null;
19
+ };
20
+ //# sourceMappingURL=useTapToSelect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useTapToSelect.d.ts","sourceRoot":"","sources":["../../src/hooks/useTapToSelect.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAC1D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAYhD;;;;GAIG;AACH,eAAO,MAAM,cAAc,aAAc,eAAe,EAAE;uBAQ9C,qBAAqB;;;;IArB/B,iFAAiF;aACxE,eAAe,EAAE;IAC1B,oDAAoD;mBACrC,MAAM;IACrB,qCAAqC;cAC3B,eAAe,GAAG,IAAI;CAgEjC,CAAC"}
@@ -0,0 +1,58 @@
1
+ import { useCallback, useState } from 'react';
2
+ import { hitTest } from '../utils';
3
+ /**
4
+ * Handles tap-to-select interaction.
5
+ * On tap, hit-tests the snapshot and selects the most specific element.
6
+ * Supports cycling through overlapping elements.
7
+ */
8
+ export const useTapToSelect = (snapshot) => {
9
+ const [state, setState] = useState({
10
+ matches: [],
11
+ selectedIndex: 0,
12
+ selected: null,
13
+ });
14
+ const handleTap = useCallback((event) => {
15
+ const { pageX, pageY } = event.nativeEvent;
16
+ const matches = hitTest(snapshot, pageX, pageY);
17
+ setState({
18
+ matches,
19
+ selectedIndex: 0,
20
+ selected: matches[0] ?? null,
21
+ });
22
+ }, [snapshot]);
23
+ const cycleNext = useCallback(() => {
24
+ setState((prev) => {
25
+ if (prev.matches.length === 0)
26
+ return prev;
27
+ const nextIndex = (prev.selectedIndex + 1) % prev.matches.length;
28
+ return {
29
+ ...prev,
30
+ selectedIndex: nextIndex,
31
+ selected: prev.matches[nextIndex] ?? null,
32
+ };
33
+ });
34
+ }, []);
35
+ const cyclePrevious = useCallback(() => {
36
+ setState((prev) => {
37
+ if (prev.matches.length === 0)
38
+ return prev;
39
+ const prevIndex = (prev.selectedIndex - 1 + prev.matches.length) % prev.matches.length;
40
+ return {
41
+ ...prev,
42
+ selectedIndex: prevIndex,
43
+ selected: prev.matches[prevIndex] ?? null,
44
+ };
45
+ });
46
+ }, []);
47
+ const clearSelection = useCallback(() => {
48
+ setState({ matches: [], selectedIndex: 0, selected: null });
49
+ }, []);
50
+ return {
51
+ ...state,
52
+ handleTap,
53
+ cycleNext,
54
+ cyclePrevious,
55
+ clearSelection,
56
+ };
57
+ };
58
+ //# sourceMappingURL=useTapToSelect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useTapToSelect.js","sourceRoot":"","sources":["../../src/hooks/useTapToSelect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAG9C,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAWnC;;;;GAIG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,QAA2B,EAAE,EAAE;IAC5D,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAmB;QACnD,OAAO,EAAE,EAAE;QACX,aAAa,EAAE,CAAC;QAChB,QAAQ,EAAE,IAAI;KACf,CAAC,CAAC;IAEH,MAAM,SAAS,GAAG,WAAW,CAC3B,CAAC,KAA4B,EAAE,EAAE;QAC/B,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC,WAAW,CAAC;QAC3C,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;QAEhD,QAAQ,CAAC;YACP,OAAO;YACP,aAAa,EAAE,CAAC;YAChB,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,IAAI;SAC7B,CAAC,CAAC;IACL,CAAC,EACD,CAAC,QAAQ,CAAC,CACX,CAAC;IAEF,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE;QACjC,QAAQ,CAAC,CAAC,IAAI,EAAE,EAAE;YAChB,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,IAAI,CAAC;YAC3C,MAAM,SAAS,GAAG,CAAC,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;YACjE,OAAO;gBACL,GAAG,IAAI;gBACP,aAAa,EAAE,SAAS;gBACxB,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,IAAI;aAC1C,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,aAAa,GAAG,WAAW,CAAC,GAAG,EAAE;QACrC,QAAQ,CAAC,CAAC,IAAI,EAAE,EAAE;YAChB,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,IAAI,CAAC;YAC3C,MAAM,SAAS,GAAG,CAAC,IAAI,CAAC,aAAa,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;YACvF,OAAO;gBACL,GAAG,IAAI;gBACP,aAAa,EAAE,SAAS;gBACxB,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,IAAI;aAC1C,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,cAAc,GAAG,WAAW,CAAC,GAAG,EAAE;QACtC,QAAQ,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,aAAa,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9D,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,OAAO;QACL,GAAG,KAAK;QACR,SAAS;QACT,SAAS;QACT,aAAa;QACb,cAAc;KACf,CAAC;AACJ,CAAC,CAAC"}
package/lib/index.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ export type { ElementInspectorProps } from './ElementInspector';
2
+ export { ElementInspector } from './ElementInspector';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAChE,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC"}
package/lib/index.js ADDED
@@ -0,0 +1,2 @@
1
+ export { ElementInspector } from './ElementInspector';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const clamp: (value: number, min: number, max: number) => number;
2
+ //# sourceMappingURL=clamp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clamp.d.ts","sourceRoot":"","sources":["../../src/utils/clamp.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,KAAK,UAAW,MAAM,OAAO,MAAM,OAAO,MAAM,KAAG,MAC3B,CAAC"}
@@ -0,0 +1,2 @@
1
+ export const clamp = (value, min, max) => Math.max(min, Math.min(max, value));
2
+ //# sourceMappingURL=clamp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clamp.js","sourceRoot":"","sources":["../../src/utils/clamp.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,KAAa,EAAE,GAAW,EAAE,GAAW,EAAU,EAAE,CACvE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC"}
@@ -0,0 +1,6 @@
1
+ export type StyleObject = Record<string, unknown>;
2
+ /**
3
+ * Resolve any style value (StyleSheet ID, array, or plain object) into a flat object.
4
+ */
5
+ export declare const flattenStyles: (style: unknown) => StyleObject | null;
6
+ //# sourceMappingURL=flattenStyles.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flattenStyles.d.ts","sourceRoot":"","sources":["../../src/utils/flattenStyles.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAElD;;GAEG;AACH,eAAO,MAAM,aAAa,UAAW,OAAO,KAAG,WAAW,GAAG,IAI5D,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { StyleSheet } from 'react-native';
2
+ /**
3
+ * Resolve any style value (StyleSheet ID, array, or plain object) into a flat object.
4
+ */
5
+ export const flattenStyles = (style) => {
6
+ if (!style)
7
+ return null;
8
+ const flat = StyleSheet.flatten(style);
9
+ return (flat ?? null);
10
+ };
11
+ //# sourceMappingURL=flattenStyles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flattenStyles.js","sourceRoot":"","sources":["../../src/utils/flattenStyles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,UAAU,EAAkB,MAAM,cAAc,CAAC;AAI1E;;GAEG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,KAAc,EAAsB,EAAE;IAClE,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC,KAA6B,CAAC,CAAC;IAC/D,OAAO,CAAC,IAAI,IAAI,IAAI,CAAuB,CAAC;AAC9C,CAAC,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { MeasuredElement } from '../fiber';
2
+ /**
3
+ * Given a tap point and a layout snapshot, return all elements
4
+ * whose bounds contain the point, sorted by area (smallest first).
5
+ */
6
+ export declare const hitTest: (snapshot: MeasuredElement[], tapX: number, tapY: number) => MeasuredElement[];
7
+ //# sourceMappingURL=hitTest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hitTest.d.ts","sourceRoot":"","sources":["../../src/utils/hitTest.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAEhD;;;GAGG;AACH,eAAO,MAAM,OAAO,aACR,eAAe,EAAE,QACrB,MAAM,QACN,MAAM,KACX,eAAe,EAkBjB,CAAC"}