@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.
@@ -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.js");
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.js");
47
+ return (0, import_path.join)(currentDir, "..", "..", "expo", "metro-transformer.cjs");
48
48
  }
49
49
  }
50
50
  var transformerPath = resolveTransformerPath();
@@ -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.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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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,sBAAsB;AAAA,EAChE,QAAQ;AAGJ,UAAM,EAAE,cAAc,IAAI,QAAQ,KAAK;AACvC,UAAM,iBAAa,qBAAQ,cAAc,YAAY,GAAG,CAAC;AACzD,eAAO,kBAAK,YAAY,MAAM,MAAM,QAAQ,sBAAsB;AAAA,EACtE;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":[]}
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":[]}
@@ -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.js");
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.js");
18
+ return join(currentDir, "..", "..", "expo", "metro-transformer.cjs");
19
19
  }
20
20
  }
21
21
  var transformerPath = resolveTransformerPath();
@@ -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.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":";;;;;;;;;AAAA,SAAS,SAAS,YAAY;AAK9B,SAAS,yBAAiC;AACtC,MAAI;AAGA,UAAM,UAAU,UAAQ,QAAQ,qCAAqC;AACrE,WAAO,KAAK,QAAQ,OAAO,GAAG,QAAQ,sBAAsB;AAAA,EAChE,QAAQ;AAGJ,UAAM,EAAE,cAAc,IAAI,UAAQ,KAAK;AACvC,UAAM,aAAa,QAAQ,cAAc,YAAY,GAAG,CAAC;AACzD,WAAO,KAAK,YAAY,MAAM,MAAM,QAAQ,sBAAsB;AAAA,EACtE;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":[]}
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":[]}
@@ -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.js");
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.js");
1011
+ return (0, import_path.join)(currentDir, "..", "..", "expo", "metro-transformer.cjs");
1012
1012
  }
1013
1013
  }
1014
1014
  var transformerPath = resolveTransformerPath();
@@ -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"]}
@@ -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.js");
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.js");
978
+ return join(currentDir, "..", "..", "expo", "metro-transformer.cjs");
979
979
  }
980
980
  }
981
981
  var transformerPath = resolveTransformerPath();