@vibexdotnew/inspector 0.0.3 → 0.0.5
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/dist/expo/config.cjs +21 -4
- package/dist/expo/config.cjs.map +1 -1
- package/dist/expo/config.js +17 -4
- package/dist/expo/config.js.map +1 -1
- package/dist/expo/index.cjs +21 -4
- package/dist/expo/index.cjs.map +1 -1
- package/dist/expo/index.js +11 -4
- package/dist/expo/index.js.map +1 -1
- package/dist/next/index.cjs +21 -4
- package/dist/next/index.cjs.map +1 -1
- package/dist/next/index.js +17 -4
- package/dist/next/index.js.map +1 -1
- package/dist/next/loader.cjs +21 -4
- package/dist/next/loader.cjs.map +1 -1
- package/dist/next/loader.d.cts +2 -2
- package/dist/next/loader.d.ts +2 -2
- package/dist/next/loader.js +17 -4
- package/dist/next/loader.js.map +1 -1
- package/package.json +4 -3
- /package/expo/{metro-transformer.js → metro-transformer.cjs} +0 -0
- /package/next/{element-tagger.js → element-tagger.cjs} +0 -0
package/dist/expo/config.cjs
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
"use strict";
|
|
3
|
+
var __create = Object.create;
|
|
3
4
|
var __defProp = Object.defineProperty;
|
|
4
5
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
6
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
7
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
6
8
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
9
|
var __export = (target, all) => {
|
|
8
10
|
for (var name in all)
|
|
@@ -16,6 +18,14 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
16
18
|
}
|
|
17
19
|
return to;
|
|
18
20
|
};
|
|
21
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
22
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
23
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
24
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
25
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
26
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
27
|
+
mod
|
|
28
|
+
));
|
|
19
29
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
20
30
|
|
|
21
31
|
// src/expo/config.ts
|
|
@@ -25,12 +35,19 @@ __export(config_exports, {
|
|
|
25
35
|
withInspector: () => withInspector
|
|
26
36
|
});
|
|
27
37
|
module.exports = __toCommonJS(config_exports);
|
|
28
|
-
var import_url = require("url");
|
|
29
38
|
var import_path = require("path");
|
|
30
39
|
var import_meta = {};
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
40
|
+
function resolveTransformerPath() {
|
|
41
|
+
try {
|
|
42
|
+
const pkgPath = require.resolve("@vibexdotnew/inspector/package.json");
|
|
43
|
+
return (0, import_path.join)((0, import_path.dirname)(pkgPath), "expo", "metro-transformer.cjs");
|
|
44
|
+
} catch {
|
|
45
|
+
const { fileURLToPath } = require("url");
|
|
46
|
+
const currentDir = (0, import_path.dirname)(fileURLToPath(import_meta.url));
|
|
47
|
+
return (0, import_path.join)(currentDir, "..", "..", "expo", "metro-transformer.cjs");
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
var transformerPath = resolveTransformerPath();
|
|
34
51
|
function withInspector(metroConfig, options = {}) {
|
|
35
52
|
const { enableInProduction = false } = options;
|
|
36
53
|
if (process.env.NODE_ENV === "production" && !enableInProduction) {
|
package/dist/expo/config.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/expo/config.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"sources":["../../src/expo/config.ts"],"sourcesContent":["import { dirname, join } from 'path';\n\n/**\n * Resolves the transformer path in both CJS and ESM environments\n */\nfunction resolveTransformerPath(): string {\n try {\n // CJS: use require.resolve to find our own package\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const pkgPath = require.resolve('@vibexdotnew/inspector/package.json');\n return join(dirname(pkgPath), 'expo', 'metro-transformer.cjs');\n } catch {\n // ESM fallback: use import.meta.url\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const { fileURLToPath } = require('url');\n const currentDir = dirname(fileURLToPath(import.meta.url));\n return join(currentDir, '..', '..', 'expo', 'metro-transformer.cjs');\n }\n}\n\n/**\n * Absolute path to the metro-transformer.js file.\n * Use this with Metro configuration.\n *\n * @example\n * ```javascript\n * const { getDefaultConfig } = require('expo/metro-config');\n * const { transformerPath } = require('@vibexdotnew/inspector/expo');\n *\n * const config = getDefaultConfig(__dirname);\n *\n * module.exports = {\n * ...config,\n * transformer: {\n * ...config.transformer,\n * babelTransformerPath: transformerPath,\n * },\n * };\n * ```\n */\nexport const transformerPath = resolveTransformerPath();\n\nexport interface InspectorConfig {\n /**\n * Enable the inspector in production builds.\n * @default false\n */\n enableInProduction?: boolean;\n}\n\n/**\n * Wraps an Expo Metro config to add the Vibex Inspector transformer.\n *\n * @example\n * ```javascript\n * const { getDefaultConfig } = require('expo/metro-config');\n * const { withInspector } = require('@vibexdotnew/inspector/expo');\n *\n * const config = getDefaultConfig(__dirname);\n *\n * module.exports = withInspector(config);\n * ```\n */\nexport function withInspector<T extends { transformer?: { babelTransformerPath?: string } }>(\n metroConfig: T,\n options: InspectorConfig = {}\n): T {\n const { enableInProduction = false } = options;\n\n // Skip in production unless explicitly enabled\n if (process.env.NODE_ENV === 'production' && !enableInProduction) {\n return metroConfig;\n }\n\n return {\n ...metroConfig,\n transformer: {\n ...metroConfig.transformer,\n babelTransformerPath: transformerPath,\n },\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAA8B;AAA9B;AAKA,SAAS,yBAAiC;AACtC,MAAI;AAGA,UAAM,UAAU,gBAAgB,qCAAqC;AACrE,eAAO,sBAAK,qBAAQ,OAAO,GAAG,QAAQ,uBAAuB;AAAA,EACjE,QAAQ;AAGJ,UAAM,EAAE,cAAc,IAAI,QAAQ,KAAK;AACvC,UAAM,iBAAa,qBAAQ,cAAc,YAAY,GAAG,CAAC;AACzD,eAAO,kBAAK,YAAY,MAAM,MAAM,QAAQ,uBAAuB;AAAA,EACvE;AACJ;AAsBO,IAAM,kBAAkB,uBAAuB;AAuB/C,SAAS,cACZ,aACA,UAA2B,CAAC,GAC3B;AACD,QAAM,EAAE,qBAAqB,MAAM,IAAI;AAGvC,MAAI,QAAQ,IAAI,aAAa,gBAAgB,CAAC,oBAAoB;AAC9D,WAAO;AAAA,EACX;AAEA,SAAO;AAAA,IACH,GAAG;AAAA,IACH,aAAa;AAAA,MACT,GAAG,YAAY;AAAA,MACf,sBAAsB;AAAA,IAC1B;AAAA,EACJ;AACJ;","names":[]}
|
package/dist/expo/config.js
CHANGED
|
@@ -1,11 +1,24 @@
|
|
|
1
1
|
"use client";
|
|
2
|
+
var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
|
|
3
|
+
get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
|
|
4
|
+
}) : x)(function(x) {
|
|
5
|
+
if (typeof require !== "undefined") return require.apply(this, arguments);
|
|
6
|
+
throw Error('Dynamic require of "' + x + '" is not supported');
|
|
7
|
+
});
|
|
2
8
|
|
|
3
9
|
// src/expo/config.ts
|
|
4
|
-
import { fileURLToPath } from "url";
|
|
5
10
|
import { dirname, join } from "path";
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
11
|
+
function resolveTransformerPath() {
|
|
12
|
+
try {
|
|
13
|
+
const pkgPath = __require.resolve("@vibexdotnew/inspector/package.json");
|
|
14
|
+
return join(dirname(pkgPath), "expo", "metro-transformer.cjs");
|
|
15
|
+
} catch {
|
|
16
|
+
const { fileURLToPath } = __require("url");
|
|
17
|
+
const currentDir = dirname(fileURLToPath(import.meta.url));
|
|
18
|
+
return join(currentDir, "..", "..", "expo", "metro-transformer.cjs");
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
var transformerPath = resolveTransformerPath();
|
|
9
22
|
function withInspector(metroConfig, options = {}) {
|
|
10
23
|
const { enableInProduction = false } = options;
|
|
11
24
|
if (process.env.NODE_ENV === "production" && !enableInProduction) {
|
package/dist/expo/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/expo/config.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"sources":["../../src/expo/config.ts"],"sourcesContent":["import { dirname, join } from 'path';\n\n/**\n * Resolves the transformer path in both CJS and ESM environments\n */\nfunction resolveTransformerPath(): string {\n try {\n // CJS: use require.resolve to find our own package\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const pkgPath = require.resolve('@vibexdotnew/inspector/package.json');\n return join(dirname(pkgPath), 'expo', 'metro-transformer.cjs');\n } catch {\n // ESM fallback: use import.meta.url\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const { fileURLToPath } = require('url');\n const currentDir = dirname(fileURLToPath(import.meta.url));\n return join(currentDir, '..', '..', 'expo', 'metro-transformer.cjs');\n }\n}\n\n/**\n * Absolute path to the metro-transformer.js file.\n * Use this with Metro configuration.\n *\n * @example\n * ```javascript\n * const { getDefaultConfig } = require('expo/metro-config');\n * const { transformerPath } = require('@vibexdotnew/inspector/expo');\n *\n * const config = getDefaultConfig(__dirname);\n *\n * module.exports = {\n * ...config,\n * transformer: {\n * ...config.transformer,\n * babelTransformerPath: transformerPath,\n * },\n * };\n * ```\n */\nexport const transformerPath = resolveTransformerPath();\n\nexport interface InspectorConfig {\n /**\n * Enable the inspector in production builds.\n * @default false\n */\n enableInProduction?: boolean;\n}\n\n/**\n * Wraps an Expo Metro config to add the Vibex Inspector transformer.\n *\n * @example\n * ```javascript\n * const { getDefaultConfig } = require('expo/metro-config');\n * const { withInspector } = require('@vibexdotnew/inspector/expo');\n *\n * const config = getDefaultConfig(__dirname);\n *\n * module.exports = withInspector(config);\n * ```\n */\nexport function withInspector<T extends { transformer?: { babelTransformerPath?: string } }>(\n metroConfig: T,\n options: InspectorConfig = {}\n): T {\n const { enableInProduction = false } = options;\n\n // Skip in production unless explicitly enabled\n if (process.env.NODE_ENV === 'production' && !enableInProduction) {\n return metroConfig;\n }\n\n return {\n ...metroConfig,\n transformer: {\n ...metroConfig.transformer,\n babelTransformerPath: transformerPath,\n },\n };\n}\n"],"mappings":";;;;;;;;;AAAA,SAAS,SAAS,YAAY;AAK9B,SAAS,yBAAiC;AACtC,MAAI;AAGA,UAAM,UAAU,UAAQ,QAAQ,qCAAqC;AACrE,WAAO,KAAK,QAAQ,OAAO,GAAG,QAAQ,uBAAuB;AAAA,EACjE,QAAQ;AAGJ,UAAM,EAAE,cAAc,IAAI,UAAQ,KAAK;AACvC,UAAM,aAAa,QAAQ,cAAc,YAAY,GAAG,CAAC;AACzD,WAAO,KAAK,YAAY,MAAM,MAAM,QAAQ,uBAAuB;AAAA,EACvE;AACJ;AAsBO,IAAM,kBAAkB,uBAAuB;AAuB/C,SAAS,cACZ,aACA,UAA2B,CAAC,GAC3B;AACD,QAAM,EAAE,qBAAqB,MAAM,IAAI;AAGvC,MAAI,QAAQ,IAAI,aAAa,gBAAgB,CAAC,oBAAoB;AAC9D,WAAO;AAAA,EACX;AAEA,SAAO;AAAA,IACH,GAAG;AAAA,IACH,aAAa;AAAA,MACT,GAAG,YAAY;AAAA,MACf,sBAAsB;AAAA,IAC1B;AAAA,EACJ;AACJ;","names":[]}
|
package/dist/expo/index.cjs
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
"use strict";
|
|
3
|
+
var __create = Object.create;
|
|
3
4
|
var __defProp = Object.defineProperty;
|
|
4
5
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
6
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
7
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
6
8
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
9
|
var __export = (target, all) => {
|
|
8
10
|
for (var name in all)
|
|
@@ -16,6 +18,14 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
16
18
|
}
|
|
17
19
|
return to;
|
|
18
20
|
};
|
|
21
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
22
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
23
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
24
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
25
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
26
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
27
|
+
mod
|
|
28
|
+
));
|
|
19
29
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
20
30
|
|
|
21
31
|
// src/expo/index.ts
|
|
@@ -989,12 +999,19 @@ var styles2 = import_react_native2.StyleSheet.create({
|
|
|
989
999
|
});
|
|
990
1000
|
|
|
991
1001
|
// src/expo/config.ts
|
|
992
|
-
var import_url = require("url");
|
|
993
1002
|
var import_path = require("path");
|
|
994
1003
|
var import_meta = {};
|
|
995
|
-
|
|
996
|
-
|
|
997
|
-
|
|
1004
|
+
function resolveTransformerPath() {
|
|
1005
|
+
try {
|
|
1006
|
+
const pkgPath = require.resolve("@vibexdotnew/inspector/package.json");
|
|
1007
|
+
return (0, import_path.join)((0, import_path.dirname)(pkgPath), "expo", "metro-transformer.cjs");
|
|
1008
|
+
} catch {
|
|
1009
|
+
const { fileURLToPath } = require("url");
|
|
1010
|
+
const currentDir = (0, import_path.dirname)(fileURLToPath(import_meta.url));
|
|
1011
|
+
return (0, import_path.join)(currentDir, "..", "..", "expo", "metro-transformer.cjs");
|
|
1012
|
+
}
|
|
1013
|
+
}
|
|
1014
|
+
var transformerPath = resolveTransformerPath();
|
|
998
1015
|
function withInspector(metroConfig, options = {}) {
|
|
999
1016
|
const { enableInProduction = false } = options;
|
|
1000
1017
|
if (process.env.NODE_ENV === "production" && !enableInProduction) {
|
package/dist/expo/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/expo/index.ts","../../src/expo/components/VisualInspector.tsx","../../src/expo/components/ErrorBoundary.tsx","../../src/expo/config.ts"],"sourcesContent":["// Components\nexport { VisualInspector } from './components/VisualInspector';\nexport { ErrorBoundary } from './components/ErrorBoundary';\n\n// Config helper\nexport { withInspector, transformerPath, type InspectorConfig } from './config';\n","/**\n * VisualInspector - Visual element inspector for Expo Web\n * Enables element selection and inspection when running in an iframe\n * Communicates with parent frame for element editing capabilities\n */\n\nimport React, { useEffect, useReducer, useRef, useCallback } from \"react\";\nimport { View, Text, StyleSheet, Platform, GestureResponderEvent } from \"react-native\";\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Constants\n// ─────────────────────────────────────────────────────────────────────────────\nconst CHANNEL = \"VIBEX_INSPECTOR\" as const;\nconst STORAGE_KEY = \"vibex_inspector_active\" as const;\nconst SELECTED_KEY = \"vibex_selected_element\" as const;\nconst DATA_ATTR = \"data-vibex-loc\" as const;\nconst OVERLAY_PADDING = 4;\nconst MAX_SELECTIONS = 5;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Types\n// ─────────────────────────────────────────────────────────────────────────────\ninterface Rect {\n top: number;\n left: number;\n width: number;\n height: number;\n}\n\ninterface ElementInfo {\n id: string;\n tag: string;\n rect: Rect;\n editable: boolean;\n styles: ComputedStyles;\n className: string;\n src?: string;\n}\n\ninterface ComputedStyles {\n fontSize: string;\n color: string;\n fontWeight: string;\n fontFamily: string;\n fontStyle: string;\n textAlign: string;\n textDecoration: string;\n lineHeight: string;\n letterSpacing: string;\n backgroundColor: string;\n backgroundImage: string;\n borderRadius: string;\n opacity: string;\n padding: string;\n margin: string;\n display: string;\n flexDirection: string;\n alignItems: string;\n justifyContent: string;\n gap: string;\n width: string;\n height: string;\n}\n\ninterface SourceLocation {\n file: string;\n line: number;\n col: number;\n}\n\n// Inbound messages (from parent)\ntype InboundMessage =\n | { channel: typeof CHANNEL; action: \"ACTIVATE\"; value: boolean }\n | { channel: typeof CHANNEL; action: \"HOVER_ELEMENT\"; elementId: string | null }\n | { channel: typeof CHANNEL; action: \"SCROLL_BY\"; dx: number; dy: number }\n | { channel: typeof CHANNEL; action: \"APPLY_STYLES\"; elementId: string; styles: Record<string, string> }\n | { channel: typeof CHANNEL; action: \"APPLY_IMAGE\"; elementId: string; src: string }\n | { channel: typeof CHANNEL; action: \"PREVIEW_FONT\"; elementId: string; font: string }\n | { channel: typeof CHANNEL; action: \"CLEAR_STYLES\"; elementId: string }\n | { channel: typeof CHANNEL; action: \"RESIZE\"; elementId: string; width: number; height: number };\n\n// Outbound messages (to parent)\ntype OutboundMessage =\n | { channel: typeof CHANNEL; event: \"READY\" }\n | { channel: typeof CHANNEL; event: \"MODE_CHANGED\"; active: boolean }\n | { channel: typeof CHANNEL; event: \"HOVER\"; element: ElementInfo | null }\n | { channel: typeof CHANNEL; event: \"SELECT\"; elements: ElementInfo[]; position: { x: number; y: number } }\n | { channel: typeof CHANNEL; event: \"DESELECT\" }\n | { channel: typeof CHANNEL; event: \"TEXT_EDIT\"; elementId: string; before: string; after: string; source: SourceLocation }\n | { channel: typeof CHANNEL; event: \"STYLE_COMMIT\"; elementId: string; styles: Record<string, string>; source: SourceLocation; className: string }\n | { channel: typeof CHANNEL; event: \"IMAGE_COMMIT\"; elementId: string; before: string; after: string; source: SourceLocation }\n | { channel: typeof CHANNEL; event: \"RESIZE_COMMIT\"; elementId: string; width: string; height: string; source: SourceLocation }\n | { channel: typeof CHANNEL; event: \"POSITION_UPDATE\"; elementId: string; rect: Rect }\n | { channel: typeof CHANNEL; event: \"SCROLL_START\" }\n | { channel: typeof CHANNEL; event: \"SCROLL_END\" };\n\n// State\ninterface SelectedElement {\n id: string;\n rect: Rect;\n tag: string;\n element: HTMLElement;\n}\n\ninterface InspectorState {\n active: boolean;\n hoveredId: string | null;\n hoveredRect: Rect | null;\n hoveredTag: string | null;\n selectedElements: SelectedElement[];\n isScrolling: boolean;\n isResizing: boolean;\n resizeHandle: string | null;\n}\n\ntype Action =\n | { type: \"SET_ACTIVE\"; value: boolean }\n | { type: \"SET_HOVER\"; id: string | null; rect: Rect | null; tag: string | null }\n | { type: \"ADD_SELECTED\"; selected: SelectedElement }\n | { type: \"CLEAR_SELECTIONS\" }\n | { type: \"UPDATE_SELECTED_RECTS\" }\n | { type: \"SET_SCROLLING\"; value: boolean }\n | { type: \"SET_RESIZING\"; value: boolean; handle: string | null }\n | { type: \"CLEAR_HOVER\" };\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Utilities\n// ─────────────────────────────────────────────────────────────────────────────\nconst isEmbedded = (): boolean => {\n if (Platform.OS !== \"web\" || typeof window === \"undefined\") return false;\n try {\n return window.self !== window.top;\n } catch {\n return true;\n }\n};\n\nconst emit = (() => {\n let lastPayload = \"\";\n return (msg: OutboundMessage) => {\n if (Platform.OS !== \"web\" || typeof window === \"undefined\") return;\n const json = JSON.stringify(msg);\n if (json === lastPayload) return;\n lastPayload = json;\n window.parent.postMessage(msg, \"*\");\n };\n})();\n\nconst padRect = (r: DOMRect): Rect => ({\n top: r.top - OVERLAY_PADDING,\n left: r.left - OVERLAY_PADDING,\n width: r.width + OVERLAY_PADDING * 2,\n height: r.height + OVERLAY_PADDING * 2,\n});\n\nconst parseLocation = (id: string): SourceLocation | null => {\n const parts = id.split(\":\");\n if (parts.length < 3) return null;\n const col = parseInt(parts.pop()!, 10);\n const line = parseInt(parts.pop()!, 10);\n const file = parts.join(\":\");\n if (isNaN(line) || isNaN(col)) return null;\n return { file, line, col };\n};\n\nconst normalizeStyleValue = (prop: string, val: string): string => {\n if (prop === \"backgroundColor\" && (val === \"rgba(0, 0, 0, 0)\" || val === \"transparent\")) return \"transparent\";\n if (prop === \"backgroundImage\" && val === \"none\") return \"none\";\n if (prop === \"textDecoration\" && val.includes(\"none\")) return \"none\";\n if (prop === \"fontStyle\" && val === \"normal\") return \"normal\";\n if (prop === \"opacity\" && val === \"1\") return \"1\";\n if ((prop.includes(\"padding\") || prop.includes(\"margin\")) && (val === \"0px\" || val === \"0\")) return \"0\";\n if (prop === \"borderRadius\" && val === \"0px\") return \"0\";\n if (prop === \"letterSpacing\" && (val === \"normal\" || val === \"0px\")) return \"normal\";\n if (prop === \"gap\" && (val === \"normal\" || val === \"0px\")) return \"0\";\n return val;\n};\n\nconst getComputedStyles = (el: HTMLElement): ComputedStyles => {\n const cs = window.getComputedStyle(el);\n const get = (p: string) => normalizeStyleValue(p, cs.getPropertyValue(p.replace(/([A-Z])/g, \"-$1\").toLowerCase()));\n return {\n fontSize: get(\"fontSize\"),\n color: get(\"color\"),\n fontWeight: get(\"fontWeight\"),\n fontFamily: get(\"fontFamily\"),\n fontStyle: get(\"fontStyle\"),\n textAlign: get(\"textAlign\"),\n textDecoration: get(\"textDecoration\"),\n lineHeight: get(\"lineHeight\"),\n letterSpacing: get(\"letterSpacing\"),\n backgroundColor: get(\"backgroundColor\"),\n backgroundImage: get(\"backgroundImage\"),\n borderRadius: get(\"borderRadius\"),\n opacity: get(\"opacity\"),\n padding: `${get(\"paddingTop\")} ${get(\"paddingRight\")} ${get(\"paddingBottom\")} ${get(\"paddingLeft\")}`,\n margin: `${get(\"marginTop\")} ${get(\"marginRight\")} ${get(\"marginBottom\")} ${get(\"marginLeft\")}`,\n display: get(\"display\"),\n flexDirection: get(\"flexDirection\"),\n alignItems: get(\"alignItems\"),\n justifyContent: get(\"justifyContent\"),\n gap: get(\"gap\"),\n width: get(\"width\"),\n height: get(\"height\"),\n };\n};\n\nconst canEditText = (el: HTMLElement): boolean => {\n const tag = el.tagName.toLowerCase();\n // React Native Web typically uses div for Text components\n const editableTags = [\"p\", \"h1\", \"h2\", \"h3\", \"h4\", \"h5\", \"h6\", \"span\", \"div\", \"li\", \"a\", \"button\", \"label\", \"td\", \"th\"];\n if (el.contentEditable === \"true\" || tag === \"input\" || tag === \"textarea\") return true;\n if (!editableTags.includes(tag) || !el.textContent?.trim()) return false;\n const hasDirectText = Array.from(el.childNodes).some(n => n.nodeType === Node.TEXT_NODE && n.textContent?.trim());\n return el.childElementCount === 0 || (el.childElementCount <= 1 && hasDirectText);\n};\n\nconst getDirectText = (el: HTMLElement): string => {\n let txt = \"\";\n for (const n of el.childNodes) {\n if (n.nodeType === Node.TEXT_NODE) txt += n.textContent || \"\";\n }\n return txt;\n};\n\nconst normalizeImgSrc = (src: string): string => {\n if (!src) return \"\";\n try {\n const url = new URL(src, location.origin);\n return url.href;\n } catch {\n return src;\n }\n};\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Reducer\n// ─────────────────────────────────────────────────────────────────────────────\nconst initialState: InspectorState = {\n active: false,\n hoveredId: null,\n hoveredRect: null,\n hoveredTag: null,\n selectedElements: [],\n isScrolling: false,\n isResizing: false,\n resizeHandle: null,\n};\n\nfunction reducer(state: InspectorState, action: Action): InspectorState {\n switch (action.type) {\n case \"SET_ACTIVE\":\n return { ...state, active: action.value };\n case \"SET_HOVER\":\n return { ...state, hoveredId: action.id, hoveredRect: action.rect, hoveredTag: action.tag };\n case \"ADD_SELECTED\":\n return { ...state, selectedElements: [...state.selectedElements, action.selected] };\n case \"CLEAR_SELECTIONS\":\n return { ...state, selectedElements: [] };\n case \"UPDATE_SELECTED_RECTS\":\n return {\n ...state,\n selectedElements: state.selectedElements.map((sel) => ({\n ...sel,\n rect: padRect(sel.element.getBoundingClientRect()),\n })),\n };\n case \"SET_SCROLLING\":\n return { ...state, isScrolling: action.value };\n case \"SET_RESIZING\":\n return { ...state, isResizing: action.value, resizeHandle: action.handle };\n case \"CLEAR_HOVER\":\n return { ...state, hoveredId: null, hoveredRect: null, hoveredTag: null };\n default:\n return state;\n }\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Component\n// ─────────────────────────────────────────────────────────────────────────────\nexport default function VisualInspector() {\n const [state, dispatch] = useReducer(reducer, initialState, (init) => {\n if (Platform.OS === \"web\" && typeof window !== \"undefined\") {\n try {\n const stored = localStorage.getItem(STORAGE_KEY);\n return { ...init, active: stored === \"true\" };\n } catch {\n return init;\n }\n }\n return init;\n });\n\n const activeRef = useRef(state.active);\n const selectedElRef = useRef<HTMLElement | null>(null);\n const editingElRef = useRef<HTMLElement | null>(null);\n const originalTextRef = useRef(\"\");\n const originalSrcRef = useRef(\"\");\n const appliedStylesRef = useRef<Map<string, Record<string, string>>>(new Map());\n const scrollTimeoutRef = useRef<number | null>(null);\n const resizeStartRef = useRef<{ x: number; y: number; w: number; h: number } | null>(null);\n\n // Sync active state\n useEffect(() => {\n activeRef.current = state.active;\n if (Platform.OS === \"web\" && typeof window !== \"undefined\") {\n try {\n localStorage.setItem(STORAGE_KEY, String(state.active));\n } catch {}\n }\n emit({ channel: CHANNEL, event: \"MODE_CHANGED\", active: state.active });\n }, [state.active]);\n\n // Notify parent on mount if restored\n useEffect(() => {\n if (!isEmbedded()) return;\n emit({ channel: CHANNEL, event: \"READY\" });\n if (state.active) {\n emit({ channel: CHANNEL, event: \"MODE_CHANGED\", active: true });\n }\n }, []);\n\n // Build element info\n const buildElementInfo = useCallback((el: HTMLElement): ElementInfo => {\n const id = el.getAttribute(DATA_ATTR) || \"\";\n const tag = el.getAttribute(\"data-vibex-name\") || el.tagName.toLowerCase();\n const rect = padRect(el.getBoundingClientRect());\n const editable = canEditText(el);\n const styles = getComputedStyles(el);\n const className = el.className || \"\";\n const src = el.tagName.toLowerCase() === \"img\" ? (el as HTMLImageElement).src : undefined;\n return { id, tag, rect, editable, styles, className, src };\n }, []);\n\n // Handle element click\n const handleSelect = useCallback((el: HTMLElement, clickPos: { x: number; y: number }, currentSelections: SelectedElement[]) => {\n const info = buildElementInfo(el);\n\n // Check if already selected\n if (currentSelections.some(s => s.id === info.id)) {\n return;\n }\n\n // Check selection limit\n if (currentSelections.length >= MAX_SELECTIONS) {\n return;\n }\n\n selectedElRef.current = el;\n\n const selected: SelectedElement = {\n id: info.id,\n rect: info.rect,\n tag: info.tag,\n element: el,\n };\n\n dispatch({ type: \"ADD_SELECTED\", selected });\n dispatch({ type: \"CLEAR_HOVER\" });\n\n // Get all selected elements including the new one\n const allSelected = [...currentSelections, selected];\n const allInfos = allSelected.map(s => buildElementInfo(s.element));\n\n // Persist selection\n if (Platform.OS === \"web\" && typeof window !== \"undefined\") {\n try {\n localStorage.setItem(SELECTED_KEY, JSON.stringify({ ids: allSelected.map(s => s.id) }));\n } catch {}\n }\n\n emit({ channel: CHANNEL, event: \"SELECT\", elements: allInfos, position: clickPos });\n\n // Setup editing if text editable (only for last selected)\n if (info.editable && el.contentEditable !== \"true\") {\n originalTextRef.current = el.childElementCount > 0 ? getDirectText(el) : el.innerText;\n el.contentEditable = \"true\";\n editingElRef.current = el;\n\n // Protect child elements\n el.querySelectorAll(\"*\").forEach((child) => {\n (child as HTMLElement).contentEditable = \"false\";\n });\n }\n\n // Track image src\n if (el.tagName.toLowerCase() === \"img\") {\n originalSrcRef.current = normalizeImgSrc((el as HTMLImageElement).src);\n }\n }, [buildElementInfo]);\n\n // Cleanup editing\n const cleanupEditing = useCallback(() => {\n const el = editingElRef.current;\n if (!el) return;\n\n const id = el.getAttribute(DATA_ATTR);\n if (!id) return;\n\n // Commit text changes\n const newText = el.childElementCount > 0 ? getDirectText(el) : el.innerText;\n if (newText !== originalTextRef.current) {\n const loc = parseLocation(id);\n if (loc) {\n emit({\n channel: CHANNEL,\n event: \"TEXT_EDIT\",\n elementId: id,\n before: originalTextRef.current,\n after: newText,\n source: loc,\n });\n }\n }\n\n // Commit styles\n const styles = appliedStylesRef.current.get(id);\n if (styles && Object.keys(styles).length > 0) {\n const loc = parseLocation(id);\n if (loc) {\n emit({\n channel: CHANNEL,\n event: \"STYLE_COMMIT\",\n elementId: id,\n styles,\n source: loc,\n className: el.className || \"\",\n });\n }\n appliedStylesRef.current.delete(id);\n }\n\n // Commit image changes\n if (el.tagName.toLowerCase() === \"img\") {\n const newSrc = normalizeImgSrc((el as HTMLImageElement).src);\n if (newSrc !== originalSrcRef.current && originalSrcRef.current) {\n const loc = parseLocation(id);\n if (loc) {\n emit({\n channel: CHANNEL,\n event: \"IMAGE_COMMIT\",\n elementId: id,\n before: originalSrcRef.current,\n after: newSrc,\n source: loc,\n });\n }\n }\n }\n\n // Restore element\n el.contentEditable = \"false\";\n el.querySelectorAll('[contenteditable=\"false\"]').forEach((child) => {\n (child as HTMLElement).removeAttribute(\"contenteditable\");\n });\n\n editingElRef.current = null;\n originalTextRef.current = \"\";\n originalSrcRef.current = \"\";\n }, []);\n\n // Deselect\n const handleDeselect = useCallback(() => {\n cleanupEditing();\n selectedElRef.current = null;\n dispatch({ type: \"CLEAR_SELECTIONS\" });\n if (Platform.OS === \"web\" && typeof window !== \"undefined\") {\n try {\n localStorage.removeItem(SELECTED_KEY);\n } catch {}\n }\n emit({ channel: CHANNEL, event: \"DESELECT\" });\n }, [cleanupEditing]);\n\n // Pointer move handler\n useEffect(() => {\n if (!isEmbedded()) return;\n\n const onPointerMove = (e: PointerEvent) => {\n if (!activeRef.current || state.isResizing || state.isScrolling) return;\n\n const hit = document.elementFromPoint(e.clientX, e.clientY)?.closest<HTMLElement>(`[${DATA_ATTR}]`) ?? null;\n\n if (!hit) {\n if (state.hoveredId) {\n dispatch({ type: \"SET_HOVER\", id: null, rect: null, tag: null });\n emit({ channel: CHANNEL, event: \"HOVER\", element: null });\n }\n return;\n }\n\n const id = hit.getAttribute(DATA_ATTR);\n const isSelected = state.selectedElements.some(s => s.id === id);\n if (id === state.hoveredId || isSelected) return;\n\n const info = buildElementInfo(hit);\n dispatch({ type: \"SET_HOVER\", id: info.id, rect: info.rect, tag: info.tag });\n emit({ channel: CHANNEL, event: \"HOVER\", element: info });\n };\n\n const onPointerLeave = () => {\n if (!activeRef.current) return;\n dispatch({ type: \"CLEAR_HOVER\" });\n emit({ channel: CHANNEL, event: \"HOVER\", element: null });\n };\n\n document.addEventListener(\"pointermove\", onPointerMove);\n document.addEventListener(\"pointerleave\", onPointerLeave);\n return () => {\n document.removeEventListener(\"pointermove\", onPointerMove);\n document.removeEventListener(\"pointerleave\", onPointerLeave);\n };\n }, [state.hoveredId, state.selectedElements, state.isResizing, state.isScrolling, buildElementInfo]);\n\n // Click handler\n useEffect(() => {\n if (!isEmbedded()) return;\n\n const onClick = (e: MouseEvent) => {\n if (!activeRef.current) return;\n\n const target = e.target as HTMLElement;\n\n // Prevent link navigation\n const link = target.closest(\"a\");\n if (link && !link.isContentEditable) {\n e.preventDefault();\n e.stopPropagation();\n }\n\n const hit = target.closest<HTMLElement>(`[${DATA_ATTR}]`);\n if (!hit) {\n handleDeselect();\n return;\n }\n\n const id = hit.getAttribute(DATA_ATTR);\n const isAlreadySelected = state.selectedElements.some(s => s.id === id);\n if (isAlreadySelected) return; // Already selected\n\n // Cleanup previous editing\n cleanupEditing();\n\n handleSelect(hit, { x: e.clientX, y: e.clientY }, state.selectedElements);\n };\n\n document.addEventListener(\"click\", onClick, true);\n return () => document.removeEventListener(\"click\", onClick, true);\n }, [state.selectedElements, handleSelect, handleDeselect, cleanupEditing]);\n\n // Scroll tracking\n useEffect(() => {\n if (!isEmbedded()) return;\n\n const onScroll = () => {\n if (!activeRef.current) return;\n\n if (!state.isScrolling) {\n dispatch({ type: \"SET_SCROLLING\", value: true });\n emit({ channel: CHANNEL, event: \"SCROLL_START\" });\n }\n\n if (scrollTimeoutRef.current) clearTimeout(scrollTimeoutRef.current);\n\n scrollTimeoutRef.current = window.setTimeout(() => {\n dispatch({ type: \"SET_SCROLLING\", value: false });\n emit({ channel: CHANNEL, event: \"SCROLL_END\" });\n\n // Update selected rects\n dispatch({ type: \"UPDATE_SELECTED_RECTS\" });\n }, 150);\n };\n\n window.addEventListener(\"scroll\", onScroll, true);\n return () => window.removeEventListener(\"scroll\", onScroll, true);\n }, [state.isScrolling]);\n\n // Handle inbound messages\n useEffect(() => {\n if (!isEmbedded()) return;\n\n const onMessage = (e: MessageEvent<InboundMessage>) => {\n const msg = e.data;\n if (msg?.channel !== CHANNEL) return;\n\n switch (msg.action) {\n case \"ACTIVATE\":\n dispatch({ type: \"SET_ACTIVE\", value: msg.value });\n if (!msg.value) handleDeselect();\n break;\n\n case \"SCROLL_BY\":\n window.scrollBy({ left: msg.dx, top: msg.dy, behavior: \"auto\" });\n break;\n\n case \"APPLY_STYLES\": {\n const elements = document.querySelectorAll<HTMLElement>(`[${DATA_ATTR}=\"${msg.elementId}\"]`);\n elements.forEach((el) => {\n Object.entries(msg.styles).forEach(([prop, val]) => {\n const cssProp = prop.replace(/([A-Z])/g, \"-$1\").toLowerCase();\n el.style.setProperty(cssProp, val, \"important\");\n });\n });\n // Track applied styles\n const existing = appliedStylesRef.current.get(msg.elementId) || {};\n appliedStylesRef.current.set(msg.elementId, { ...existing, ...msg.styles });\n\n // Update rects\n requestAnimationFrame(() => {\n dispatch({ type: \"UPDATE_SELECTED_RECTS\" });\n });\n break;\n }\n\n case \"APPLY_IMAGE\": {\n const img = document.querySelector<HTMLImageElement>(`[${DATA_ATTR}=\"${msg.elementId}\"]`);\n if (img?.tagName.toLowerCase() === \"img\") {\n img.removeAttribute(\"srcset\");\n img.src = msg.src;\n }\n break;\n }\n\n case \"PREVIEW_FONT\": {\n const el = document.querySelector<HTMLElement>(`[${DATA_ATTR}=\"${msg.elementId}\"]`);\n if (el) {\n // Load font\n const fontKey = msg.font.replace(/[\\s']+/g, \"+\");\n const link = document.createElement(\"link\");\n link.rel = \"stylesheet\";\n link.href = `https://fonts.googleapis.com/css2?family=${fontKey}:wght@400;500;600;700&display=swap`;\n document.head.appendChild(link);\n\n el.style.setProperty(\"font-family\", msg.font, \"important\");\n }\n break;\n }\n\n case \"CLEAR_STYLES\": {\n const el = document.querySelector<HTMLElement>(`[${DATA_ATTR}=\"${msg.elementId}\"]`);\n if (el) {\n el.removeAttribute(\"style\");\n appliedStylesRef.current.delete(msg.elementId);\n }\n break;\n }\n\n case \"RESIZE\": {\n const el = document.querySelector<HTMLElement>(`[${DATA_ATTR}=\"${msg.elementId}\"]`);\n if (el) {\n el.style.setProperty(\"width\", `${msg.width}px`, \"important\");\n el.style.setProperty(\"height\", `${msg.height}px`, \"important\");\n\n // Track\n const existing = appliedStylesRef.current.get(msg.elementId) || {};\n appliedStylesRef.current.set(msg.elementId, {\n ...existing,\n width: `${msg.width}px`,\n height: `${msg.height}px`,\n });\n\n // Update rects\n requestAnimationFrame(() => {\n dispatch({ type: \"UPDATE_SELECTED_RECTS\" });\n });\n }\n break;\n }\n\n case \"HOVER_ELEMENT\": {\n if (!msg.elementId) {\n dispatch({ type: \"CLEAR_HOVER\" });\n return;\n }\n const el = document.querySelector<HTMLElement>(`[${DATA_ATTR}=\"${msg.elementId}\"]`);\n if (el) {\n const info = buildElementInfo(el);\n dispatch({ type: \"SET_HOVER\", id: info.id, rect: info.rect, tag: info.tag });\n }\n break;\n }\n }\n };\n\n window.addEventListener(\"message\", onMessage);\n return () => window.removeEventListener(\"message\", onMessage);\n }, [handleDeselect, buildElementInfo]);\n\n // Keyboard handler\n useEffect(() => {\n if (!isEmbedded()) return;\n\n const onKeyDown = (e: KeyboardEvent) => {\n if (!activeRef.current) return;\n\n if (e.key === \"Escape\") {\n if (editingElRef.current) {\n editingElRef.current.blur();\n cleanupEditing();\n } else if (state.selectedElements.length > 0) {\n handleDeselect();\n }\n }\n };\n\n document.addEventListener(\"keydown\", onKeyDown);\n return () => document.removeEventListener(\"keydown\", onKeyDown);\n }, [state.selectedElements, cleanupEditing, handleDeselect]);\n\n // Resize handlers\n const onResizeStart = useCallback((handle: string, e: GestureResponderEvent) => {\n if (!selectedElRef.current || Platform.OS !== \"web\") return;\n\n const nativeEvent = e.nativeEvent as unknown as { pageX: number; pageY: number };\n const rect = selectedElRef.current.getBoundingClientRect();\n resizeStartRef.current = { x: nativeEvent.pageX, y: nativeEvent.pageY, w: rect.width, h: rect.height };\n dispatch({ type: \"SET_RESIZING\", value: true, handle });\n dispatch({ type: \"CLEAR_HOVER\" });\n }, []);\n\n useEffect(() => {\n if (!state.isResizing || !resizeStartRef.current || !state.resizeHandle || Platform.OS !== \"web\") return;\n\n const onMouseMove = (e: MouseEvent) => {\n if (!selectedElRef.current || !resizeStartRef.current) return;\n\n const dx = e.clientX - resizeStartRef.current.x;\n const dy = e.clientY - resizeStartRef.current.y;\n const handle = state.resizeHandle!;\n\n let w = resizeStartRef.current.w;\n let h = resizeStartRef.current.h;\n\n if (handle.includes(\"e\")) w += dx;\n if (handle.includes(\"w\")) w -= dx;\n if (handle.includes(\"s\")) h += dy;\n if (handle.includes(\"n\")) h -= dy;\n\n w = Math.max(20, w);\n h = Math.max(20, h);\n\n selectedElRef.current.style.setProperty(\"width\", `${w}px`, \"important\");\n selectedElRef.current.style.setProperty(\"height\", `${h}px`, \"important\");\n\n dispatch({ type: \"UPDATE_SELECTED_RECTS\" });\n };\n\n const onMouseUp = () => {\n if (selectedElRef.current) {\n const id = selectedElRef.current.getAttribute(DATA_ATTR);\n if (id) {\n const cs = window.getComputedStyle(selectedElRef.current);\n const loc = parseLocation(id);\n if (loc) {\n emit({\n channel: CHANNEL,\n event: \"RESIZE_COMMIT\",\n elementId: id,\n width: cs.width,\n height: cs.height,\n source: loc,\n });\n }\n }\n }\n dispatch({ type: \"SET_RESIZING\", value: false, handle: null });\n resizeStartRef.current = null;\n };\n\n document.addEventListener(\"mousemove\", onMouseMove);\n document.addEventListener(\"mouseup\", onMouseUp);\n return () => {\n document.removeEventListener(\"mousemove\", onMouseMove);\n document.removeEventListener(\"mouseup\", onMouseUp);\n };\n }, [state.isResizing, state.resizeHandle]);\n\n // Prevent navigation in edit mode\n useEffect(() => {\n if (!state.active || Platform.OS !== \"web\") return;\n\n const preventSubmit = (e: Event) => {\n e.preventDefault();\n e.stopPropagation();\n };\n\n document.addEventListener(\"submit\", preventSubmit, true);\n return () => document.removeEventListener(\"submit\", preventSubmit, true);\n }, [state.active]);\n\n // Don't render if not web, not embedded, or not active\n if (Platform.OS !== \"web\" || !state.active) return null;\n\n const resizeHandles = [\"n\", \"ne\", \"e\", \"se\", \"s\", \"sw\", \"w\", \"nw\"];\n\n const getHandleStyle = (handle: string): Record<string, number | string> => {\n const base: Record<string, number | string> = {\n position: \"absolute\",\n width: 8,\n height: 8,\n backgroundColor: \"#3b82f6\",\n borderWidth: 1,\n borderColor: \"white\",\n borderRadius: 2,\n zIndex: 10002,\n };\n\n const posMap: Record<string, Record<string, number | string>> = {\n n: { top: -4, left: \"50%\", transform: \"translateX(-50%)\", cursor: \"ns-resize\" },\n ne: { top: -4, right: -4, cursor: \"nesw-resize\" },\n e: { top: \"50%\", right: -4, transform: \"translateY(-50%)\", cursor: \"ew-resize\" },\n se: { bottom: -4, right: -4, cursor: \"nwse-resize\" },\n s: { bottom: -4, left: \"50%\", transform: \"translateX(-50%)\", cursor: \"ns-resize\" },\n sw: { bottom: -4, left: -4, cursor: \"nesw-resize\" },\n w: { top: \"50%\", left: -4, transform: \"translateY(-50%)\", cursor: \"ew-resize\" },\n nw: { top: -4, left: -4, cursor: \"nwse-resize\" },\n };\n\n return { ...base, ...posMap[handle] };\n };\n\n return (\n <View style={styles.container} pointerEvents=\"box-none\">\n {/* Hover overlay */}\n {state.hoveredRect && !state.selectedElements.some(s => s.id === state.hoveredId) && !state.isScrolling && (\n <View\n style={[\n styles.hoverOverlay,\n {\n top: state.hoveredRect.top,\n left: state.hoveredRect.left,\n width: state.hoveredRect.width,\n height: state.hoveredRect.height,\n },\n ]}\n pointerEvents=\"none\"\n >\n {state.hoveredTag && (\n <View style={styles.hoverTag}>\n <Text style={styles.hoverTagText}>{state.hoveredTag}</Text>\n </View>\n )}\n </View>\n )}\n\n {/* Selected overlays */}\n {!state.isScrolling && state.selectedElements.map((selected, index) => (\n <View\n key={selected.id}\n style={[\n styles.selectedOverlay,\n {\n top: selected.rect.top,\n left: selected.rect.left,\n width: selected.rect.width,\n height: selected.rect.height,\n zIndex: 10001 + index,\n },\n ]}\n pointerEvents=\"box-none\"\n >\n {selected.tag && (\n <View style={styles.selectedTag}>\n <Text style={styles.selectedTagText}>\n {selected.tag} ({index + 1}/{state.selectedElements.length})\n </Text>\n </View>\n )}\n\n {/* Resize handles - only show for last selected element */}\n {index === state.selectedElements.length - 1 && resizeHandles.map((handle) => (\n <View\n key={handle}\n style={getHandleStyle(handle) as any}\n onStartShouldSetResponder={() => true}\n onResponderGrant={(e) => onResizeStart(handle, e)}\n />\n ))}\n </View>\n ))}\n </View>\n );\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Styles\n// ─────────────────────────────────────────────────────────────────────────────\nconst styles = StyleSheet.create({\n container: {\n position: \"absolute\",\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n zIndex: 99999,\n },\n hoverOverlay: {\n position: \"absolute\",\n borderWidth: 2,\n borderStyle: \"dashed\",\n borderColor: \"#3b82f6\",\n backgroundColor: \"rgba(59, 130, 246, 0.08)\",\n borderRadius: 4,\n zIndex: 10000,\n },\n hoverTag: {\n position: \"absolute\",\n top: -22,\n left: 0,\n backgroundColor: \"#3b82f6\",\n paddingHorizontal: 6,\n paddingVertical: 2,\n borderRadius: 3,\n },\n hoverTagText: {\n color: \"white\",\n fontSize: 11,\n fontFamily: \"system-ui, sans-serif\",\n },\n selectedOverlay: {\n position: \"absolute\",\n borderWidth: 2,\n borderColor: \"#3b82f6\",\n backgroundColor: \"rgba(59, 130, 246, 0.04)\",\n borderRadius: 4,\n },\n selectedTag: {\n position: \"absolute\",\n top: -22,\n left: 0,\n backgroundColor: \"#3b82f6\",\n paddingHorizontal: 6,\n paddingVertical: 2,\n borderRadius: 3,\n },\n selectedTagText: {\n color: \"white\",\n fontSize: 11,\n fontWeight: \"500\",\n fontFamily: \"system-ui, sans-serif\",\n },\n});\n\nexport { VisualInspector };\n","/**\n * ErrorBoundary - React Error Boundary with integrated error reporting\n * Catches runtime errors and sends them to the parent iframe for AI debugging\n * Uses same event names as VibexObserver for Next.js compatibility\n */\n\n// React Native global\ndeclare const __DEV__: boolean;\n\nimport React, { Component, ReactNode, ErrorInfo } from \"react\";\nimport { Platform, StyleSheet, Text, View, TouchableOpacity } from \"react-native\";\n\n// ============================================================================\n// Configuration\n// ============================================================================\n\nconst ERROR_DEDUPE_WINDOW_MS = 5000;\n\n// ============================================================================\n// Types\n// ============================================================================\n\ninterface ErrorBoundaryProps {\n children: ReactNode;\n onError?: (error: Error, errorInfo: ErrorInfo) => void;\n fallback?: ReactNode;\n}\n\ninterface ErrorBoundaryState {\n hasError: boolean;\n error: Error | null;\n errorInfo: ErrorInfo | null;\n}\n\n// ============================================================================\n// Error Reporting Utilities\n// ============================================================================\n\nconst reportedErrors = new Set<string>();\n\nfunction generateFingerprint(message: string, stack?: string): string {\n const stackLine = stack?.split(\"\\\\n\")[1] || \"\";\n return `${message}: ${stackLine}`.slice(0, 200);\n}\n\nfunction shouldReport(fingerprint: string): boolean {\n if (reportedErrors.has(fingerprint)) {\n return false;\n }\n reportedErrors.add(fingerprint);\n setTimeout(() => reportedErrors.delete(fingerprint), ERROR_DEDUPE_WINDOW_MS);\n return true;\n}\n\nfunction dispatch(data: unknown): void {\n if (Platform.OS === \"web\" && typeof window !== \"undefined\" && window.parent !== window) {\n try {\n window.parent.postMessage(data, \"*\");\n } catch {\n // Parent blocked communication\n }\n } else if (Platform.OS !== \"web\") {\n try {\n const { requireOptionalNativeModule } = require(\"expo-modules-core\");\n const Bridge = requireOptionalNativeModule(\"FlexBridge\");\n Bridge?.sendMessage?.({ type: \"runtime-error\", payload: JSON.stringify(data) });\n } catch {\n // Bridge unavailable\n }\n }\n}\n\nfunction reportException(\n message: string,\n origin: \"runtime\" | \"promise\" | \"console\" | \"boundary\",\n details?: {\n stack?: string;\n file?: string;\n line?: number;\n column?: number;\n componentStack?: string;\n name?: string;\n }\n): void {\n const fingerprint = generateFingerprint(message, details?.stack);\n if (!shouldReport(fingerprint)) return;\n\n dispatch({\n type: \"VIBEX_EXCEPTION\",\n details: {\n message,\n stack: details?.stack,\n file: details?.file,\n line: details?.line,\n column: details?.column,\n componentStack: details?.componentStack,\n name: details?.name,\n origin,\n },\n capturedAt: Date.now(),\n });\n}\n\nfunction reportBoundaryError(error: Error, componentStack?: string): void {\n dispatch({\n type: \"vibex-boundary-error\",\n details: {\n message: error.message,\n stack: error.stack,\n name: error.name,\n componentStack,\n },\n capturedAt: Date.now(),\n client: Platform.OS === \"web\" && typeof navigator !== \"undefined\"\n ? navigator.userAgent\n : `react-native-${Platform.OS}`,\n });\n}\n\nfunction requestAIFix(error: Error): void {\n dispatch({\n type: \"vibex-fix-with-ai\",\n details: {\n message: error.message,\n stack: error.stack,\n name: error.name,\n },\n capturedAt: Date.now(),\n });\n}\n\nfunction setupGlobalHandlers(): void {\n if (Platform.OS !== \"web\" || typeof window === \"undefined\") return;\n\n window.addEventListener(\"error\", (evt: ErrorEvent) => {\n evt.preventDefault();\n reportException(\n evt.message || \"Unknown error\",\n \"runtime\",\n {\n stack: evt.error?.stack,\n file: evt.filename,\n line: evt.lineno,\n column: evt.colno,\n }\n );\n }, true);\n\n window.addEventListener(\"unhandledrejection\", (evt: PromiseRejectionEvent) => {\n evt.preventDefault();\n reportException(\n evt.reason?.message ?? String(evt.reason),\n \"promise\",\n { stack: evt.reason?.stack }\n );\n }, true);\n}\n\nfunction interceptConsoleErrors(): () => void {\n const original = console.error;\n\n console.error = (...args: unknown[]) => {\n original.apply(console, args);\n\n const message = args.map((a) => {\n if (a instanceof Error) return a.message;\n if (typeof a === \"object\") {\n try { return JSON.stringify(a); } catch { return String(a); }\n }\n return String(a);\n }).join(\" \");\n\n if (/error|exception|failed|crash|fatal/i.test(message)) {\n reportException(message, \"console\");\n }\n };\n\n return () => { console.error = original; };\n}\n\n// ============================================================================\n// Error Boundary Component\n// ============================================================================\n\nexport class ErrorBoundary extends Component<ErrorBoundaryProps, ErrorBoundaryState> {\n private cleanupConsole: (() => void) | null = null;\n\n constructor(props: ErrorBoundaryProps) {\n super(props);\n this.state = { hasError: false, error: null, errorInfo: null };\n }\n\n componentDidMount(): void {\n setupGlobalHandlers();\n this.cleanupConsole = interceptConsoleErrors();\n }\n\n componentWillUnmount(): void {\n this.cleanupConsole?.();\n }\n\n static getDerivedStateFromError(error: Error): Partial<ErrorBoundaryState> {\n return { hasError: true, error };\n }\n\n componentDidCatch(error: Error, errorInfo: ErrorInfo): void {\n this.setState({ errorInfo });\n\n // Report as VIBEX_EXCEPTION\n reportException(error.message, \"boundary\", {\n stack: error.stack,\n name: error.name,\n componentStack: errorInfo.componentStack || undefined,\n });\n\n // Also report as vibex-boundary-error for compatibility\n reportBoundaryError(error, errorInfo.componentStack || undefined);\n\n this.props.onError?.(error, errorInfo);\n }\n\n handleRetry = (): void => {\n this.setState({ hasError: false, error: null, errorInfo: null });\n };\n\n handleFixWithAI = (): void => {\n if (this.state.error) {\n requestAIFix(this.state.error);\n }\n };\n\n render(): ReactNode {\n if (this.state.hasError) {\n if (this.props.fallback) return this.props.fallback;\n\n const error = this.state.error;\n\n return (\n <View style={styles.container}>\n <View style={styles.card}>\n <View style={styles.accentBar} />\n <View style={styles.content}>\n {/* Header */}\n <View style={styles.header}>\n <View>\n <Text style={styles.label}>Runtime Error</Text>\n <Text style={styles.title}>{error?.name || \"Error\"}</Text>\n </View>\n </View>\n\n {/* Error message */}\n <Text style={styles.message}>\n {error?.message || \"An unexpected error occurred\"}\n </Text>\n\n {/* Actions */}\n <View style={styles.actions}>\n <TouchableOpacity style={styles.primaryButton} onPress={this.handleFixWithAI}>\n <Text style={styles.primaryButtonText}>Fix with AI</Text>\n </TouchableOpacity>\n <TouchableOpacity style={styles.secondaryButton} onPress={this.handleRetry}>\n <Text style={styles.secondaryButtonText}>Retry</Text>\n </TouchableOpacity>\n </View>\n\n {/* Stack trace in development */}\n {__DEV__ && error?.stack && (\n <View style={styles.stackContainer}>\n <Text style={styles.stackTrace}>{error.stack}</Text>\n </View>\n )}\n </View>\n </View>\n\n {/* Footer */}\n <Text style={styles.footer}>Vibex</Text>\n </View>\n );\n }\n\n return this.props.children;\n }\n}\n\n// ============================================================================\n// Styles\n// ============================================================================\n\nconst styles = StyleSheet.create({\n container: {\n flex: 1,\n backgroundColor: \"#fafafa\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: 16,\n },\n card: {\n width: \"100%\",\n maxWidth: 480,\n flexDirection: \"row\",\n borderRadius: 12,\n borderWidth: 1,\n borderColor: \"#e5e5e5\",\n backgroundColor: \"#fff\",\n overflow: \"hidden\",\n },\n accentBar: {\n width: 6,\n backgroundColor: \"#dc2626\",\n },\n content: {\n flex: 1,\n padding: 20,\n },\n header: {\n flexDirection: \"row\",\n justifyContent: \"space-between\",\n alignItems: \"flex-start\",\n marginBottom: 16,\n },\n label: {\n fontSize: 10,\n fontWeight: \"600\",\n letterSpacing: 0.5,\n textTransform: \"uppercase\",\n color: \"#737373\",\n marginBottom: 4,\n },\n title: {\n fontSize: 18,\n fontWeight: \"500\",\n color: \"#171717\",\n },\n message: {\n fontSize: 14,\n color: \"#737373\",\n lineHeight: 20,\n marginBottom: 20,\n },\n actions: {\n flexDirection: \"row\",\n alignItems: \"center\",\n gap: 12,\n },\n primaryButton: {\n backgroundColor: \"#171717\",\n paddingHorizontal: 16,\n paddingVertical: 10,\n borderRadius: 6,\n flexDirection: \"row\",\n alignItems: \"center\",\n gap: 8,\n },\n primaryButtonText: {\n color: \"#fff\",\n fontSize: 14,\n fontWeight: \"500\",\n },\n secondaryButton: {\n paddingHorizontal: 12,\n paddingVertical: 10,\n },\n secondaryButtonText: {\n color: \"#737373\",\n fontSize: 14,\n },\n stackContainer: {\n marginTop: 16,\n paddingTop: 16,\n borderTopWidth: 1,\n borderTopColor: \"#e5e5e5\",\n },\n stackTrace: {\n fontSize: 11,\n fontFamily: Platform.OS === \"ios\" ? \"Menlo\" : \"monospace\",\n color: \"#737373\",\n lineHeight: 16,\n maxHeight: 350,\n overflow: \"scroll\",\n },\n footer: {\n marginTop: 16,\n fontSize: 12,\n color: \"#a3a3a3\",\n },\n});\n\nexport default ErrorBoundary;\n","import { fileURLToPath } from 'url';\nimport { dirname, join } from 'path';\n\n// Calculate the path to the transformer file\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\n/**\n * Absolute path to the metro-transformer.js file.\n * Use this with Metro configuration.\n *\n * @example\n * ```javascript\n * const { getDefaultConfig } = require('expo/metro-config');\n * const { transformerPath } = require('@vibexdotnew/inspector/expo');\n *\n * const config = getDefaultConfig(__dirname);\n *\n * module.exports = {\n * ...config,\n * transformer: {\n * ...config.transformer,\n * babelTransformerPath: transformerPath,\n * },\n * };\n * ```\n */\nexport const transformerPath = join(__dirname, '..', '..', 'expo', 'metro-transformer.js');\n\nexport interface InspectorConfig {\n /**\n * Enable the inspector in production builds.\n * @default false\n */\n enableInProduction?: boolean;\n}\n\n/**\n * Wraps an Expo Metro config to add the Vibex Inspector transformer.\n *\n * @example\n * ```javascript\n * const { getDefaultConfig } = require('expo/metro-config');\n * const { withInspector } = require('@vibexdotnew/inspector/expo');\n *\n * const config = getDefaultConfig(__dirname);\n *\n * module.exports = withInspector(config);\n * ```\n */\nexport function withInspector<T extends { transformer?: { babelTransformerPath?: string } }>(\n metroConfig: T,\n options: InspectorConfig = {}\n): T {\n const { enableInProduction = false } = options;\n\n // Skip in production unless explicitly enabled\n if (process.env.NODE_ENV === 'production' && !enableInProduction) {\n return metroConfig;\n }\n\n return {\n ...metroConfig,\n transformer: {\n ...metroConfig.transformer,\n babelTransformerPath: transformerPath,\n },\n };\n}\n"],"mappings":"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","names":["dispatch","styles","import_react","import_react_native","import_jsx_runtime","styles"]}
|
|
1
|
+
{"version":3,"sources":["../../src/expo/index.ts","../../src/expo/components/VisualInspector.tsx","../../src/expo/components/ErrorBoundary.tsx","../../src/expo/config.ts"],"sourcesContent":["// Components\nexport { VisualInspector } from './components/VisualInspector';\nexport { ErrorBoundary } from './components/ErrorBoundary';\n\n// Config helper\nexport { withInspector, transformerPath, type InspectorConfig } from './config';\n","/**\n * VisualInspector - Visual element inspector for Expo Web\n * Enables element selection and inspection when running in an iframe\n * Communicates with parent frame for element editing capabilities\n */\n\nimport React, { useEffect, useReducer, useRef, useCallback } from \"react\";\nimport { View, Text, StyleSheet, Platform, GestureResponderEvent } from \"react-native\";\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Constants\n// ─────────────────────────────────────────────────────────────────────────────\nconst CHANNEL = \"VIBEX_INSPECTOR\" as const;\nconst STORAGE_KEY = \"vibex_inspector_active\" as const;\nconst SELECTED_KEY = \"vibex_selected_element\" as const;\nconst DATA_ATTR = \"data-vibex-loc\" as const;\nconst OVERLAY_PADDING = 4;\nconst MAX_SELECTIONS = 5;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Types\n// ─────────────────────────────────────────────────────────────────────────────\ninterface Rect {\n top: number;\n left: number;\n width: number;\n height: number;\n}\n\ninterface ElementInfo {\n id: string;\n tag: string;\n rect: Rect;\n editable: boolean;\n styles: ComputedStyles;\n className: string;\n src?: string;\n}\n\ninterface ComputedStyles {\n fontSize: string;\n color: string;\n fontWeight: string;\n fontFamily: string;\n fontStyle: string;\n textAlign: string;\n textDecoration: string;\n lineHeight: string;\n letterSpacing: string;\n backgroundColor: string;\n backgroundImage: string;\n borderRadius: string;\n opacity: string;\n padding: string;\n margin: string;\n display: string;\n flexDirection: string;\n alignItems: string;\n justifyContent: string;\n gap: string;\n width: string;\n height: string;\n}\n\ninterface SourceLocation {\n file: string;\n line: number;\n col: number;\n}\n\n// Inbound messages (from parent)\ntype InboundMessage =\n | { channel: typeof CHANNEL; action: \"ACTIVATE\"; value: boolean }\n | { channel: typeof CHANNEL; action: \"HOVER_ELEMENT\"; elementId: string | null }\n | { channel: typeof CHANNEL; action: \"SCROLL_BY\"; dx: number; dy: number }\n | { channel: typeof CHANNEL; action: \"APPLY_STYLES\"; elementId: string; styles: Record<string, string> }\n | { channel: typeof CHANNEL; action: \"APPLY_IMAGE\"; elementId: string; src: string }\n | { channel: typeof CHANNEL; action: \"PREVIEW_FONT\"; elementId: string; font: string }\n | { channel: typeof CHANNEL; action: \"CLEAR_STYLES\"; elementId: string }\n | { channel: typeof CHANNEL; action: \"RESIZE\"; elementId: string; width: number; height: number };\n\n// Outbound messages (to parent)\ntype OutboundMessage =\n | { channel: typeof CHANNEL; event: \"READY\" }\n | { channel: typeof CHANNEL; event: \"MODE_CHANGED\"; active: boolean }\n | { channel: typeof CHANNEL; event: \"HOVER\"; element: ElementInfo | null }\n | { channel: typeof CHANNEL; event: \"SELECT\"; elements: ElementInfo[]; position: { x: number; y: number } }\n | { channel: typeof CHANNEL; event: \"DESELECT\" }\n | { channel: typeof CHANNEL; event: \"TEXT_EDIT\"; elementId: string; before: string; after: string; source: SourceLocation }\n | { channel: typeof CHANNEL; event: \"STYLE_COMMIT\"; elementId: string; styles: Record<string, string>; source: SourceLocation; className: string }\n | { channel: typeof CHANNEL; event: \"IMAGE_COMMIT\"; elementId: string; before: string; after: string; source: SourceLocation }\n | { channel: typeof CHANNEL; event: \"RESIZE_COMMIT\"; elementId: string; width: string; height: string; source: SourceLocation }\n | { channel: typeof CHANNEL; event: \"POSITION_UPDATE\"; elementId: string; rect: Rect }\n | { channel: typeof CHANNEL; event: \"SCROLL_START\" }\n | { channel: typeof CHANNEL; event: \"SCROLL_END\" };\n\n// State\ninterface SelectedElement {\n id: string;\n rect: Rect;\n tag: string;\n element: HTMLElement;\n}\n\ninterface InspectorState {\n active: boolean;\n hoveredId: string | null;\n hoveredRect: Rect | null;\n hoveredTag: string | null;\n selectedElements: SelectedElement[];\n isScrolling: boolean;\n isResizing: boolean;\n resizeHandle: string | null;\n}\n\ntype Action =\n | { type: \"SET_ACTIVE\"; value: boolean }\n | { type: \"SET_HOVER\"; id: string | null; rect: Rect | null; tag: string | null }\n | { type: \"ADD_SELECTED\"; selected: SelectedElement }\n | { type: \"CLEAR_SELECTIONS\" }\n | { type: \"UPDATE_SELECTED_RECTS\" }\n | { type: \"SET_SCROLLING\"; value: boolean }\n | { type: \"SET_RESIZING\"; value: boolean; handle: string | null }\n | { type: \"CLEAR_HOVER\" };\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Utilities\n// ─────────────────────────────────────────────────────────────────────────────\nconst isEmbedded = (): boolean => {\n if (Platform.OS !== \"web\" || typeof window === \"undefined\") return false;\n try {\n return window.self !== window.top;\n } catch {\n return true;\n }\n};\n\nconst emit = (() => {\n let lastPayload = \"\";\n return (msg: OutboundMessage) => {\n if (Platform.OS !== \"web\" || typeof window === \"undefined\") return;\n const json = JSON.stringify(msg);\n if (json === lastPayload) return;\n lastPayload = json;\n window.parent.postMessage(msg, \"*\");\n };\n})();\n\nconst padRect = (r: DOMRect): Rect => ({\n top: r.top - OVERLAY_PADDING,\n left: r.left - OVERLAY_PADDING,\n width: r.width + OVERLAY_PADDING * 2,\n height: r.height + OVERLAY_PADDING * 2,\n});\n\nconst parseLocation = (id: string): SourceLocation | null => {\n const parts = id.split(\":\");\n if (parts.length < 3) return null;\n const col = parseInt(parts.pop()!, 10);\n const line = parseInt(parts.pop()!, 10);\n const file = parts.join(\":\");\n if (isNaN(line) || isNaN(col)) return null;\n return { file, line, col };\n};\n\nconst normalizeStyleValue = (prop: string, val: string): string => {\n if (prop === \"backgroundColor\" && (val === \"rgba(0, 0, 0, 0)\" || val === \"transparent\")) return \"transparent\";\n if (prop === \"backgroundImage\" && val === \"none\") return \"none\";\n if (prop === \"textDecoration\" && val.includes(\"none\")) return \"none\";\n if (prop === \"fontStyle\" && val === \"normal\") return \"normal\";\n if (prop === \"opacity\" && val === \"1\") return \"1\";\n if ((prop.includes(\"padding\") || prop.includes(\"margin\")) && (val === \"0px\" || val === \"0\")) return \"0\";\n if (prop === \"borderRadius\" && val === \"0px\") return \"0\";\n if (prop === \"letterSpacing\" && (val === \"normal\" || val === \"0px\")) return \"normal\";\n if (prop === \"gap\" && (val === \"normal\" || val === \"0px\")) return \"0\";\n return val;\n};\n\nconst getComputedStyles = (el: HTMLElement): ComputedStyles => {\n const cs = window.getComputedStyle(el);\n const get = (p: string) => normalizeStyleValue(p, cs.getPropertyValue(p.replace(/([A-Z])/g, \"-$1\").toLowerCase()));\n return {\n fontSize: get(\"fontSize\"),\n color: get(\"color\"),\n fontWeight: get(\"fontWeight\"),\n fontFamily: get(\"fontFamily\"),\n fontStyle: get(\"fontStyle\"),\n textAlign: get(\"textAlign\"),\n textDecoration: get(\"textDecoration\"),\n lineHeight: get(\"lineHeight\"),\n letterSpacing: get(\"letterSpacing\"),\n backgroundColor: get(\"backgroundColor\"),\n backgroundImage: get(\"backgroundImage\"),\n borderRadius: get(\"borderRadius\"),\n opacity: get(\"opacity\"),\n padding: `${get(\"paddingTop\")} ${get(\"paddingRight\")} ${get(\"paddingBottom\")} ${get(\"paddingLeft\")}`,\n margin: `${get(\"marginTop\")} ${get(\"marginRight\")} ${get(\"marginBottom\")} ${get(\"marginLeft\")}`,\n display: get(\"display\"),\n flexDirection: get(\"flexDirection\"),\n alignItems: get(\"alignItems\"),\n justifyContent: get(\"justifyContent\"),\n gap: get(\"gap\"),\n width: get(\"width\"),\n height: get(\"height\"),\n };\n};\n\nconst canEditText = (el: HTMLElement): boolean => {\n const tag = el.tagName.toLowerCase();\n // React Native Web typically uses div for Text components\n const editableTags = [\"p\", \"h1\", \"h2\", \"h3\", \"h4\", \"h5\", \"h6\", \"span\", \"div\", \"li\", \"a\", \"button\", \"label\", \"td\", \"th\"];\n if (el.contentEditable === \"true\" || tag === \"input\" || tag === \"textarea\") return true;\n if (!editableTags.includes(tag) || !el.textContent?.trim()) return false;\n const hasDirectText = Array.from(el.childNodes).some(n => n.nodeType === Node.TEXT_NODE && n.textContent?.trim());\n return el.childElementCount === 0 || (el.childElementCount <= 1 && hasDirectText);\n};\n\nconst getDirectText = (el: HTMLElement): string => {\n let txt = \"\";\n for (const n of el.childNodes) {\n if (n.nodeType === Node.TEXT_NODE) txt += n.textContent || \"\";\n }\n return txt;\n};\n\nconst normalizeImgSrc = (src: string): string => {\n if (!src) return \"\";\n try {\n const url = new URL(src, location.origin);\n return url.href;\n } catch {\n return src;\n }\n};\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Reducer\n// ─────────────────────────────────────────────────────────────────────────────\nconst initialState: InspectorState = {\n active: false,\n hoveredId: null,\n hoveredRect: null,\n hoveredTag: null,\n selectedElements: [],\n isScrolling: false,\n isResizing: false,\n resizeHandle: null,\n};\n\nfunction reducer(state: InspectorState, action: Action): InspectorState {\n switch (action.type) {\n case \"SET_ACTIVE\":\n return { ...state, active: action.value };\n case \"SET_HOVER\":\n return { ...state, hoveredId: action.id, hoveredRect: action.rect, hoveredTag: action.tag };\n case \"ADD_SELECTED\":\n return { ...state, selectedElements: [...state.selectedElements, action.selected] };\n case \"CLEAR_SELECTIONS\":\n return { ...state, selectedElements: [] };\n case \"UPDATE_SELECTED_RECTS\":\n return {\n ...state,\n selectedElements: state.selectedElements.map((sel) => ({\n ...sel,\n rect: padRect(sel.element.getBoundingClientRect()),\n })),\n };\n case \"SET_SCROLLING\":\n return { ...state, isScrolling: action.value };\n case \"SET_RESIZING\":\n return { ...state, isResizing: action.value, resizeHandle: action.handle };\n case \"CLEAR_HOVER\":\n return { ...state, hoveredId: null, hoveredRect: null, hoveredTag: null };\n default:\n return state;\n }\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Component\n// ─────────────────────────────────────────────────────────────────────────────\nexport default function VisualInspector() {\n const [state, dispatch] = useReducer(reducer, initialState, (init) => {\n if (Platform.OS === \"web\" && typeof window !== \"undefined\") {\n try {\n const stored = localStorage.getItem(STORAGE_KEY);\n return { ...init, active: stored === \"true\" };\n } catch {\n return init;\n }\n }\n return init;\n });\n\n const activeRef = useRef(state.active);\n const selectedElRef = useRef<HTMLElement | null>(null);\n const editingElRef = useRef<HTMLElement | null>(null);\n const originalTextRef = useRef(\"\");\n const originalSrcRef = useRef(\"\");\n const appliedStylesRef = useRef<Map<string, Record<string, string>>>(new Map());\n const scrollTimeoutRef = useRef<number | null>(null);\n const resizeStartRef = useRef<{ x: number; y: number; w: number; h: number } | null>(null);\n\n // Sync active state\n useEffect(() => {\n activeRef.current = state.active;\n if (Platform.OS === \"web\" && typeof window !== \"undefined\") {\n try {\n localStorage.setItem(STORAGE_KEY, String(state.active));\n } catch {}\n }\n emit({ channel: CHANNEL, event: \"MODE_CHANGED\", active: state.active });\n }, [state.active]);\n\n // Notify parent on mount if restored\n useEffect(() => {\n if (!isEmbedded()) return;\n emit({ channel: CHANNEL, event: \"READY\" });\n if (state.active) {\n emit({ channel: CHANNEL, event: \"MODE_CHANGED\", active: true });\n }\n }, []);\n\n // Build element info\n const buildElementInfo = useCallback((el: HTMLElement): ElementInfo => {\n const id = el.getAttribute(DATA_ATTR) || \"\";\n const tag = el.getAttribute(\"data-vibex-name\") || el.tagName.toLowerCase();\n const rect = padRect(el.getBoundingClientRect());\n const editable = canEditText(el);\n const styles = getComputedStyles(el);\n const className = el.className || \"\";\n const src = el.tagName.toLowerCase() === \"img\" ? (el as HTMLImageElement).src : undefined;\n return { id, tag, rect, editable, styles, className, src };\n }, []);\n\n // Handle element click\n const handleSelect = useCallback((el: HTMLElement, clickPos: { x: number; y: number }, currentSelections: SelectedElement[]) => {\n const info = buildElementInfo(el);\n\n // Check if already selected\n if (currentSelections.some(s => s.id === info.id)) {\n return;\n }\n\n // Check selection limit\n if (currentSelections.length >= MAX_SELECTIONS) {\n return;\n }\n\n selectedElRef.current = el;\n\n const selected: SelectedElement = {\n id: info.id,\n rect: info.rect,\n tag: info.tag,\n element: el,\n };\n\n dispatch({ type: \"ADD_SELECTED\", selected });\n dispatch({ type: \"CLEAR_HOVER\" });\n\n // Get all selected elements including the new one\n const allSelected = [...currentSelections, selected];\n const allInfos = allSelected.map(s => buildElementInfo(s.element));\n\n // Persist selection\n if (Platform.OS === \"web\" && typeof window !== \"undefined\") {\n try {\n localStorage.setItem(SELECTED_KEY, JSON.stringify({ ids: allSelected.map(s => s.id) }));\n } catch {}\n }\n\n emit({ channel: CHANNEL, event: \"SELECT\", elements: allInfos, position: clickPos });\n\n // Setup editing if text editable (only for last selected)\n if (info.editable && el.contentEditable !== \"true\") {\n originalTextRef.current = el.childElementCount > 0 ? getDirectText(el) : el.innerText;\n el.contentEditable = \"true\";\n editingElRef.current = el;\n\n // Protect child elements\n el.querySelectorAll(\"*\").forEach((child) => {\n (child as HTMLElement).contentEditable = \"false\";\n });\n }\n\n // Track image src\n if (el.tagName.toLowerCase() === \"img\") {\n originalSrcRef.current = normalizeImgSrc((el as HTMLImageElement).src);\n }\n }, [buildElementInfo]);\n\n // Cleanup editing\n const cleanupEditing = useCallback(() => {\n const el = editingElRef.current;\n if (!el) return;\n\n const id = el.getAttribute(DATA_ATTR);\n if (!id) return;\n\n // Commit text changes\n const newText = el.childElementCount > 0 ? getDirectText(el) : el.innerText;\n if (newText !== originalTextRef.current) {\n const loc = parseLocation(id);\n if (loc) {\n emit({\n channel: CHANNEL,\n event: \"TEXT_EDIT\",\n elementId: id,\n before: originalTextRef.current,\n after: newText,\n source: loc,\n });\n }\n }\n\n // Commit styles\n const styles = appliedStylesRef.current.get(id);\n if (styles && Object.keys(styles).length > 0) {\n const loc = parseLocation(id);\n if (loc) {\n emit({\n channel: CHANNEL,\n event: \"STYLE_COMMIT\",\n elementId: id,\n styles,\n source: loc,\n className: el.className || \"\",\n });\n }\n appliedStylesRef.current.delete(id);\n }\n\n // Commit image changes\n if (el.tagName.toLowerCase() === \"img\") {\n const newSrc = normalizeImgSrc((el as HTMLImageElement).src);\n if (newSrc !== originalSrcRef.current && originalSrcRef.current) {\n const loc = parseLocation(id);\n if (loc) {\n emit({\n channel: CHANNEL,\n event: \"IMAGE_COMMIT\",\n elementId: id,\n before: originalSrcRef.current,\n after: newSrc,\n source: loc,\n });\n }\n }\n }\n\n // Restore element\n el.contentEditable = \"false\";\n el.querySelectorAll('[contenteditable=\"false\"]').forEach((child) => {\n (child as HTMLElement).removeAttribute(\"contenteditable\");\n });\n\n editingElRef.current = null;\n originalTextRef.current = \"\";\n originalSrcRef.current = \"\";\n }, []);\n\n // Deselect\n const handleDeselect = useCallback(() => {\n cleanupEditing();\n selectedElRef.current = null;\n dispatch({ type: \"CLEAR_SELECTIONS\" });\n if (Platform.OS === \"web\" && typeof window !== \"undefined\") {\n try {\n localStorage.removeItem(SELECTED_KEY);\n } catch {}\n }\n emit({ channel: CHANNEL, event: \"DESELECT\" });\n }, [cleanupEditing]);\n\n // Pointer move handler\n useEffect(() => {\n if (!isEmbedded()) return;\n\n const onPointerMove = (e: PointerEvent) => {\n if (!activeRef.current || state.isResizing || state.isScrolling) return;\n\n const hit = document.elementFromPoint(e.clientX, e.clientY)?.closest<HTMLElement>(`[${DATA_ATTR}]`) ?? null;\n\n if (!hit) {\n if (state.hoveredId) {\n dispatch({ type: \"SET_HOVER\", id: null, rect: null, tag: null });\n emit({ channel: CHANNEL, event: \"HOVER\", element: null });\n }\n return;\n }\n\n const id = hit.getAttribute(DATA_ATTR);\n const isSelected = state.selectedElements.some(s => s.id === id);\n if (id === state.hoveredId || isSelected) return;\n\n const info = buildElementInfo(hit);\n dispatch({ type: \"SET_HOVER\", id: info.id, rect: info.rect, tag: info.tag });\n emit({ channel: CHANNEL, event: \"HOVER\", element: info });\n };\n\n const onPointerLeave = () => {\n if (!activeRef.current) return;\n dispatch({ type: \"CLEAR_HOVER\" });\n emit({ channel: CHANNEL, event: \"HOVER\", element: null });\n };\n\n document.addEventListener(\"pointermove\", onPointerMove);\n document.addEventListener(\"pointerleave\", onPointerLeave);\n return () => {\n document.removeEventListener(\"pointermove\", onPointerMove);\n document.removeEventListener(\"pointerleave\", onPointerLeave);\n };\n }, [state.hoveredId, state.selectedElements, state.isResizing, state.isScrolling, buildElementInfo]);\n\n // Click handler\n useEffect(() => {\n if (!isEmbedded()) return;\n\n const onClick = (e: MouseEvent) => {\n if (!activeRef.current) return;\n\n const target = e.target as HTMLElement;\n\n // Prevent link navigation\n const link = target.closest(\"a\");\n if (link && !link.isContentEditable) {\n e.preventDefault();\n e.stopPropagation();\n }\n\n const hit = target.closest<HTMLElement>(`[${DATA_ATTR}]`);\n if (!hit) {\n handleDeselect();\n return;\n }\n\n const id = hit.getAttribute(DATA_ATTR);\n const isAlreadySelected = state.selectedElements.some(s => s.id === id);\n if (isAlreadySelected) return; // Already selected\n\n // Cleanup previous editing\n cleanupEditing();\n\n handleSelect(hit, { x: e.clientX, y: e.clientY }, state.selectedElements);\n };\n\n document.addEventListener(\"click\", onClick, true);\n return () => document.removeEventListener(\"click\", onClick, true);\n }, [state.selectedElements, handleSelect, handleDeselect, cleanupEditing]);\n\n // Scroll tracking\n useEffect(() => {\n if (!isEmbedded()) return;\n\n const onScroll = () => {\n if (!activeRef.current) return;\n\n if (!state.isScrolling) {\n dispatch({ type: \"SET_SCROLLING\", value: true });\n emit({ channel: CHANNEL, event: \"SCROLL_START\" });\n }\n\n if (scrollTimeoutRef.current) clearTimeout(scrollTimeoutRef.current);\n\n scrollTimeoutRef.current = window.setTimeout(() => {\n dispatch({ type: \"SET_SCROLLING\", value: false });\n emit({ channel: CHANNEL, event: \"SCROLL_END\" });\n\n // Update selected rects\n dispatch({ type: \"UPDATE_SELECTED_RECTS\" });\n }, 150);\n };\n\n window.addEventListener(\"scroll\", onScroll, true);\n return () => window.removeEventListener(\"scroll\", onScroll, true);\n }, [state.isScrolling]);\n\n // Handle inbound messages\n useEffect(() => {\n if (!isEmbedded()) return;\n\n const onMessage = (e: MessageEvent<InboundMessage>) => {\n const msg = e.data;\n if (msg?.channel !== CHANNEL) return;\n\n switch (msg.action) {\n case \"ACTIVATE\":\n dispatch({ type: \"SET_ACTIVE\", value: msg.value });\n if (!msg.value) handleDeselect();\n break;\n\n case \"SCROLL_BY\":\n window.scrollBy({ left: msg.dx, top: msg.dy, behavior: \"auto\" });\n break;\n\n case \"APPLY_STYLES\": {\n const elements = document.querySelectorAll<HTMLElement>(`[${DATA_ATTR}=\"${msg.elementId}\"]`);\n elements.forEach((el) => {\n Object.entries(msg.styles).forEach(([prop, val]) => {\n const cssProp = prop.replace(/([A-Z])/g, \"-$1\").toLowerCase();\n el.style.setProperty(cssProp, val, \"important\");\n });\n });\n // Track applied styles\n const existing = appliedStylesRef.current.get(msg.elementId) || {};\n appliedStylesRef.current.set(msg.elementId, { ...existing, ...msg.styles });\n\n // Update rects\n requestAnimationFrame(() => {\n dispatch({ type: \"UPDATE_SELECTED_RECTS\" });\n });\n break;\n }\n\n case \"APPLY_IMAGE\": {\n const img = document.querySelector<HTMLImageElement>(`[${DATA_ATTR}=\"${msg.elementId}\"]`);\n if (img?.tagName.toLowerCase() === \"img\") {\n img.removeAttribute(\"srcset\");\n img.src = msg.src;\n }\n break;\n }\n\n case \"PREVIEW_FONT\": {\n const el = document.querySelector<HTMLElement>(`[${DATA_ATTR}=\"${msg.elementId}\"]`);\n if (el) {\n // Load font\n const fontKey = msg.font.replace(/[\\s']+/g, \"+\");\n const link = document.createElement(\"link\");\n link.rel = \"stylesheet\";\n link.href = `https://fonts.googleapis.com/css2?family=${fontKey}:wght@400;500;600;700&display=swap`;\n document.head.appendChild(link);\n\n el.style.setProperty(\"font-family\", msg.font, \"important\");\n }\n break;\n }\n\n case \"CLEAR_STYLES\": {\n const el = document.querySelector<HTMLElement>(`[${DATA_ATTR}=\"${msg.elementId}\"]`);\n if (el) {\n el.removeAttribute(\"style\");\n appliedStylesRef.current.delete(msg.elementId);\n }\n break;\n }\n\n case \"RESIZE\": {\n const el = document.querySelector<HTMLElement>(`[${DATA_ATTR}=\"${msg.elementId}\"]`);\n if (el) {\n el.style.setProperty(\"width\", `${msg.width}px`, \"important\");\n el.style.setProperty(\"height\", `${msg.height}px`, \"important\");\n\n // Track\n const existing = appliedStylesRef.current.get(msg.elementId) || {};\n appliedStylesRef.current.set(msg.elementId, {\n ...existing,\n width: `${msg.width}px`,\n height: `${msg.height}px`,\n });\n\n // Update rects\n requestAnimationFrame(() => {\n dispatch({ type: \"UPDATE_SELECTED_RECTS\" });\n });\n }\n break;\n }\n\n case \"HOVER_ELEMENT\": {\n if (!msg.elementId) {\n dispatch({ type: \"CLEAR_HOVER\" });\n return;\n }\n const el = document.querySelector<HTMLElement>(`[${DATA_ATTR}=\"${msg.elementId}\"]`);\n if (el) {\n const info = buildElementInfo(el);\n dispatch({ type: \"SET_HOVER\", id: info.id, rect: info.rect, tag: info.tag });\n }\n break;\n }\n }\n };\n\n window.addEventListener(\"message\", onMessage);\n return () => window.removeEventListener(\"message\", onMessage);\n }, [handleDeselect, buildElementInfo]);\n\n // Keyboard handler\n useEffect(() => {\n if (!isEmbedded()) return;\n\n const onKeyDown = (e: KeyboardEvent) => {\n if (!activeRef.current) return;\n\n if (e.key === \"Escape\") {\n if (editingElRef.current) {\n editingElRef.current.blur();\n cleanupEditing();\n } else if (state.selectedElements.length > 0) {\n handleDeselect();\n }\n }\n };\n\n document.addEventListener(\"keydown\", onKeyDown);\n return () => document.removeEventListener(\"keydown\", onKeyDown);\n }, [state.selectedElements, cleanupEditing, handleDeselect]);\n\n // Resize handlers\n const onResizeStart = useCallback((handle: string, e: GestureResponderEvent) => {\n if (!selectedElRef.current || Platform.OS !== \"web\") return;\n\n const nativeEvent = e.nativeEvent as unknown as { pageX: number; pageY: number };\n const rect = selectedElRef.current.getBoundingClientRect();\n resizeStartRef.current = { x: nativeEvent.pageX, y: nativeEvent.pageY, w: rect.width, h: rect.height };\n dispatch({ type: \"SET_RESIZING\", value: true, handle });\n dispatch({ type: \"CLEAR_HOVER\" });\n }, []);\n\n useEffect(() => {\n if (!state.isResizing || !resizeStartRef.current || !state.resizeHandle || Platform.OS !== \"web\") return;\n\n const onMouseMove = (e: MouseEvent) => {\n if (!selectedElRef.current || !resizeStartRef.current) return;\n\n const dx = e.clientX - resizeStartRef.current.x;\n const dy = e.clientY - resizeStartRef.current.y;\n const handle = state.resizeHandle!;\n\n let w = resizeStartRef.current.w;\n let h = resizeStartRef.current.h;\n\n if (handle.includes(\"e\")) w += dx;\n if (handle.includes(\"w\")) w -= dx;\n if (handle.includes(\"s\")) h += dy;\n if (handle.includes(\"n\")) h -= dy;\n\n w = Math.max(20, w);\n h = Math.max(20, h);\n\n selectedElRef.current.style.setProperty(\"width\", `${w}px`, \"important\");\n selectedElRef.current.style.setProperty(\"height\", `${h}px`, \"important\");\n\n dispatch({ type: \"UPDATE_SELECTED_RECTS\" });\n };\n\n const onMouseUp = () => {\n if (selectedElRef.current) {\n const id = selectedElRef.current.getAttribute(DATA_ATTR);\n if (id) {\n const cs = window.getComputedStyle(selectedElRef.current);\n const loc = parseLocation(id);\n if (loc) {\n emit({\n channel: CHANNEL,\n event: \"RESIZE_COMMIT\",\n elementId: id,\n width: cs.width,\n height: cs.height,\n source: loc,\n });\n }\n }\n }\n dispatch({ type: \"SET_RESIZING\", value: false, handle: null });\n resizeStartRef.current = null;\n };\n\n document.addEventListener(\"mousemove\", onMouseMove);\n document.addEventListener(\"mouseup\", onMouseUp);\n return () => {\n document.removeEventListener(\"mousemove\", onMouseMove);\n document.removeEventListener(\"mouseup\", onMouseUp);\n };\n }, [state.isResizing, state.resizeHandle]);\n\n // Prevent navigation in edit mode\n useEffect(() => {\n if (!state.active || Platform.OS !== \"web\") return;\n\n const preventSubmit = (e: Event) => {\n e.preventDefault();\n e.stopPropagation();\n };\n\n document.addEventListener(\"submit\", preventSubmit, true);\n return () => document.removeEventListener(\"submit\", preventSubmit, true);\n }, [state.active]);\n\n // Don't render if not web, not embedded, or not active\n if (Platform.OS !== \"web\" || !state.active) return null;\n\n const resizeHandles = [\"n\", \"ne\", \"e\", \"se\", \"s\", \"sw\", \"w\", \"nw\"];\n\n const getHandleStyle = (handle: string): Record<string, number | string> => {\n const base: Record<string, number | string> = {\n position: \"absolute\",\n width: 8,\n height: 8,\n backgroundColor: \"#3b82f6\",\n borderWidth: 1,\n borderColor: \"white\",\n borderRadius: 2,\n zIndex: 10002,\n };\n\n const posMap: Record<string, Record<string, number | string>> = {\n n: { top: -4, left: \"50%\", transform: \"translateX(-50%)\", cursor: \"ns-resize\" },\n ne: { top: -4, right: -4, cursor: \"nesw-resize\" },\n e: { top: \"50%\", right: -4, transform: \"translateY(-50%)\", cursor: \"ew-resize\" },\n se: { bottom: -4, right: -4, cursor: \"nwse-resize\" },\n s: { bottom: -4, left: \"50%\", transform: \"translateX(-50%)\", cursor: \"ns-resize\" },\n sw: { bottom: -4, left: -4, cursor: \"nesw-resize\" },\n w: { top: \"50%\", left: -4, transform: \"translateY(-50%)\", cursor: \"ew-resize\" },\n nw: { top: -4, left: -4, cursor: \"nwse-resize\" },\n };\n\n return { ...base, ...posMap[handle] };\n };\n\n return (\n <View style={styles.container} pointerEvents=\"box-none\">\n {/* Hover overlay */}\n {state.hoveredRect && !state.selectedElements.some(s => s.id === state.hoveredId) && !state.isScrolling && (\n <View\n style={[\n styles.hoverOverlay,\n {\n top: state.hoveredRect.top,\n left: state.hoveredRect.left,\n width: state.hoveredRect.width,\n height: state.hoveredRect.height,\n },\n ]}\n pointerEvents=\"none\"\n >\n {state.hoveredTag && (\n <View style={styles.hoverTag}>\n <Text style={styles.hoverTagText}>{state.hoveredTag}</Text>\n </View>\n )}\n </View>\n )}\n\n {/* Selected overlays */}\n {!state.isScrolling && state.selectedElements.map((selected, index) => (\n <View\n key={selected.id}\n style={[\n styles.selectedOverlay,\n {\n top: selected.rect.top,\n left: selected.rect.left,\n width: selected.rect.width,\n height: selected.rect.height,\n zIndex: 10001 + index,\n },\n ]}\n pointerEvents=\"box-none\"\n >\n {selected.tag && (\n <View style={styles.selectedTag}>\n <Text style={styles.selectedTagText}>\n {selected.tag} ({index + 1}/{state.selectedElements.length})\n </Text>\n </View>\n )}\n\n {/* Resize handles - only show for last selected element */}\n {index === state.selectedElements.length - 1 && resizeHandles.map((handle) => (\n <View\n key={handle}\n style={getHandleStyle(handle) as any}\n onStartShouldSetResponder={() => true}\n onResponderGrant={(e) => onResizeStart(handle, e)}\n />\n ))}\n </View>\n ))}\n </View>\n );\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Styles\n// ─────────────────────────────────────────────────────────────────────────────\nconst styles = StyleSheet.create({\n container: {\n position: \"absolute\",\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n zIndex: 99999,\n },\n hoverOverlay: {\n position: \"absolute\",\n borderWidth: 2,\n borderStyle: \"dashed\",\n borderColor: \"#3b82f6\",\n backgroundColor: \"rgba(59, 130, 246, 0.08)\",\n borderRadius: 4,\n zIndex: 10000,\n },\n hoverTag: {\n position: \"absolute\",\n top: -22,\n left: 0,\n backgroundColor: \"#3b82f6\",\n paddingHorizontal: 6,\n paddingVertical: 2,\n borderRadius: 3,\n },\n hoverTagText: {\n color: \"white\",\n fontSize: 11,\n fontFamily: \"system-ui, sans-serif\",\n },\n selectedOverlay: {\n position: \"absolute\",\n borderWidth: 2,\n borderColor: \"#3b82f6\",\n backgroundColor: \"rgba(59, 130, 246, 0.04)\",\n borderRadius: 4,\n },\n selectedTag: {\n position: \"absolute\",\n top: -22,\n left: 0,\n backgroundColor: \"#3b82f6\",\n paddingHorizontal: 6,\n paddingVertical: 2,\n borderRadius: 3,\n },\n selectedTagText: {\n color: \"white\",\n fontSize: 11,\n fontWeight: \"500\",\n fontFamily: \"system-ui, sans-serif\",\n },\n});\n\nexport { VisualInspector };\n","/**\n * ErrorBoundary - React Error Boundary with integrated error reporting\n * Catches runtime errors and sends them to the parent iframe for AI debugging\n * Uses same event names as VibexObserver for Next.js compatibility\n */\n\n// React Native global\ndeclare const __DEV__: boolean;\n\nimport React, { Component, ReactNode, ErrorInfo } from \"react\";\nimport { Platform, StyleSheet, Text, View, TouchableOpacity } from \"react-native\";\n\n// ============================================================================\n// Configuration\n// ============================================================================\n\nconst ERROR_DEDUPE_WINDOW_MS = 5000;\n\n// ============================================================================\n// Types\n// ============================================================================\n\ninterface ErrorBoundaryProps {\n children: ReactNode;\n onError?: (error: Error, errorInfo: ErrorInfo) => void;\n fallback?: ReactNode;\n}\n\ninterface ErrorBoundaryState {\n hasError: boolean;\n error: Error | null;\n errorInfo: ErrorInfo | null;\n}\n\n// ============================================================================\n// Error Reporting Utilities\n// ============================================================================\n\nconst reportedErrors = new Set<string>();\n\nfunction generateFingerprint(message: string, stack?: string): string {\n const stackLine = stack?.split(\"\\\\n\")[1] || \"\";\n return `${message}: ${stackLine}`.slice(0, 200);\n}\n\nfunction shouldReport(fingerprint: string): boolean {\n if (reportedErrors.has(fingerprint)) {\n return false;\n }\n reportedErrors.add(fingerprint);\n setTimeout(() => reportedErrors.delete(fingerprint), ERROR_DEDUPE_WINDOW_MS);\n return true;\n}\n\nfunction dispatch(data: unknown): void {\n if (Platform.OS === \"web\" && typeof window !== \"undefined\" && window.parent !== window) {\n try {\n window.parent.postMessage(data, \"*\");\n } catch {\n // Parent blocked communication\n }\n } else if (Platform.OS !== \"web\") {\n try {\n const { requireOptionalNativeModule } = require(\"expo-modules-core\");\n const Bridge = requireOptionalNativeModule(\"FlexBridge\");\n Bridge?.sendMessage?.({ type: \"runtime-error\", payload: JSON.stringify(data) });\n } catch {\n // Bridge unavailable\n }\n }\n}\n\nfunction reportException(\n message: string,\n origin: \"runtime\" | \"promise\" | \"console\" | \"boundary\",\n details?: {\n stack?: string;\n file?: string;\n line?: number;\n column?: number;\n componentStack?: string;\n name?: string;\n }\n): void {\n const fingerprint = generateFingerprint(message, details?.stack);\n if (!shouldReport(fingerprint)) return;\n\n dispatch({\n type: \"VIBEX_EXCEPTION\",\n details: {\n message,\n stack: details?.stack,\n file: details?.file,\n line: details?.line,\n column: details?.column,\n componentStack: details?.componentStack,\n name: details?.name,\n origin,\n },\n capturedAt: Date.now(),\n });\n}\n\nfunction reportBoundaryError(error: Error, componentStack?: string): void {\n dispatch({\n type: \"vibex-boundary-error\",\n details: {\n message: error.message,\n stack: error.stack,\n name: error.name,\n componentStack,\n },\n capturedAt: Date.now(),\n client: Platform.OS === \"web\" && typeof navigator !== \"undefined\"\n ? navigator.userAgent\n : `react-native-${Platform.OS}`,\n });\n}\n\nfunction requestAIFix(error: Error): void {\n dispatch({\n type: \"vibex-fix-with-ai\",\n details: {\n message: error.message,\n stack: error.stack,\n name: error.name,\n },\n capturedAt: Date.now(),\n });\n}\n\nfunction setupGlobalHandlers(): void {\n if (Platform.OS !== \"web\" || typeof window === \"undefined\") return;\n\n window.addEventListener(\"error\", (evt: ErrorEvent) => {\n evt.preventDefault();\n reportException(\n evt.message || \"Unknown error\",\n \"runtime\",\n {\n stack: evt.error?.stack,\n file: evt.filename,\n line: evt.lineno,\n column: evt.colno,\n }\n );\n }, true);\n\n window.addEventListener(\"unhandledrejection\", (evt: PromiseRejectionEvent) => {\n evt.preventDefault();\n reportException(\n evt.reason?.message ?? String(evt.reason),\n \"promise\",\n { stack: evt.reason?.stack }\n );\n }, true);\n}\n\nfunction interceptConsoleErrors(): () => void {\n const original = console.error;\n\n console.error = (...args: unknown[]) => {\n original.apply(console, args);\n\n const message = args.map((a) => {\n if (a instanceof Error) return a.message;\n if (typeof a === \"object\") {\n try { return JSON.stringify(a); } catch { return String(a); }\n }\n return String(a);\n }).join(\" \");\n\n if (/error|exception|failed|crash|fatal/i.test(message)) {\n reportException(message, \"console\");\n }\n };\n\n return () => { console.error = original; };\n}\n\n// ============================================================================\n// Error Boundary Component\n// ============================================================================\n\nexport class ErrorBoundary extends Component<ErrorBoundaryProps, ErrorBoundaryState> {\n private cleanupConsole: (() => void) | null = null;\n\n constructor(props: ErrorBoundaryProps) {\n super(props);\n this.state = { hasError: false, error: null, errorInfo: null };\n }\n\n componentDidMount(): void {\n setupGlobalHandlers();\n this.cleanupConsole = interceptConsoleErrors();\n }\n\n componentWillUnmount(): void {\n this.cleanupConsole?.();\n }\n\n static getDerivedStateFromError(error: Error): Partial<ErrorBoundaryState> {\n return { hasError: true, error };\n }\n\n componentDidCatch(error: Error, errorInfo: ErrorInfo): void {\n this.setState({ errorInfo });\n\n // Report as VIBEX_EXCEPTION\n reportException(error.message, \"boundary\", {\n stack: error.stack,\n name: error.name,\n componentStack: errorInfo.componentStack || undefined,\n });\n\n // Also report as vibex-boundary-error for compatibility\n reportBoundaryError(error, errorInfo.componentStack || undefined);\n\n this.props.onError?.(error, errorInfo);\n }\n\n handleRetry = (): void => {\n this.setState({ hasError: false, error: null, errorInfo: null });\n };\n\n handleFixWithAI = (): void => {\n if (this.state.error) {\n requestAIFix(this.state.error);\n }\n };\n\n render(): ReactNode {\n if (this.state.hasError) {\n if (this.props.fallback) return this.props.fallback;\n\n const error = this.state.error;\n\n return (\n <View style={styles.container}>\n <View style={styles.card}>\n <View style={styles.accentBar} />\n <View style={styles.content}>\n {/* Header */}\n <View style={styles.header}>\n <View>\n <Text style={styles.label}>Runtime Error</Text>\n <Text style={styles.title}>{error?.name || \"Error\"}</Text>\n </View>\n </View>\n\n {/* Error message */}\n <Text style={styles.message}>\n {error?.message || \"An unexpected error occurred\"}\n </Text>\n\n {/* Actions */}\n <View style={styles.actions}>\n <TouchableOpacity style={styles.primaryButton} onPress={this.handleFixWithAI}>\n <Text style={styles.primaryButtonText}>Fix with AI</Text>\n </TouchableOpacity>\n <TouchableOpacity style={styles.secondaryButton} onPress={this.handleRetry}>\n <Text style={styles.secondaryButtonText}>Retry</Text>\n </TouchableOpacity>\n </View>\n\n {/* Stack trace in development */}\n {__DEV__ && error?.stack && (\n <View style={styles.stackContainer}>\n <Text style={styles.stackTrace}>{error.stack}</Text>\n </View>\n )}\n </View>\n </View>\n\n {/* Footer */}\n <Text style={styles.footer}>Vibex</Text>\n </View>\n );\n }\n\n return this.props.children;\n }\n}\n\n// ============================================================================\n// Styles\n// ============================================================================\n\nconst styles = StyleSheet.create({\n container: {\n flex: 1,\n backgroundColor: \"#fafafa\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: 16,\n },\n card: {\n width: \"100%\",\n maxWidth: 480,\n flexDirection: \"row\",\n borderRadius: 12,\n borderWidth: 1,\n borderColor: \"#e5e5e5\",\n backgroundColor: \"#fff\",\n overflow: \"hidden\",\n },\n accentBar: {\n width: 6,\n backgroundColor: \"#dc2626\",\n },\n content: {\n flex: 1,\n padding: 20,\n },\n header: {\n flexDirection: \"row\",\n justifyContent: \"space-between\",\n alignItems: \"flex-start\",\n marginBottom: 16,\n },\n label: {\n fontSize: 10,\n fontWeight: \"600\",\n letterSpacing: 0.5,\n textTransform: \"uppercase\",\n color: \"#737373\",\n marginBottom: 4,\n },\n title: {\n fontSize: 18,\n fontWeight: \"500\",\n color: \"#171717\",\n },\n message: {\n fontSize: 14,\n color: \"#737373\",\n lineHeight: 20,\n marginBottom: 20,\n },\n actions: {\n flexDirection: \"row\",\n alignItems: \"center\",\n gap: 12,\n },\n primaryButton: {\n backgroundColor: \"#171717\",\n paddingHorizontal: 16,\n paddingVertical: 10,\n borderRadius: 6,\n flexDirection: \"row\",\n alignItems: \"center\",\n gap: 8,\n },\n primaryButtonText: {\n color: \"#fff\",\n fontSize: 14,\n fontWeight: \"500\",\n },\n secondaryButton: {\n paddingHorizontal: 12,\n paddingVertical: 10,\n },\n secondaryButtonText: {\n color: \"#737373\",\n fontSize: 14,\n },\n stackContainer: {\n marginTop: 16,\n paddingTop: 16,\n borderTopWidth: 1,\n borderTopColor: \"#e5e5e5\",\n },\n stackTrace: {\n fontSize: 11,\n fontFamily: Platform.OS === \"ios\" ? \"Menlo\" : \"monospace\",\n color: \"#737373\",\n lineHeight: 16,\n maxHeight: 350,\n overflow: \"scroll\",\n },\n footer: {\n marginTop: 16,\n fontSize: 12,\n color: \"#a3a3a3\",\n },\n});\n\nexport default ErrorBoundary;\n","import { dirname, join } from 'path';\n\n/**\n * Resolves the transformer path in both CJS and ESM environments\n */\nfunction resolveTransformerPath(): string {\n try {\n // CJS: use require.resolve to find our own package\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const pkgPath = require.resolve('@vibexdotnew/inspector/package.json');\n return join(dirname(pkgPath), 'expo', 'metro-transformer.cjs');\n } catch {\n // ESM fallback: use import.meta.url\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const { fileURLToPath } = require('url');\n const currentDir = dirname(fileURLToPath(import.meta.url));\n return join(currentDir, '..', '..', 'expo', 'metro-transformer.cjs');\n }\n}\n\n/**\n * Absolute path to the metro-transformer.js file.\n * Use this with Metro configuration.\n *\n * @example\n * ```javascript\n * const { getDefaultConfig } = require('expo/metro-config');\n * const { transformerPath } = require('@vibexdotnew/inspector/expo');\n *\n * const config = getDefaultConfig(__dirname);\n *\n * module.exports = {\n * ...config,\n * transformer: {\n * ...config.transformer,\n * babelTransformerPath: transformerPath,\n * },\n * };\n * ```\n */\nexport const transformerPath = resolveTransformerPath();\n\nexport interface InspectorConfig {\n /**\n * Enable the inspector in production builds.\n * @default false\n */\n enableInProduction?: boolean;\n}\n\n/**\n * Wraps an Expo Metro config to add the Vibex Inspector transformer.\n *\n * @example\n * ```javascript\n * const { getDefaultConfig } = require('expo/metro-config');\n * const { withInspector } = require('@vibexdotnew/inspector/expo');\n *\n * const config = getDefaultConfig(__dirname);\n *\n * module.exports = withInspector(config);\n * ```\n */\nexport function withInspector<T extends { transformer?: { babelTransformerPath?: string } }>(\n metroConfig: T,\n options: InspectorConfig = {}\n): T {\n const { enableInProduction = false } = options;\n\n // Skip in production unless explicitly enabled\n if (process.env.NODE_ENV === 'production' && !enableInProduction) {\n return metroConfig;\n }\n\n return {\n ...metroConfig,\n transformer: {\n ...metroConfig.transformer,\n babelTransformerPath: transformerPath,\n },\n };\n}\n"],"mappings":"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","names":["dispatch","styles","import_react","import_react_native","import_jsx_runtime","styles"]}
|
package/dist/expo/index.js
CHANGED
|
@@ -967,11 +967,18 @@ var styles2 = StyleSheet2.create({
|
|
|
967
967
|
});
|
|
968
968
|
|
|
969
969
|
// src/expo/config.ts
|
|
970
|
-
import { fileURLToPath } from "url";
|
|
971
970
|
import { dirname, join } from "path";
|
|
972
|
-
|
|
973
|
-
|
|
974
|
-
|
|
971
|
+
function resolveTransformerPath() {
|
|
972
|
+
try {
|
|
973
|
+
const pkgPath = __require.resolve("@vibexdotnew/inspector/package.json");
|
|
974
|
+
return join(dirname(pkgPath), "expo", "metro-transformer.cjs");
|
|
975
|
+
} catch {
|
|
976
|
+
const { fileURLToPath } = __require("url");
|
|
977
|
+
const currentDir = dirname(fileURLToPath(import.meta.url));
|
|
978
|
+
return join(currentDir, "..", "..", "expo", "metro-transformer.cjs");
|
|
979
|
+
}
|
|
980
|
+
}
|
|
981
|
+
var transformerPath = resolveTransformerPath();
|
|
975
982
|
function withInspector(metroConfig, options = {}) {
|
|
976
983
|
const { enableInProduction = false } = options;
|
|
977
984
|
if (process.env.NODE_ENV === "production" && !enableInProduction) {
|