@buoy-gg/image-overlay 2.1.11
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/lib/commonjs/imageOverlay/components/ImageOverlayModal.js +847 -0
- package/lib/commonjs/imageOverlay/components/ImageOverlayStandalone.js +455 -0
- package/lib/commonjs/imageOverlay/components/OverlayControls.js +253 -0
- package/lib/commonjs/imageOverlay/components/TargetList.js +183 -0
- package/lib/commonjs/imageOverlay/index.js +33 -0
- package/lib/commonjs/imageOverlay/types/index.js +1 -0
- package/lib/commonjs/imageOverlay/utils/ImageOverlayController.js +392 -0
- package/lib/commonjs/imageOverlay/utils/componentMeasurement.js +106 -0
- package/lib/commonjs/imageOverlay/utils/fiberScanner.js +101 -0
- package/lib/commonjs/index.js +46 -0
- package/lib/commonjs/package.json +1 -0
- package/lib/commonjs/preset.js +59 -0
- package/lib/module/imageOverlay/components/ImageOverlayModal.js +843 -0
- package/lib/module/imageOverlay/components/ImageOverlayStandalone.js +451 -0
- package/lib/module/imageOverlay/components/OverlayControls.js +249 -0
- package/lib/module/imageOverlay/components/TargetList.js +179 -0
- package/lib/module/imageOverlay/index.js +6 -0
- package/lib/module/imageOverlay/types/index.js +1 -0
- package/lib/module/imageOverlay/utils/ImageOverlayController.js +388 -0
- package/lib/module/imageOverlay/utils/componentMeasurement.js +102 -0
- package/lib/module/imageOverlay/utils/fiberScanner.js +97 -0
- package/lib/module/index.js +34 -0
- package/lib/module/preset.js +53 -0
- package/lib/typescript/imageOverlay/components/ImageOverlayModal.d.ts +3 -0
- package/lib/typescript/imageOverlay/components/ImageOverlayModal.d.ts.map +1 -0
- package/lib/typescript/imageOverlay/components/ImageOverlayStandalone.d.ts +12 -0
- package/lib/typescript/imageOverlay/components/ImageOverlayStandalone.d.ts.map +1 -0
- package/lib/typescript/imageOverlay/components/OverlayControls.d.ts +18 -0
- package/lib/typescript/imageOverlay/components/OverlayControls.d.ts.map +1 -0
- package/lib/typescript/imageOverlay/components/TargetList.d.ts +12 -0
- package/lib/typescript/imageOverlay/components/TargetList.d.ts.map +1 -0
- package/lib/typescript/imageOverlay/index.d.ts +6 -0
- package/lib/typescript/imageOverlay/index.d.ts.map +1 -0
- package/lib/typescript/imageOverlay/types/index.d.ts +53 -0
- package/lib/typescript/imageOverlay/types/index.d.ts.map +1 -0
- package/lib/typescript/imageOverlay/utils/ImageOverlayController.d.ts +34 -0
- package/lib/typescript/imageOverlay/utils/ImageOverlayController.d.ts.map +1 -0
- package/lib/typescript/imageOverlay/utils/componentMeasurement.d.ts +13 -0
- package/lib/typescript/imageOverlay/utils/componentMeasurement.d.ts.map +1 -0
- package/lib/typescript/imageOverlay/utils/fiberScanner.d.ts +13 -0
- package/lib/typescript/imageOverlay/utils/fiberScanner.d.ts.map +1 -0
- package/lib/typescript/index.d.ts +14 -0
- package/lib/typescript/index.d.ts.map +1 -0
- package/lib/typescript/preset.d.ts +46 -0
- package/lib/typescript/preset.d.ts.map +1 -0
- package/package.json +79 -0
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.scanForImageTargets = scanForImageTargets;
|
|
7
|
+
/**
|
|
8
|
+
* Fiber tree scanner for discovering image-overlay targets.
|
|
9
|
+
* Finds components tagged with testID="image-target:LabelName".
|
|
10
|
+
*
|
|
11
|
+
* Core traversal adapted from debug-borders/utils/fiberTreeTraversal.js
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
const IMAGE_TARGET_PREFIX = "image-target:";
|
|
15
|
+
|
|
16
|
+
// Fiber tag constants (from React internals)
|
|
17
|
+
const HostComponent = 5;
|
|
18
|
+
const OffscreenComponent = 22;
|
|
19
|
+
function getReactDevToolsHook() {
|
|
20
|
+
if (typeof global === "undefined") return null;
|
|
21
|
+
return global.__REACT_DEVTOOLS_GLOBAL_HOOK__ ?? null;
|
|
22
|
+
}
|
|
23
|
+
function getFiberRoots() {
|
|
24
|
+
const hook = getReactDevToolsHook();
|
|
25
|
+
if (!hook?.getFiberRoots) return [];
|
|
26
|
+
try {
|
|
27
|
+
const rootsSet = hook.getFiberRoots(1);
|
|
28
|
+
return rootsSet ? Array.from(rootsSet) : [];
|
|
29
|
+
} catch {
|
|
30
|
+
return [];
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
function isHiddenOffscreen(fiber) {
|
|
34
|
+
return fiber.tag === OffscreenComponent && fiber.memoizedState !== null;
|
|
35
|
+
}
|
|
36
|
+
function isInactiveScreen(fiber) {
|
|
37
|
+
return fiber.memoizedProps?.activityState === 0;
|
|
38
|
+
}
|
|
39
|
+
function traverseFiberTree(fiber, callback, depth = 0, visited = new Set()) {
|
|
40
|
+
if (!fiber || visited.has(fiber) || depth > 500) return;
|
|
41
|
+
visited.add(fiber);
|
|
42
|
+
if (isHiddenOffscreen(fiber)) {
|
|
43
|
+
if (fiber.sibling) traverseFiberTree(fiber.sibling, callback, depth, visited);
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
if (isInactiveScreen(fiber)) {
|
|
47
|
+
if (fiber.sibling) traverseFiberTree(fiber.sibling, callback, depth, visited);
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
callback(fiber, depth);
|
|
51
|
+
if (fiber.child) traverseFiberTree(fiber.child, callback, depth + 1, visited);
|
|
52
|
+
if (fiber.sibling) traverseFiberTree(fiber.sibling, callback, depth, visited);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Walk the fiber tree upward to find the owning user-defined React component name.
|
|
57
|
+
*/
|
|
58
|
+
function getOwningComponentName(fiber) {
|
|
59
|
+
const internalNames = new Set(["View", "RCTView", "Text", "RCTText", "Image", "RCTImageView", "ScrollView", "RCTScrollView", "TextInput", "RCTTextInput", "TouchableOpacity", "TouchableHighlight", "TouchableWithoutFeedback", "Pressable", "FlatList", "SectionList", "SafeAreaView"]);
|
|
60
|
+
let current = fiber._debugOwner || fiber.return;
|
|
61
|
+
let depth = 0;
|
|
62
|
+
while (current && depth < 30) {
|
|
63
|
+
depth++;
|
|
64
|
+
const type = current.type;
|
|
65
|
+
if (type) {
|
|
66
|
+
const name = typeof type === "string" ? type : type.displayName || type.name;
|
|
67
|
+
if (name && !internalNames.has(name)) {
|
|
68
|
+
return name;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
current = current.return;
|
|
72
|
+
}
|
|
73
|
+
return null;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Scan the React fiber tree for components with testID="image-target:*".
|
|
78
|
+
* Returns an array of discovered targets with their fiber references for measurement.
|
|
79
|
+
*/
|
|
80
|
+
function scanForImageTargets() {
|
|
81
|
+
const roots = getFiberRoots();
|
|
82
|
+
if (roots.length === 0) return [];
|
|
83
|
+
const targets = [];
|
|
84
|
+
for (const root of roots) {
|
|
85
|
+
traverseFiberTree(root.current, fiber => {
|
|
86
|
+
if (fiber.tag !== HostComponent) return;
|
|
87
|
+
const testID = fiber.memoizedProps?.testID ?? fiber.pendingProps?.testID;
|
|
88
|
+
if (!testID || !testID.startsWith(IMAGE_TARGET_PREFIX)) return;
|
|
89
|
+
const label = testID.slice(IMAGE_TARGET_PREFIX.length);
|
|
90
|
+
if (!label) return;
|
|
91
|
+
targets.push({
|
|
92
|
+
label,
|
|
93
|
+
testID,
|
|
94
|
+
fiber,
|
|
95
|
+
instance: fiber.stateNode,
|
|
96
|
+
componentName: getOwningComponentName(fiber)
|
|
97
|
+
});
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
return targets;
|
|
101
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
Object.defineProperty(exports, "ImageOverlayController", {
|
|
7
|
+
enumerable: true,
|
|
8
|
+
get: function () {
|
|
9
|
+
return _ImageOverlayController.ImageOverlayController;
|
|
10
|
+
}
|
|
11
|
+
});
|
|
12
|
+
Object.defineProperty(exports, "ImageOverlayModal", {
|
|
13
|
+
enumerable: true,
|
|
14
|
+
get: function () {
|
|
15
|
+
return _ImageOverlayModal.ImageOverlayModal;
|
|
16
|
+
}
|
|
17
|
+
});
|
|
18
|
+
Object.defineProperty(exports, "ImageOverlayStandalone", {
|
|
19
|
+
enumerable: true,
|
|
20
|
+
get: function () {
|
|
21
|
+
return _ImageOverlayStandalone.ImageOverlayStandalone;
|
|
22
|
+
}
|
|
23
|
+
});
|
|
24
|
+
Object.defineProperty(exports, "createImageOverlayTool", {
|
|
25
|
+
enumerable: true,
|
|
26
|
+
get: function () {
|
|
27
|
+
return _preset.createImageOverlayTool;
|
|
28
|
+
}
|
|
29
|
+
});
|
|
30
|
+
Object.defineProperty(exports, "imageOverlayToolPreset", {
|
|
31
|
+
enumerable: true,
|
|
32
|
+
get: function () {
|
|
33
|
+
return _preset.imageOverlayToolPreset;
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
Object.defineProperty(exports, "scanForImageTargets", {
|
|
37
|
+
enumerable: true,
|
|
38
|
+
get: function () {
|
|
39
|
+
return _fiberScanner.scanForImageTargets;
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
var _preset = require("./preset");
|
|
43
|
+
var _ImageOverlayModal = require("./imageOverlay/components/ImageOverlayModal");
|
|
44
|
+
var _ImageOverlayStandalone = require("./imageOverlay/components/ImageOverlayStandalone");
|
|
45
|
+
var _ImageOverlayController = require("./imageOverlay/utils/ImageOverlayController");
|
|
46
|
+
var _fiberScanner = require("./imageOverlay/utils/fiberScanner");
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"type":"commonjs"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.IMAGE_OVERLAY_ICON_COLOR = void 0;
|
|
7
|
+
exports.createImageOverlayTool = createImageOverlayTool;
|
|
8
|
+
exports.imageOverlayToolPreset = void 0;
|
|
9
|
+
var _sharedUi = require("@buoy-gg/shared-ui");
|
|
10
|
+
var _ImageOverlayModal = require("./imageOverlay/components/ImageOverlayModal");
|
|
11
|
+
var _jsxRuntime = require("react/jsx-runtime");
|
|
12
|
+
/**
|
|
13
|
+
* Pre-configured image overlay tool for FloatingDevTools
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* ```tsx
|
|
17
|
+
* import { imageOverlayToolPreset } from '@buoy-gg/image-overlay';
|
|
18
|
+
*
|
|
19
|
+
* const installedApps = [
|
|
20
|
+
* imageOverlayToolPreset,
|
|
21
|
+
* ];
|
|
22
|
+
* ```
|
|
23
|
+
*/
|
|
24
|
+
|
|
25
|
+
const IMAGE_OVERLAY_ICON_COLOR = exports.IMAGE_OVERLAY_ICON_COLOR = "#A855F7";
|
|
26
|
+
const imageOverlayToolPreset = exports.imageOverlayToolPreset = {
|
|
27
|
+
id: "image-overlay",
|
|
28
|
+
name: "IMG",
|
|
29
|
+
description: "Design mockup overlay",
|
|
30
|
+
slot: "both",
|
|
31
|
+
icon: ({
|
|
32
|
+
size
|
|
33
|
+
}) => /*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.ImageOverlayIcon, {
|
|
34
|
+
size: size,
|
|
35
|
+
color: IMAGE_OVERLAY_ICON_COLOR
|
|
36
|
+
}),
|
|
37
|
+
component: _ImageOverlayModal.ImageOverlayModal,
|
|
38
|
+
props: {
|
|
39
|
+
enableSharedModalDimensions: false
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
function createImageOverlayTool(options) {
|
|
43
|
+
return {
|
|
44
|
+
id: options?.id || "image-overlay",
|
|
45
|
+
name: options?.name || "IMG",
|
|
46
|
+
description: options?.description || "Design mockup overlay",
|
|
47
|
+
slot: "both",
|
|
48
|
+
icon: ({
|
|
49
|
+
size
|
|
50
|
+
}) => /*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.ImageOverlayIcon, {
|
|
51
|
+
size: size,
|
|
52
|
+
color: IMAGE_OVERLAY_ICON_COLOR
|
|
53
|
+
}),
|
|
54
|
+
component: _ImageOverlayModal.ImageOverlayModal,
|
|
55
|
+
props: {
|
|
56
|
+
enableSharedModalDimensions: options?.enableSharedModalDimensions !== undefined ? options.enableSharedModalDimensions : false
|
|
57
|
+
}
|
|
58
|
+
};
|
|
59
|
+
}
|