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,46 @@
1
+ import { Platform } from 'react-native';
2
+ /** Cross-platform monospace font family */
3
+ export const MONOSPACE_FONT = Platform.select({ ios: 'Menlo', default: 'monospace' });
4
+ /** Z-index layering for inspector UI elements */
5
+ export const Z_INDEX = {
6
+ HIGHLIGHT: 9997,
7
+ TAP_OVERLAY: 9998,
8
+ FLOATING_PANEL: 10000,
9
+ };
10
+ /** Timeout for fiber measure() calls (ms) */
11
+ export const MEASURE_TIMEOUT_MS = 3000;
12
+ /** Floating panel dimensions and animation config */
13
+ export const FLOATING_PANEL = {
14
+ BUBBLE_SIZE: 48,
15
+ HANDLE_WIDTH: 180,
16
+ HANDLE_HEIGHT: 44,
17
+ PANEL_WIDTH: 280,
18
+ PANEL_HEIGHT: 320,
19
+ PANEL_BODY_HEIGHT: 220,
20
+ TAP_THRESHOLD: 5,
21
+ EDGE_MARGIN: 12,
22
+ TOP_SAFE_AREA: 50,
23
+ BOTTOM_SAFE_AREA: 40,
24
+ SNAP_FRICTION: 7,
25
+ SNAP_TENSION: 40,
26
+ EXPAND_DURATION: 250,
27
+ HIGHLIGHT_FLASH_MS: 1500,
28
+ };
29
+ /** Validation constraints for editable style values */
30
+ export const EDITABLE_VALUE = {
31
+ VALID_STYLE_KEY: /^[a-zA-Z][a-zA-Z0-9]*$/,
32
+ MAX_VALUE_LENGTH: 200,
33
+ };
34
+ /** InspectorBubble sizing and animation trail config */
35
+ export const INSPECTOR_BUBBLE = {
36
+ SIZE: 48,
37
+ SWEEP_WIDTH: 2.5,
38
+ CENTER_DOT_SIZE: 8,
39
+ TRAIL_ARMS: [
40
+ { key: 'sweep', offsetDeg: 0, opacity: 0.9 },
41
+ { key: 'trail-1', offsetDeg: -18, opacity: 0.45 },
42
+ { key: 'trail-2', offsetDeg: -36, opacity: 0.3 },
43
+ { key: 'trail-3', offsetDeg: -54, opacity: 0.2 },
44
+ ],
45
+ };
46
+ //# sourceMappingURL=ui.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui.js","sourceRoot":"","sources":["../../src/constants/ui.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAExC,2CAA2C;AAC3C,MAAM,CAAC,MAAM,cAAc,GAAG,QAAQ,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC;AAEtF,iDAAiD;AACjD,MAAM,CAAC,MAAM,OAAO,GAAG;IACrB,SAAS,EAAE,IAAI;IACf,WAAW,EAAE,IAAI;IACjB,cAAc,EAAE,KAAK;CACb,CAAC;AAEX,6CAA6C;AAC7C,MAAM,CAAC,MAAM,kBAAkB,GAAG,IAAI,CAAC;AAEvC,qDAAqD;AACrD,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,WAAW,EAAE,EAAE;IACf,YAAY,EAAE,GAAG;IACjB,aAAa,EAAE,EAAE;IACjB,WAAW,EAAE,GAAG;IAChB,YAAY,EAAE,GAAG;IACjB,iBAAiB,EAAE,GAAG;IACtB,aAAa,EAAE,CAAC;IAChB,WAAW,EAAE,EAAE;IACf,aAAa,EAAE,EAAE;IACjB,gBAAgB,EAAE,EAAE;IACpB,aAAa,EAAE,CAAC;IAChB,YAAY,EAAE,EAAE;IAChB,eAAe,EAAE,GAAG;IACpB,kBAAkB,EAAE,IAAI;CAChB,CAAC;AAEX,uDAAuD;AACvD,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,eAAe,EAAE,wBAAwB;IACzC,gBAAgB,EAAE,GAAG;CACb,CAAC;AAEX,wDAAwD;AACxD,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,IAAI,EAAE,EAAE;IACR,WAAW,EAAE,GAAG;IAChB,eAAe,EAAE,CAAC;IAClB,UAAU,EAAE;QACV,EAAE,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE;QAC5C,EAAE,GAAG,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE;QACjD,EAAE,GAAG,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE;QAChD,EAAE,GAAG,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE;KACjD;CACO,CAAC"}
@@ -0,0 +1,52 @@
1
+ import { type FiberNode } from './types';
2
+ /**
3
+ * Unified API for all fiber tree access.
4
+ * Abstracts away React version differences.
5
+ */
6
+ export declare const FiberAdapter: {
7
+ /**
8
+ * Get the fiber root from the React DevTools global hook.
9
+ * Returns null if the hook is not available (production build).
10
+ */
11
+ getFiberRoot: () => FiberNode | null;
12
+ /**
13
+ * Walk the fiber tree and collect all host component fibers with their depth.
14
+ * Depth is needed later for z-ordering in the layout snapshot.
15
+ */
16
+ walkHostFibers: (root: FiberNode) => Array<{
17
+ fiber: FiberNode;
18
+ depth: number;
19
+ }>;
20
+ /**
21
+ * Get the flattened style object from a fiber's props.
22
+ */
23
+ getStyle: (fiber: FiberNode) => Record<string, unknown> | null;
24
+ /**
25
+ * Get the source file location from a fiber's debug info.
26
+ */
27
+ getSource: (fiber: FiberNode) => {
28
+ fileName: string;
29
+ lineNumber: number;
30
+ } | null;
31
+ /**
32
+ * Get the display name of the component.
33
+ */
34
+ getComponentName: (fiber: FiberNode) => string;
35
+ /**
36
+ * Measure a fiber's native view on screen.
37
+ * Returns a promise with { x, y, width, height }.
38
+ */
39
+ measure: (fiber: FiberNode) => Promise<{
40
+ x: number;
41
+ y: number;
42
+ width: number;
43
+ height: number;
44
+ }>;
45
+ /**
46
+ * Replace the style on a fiber using the devtools hook.
47
+ * Caller is responsible for building the final style object.
48
+ * Works on both old arch and Fabric.
49
+ */
50
+ setStyle: (fiber: FiberNode, style: unknown) => boolean;
51
+ };
52
+ //# sourceMappingURL=FiberAdapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FiberAdapter.d.ts","sourceRoot":"","sources":["../../src/fiber/FiberAdapter.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,SAAS,EAAsB,MAAM,SAAS,CAAC;AAE7D;;;GAGG;AACH,eAAO,MAAM,YAAY;IACvB;;;OAGG;wBACe,SAAS,GAAG,IAAI;IAsBlC;;;OAGG;2BACoB,SAAS,KAAG,KAAK,CAAC;QAAE,KAAK,EAAE,SAAS,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAmB7E;;OAEG;sBACe,SAAS,KAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAI5D;;OAEG;uBACgB,SAAS,KAAG;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAI9E;;OAEG;8BACuB,SAAS,KAAG,MAAM;IAO5C;;;OAGG;qBACc,SAAS,KAAG,OAAO,CAAC;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAwC7F;;;;OAIG;sBACe,SAAS,SAAS,OAAO,KAAG,OAAO;CAqBtD,CAAC"}
@@ -0,0 +1,112 @@
1
+ import { MEASURE_TIMEOUT_MS } from '../constants';
2
+ import { flattenStyles } from '../utils/flattenStyles';
3
+ import { HOST_COMPONENT_TAG } from './types';
4
+ /**
5
+ * Unified API for all fiber tree access.
6
+ * Abstracts away React version differences.
7
+ */
8
+ export const FiberAdapter = {
9
+ /**
10
+ * Get the fiber root from the React DevTools global hook.
11
+ * Returns null if the hook is not available (production build).
12
+ */
13
+ getFiberRoot: () => {
14
+ const hook = globalThis.__REACT_DEVTOOLS_GLOBAL_HOOK__;
15
+ if (!(hook?.renderers && hook.getFiberRoots))
16
+ return null;
17
+ // Try each renderer ID — the RN renderer isn't always ID 1
18
+ for (const rendererId of hook.renderers.keys()) {
19
+ const roots = hook.getFiberRoots(rendererId);
20
+ if (!roots || roots.size === 0)
21
+ continue;
22
+ const root = roots.values().next().value;
23
+ if (root?.current)
24
+ return root.current;
25
+ }
26
+ return null;
27
+ },
28
+ /**
29
+ * Walk the fiber tree and collect all host component fibers with their depth.
30
+ * Depth is needed later for z-ordering in the layout snapshot.
31
+ */
32
+ walkHostFibers: (root) => {
33
+ const hostFibers = [];
34
+ const walk = (fiber, depth) => {
35
+ let current = fiber;
36
+ while (current) {
37
+ if (current.tag === HOST_COMPONENT_TAG) {
38
+ hostFibers.push({ fiber: current, depth });
39
+ }
40
+ walk(current.child, depth + 1);
41
+ current = current.sibling;
42
+ }
43
+ };
44
+ walk(root.child, 0);
45
+ return hostFibers;
46
+ },
47
+ /**
48
+ * Get the flattened style object from a fiber's props.
49
+ */
50
+ getStyle: (fiber) => {
51
+ return flattenStyles(fiber.memoizedProps?.style);
52
+ },
53
+ /**
54
+ * Get the source file location from a fiber's debug info.
55
+ */
56
+ getSource: (fiber) => {
57
+ return fiber._debugSource ?? null;
58
+ },
59
+ /**
60
+ * Get the display name of the component.
61
+ */
62
+ getComponentName: (fiber) => {
63
+ if (typeof fiber.type === 'string')
64
+ return fiber.type;
65
+ if (typeof fiber.type === 'function')
66
+ return fiber.type.displayName ?? fiber.type.name ?? 'Unknown';
67
+ return 'Unknown';
68
+ },
69
+ /**
70
+ * Measure a fiber's native view on screen.
71
+ * Returns a promise with { x, y, width, height }.
72
+ */
73
+ measure: (fiber) => {
74
+ return new Promise((resolve, reject) => {
75
+ const stateNode = fiber.stateNode;
76
+ // Old arch: stateNode.measure()
77
+ // Fabric: stateNode.canonical.publicInstance.measure()
78
+ const target = stateNode?.measure
79
+ ? stateNode
80
+ : (stateNode?.canonical?.publicInstance ?? stateNode?.canonical);
81
+ if (!target?.measure) {
82
+ reject(new Error('Fiber stateNode does not support measure()'));
83
+ return;
84
+ }
85
+ const timeoutId = setTimeout(() => {
86
+ reject(new Error('measure() timed out'));
87
+ }, MEASURE_TIMEOUT_MS);
88
+ target.measure((_x, _y, width, height, pageX, pageY) => {
89
+ clearTimeout(timeoutId);
90
+ resolve({ x: pageX, y: pageY, width, height });
91
+ });
92
+ });
93
+ },
94
+ /**
95
+ * Replace the style on a fiber using the devtools hook.
96
+ * Caller is responsible for building the final style object.
97
+ * Works on both old arch and Fabric.
98
+ */
99
+ setStyle: (fiber, style) => {
100
+ const hook = globalThis.__REACT_DEVTOOLS_GLOBAL_HOOK__;
101
+ if (!hook?.renderers)
102
+ return false;
103
+ for (const renderer of hook.renderers.values()) {
104
+ if (renderer?.overrideProps) {
105
+ renderer.overrideProps(fiber, ['style'], style);
106
+ return true;
107
+ }
108
+ }
109
+ return false;
110
+ },
111
+ };
112
+ //# sourceMappingURL=FiberAdapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FiberAdapter.js","sourceRoot":"","sources":["../../src/fiber/FiberAdapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAkB,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAE7D;;;GAGG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B;;;OAGG;IACH,YAAY,EAAE,GAAqB,EAAE;QACnC,MAAM,IAAI,GAAI,UAAsC,CAAC,8BAKxC,CAAC;QAEd,IAAI,CAAC,CAAC,IAAI,EAAE,SAAS,IAAI,IAAI,CAAC,aAAa,CAAC;YAAE,OAAO,IAAI,CAAC;QAE1D,2DAA2D;QAC3D,KAAK,MAAM,UAAU,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,CAAC;YAC/C,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;YAC7C,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC;gBAAE,SAAS;YAEzC,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;YACzC,IAAI,IAAI,EAAE,OAAO;gBAAE,OAAO,IAAI,CAAC,OAAO,CAAC;QACzC,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;OAGG;IACH,cAAc,EAAE,CAAC,IAAe,EAA8C,EAAE;QAC9E,MAAM,UAAU,GAA+C,EAAE,CAAC;QAElE,MAAM,IAAI,GAAG,CAAC,KAAuB,EAAE,KAAa,EAAE,EAAE;YACtD,IAAI,OAAO,GAAG,KAAK,CAAC;YACpB,OAAO,OAAO,EAAE,CAAC;gBACf,IAAI,OAAO,CAAC,GAAG,KAAK,kBAAkB,EAAE,CAAC;oBACvC,UAAU,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;gBAC7C,CAAC;gBAED,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;gBAC/B,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;YAC5B,CAAC;QACH,CAAC,CAAC;QAEF,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QACpB,OAAO,UAAU,CAAC;IACpB,CAAC;IAED;;OAEG;IACH,QAAQ,EAAE,CAAC,KAAgB,EAAkC,EAAE;QAC7D,OAAO,aAAa,CAAC,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;IACnD,CAAC;IAED;;OAEG;IACH,SAAS,EAAE,CAAC,KAAgB,EAAmD,EAAE;QAC/E,OAAO,KAAK,CAAC,YAAY,IAAI,IAAI,CAAC;IACpC,CAAC;IAED;;OAEG;IACH,gBAAgB,EAAE,CAAC,KAAgB,EAAU,EAAE;QAC7C,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,KAAK,CAAC,IAAI,CAAC;QACtD,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,UAAU;YAClC,OAAO,KAAK,CAAC,IAAI,CAAC,WAAW,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,SAAS,CAAC;QAChE,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;;OAGG;IACH,OAAO,EAAE,CAAC,KAAgB,EAAoE,EAAE;QAW9F,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,MAAM,SAAS,GAAG,KAAK,CAAC,SAIhB,CAAC;YAET,gCAAgC;YAChC,uDAAuD;YACvD,MAAM,MAAM,GAAG,SAAS,EAAE,OAAO;gBAC/B,CAAC,CAAC,SAAS;gBACX,CAAC,CAAC,CAAC,SAAS,EAAE,SAAS,EAAE,cAAc,IAAI,SAAS,EAAE,SAAS,CAAC,CAAC;YAEnE,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC;gBACrB,MAAM,CAAC,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC,CAAC;gBAChE,OAAO;YACT,CAAC;YAED,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE;gBAChC,MAAM,CAAC,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC,CAAC;YAC3C,CAAC,EAAE,kBAAkB,CAAC,CAAC;YAEvB,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;gBACrD,YAAY,CAAC,SAAS,CAAC,CAAC;gBACxB,OAAO,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;YACjD,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;;OAIG;IACH,QAAQ,EAAE,CAAC,KAAgB,EAAE,KAAc,EAAW,EAAE;QACtD,MAAM,IAAI,GAAI,UAAsC,CAAC,8BAOxC,CAAC;QAEd,IAAI,CAAC,IAAI,EAAE,SAAS;YAAE,OAAO,KAAK,CAAC;QAEnC,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,CAAC;YAC/C,IAAI,QAAQ,EAAE,aAAa,EAAE,CAAC;gBAC5B,QAAQ,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC,OAAO,CAAC,EAAE,KAAK,CAAC,CAAC;gBAChD,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;CACF,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Detect the React version at runtime from the renderer.
3
+ * Used to load the correct fiber adapter if needed.
4
+ */
5
+ export declare const detectReactVersion: () => {
6
+ major: number;
7
+ minor: number;
8
+ } | null;
9
+ //# sourceMappingURL=detectVersion.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detectVersion.d.ts","sourceRoot":"","sources":["../../src/fiber/detectVersion.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,eAAO,MAAM,kBAAkB,QAAO;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,IAcxE,CAAC"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Detect the React version at runtime from the renderer.
3
+ * Used to load the correct fiber adapter if needed.
4
+ */
5
+ export const detectReactVersion = () => {
6
+ const hook = globalThis.__REACT_DEVTOOLS_GLOBAL_HOOK__;
7
+ if (!hook?.renderers)
8
+ return null;
9
+ for (const renderer of hook.renderers.values()) {
10
+ if (!renderer?.version)
11
+ continue;
12
+ const [major, minor] = renderer.version.split('.').map(Number);
13
+ return { major: major ?? 0, minor: minor ?? 0 };
14
+ }
15
+ return null;
16
+ };
17
+ //# sourceMappingURL=detectVersion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detectVersion.js","sourceRoot":"","sources":["../../src/fiber/detectVersion.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,GAA4C,EAAE;IAC9E,MAAM,IAAI,GAAI,UAAsC,CAAC,8BAExC,CAAC;IAEd,IAAI,CAAC,IAAI,EAAE,SAAS;QAAE,OAAO,IAAI,CAAC;IAElC,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,CAAC;QAC/C,IAAI,CAAC,QAAQ,EAAE,OAAO;YAAE,SAAS;QACjC,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC/D,OAAO,EAAE,KAAK,EAAE,KAAK,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;IAClD,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC,CAAC"}
@@ -0,0 +1,5 @@
1
+ export { detectReactVersion } from './detectVersion';
2
+ export { FiberAdapter } from './FiberAdapter';
3
+ export type { FiberNode, MeasuredElement } from './types';
4
+ export { HOST_COMPONENT_TAG } from './types';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/fiber/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,YAAY,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { detectReactVersion } from './detectVersion';
2
+ export { FiberAdapter } from './FiberAdapter';
3
+ export { HOST_COMPONENT_TAG } from './types';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/fiber/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC"}
@@ -0,0 +1,35 @@
1
+ /** React component function with optional display name. */
2
+ type ComponentFunction = ((...args: never[]) => unknown) & {
3
+ displayName?: string;
4
+ name?: string;
5
+ };
6
+ /** Minimal fiber node type — only the fields we access. */
7
+ export interface FiberNode {
8
+ tag: number;
9
+ type: string | ComponentFunction;
10
+ memoizedProps: Record<string, unknown>;
11
+ stateNode: unknown;
12
+ child: FiberNode | null;
13
+ sibling: FiberNode | null;
14
+ return: FiberNode | null;
15
+ _debugSource?: {
16
+ fileName: string;
17
+ lineNumber: number;
18
+ columnNumber?: number;
19
+ };
20
+ _debugOwner?: FiberNode;
21
+ }
22
+ /** Host component fiber tag — View, Text, Image, etc. */
23
+ export declare const HOST_COMPONENT_TAG = 5;
24
+ export interface MeasuredElement {
25
+ fiber: FiberNode;
26
+ x: number;
27
+ y: number;
28
+ width: number;
29
+ height: number;
30
+ depth: number;
31
+ zIndex: number;
32
+ componentName: string;
33
+ }
34
+ export {};
35
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/fiber/types.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAC3D,KAAK,iBAAiB,GAAG,CAAC,CAAC,GAAG,IAAI,EAAE,KAAK,EAAE,KAAK,OAAO,CAAC,GAAG;IACzD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,2DAA2D;AAC3D,MAAM,WAAW,SAAS;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,GAAG,iBAAiB,CAAC;IACjC,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,SAAS,GAAG,IAAI,CAAC;IACxB,OAAO,EAAE,SAAS,GAAG,IAAI,CAAC;IAC1B,MAAM,EAAE,SAAS,GAAG,IAAI,CAAC;IACzB,YAAY,CAAC,EAAE;QACb,QAAQ,EAAE,MAAM,CAAC;QACjB,UAAU,EAAE,MAAM,CAAC;QACnB,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB,CAAC;IACF,WAAW,CAAC,EAAE,SAAS,CAAC;CACzB;AAED,yDAAyD;AACzD,eAAO,MAAM,kBAAkB,IAAI,CAAC;AAEpC,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,SAAS,CAAC;IACjB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;CACvB"}
@@ -0,0 +1,3 @@
1
+ /** Host component fiber tag — View, Text, Image, etc. */
2
+ export const HOST_COMPONENT_TAG = 5;
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/fiber/types.ts"],"names":[],"mappings":"AAuBA,yDAAyD;AACzD,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC"}
@@ -0,0 +1,13 @@
1
+ interface AddPropertyRowProps {
2
+ onAdd: (key: string, value: unknown) => void;
3
+ onCancel: () => void;
4
+ }
5
+ /** Inline two-step row for adding a new style property: type key → type value → applied. */
6
+ export declare const AddPropertyRow: ({ onAdd, onCancel }: AddPropertyRowProps) => import("react/jsx-runtime").JSX.Element;
7
+ interface AddPropertyButtonProps {
8
+ onPress: () => void;
9
+ }
10
+ /** Dim "+ add property" button shown at the bottom of the style list. */
11
+ export declare const AddPropertyButton: ({ onPress }: AddPropertyButtonProps) => import("react/jsx-runtime").JSX.Element;
12
+ export {};
13
+ //# sourceMappingURL=AddPropertyRow.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AddPropertyRow.d.ts","sourceRoot":"","sources":["../../src/floatingPanel/AddPropertyRow.tsx"],"names":[],"mappings":"AAKA,UAAU,mBAAmB;IAC3B,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IAC7C,QAAQ,EAAE,MAAM,IAAI,CAAC;CACtB;AAED,4FAA4F;AAC5F,eAAO,MAAM,cAAc,wBAAyB,mBAAmB,4CAiDtE,CAAC;AAEF,UAAU,sBAAsB;IAC9B,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,yEAAyE;AACzE,eAAO,MAAM,iBAAiB,gBAAiB,sBAAsB,4CAIpE,CAAC"}
@@ -0,0 +1,61 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useState } from 'react';
3
+ import { Pressable, StyleSheet, Text, View } from 'react-native';
4
+ import { MONOSPACE_FONT } from '../constants';
5
+ import { EditableValue } from './EditableValue';
6
+ /** Inline two-step row for adding a new style property: type key → type value → applied. */
7
+ export const AddPropertyRow = ({ onAdd, onCancel }) => {
8
+ const [key, setKey] = useState('');
9
+ const [waitingForValue, setWaitingForValue] = useState(false);
10
+ if (!waitingForValue) {
11
+ return (_jsx(View, { style: styles.row, children: _jsx(View, { style: styles.content, children: _jsx(EditableValue, { value: '', displayValue: '', onSubmit: (newKey) => {
12
+ const trimmed = String(newKey).trim();
13
+ if (!trimmed) {
14
+ onCancel();
15
+ return;
16
+ }
17
+ setKey(trimmed);
18
+ setWaitingForValue(true);
19
+ }, variant: 'key', initialEditing: true }) }) }));
20
+ }
21
+ return (_jsx(View, { style: styles.row, children: _jsxs(View, { style: styles.content, children: [_jsxs(Text, { style: styles.pendingKey, children: [key, ":"] }), _jsx(EditableValue, { value: '', displayValue: '', onSubmit: (newValue) => {
22
+ const trimmed = String(newValue).trim();
23
+ if (!trimmed) {
24
+ onCancel();
25
+ return;
26
+ }
27
+ onAdd(key, newValue);
28
+ }, variant: 'value', initialEditing: true })] }) }));
29
+ };
30
+ /** Dim "+ add property" button shown at the bottom of the style list. */
31
+ export const AddPropertyButton = ({ onPress }) => (_jsx(Pressable, { style: styles.button, onPress: onPress, hitSlop: 6, children: _jsx(Text, { style: styles.buttonText, children: "+ add property" }) }));
32
+ const styles = StyleSheet.create({
33
+ row: {
34
+ flexDirection: 'row',
35
+ alignItems: 'center',
36
+ paddingVertical: 5,
37
+ paddingHorizontal: 8,
38
+ borderRadius: 4,
39
+ },
40
+ content: {
41
+ flex: 1,
42
+ flexDirection: 'row',
43
+ justifyContent: 'space-between',
44
+ alignItems: 'center',
45
+ },
46
+ pendingKey: {
47
+ color: '#9CDCFE',
48
+ fontSize: 13,
49
+ fontFamily: MONOSPACE_FONT,
50
+ },
51
+ button: {
52
+ paddingVertical: 6,
53
+ paddingHorizontal: 8,
54
+ },
55
+ buttonText: {
56
+ color: '#666',
57
+ fontSize: 12,
58
+ fontFamily: MONOSPACE_FONT,
59
+ },
60
+ });
61
+ //# sourceMappingURL=AddPropertyRow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AddPropertyRow.js","sourceRoot":"","sources":["../../src/floatingPanel/AddPropertyRow.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAOhD,4FAA4F;AAC5F,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAuB,EAAE,EAAE;IACzE,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IACnC,MAAM,CAAC,eAAe,EAAE,kBAAkB,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAE9D,IAAI,CAAC,eAAe,EAAE,CAAC;QACrB,OAAO,CACL,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,GAAG,YACrB,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,OAAO,YACzB,KAAC,aAAa,IACZ,KAAK,EAAC,EAAE,EACR,YAAY,EAAC,EAAE,EACf,QAAQ,EAAE,CAAC,MAAM,EAAE,EAAE;wBACnB,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;wBACtC,IAAI,CAAC,OAAO,EAAE,CAAC;4BACb,QAAQ,EAAE,CAAC;4BACX,OAAO;wBACT,CAAC;wBACD,MAAM,CAAC,OAAO,CAAC,CAAC;wBAChB,kBAAkB,CAAC,IAAI,CAAC,CAAC;oBAC3B,CAAC,EACD,OAAO,EAAC,KAAK,EACb,cAAc,SACd,GACG,GACF,CACR,CAAC;IACJ,CAAC;IAED,OAAO,CACL,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,GAAG,YACrB,MAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,OAAO,aACzB,MAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,UAAU,aAAG,GAAG,SAAS,EAC7C,KAAC,aAAa,IACZ,KAAK,EAAC,EAAE,EACR,YAAY,EAAC,EAAE,EACf,QAAQ,EAAE,CAAC,QAAQ,EAAE,EAAE;wBACrB,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC;wBACxC,IAAI,CAAC,OAAO,EAAE,CAAC;4BACb,QAAQ,EAAE,CAAC;4BACX,OAAO;wBACT,CAAC;wBACD,KAAK,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;oBACvB,CAAC,EACD,OAAO,EAAC,OAAO,EACf,cAAc,SACd,IACG,GACF,CACR,CAAC;AACJ,CAAC,CAAC;AAMF,yEAAyE;AACzE,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,EAAE,OAAO,EAA0B,EAAE,EAAE,CAAC,CACxE,KAAC,SAAS,IAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,YAC3D,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,UAAU,+BAAuB,GAC3C,CACb,CAAC;AAEF,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC;IAC/B,GAAG,EAAE;QACH,aAAa,EAAE,KAAK;QACpB,UAAU,EAAE,QAAQ;QACpB,eAAe,EAAE,CAAC;QAClB,iBAAiB,EAAE,CAAC;QACpB,YAAY,EAAE,CAAC;KAChB;IACD,OAAO,EAAE;QACP,IAAI,EAAE,CAAC;QACP,aAAa,EAAE,KAAK;QACpB,cAAc,EAAE,eAAe;QAC/B,UAAU,EAAE,QAAQ;KACrB;IACD,UAAU,EAAE;QACV,KAAK,EAAE,SAAS;QAChB,QAAQ,EAAE,EAAE;QACZ,UAAU,EAAE,cAAc;KAC3B;IACD,MAAM,EAAE;QACN,eAAe,EAAE,CAAC;QAClB,iBAAiB,EAAE,CAAC;KACrB;IACD,UAAU,EAAE;QACV,KAAK,EAAE,MAAM;QACb,QAAQ,EAAE,EAAE;QACZ,UAAU,EAAE,cAAc;KAC3B;CACF,CAAC,CAAC"}
@@ -0,0 +1,7 @@
1
+ interface CloseButtonProps {
2
+ onPress: () => void;
3
+ }
4
+ /** Reusable red-tinted circular close button used across panel states. */
5
+ export declare const CloseButton: ({ onPress }: CloseButtonProps) => import("react/jsx-runtime").JSX.Element;
6
+ export {};
7
+ //# sourceMappingURL=CloseButton.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CloseButton.d.ts","sourceRoot":"","sources":["../../src/floatingPanel/CloseButton.tsx"],"names":[],"mappings":"AAEA,UAAU,gBAAgB;IACxB,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,0EAA0E;AAC1E,eAAO,MAAM,WAAW,gBAAiB,gBAAgB,4CASxD,CAAC"}
@@ -0,0 +1,21 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { StyleSheet, Text, TouchableOpacity } from 'react-native';
3
+ /** Reusable red-tinted circular close button used across panel states. */
4
+ export const CloseButton = ({ onPress }) => (_jsx(TouchableOpacity, { onPress: onPress, hitSlop: { top: 8, bottom: 8, left: 8, right: 8 }, style: styles.button, activeOpacity: 0.6, children: _jsx(Text, { style: styles.text, children: "\u2715" }) }));
5
+ const styles = StyleSheet.create({
6
+ button: {
7
+ width: 22,
8
+ height: 22,
9
+ borderRadius: 11,
10
+ backgroundColor: 'rgba(255, 59, 48, 0.15)',
11
+ alignItems: 'center',
12
+ justifyContent: 'center',
13
+ },
14
+ text: {
15
+ color: '#FF3B30',
16
+ fontSize: 13,
17
+ fontWeight: '600',
18
+ lineHeight: 14,
19
+ },
20
+ });
21
+ //# sourceMappingURL=CloseButton.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CloseButton.js","sourceRoot":"","sources":["../../src/floatingPanel/CloseButton.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAMlE,0EAA0E;AAC1E,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,EAAE,OAAO,EAAoB,EAAE,EAAE,CAAC,CAC5D,KAAC,gBAAgB,IACf,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,EACjD,KAAK,EAAE,MAAM,CAAC,MAAM,EACpB,aAAa,EAAE,GAAG,YAElB,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,IAAI,uBAAU,GACjB,CACpB,CAAC;AAEF,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC;IAC/B,MAAM,EAAE;QACN,KAAK,EAAE,EAAE;QACT,MAAM,EAAE,EAAE;QACV,YAAY,EAAE,EAAE;QAChB,eAAe,EAAE,yBAAyB;QAC1C,UAAU,EAAE,QAAQ;QACpB,cAAc,EAAE,QAAQ;KACzB;IACD,IAAI,EAAE;QACJ,KAAK,EAAE,SAAS;QAChB,QAAQ,EAAE,EAAE;QACZ,UAAU,EAAE,KAAK;QACjB,UAAU,EAAE,EAAE;KACf;CACF,CAAC,CAAC"}
@@ -0,0 +1,12 @@
1
+ interface EditableValueProps {
2
+ value: unknown;
3
+ displayValue: string;
4
+ onSubmit: (parsed: unknown) => void;
5
+ variant: 'key' | 'value';
6
+ disabled?: boolean;
7
+ initialEditing?: boolean;
8
+ }
9
+ /** Tappable style value that becomes an inline TextInput on press. */
10
+ export declare const EditableValue: ({ value, displayValue, onSubmit, variant, disabled, initialEditing, }: EditableValueProps) => import("react/jsx-runtime").JSX.Element;
11
+ export {};
12
+ //# sourceMappingURL=EditableValue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EditableValue.d.ts","sourceRoot":"","sources":["../../src/floatingPanel/EditableValue.tsx"],"names":[],"mappings":"AAKA,UAAU,kBAAkB;IAC1B,KAAK,EAAE,OAAO,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;IACpC,OAAO,EAAE,KAAK,GAAG,OAAO,CAAC;IACzB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,sEAAsE;AACtE,eAAO,MAAM,aAAa,0EAOvB,kBAAkB,4CAmEpB,CAAC"}
@@ -0,0 +1,67 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { useRef, useState } from 'react';
3
+ import { Pressable, StyleSheet, Text, TextInput } from 'react-native';
4
+ import { EDITABLE_VALUE, EDITABLE_VALUE_COLORS, MONOSPACE_FONT } from '../constants';
5
+ import { parseInput, toEditableString } from '../utils';
6
+ /** Tappable style value that becomes an inline TextInput on press. */
7
+ export const EditableValue = ({ value, displayValue, onSubmit, variant, disabled, initialEditing = false, }) => {
8
+ const colors = EDITABLE_VALUE_COLORS[variant];
9
+ const [editing, setEditing] = useState(initialEditing);
10
+ const [draft, setDraft] = useState('');
11
+ const [invalid, setInvalid] = useState(false);
12
+ const committedRef = useRef(false);
13
+ const startEditing = () => {
14
+ if (disabled)
15
+ return;
16
+ committedRef.current = false;
17
+ setDraft(toEditableString(value));
18
+ setEditing(true);
19
+ };
20
+ const commitEdit = () => {
21
+ // Guard against double-fire from onSubmitEditing + onBlur
22
+ if (committedRef.current)
23
+ return;
24
+ committedRef.current = true;
25
+ const trimmed = draft.trim();
26
+ const changed = trimmed !== '' && trimmed !== toEditableString(value);
27
+ if (changed) {
28
+ const isInvalidKey = variant === 'key' && !EDITABLE_VALUE.VALID_STYLE_KEY.test(trimmed);
29
+ const isTooLong = trimmed.length > EDITABLE_VALUE.MAX_VALUE_LENGTH;
30
+ if (isInvalidKey || isTooLong) {
31
+ setInvalid(true);
32
+ setTimeout(() => setEditing(false), 300);
33
+ return;
34
+ }
35
+ const parsed = parseInput(trimmed, value);
36
+ onSubmit(parsed);
37
+ }
38
+ setEditing(false);
39
+ };
40
+ if (editing) {
41
+ return (_jsx(TextInput, { style: [
42
+ styles.base,
43
+ styles.editing,
44
+ { color: colors.text, borderColor: invalid ? '#f44' : colors.underline },
45
+ ], value: draft, onChangeText: setDraft, onSubmitEditing: commitEdit, onBlur: commitEdit, autoCapitalize: 'none', autoCorrect: false, autoFocus: true, selectTextOnFocus: true, returnKeyType: 'done' }));
46
+ }
47
+ return (_jsx(Pressable, { onPress: startEditing, hitSlop: 4, children: _jsx(Text, { style: [styles.base, { color: colors.text }, disabled && styles.strikethrough], children: displayValue }) }));
48
+ };
49
+ const styles = StyleSheet.create({
50
+ base: {
51
+ fontSize: 13,
52
+ fontFamily: MONOSPACE_FONT,
53
+ padding: 0,
54
+ margin: 0,
55
+ minWidth: 20,
56
+ },
57
+ editing: {
58
+ borderWidth: 1,
59
+ borderRadius: 3,
60
+ paddingHorizontal: 4,
61
+ paddingVertical: 2,
62
+ },
63
+ strikethrough: {
64
+ textDecorationLine: 'line-through',
65
+ },
66
+ });
67
+ //# sourceMappingURL=EditableValue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EditableValue.js","sourceRoot":"","sources":["../../src/floatingPanel/EditableValue.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { FloatingPanelProps } from './types';
2
+ /**
3
+ * Unified floating panel that renders as a bubble, handle, or expanded panel.
4
+ * Draggable via PanResponder. Bubble/handle snap to edge; expanded floats freely.
5
+ */
6
+ export declare const FloatingPanel: ({ panelState, selected, matches, selectedIndex, onToggleInspect, onCycleNext, onCyclePrevious, onClose, }: FloatingPanelProps) => import("react/jsx-runtime").JSX.Element;
7
+ //# sourceMappingURL=FloatingPanel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FloatingPanel.d.ts","sourceRoot":"","sources":["../../src/floatingPanel/FloatingPanel.tsx"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAElD;;;GAGG;AACH,eAAO,MAAM,aAAa,8GASvB,kBAAkB,4CA6DpB,CAAC"}
@@ -0,0 +1,70 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Animated, StyleSheet, useWindowDimensions, View } from 'react-native';
3
+ import { FLOATING_PANEL, Z_INDEX } from '../constants';
4
+ import { useFloatingPanel } from '../hooks';
5
+ import { HandleContent } from './HandleContent';
6
+ import { InspectorBubble } from './InspectorBubble';
7
+ import { PanelBody } from './PanelBody';
8
+ import { PanelHeader } from './PanelHeader';
9
+ /**
10
+ * Unified floating panel that renders as a bubble, handle, or expanded panel.
11
+ * Draggable via PanResponder. Bubble/handle snap to edge; expanded floats freely.
12
+ */
13
+ export const FloatingPanel = ({ panelState, selected, matches, selectedIndex, onToggleInspect, onCycleNext, onCyclePrevious, onClose, }) => {
14
+ const { width: screenWidth, height: screenHeight } = useWindowDimensions();
15
+ const { position, expandProgress, panHandlers, panelSize } = useFloatingPanel({
16
+ panelState,
17
+ screenWidth,
18
+ screenHeight,
19
+ onTap: onToggleInspect,
20
+ });
21
+ const bodyHeight = expandProgress.interpolate({
22
+ inputRange: [0, 1],
23
+ outputRange: [0, FLOATING_PANEL.PANEL_BODY_HEIGHT],
24
+ });
25
+ const bodyOpacity = expandProgress.interpolate({
26
+ inputRange: [0, 0.6, 1],
27
+ outputRange: [0, 0, 1],
28
+ });
29
+ return (_jsxs(Animated.View, { style: [
30
+ styles.container,
31
+ {
32
+ left: position.x,
33
+ top: position.y,
34
+ width: panelSize.width,
35
+ zIndex: Z_INDEX.FLOATING_PANEL,
36
+ },
37
+ panelState === 'bubble' && styles.bubbleContainer,
38
+ panelState === 'handle' && styles.handleContainer,
39
+ ], children: [_jsxs(View, { ...panHandlers, children: [panelState === 'bubble' && _jsx(InspectorBubble, {}), panelState === 'handle' && _jsx(HandleContent, { onClose: onClose }), panelState === 'expanded' && selected && (_jsx(PanelHeader, { selected: selected, matches: matches, selectedIndex: selectedIndex, onCycleNext: onCycleNext, onCyclePrevious: onCyclePrevious, onClose: onClose }))] }), selected && (_jsx(Animated.View, { style: [styles.body, { height: bodyHeight, opacity: bodyOpacity }], pointerEvents: panelState === 'expanded' ? 'auto' : 'none', children: _jsx(PanelBody, { element: selected }) }))] }));
40
+ };
41
+ const styles = StyleSheet.create({
42
+ container: {
43
+ position: 'absolute',
44
+ backgroundColor: 'rgba(30, 30, 30, 0.97)',
45
+ borderRadius: 12,
46
+ borderWidth: 1,
47
+ borderColor: 'rgba(255, 255, 255, 0.08)',
48
+ shadowColor: '#000',
49
+ shadowOffset: { width: 0, height: 4 },
50
+ shadowOpacity: 0.4,
51
+ shadowRadius: 8,
52
+ elevation: 8,
53
+ overflow: 'hidden',
54
+ },
55
+ bubbleContainer: {
56
+ borderRadius: FLOATING_PANEL.BUBBLE_SIZE / 2,
57
+ backgroundColor: 'transparent',
58
+ borderWidth: 0,
59
+ overflow: 'visible',
60
+ shadowOpacity: 0,
61
+ elevation: 0,
62
+ },
63
+ handleContainer: {
64
+ borderColor: 'rgba(255, 59, 48, 0.2)',
65
+ },
66
+ body: {
67
+ overflow: 'hidden',
68
+ },
69
+ });
70
+ //# sourceMappingURL=FloatingPanel.js.map