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.
- package/LICENSE +21 -0
- package/README.md +134 -0
- package/lib/ElementCycler.d.ts +14 -0
- package/lib/ElementCycler.d.ts.map +1 -0
- package/lib/ElementCycler.js +33 -0
- package/lib/ElementCycler.js.map +1 -0
- package/lib/ElementHighlighter.d.ts +21 -0
- package/lib/ElementHighlighter.d.ts.map +1 -0
- package/lib/ElementHighlighter.js +89 -0
- package/lib/ElementHighlighter.js.map +1 -0
- package/lib/ElementInspector.d.ts +12 -0
- package/lib/ElementInspector.d.ts.map +1 -0
- package/lib/ElementInspector.js +74 -0
- package/lib/ElementInspector.js.map +1 -0
- package/lib/components/Checkbox.d.ts +7 -0
- package/lib/components/Checkbox.d.ts.map +1 -0
- package/lib/components/Checkbox.js +30 -0
- package/lib/components/Checkbox.js.map +1 -0
- package/lib/components/index.d.ts +2 -0
- package/lib/components/index.d.ts.map +1 -0
- package/lib/components/index.js +2 -0
- package/lib/components/index.js.map +1 -0
- package/lib/constants/colors.d.ts +24 -0
- package/lib/constants/colors.d.ts.map +1 -0
- package/lib/constants/colors.js +18 -0
- package/lib/constants/colors.js.map +1 -0
- package/lib/constants/index.d.ts +3 -0
- package/lib/constants/index.d.ts.map +1 -0
- package/lib/constants/index.js +3 -0
- package/lib/constants/index.js.map +1 -0
- package/lib/constants/ui.d.ts +56 -0
- package/lib/constants/ui.d.ts.map +1 -0
- package/lib/constants/ui.js +46 -0
- package/lib/constants/ui.js.map +1 -0
- package/lib/fiber/FiberAdapter.d.ts +52 -0
- package/lib/fiber/FiberAdapter.d.ts.map +1 -0
- package/lib/fiber/FiberAdapter.js +112 -0
- package/lib/fiber/FiberAdapter.js.map +1 -0
- package/lib/fiber/detectVersion.d.ts +9 -0
- package/lib/fiber/detectVersion.d.ts.map +1 -0
- package/lib/fiber/detectVersion.js +17 -0
- package/lib/fiber/detectVersion.js.map +1 -0
- package/lib/fiber/index.d.ts +5 -0
- package/lib/fiber/index.d.ts.map +1 -0
- package/lib/fiber/index.js +4 -0
- package/lib/fiber/index.js.map +1 -0
- package/lib/fiber/types.d.ts +35 -0
- package/lib/fiber/types.d.ts.map +1 -0
- package/lib/fiber/types.js +3 -0
- package/lib/fiber/types.js.map +1 -0
- package/lib/floatingPanel/AddPropertyRow.d.ts +13 -0
- package/lib/floatingPanel/AddPropertyRow.d.ts.map +1 -0
- package/lib/floatingPanel/AddPropertyRow.js +61 -0
- package/lib/floatingPanel/AddPropertyRow.js.map +1 -0
- package/lib/floatingPanel/CloseButton.d.ts +7 -0
- package/lib/floatingPanel/CloseButton.d.ts.map +1 -0
- package/lib/floatingPanel/CloseButton.js +21 -0
- package/lib/floatingPanel/CloseButton.js.map +1 -0
- package/lib/floatingPanel/EditableValue.d.ts +12 -0
- package/lib/floatingPanel/EditableValue.d.ts.map +1 -0
- package/lib/floatingPanel/EditableValue.js +67 -0
- package/lib/floatingPanel/EditableValue.js.map +1 -0
- package/lib/floatingPanel/FloatingPanel.d.ts +7 -0
- package/lib/floatingPanel/FloatingPanel.d.ts.map +1 -0
- package/lib/floatingPanel/FloatingPanel.js +70 -0
- package/lib/floatingPanel/FloatingPanel.js.map +1 -0
- package/lib/floatingPanel/HandleContent.d.ts +7 -0
- package/lib/floatingPanel/HandleContent.d.ts.map +1 -0
- package/lib/floatingPanel/HandleContent.js +35 -0
- package/lib/floatingPanel/HandleContent.js.map +1 -0
- package/lib/floatingPanel/InspectorBubble.d.ts +6 -0
- package/lib/floatingPanel/InspectorBubble.d.ts.map +1 -0
- package/lib/floatingPanel/InspectorBubble.js +91 -0
- package/lib/floatingPanel/InspectorBubble.js.map +1 -0
- package/lib/floatingPanel/PanelBody.d.ts +8 -0
- package/lib/floatingPanel/PanelBody.d.ts.map +1 -0
- package/lib/floatingPanel/PanelBody.js +72 -0
- package/lib/floatingPanel/PanelBody.js.map +1 -0
- package/lib/floatingPanel/PanelFooter.d.ts +9 -0
- package/lib/floatingPanel/PanelFooter.d.ts.map +1 -0
- package/lib/floatingPanel/PanelFooter.js +21 -0
- package/lib/floatingPanel/PanelFooter.js.map +1 -0
- package/lib/floatingPanel/PanelHeader.d.ts +13 -0
- package/lib/floatingPanel/PanelHeader.d.ts.map +1 -0
- package/lib/floatingPanel/PanelHeader.js +56 -0
- package/lib/floatingPanel/PanelHeader.js.map +1 -0
- package/lib/floatingPanel/index.d.ts +12 -0
- package/lib/floatingPanel/index.d.ts.map +1 -0
- package/lib/floatingPanel/index.js +11 -0
- package/lib/floatingPanel/index.js.map +1 -0
- package/lib/floatingPanel/panelUtils.d.ts +3 -0
- package/lib/floatingPanel/panelUtils.d.ts.map +1 -0
- package/lib/floatingPanel/panelUtils.js +12 -0
- package/lib/floatingPanel/panelUtils.js.map +1 -0
- package/lib/floatingPanel/types.d.ts +23 -0
- package/lib/floatingPanel/types.d.ts.map +1 -0
- package/lib/floatingPanel/types.js +2 -0
- package/lib/floatingPanel/types.js.map +1 -0
- package/lib/hooks/index.d.ts +8 -0
- package/lib/hooks/index.d.ts.map +1 -0
- package/lib/hooks/index.js +8 -0
- package/lib/hooks/index.js.map +1 -0
- package/lib/hooks/useDebouncedCallback.d.ts +2 -0
- package/lib/hooks/useDebouncedCallback.d.ts.map +1 -0
- package/lib/hooks/useDebouncedCallback.js +12 -0
- package/lib/hooks/useDebouncedCallback.js.map +1 -0
- package/lib/hooks/useDebouncedValue.d.ts +2 -0
- package/lib/hooks/useDebouncedValue.d.ts.map +1 -0
- package/lib/hooks/useDebouncedValue.js +10 -0
- package/lib/hooks/useDebouncedValue.js.map +1 -0
- package/lib/hooks/useFloatingPanel.d.ts +14 -0
- package/lib/hooks/useFloatingPanel.d.ts.map +1 -0
- package/lib/hooks/useFloatingPanel.js +132 -0
- package/lib/hooks/useFloatingPanel.js.map +1 -0
- package/lib/hooks/useLayoutSnapshot.d.ts +14 -0
- package/lib/hooks/useLayoutSnapshot.d.ts.map +1 -0
- package/lib/hooks/useLayoutSnapshot.js +39 -0
- package/lib/hooks/useLayoutSnapshot.js.map +1 -0
- package/lib/hooks/useStyleMutation.d.ts +14 -0
- package/lib/hooks/useStyleMutation.d.ts.map +1 -0
- package/lib/hooks/useStyleMutation.js +22 -0
- package/lib/hooks/useStyleMutation.js.map +1 -0
- package/lib/hooks/useStyleOverrides.d.ts +24 -0
- package/lib/hooks/useStyleOverrides.d.ts.map +1 -0
- package/lib/hooks/useStyleOverrides.js +165 -0
- package/lib/hooks/useStyleOverrides.js.map +1 -0
- package/lib/hooks/useTapToSelect.d.ts +20 -0
- package/lib/hooks/useTapToSelect.d.ts.map +1 -0
- package/lib/hooks/useTapToSelect.js +58 -0
- package/lib/hooks/useTapToSelect.js.map +1 -0
- package/lib/index.d.ts +3 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +2 -0
- package/lib/index.js.map +1 -0
- package/lib/utils/clamp.d.ts +2 -0
- package/lib/utils/clamp.d.ts.map +1 -0
- package/lib/utils/clamp.js +2 -0
- package/lib/utils/clamp.js.map +1 -0
- package/lib/utils/flattenStyles.d.ts +6 -0
- package/lib/utils/flattenStyles.d.ts.map +1 -0
- package/lib/utils/flattenStyles.js +11 -0
- package/lib/utils/flattenStyles.js.map +1 -0
- package/lib/utils/hitTest.d.ts +7 -0
- package/lib/utils/hitTest.d.ts.map +1 -0
- package/lib/utils/hitTest.js +20 -0
- package/lib/utils/hitTest.js.map +1 -0
- package/lib/utils/index.d.ts +12 -0
- package/lib/utils/index.d.ts.map +1 -0
- package/lib/utils/index.js +9 -0
- package/lib/utils/index.js.map +1 -0
- package/lib/utils/layoutSnapshot.d.ts +7 -0
- package/lib/utils/layoutSnapshot.d.ts.map +1 -0
- package/lib/utils/layoutSnapshot.js +42 -0
- package/lib/utils/layoutSnapshot.js.map +1 -0
- package/lib/utils/sourceMapping.d.ts +26 -0
- package/lib/utils/sourceMapping.d.ts.map +1 -0
- package/lib/utils/sourceMapping.js +53 -0
- package/lib/utils/sourceMapping.js.map +1 -0
- package/lib/utils/styleFormatting.d.ts +5 -0
- package/lib/utils/styleFormatting.d.ts.map +1 -0
- package/lib/utils/styleFormatting.js +38 -0
- package/lib/utils/styleFormatting.js.map +1 -0
- package/lib/utils/styleInputParsing.d.ts +5 -0
- package/lib/utils/styleInputParsing.d.ts.map +1 -0
- package/lib/utils/styleInputParsing.js +33 -0
- package/lib/utils/styleInputParsing.js.map +1 -0
- package/lib/utils/yogaLayout.d.ts +33 -0
- package/lib/utils/yogaLayout.d.ts.map +1 -0
- package/lib/utils/yogaLayout.js +33 -0
- package/lib/utils/yogaLayout.js.map +1 -0
- package/package.json +74 -0
- package/src/ElementCycler.tsx +64 -0
- package/src/ElementHighlighter.tsx +122 -0
- package/src/ElementInspector.tsx +119 -0
- package/src/components/Checkbox.tsx +41 -0
- package/src/components/index.ts +1 -0
- package/src/constants/colors.ts +18 -0
- package/src/constants/index.ts +9 -0
- package/src/constants/ui.ts +51 -0
- package/src/fiber/FiberAdapter.ts +153 -0
- package/src/fiber/detectVersion.ts +19 -0
- package/src/fiber/index.ts +4 -0
- package/src/fiber/types.ts +36 -0
- package/src/floatingPanel/AddPropertyRow.tsx +102 -0
- package/src/floatingPanel/CloseButton.tsx +34 -0
- package/src/floatingPanel/EditableValue.tsx +109 -0
- package/src/floatingPanel/FloatingPanel.tsx +114 -0
- package/src/floatingPanel/HandleContent.tsx +45 -0
- package/src/floatingPanel/InspectorBubble.tsx +121 -0
- package/src/floatingPanel/PanelBody.tsx +162 -0
- package/src/floatingPanel/PanelFooter.tsx +36 -0
- package/src/floatingPanel/PanelHeader.tsx +111 -0
- package/src/floatingPanel/index.ts +11 -0
- package/src/floatingPanel/panelUtils.ts +13 -0
- package/src/floatingPanel/types.ts +26 -0
- package/src/hooks/index.ts +7 -0
- package/src/hooks/useDebouncedCallback.ts +18 -0
- package/src/hooks/useDebouncedValue.ts +12 -0
- package/src/hooks/useFloatingPanel.ts +191 -0
- package/src/hooks/useLayoutSnapshot.ts +42 -0
- package/src/hooks/useStyleMutation.ts +31 -0
- package/src/hooks/useStyleOverrides.ts +176 -0
- package/src/hooks/useTapToSelect.ts +76 -0
- package/src/index.ts +2 -0
- package/src/utils/clamp.ts +2 -0
- package/src/utils/flattenStyles.ts +12 -0
- package/src/utils/hitTest.ts +29 -0
- package/src/utils/index.ts +11 -0
- package/src/utils/layoutSnapshot.ts +48 -0
- package/src/utils/sourceMapping.ts +67 -0
- package/src/utils/styleFormatting.ts +34 -0
- package/src/utils/styleInputParsing.ts +33 -0
- 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":"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"}
|
|
@@ -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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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":";AAAA,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACtE,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACrF,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAWxD,sEAAsE;AACtE,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,EAC5B,KAAK,EACL,YAAY,EACZ,QAAQ,EACR,OAAO,EACP,QAAQ,EACR,cAAc,GAAG,KAAK,GACH,EAAE,EAAE;IACvB,MAAM,MAAM,GAAG,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAC9C,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,cAAc,CAAC,CAAC;IACvD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IACvC,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC9C,MAAM,YAAY,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAEnC,MAAM,YAAY,GAAG,GAAG,EAAE;QACxB,IAAI,QAAQ;YAAE,OAAO;QACrB,YAAY,CAAC,OAAO,GAAG,KAAK,CAAC;QAC7B,QAAQ,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC;QAClC,UAAU,CAAC,IAAI,CAAC,CAAC;IACnB,CAAC,CAAC;IAEF,MAAM,UAAU,GAAG,GAAG,EAAE;QACtB,0DAA0D;QAC1D,IAAI,YAAY,CAAC,OAAO;YAAE,OAAO;QACjC,YAAY,CAAC,OAAO,GAAG,IAAI,CAAC;QAE5B,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;QAC7B,MAAM,OAAO,GAAG,OAAO,KAAK,EAAE,IAAI,OAAO,KAAK,gBAAgB,CAAC,KAAK,CAAC,CAAC;QAEtE,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,YAAY,GAAG,OAAO,KAAK,KAAK,IAAI,CAAC,cAAc,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACxF,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,GAAG,cAAc,CAAC,gBAAgB,CAAC;YAEnE,IAAI,YAAY,IAAI,SAAS,EAAE,CAAC;gBAC9B,UAAU,CAAC,IAAI,CAAC,CAAC;gBACjB,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC;gBACzC,OAAO;YACT,CAAC;YAED,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YAC1C,QAAQ,CAAC,MAAM,CAAC,CAAC;QACnB,CAAC;QAED,UAAU,CAAC,KAAK,CAAC,CAAC;IACpB,CAAC,CAAC;IAEF,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,CACL,KAAC,SAAS,IACR,KAAK,EAAE;gBACL,MAAM,CAAC,IAAI;gBACX,MAAM,CAAC,OAAO;gBACd,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,EAAE;aACzE,EACD,KAAK,EAAE,KAAK,EACZ,YAAY,EAAE,QAAQ,EACtB,eAAe,EAAE,UAAU,EAC3B,MAAM,EAAE,UAAU,EAClB,cAAc,EAAC,MAAM,EACrB,WAAW,EAAE,KAAK,EAClB,SAAS,QACT,iBAAiB,QACjB,aAAa,EAAC,MAAM,GACpB,CACH,CAAC;IACJ,CAAC;IAED,OAAO,CACL,KAAC,SAAS,IAAC,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,YAC1C,KAAC,IAAI,IAAC,KAAK,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,EAAE,EAAE,QAAQ,IAAI,MAAM,CAAC,aAAa,CAAC,YACjF,YAAY,GACR,GACG,CACb,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC;IAC/B,IAAI,EAAE;QACJ,QAAQ,EAAE,EAAE;QACZ,UAAU,EAAE,cAAc;QAC1B,OAAO,EAAE,CAAC;QACV,MAAM,EAAE,CAAC;QACT,QAAQ,EAAE,EAAE;KACb;IACD,OAAO,EAAE;QACP,WAAW,EAAE,CAAC;QACd,YAAY,EAAE,CAAC;QACf,iBAAiB,EAAE,CAAC;QACpB,eAAe,EAAE,CAAC;KACnB;IACD,aAAa,EAAE;QACb,kBAAkB,EAAE,cAAc;KACnC;CACF,CAAC,CAAC"}
|
|
@@ -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
|