@vibexdotnew/inspector 0.0.4 → 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 +2 -2
- package/dist/expo/config.cjs.map +1 -1
- package/dist/expo/config.js +2 -2
- package/dist/expo/config.js.map +1 -1
- package/dist/expo/index.cjs +2 -2
- package/dist/expo/index.cjs.map +1 -1
- package/dist/expo/index.js +2 -2
- package/dist/expo/index.js.map +1 -1
- package/dist/next/index.cjs +2 -2
- package/dist/next/index.cjs.map +1 -1
- package/dist/next/index.js +2 -2
- package/dist/next/index.js.map +1 -1
- package/dist/next/loader.cjs +2 -2
- package/dist/next/loader.cjs.map +1 -1
- package/dist/next/loader.js +2 -2
- package/dist/next/loader.js.map +1 -1
- package/package.json +3 -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
|
@@ -40,11 +40,11 @@ var import_meta = {};
|
|
|
40
40
|
function resolveTransformerPath() {
|
|
41
41
|
try {
|
|
42
42
|
const pkgPath = require.resolve("@vibexdotnew/inspector/package.json");
|
|
43
|
-
return (0, import_path.join)((0, import_path.dirname)(pkgPath), "expo", "metro-transformer.
|
|
43
|
+
return (0, import_path.join)((0, import_path.dirname)(pkgPath), "expo", "metro-transformer.cjs");
|
|
44
44
|
} catch {
|
|
45
45
|
const { fileURLToPath } = require("url");
|
|
46
46
|
const currentDir = (0, import_path.dirname)(fileURLToPath(import_meta.url));
|
|
47
|
-
return (0, import_path.join)(currentDir, "..", "..", "expo", "metro-transformer.
|
|
47
|
+
return (0, import_path.join)(currentDir, "..", "..", "expo", "metro-transformer.cjs");
|
|
48
48
|
}
|
|
49
49
|
}
|
|
50
50
|
var transformerPath = resolveTransformerPath();
|
package/dist/expo/config.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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.
|
|
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
|
@@ -11,11 +11,11 @@ import { dirname, join } from "path";
|
|
|
11
11
|
function resolveTransformerPath() {
|
|
12
12
|
try {
|
|
13
13
|
const pkgPath = __require.resolve("@vibexdotnew/inspector/package.json");
|
|
14
|
-
return join(dirname(pkgPath), "expo", "metro-transformer.
|
|
14
|
+
return join(dirname(pkgPath), "expo", "metro-transformer.cjs");
|
|
15
15
|
} catch {
|
|
16
16
|
const { fileURLToPath } = __require("url");
|
|
17
17
|
const currentDir = dirname(fileURLToPath(import.meta.url));
|
|
18
|
-
return join(currentDir, "..", "..", "expo", "metro-transformer.
|
|
18
|
+
return join(currentDir, "..", "..", "expo", "metro-transformer.cjs");
|
|
19
19
|
}
|
|
20
20
|
}
|
|
21
21
|
var transformerPath = resolveTransformerPath();
|
package/dist/expo/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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.
|
|
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
|
@@ -1004,11 +1004,11 @@ var import_meta = {};
|
|
|
1004
1004
|
function resolveTransformerPath() {
|
|
1005
1005
|
try {
|
|
1006
1006
|
const pkgPath = require.resolve("@vibexdotnew/inspector/package.json");
|
|
1007
|
-
return (0, import_path.join)((0, import_path.dirname)(pkgPath), "expo", "metro-transformer.
|
|
1007
|
+
return (0, import_path.join)((0, import_path.dirname)(pkgPath), "expo", "metro-transformer.cjs");
|
|
1008
1008
|
} catch {
|
|
1009
1009
|
const { fileURLToPath } = require("url");
|
|
1010
1010
|
const currentDir = (0, import_path.dirname)(fileURLToPath(import_meta.url));
|
|
1011
|
-
return (0, import_path.join)(currentDir, "..", "..", "expo", "metro-transformer.
|
|
1011
|
+
return (0, import_path.join)(currentDir, "..", "..", "expo", "metro-transformer.cjs");
|
|
1012
1012
|
}
|
|
1013
1013
|
}
|
|
1014
1014
|
var transformerPath = resolveTransformerPath();
|
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 { 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.js');\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.js');\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"]}
|
|
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
|
@@ -971,11 +971,11 @@ import { dirname, join } from "path";
|
|
|
971
971
|
function resolveTransformerPath() {
|
|
972
972
|
try {
|
|
973
973
|
const pkgPath = __require.resolve("@vibexdotnew/inspector/package.json");
|
|
974
|
-
return join(dirname(pkgPath), "expo", "metro-transformer.
|
|
974
|
+
return join(dirname(pkgPath), "expo", "metro-transformer.cjs");
|
|
975
975
|
} catch {
|
|
976
976
|
const { fileURLToPath } = __require("url");
|
|
977
977
|
const currentDir = dirname(fileURLToPath(import.meta.url));
|
|
978
|
-
return join(currentDir, "..", "..", "expo", "metro-transformer.
|
|
978
|
+
return join(currentDir, "..", "..", "expo", "metro-transformer.cjs");
|
|
979
979
|
}
|
|
980
980
|
}
|
|
981
981
|
var transformerPath = resolveTransformerPath();
|