@vibexdotnew/inspector 0.0.9 → 0.0.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/next/index.cjs +2 -2
- package/dist/next/index.cjs.map +1 -1
- package/dist/next/index.js +2 -2
- package/dist/next/index.js.map +1 -1
- package/dist/next/loader.cjs +2 -2
- package/dist/next/loader.cjs.map +1 -1
- package/dist/next/loader.js +2 -2
- package/dist/next/loader.js.map +1 -1
- package/package.json +1 -1
package/dist/next/index.cjs
CHANGED
|
@@ -888,11 +888,11 @@ var import_meta = {};
|
|
|
888
888
|
function resolveLoaderPath() {
|
|
889
889
|
try {
|
|
890
890
|
const pkgPath = require.resolve("@vibexdotnew/inspector/package.json");
|
|
891
|
-
return (0, import_path.join)((0, import_path.dirname)(pkgPath), "next", "element-tagger.
|
|
891
|
+
return (0, import_path.join)((0, import_path.dirname)(pkgPath), "next", "element-tagger.js");
|
|
892
892
|
} catch {
|
|
893
893
|
const { fileURLToPath } = require("url");
|
|
894
894
|
const currentDir = (0, import_path.dirname)(fileURLToPath(import_meta.url));
|
|
895
|
-
return (0, import_path.join)(currentDir, "..", "..", "next", "element-tagger.
|
|
895
|
+
return (0, import_path.join)(currentDir, "..", "..", "next", "element-tagger.js");
|
|
896
896
|
}
|
|
897
897
|
}
|
|
898
898
|
var loaderPath = resolveLoaderPath();
|
package/dist/next/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/next/index.ts","../../src/next/components/VisualInspector.tsx","../../src/next/components/Observer.tsx","../../src/next/loader.ts","../../src/next/config.ts"],"sourcesContent":["// Components\nexport { VisualInspector } from './components/VisualInspector';\nexport { Observer, type ObserverProps } from './components/Observer';\n\n// Config helper\nexport { withInspector, type InspectorConfig } from './config';\n\n// Loader path for direct use\nexport { loaderPath } from './loader';\n","\"use client\";\n\nimport { useEffect, useReducer, useRef, useCallback } from \"react\";\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 | { channel: typeof CHANNEL; action: \"REMOVE_SELECTED\"; elementId: string };\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: \"REMOVE_SELECTED\"; elementId: string }\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 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 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 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 if (url.pathname === \"/_next/image\") {\n const real = url.searchParams.get(\"url\");\n if (real) return decodeURIComponent(real);\n }\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 \"REMOVE_SELECTED\":\n return { ...state, selectedElements: state.selectedElements.filter((sel) => sel.id !== action.elementId) };\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 function VisualInspector() {\n const [state, dispatch] = useReducer(reducer, initialState, (init) => {\n if (typeof window !== \"undefined\") {\n const stored = localStorage.getItem(STORAGE_KEY);\n return { ...init, active: stored === \"true\" };\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 localStorage.setItem(STORAGE_KEY, String(state.active));\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 alert(`Selection limit reached! You can only select up to ${MAX_SELECTIONS} elements.`);\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 localStorage.setItem(SELECTED_KEY, JSON.stringify({ ids: allSelected.map(s => s.id) }));\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 localStorage.removeItem(SELECTED_KEY);\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 case \"REMOVE_SELECTED\": {\n // Clean up editing if this element is being edited\n const removedElement = state.selectedElements.find(s => s.id === msg.elementId);\n if (removedElement?.element === editingElRef.current) {\n cleanupEditing();\n }\n\n dispatch({ type: \"REMOVE_SELECTED\", elementId: msg.elementId });\n\n // Update localStorage\n const remaining = state.selectedElements.filter(s => s.id !== msg.elementId);\n if (remaining.length > 0) {\n localStorage.setItem(SELECTED_KEY, JSON.stringify({ ids: remaining.map(s => s.id) }));\n } else {\n localStorage.removeItem(SELECTED_KEY);\n }\n\n // Emit updated selection\n if (remaining.length > 0) {\n const allInfos = remaining.map(s => buildElementInfo(s.element));\n emit({ channel: CHANNEL, event: \"SELECT\", elements: allInfos, position: { x: 0, y: 0 } });\n } else {\n emit({ channel: CHANNEL, event: \"DESELECT\" });\n }\n break;\n }\n }\n };\n\n window.addEventListener(\"message\", onMessage);\n return () => window.removeEventListener(\"message\", onMessage);\n }, [handleDeselect, buildElementInfo, state.selectedElements, cleanupEditing]);\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((e: React.MouseEvent, handle: string) => {\n if (!selectedElRef.current) return;\n e.preventDefault();\n e.stopPropagation();\n\n const rect = selectedElRef.current.getBoundingClientRect();\n resizeStartRef.current = { x: e.clientX, y: e.clientY, 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) 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) 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 embedded or not active\n if (!state.active) return null;\n\n const resizeHandles = [\"n\", \"ne\", \"e\", \"se\", \"s\", \"sw\", \"w\", \"nw\"];\n\n const getHandleStyle = (handle: string): React.CSSProperties => {\n const base: React.CSSProperties = {\n position: \"absolute\",\n width: 8,\n height: 8,\n background: \"#3b82f6\",\n border: \"1px solid white\",\n borderRadius: 2,\n zIndex: 10002,\n };\n\n const posMap: Record<string, React.CSSProperties> = {\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 <>\n {/* Hover overlay */}\n {state.hoveredRect && !state.selectedElements.some(s => s.id === state.hoveredId) && !state.isScrolling && (\n <div\n style={{\n position: \"fixed\",\n top: state.hoveredRect.top,\n left: state.hoveredRect.left,\n width: state.hoveredRect.width,\n height: state.hoveredRect.height,\n border: \"2px dashed #3b82f6\",\n background: \"rgba(59, 130, 246, 0.08)\",\n pointerEvents: \"none\",\n zIndex: 10000,\n borderRadius: 4,\n }}\n >\n {state.hoveredTag && (\n <span\n style={{\n position: \"absolute\",\n top: -22,\n left: 0,\n background: \"#3b82f6\",\n color: \"white\",\n fontSize: 11,\n padding: \"2px 6px\",\n borderRadius: 3,\n fontFamily: \"system-ui, sans-serif\",\n }}\n >\n {state.hoveredTag}\n </span>\n )}\n </div>\n )}\n\n {/* Selected overlays */}\n {!state.isScrolling && state.selectedElements.map((selected, index) => (\n <div\n key={selected.id}\n style={{\n position: \"fixed\",\n top: selected.rect.top,\n left: selected.rect.left,\n width: selected.rect.width,\n height: selected.rect.height,\n border: \"2px solid #3b82f6\",\n background: \"rgba(59, 130, 246, 0.04)\",\n pointerEvents: \"none\",\n zIndex: 10001 + index,\n borderRadius: 4,\n }}\n >\n {selected.tag && (\n <span\n style={{\n position: \"absolute\",\n top: -22,\n left: 0,\n background: \"#3b82f6\",\n color: \"white\",\n fontSize: 11,\n padding: \"2px 6px\",\n borderRadius: 3,\n fontFamily: \"system-ui, sans-serif\",\n fontWeight: 500,\n }}\n >\n {selected.tag} ({index + 1}/{state.selectedElements.length})\n </span>\n )}\n\n {/* Resize handles - only show for last selected element */}\n {index === state.selectedElements.length - 1 && resizeHandles.map((handle) => (\n <div\n key={handle}\n style={{ ...getHandleStyle(handle), pointerEvents: \"auto\" }}\n onMouseDown={(e) => onResizeStart(e, handle)}\n />\n ))}\n </div>\n ))}\n\n {/* Global styles for editing */}\n <style>{`\n [contenteditable=\"true\"]:focus {\n outline: none !important;\n }\n [contenteditable=\"true\"]::selection {\n background: rgba(59, 130, 246, 0.3);\n }\n `}</style>\n <style>{`\n nextjs-portal {\n display: none !important;\n }\n `}</style>\n </>\n );\n}\n\nexport default VisualInspector;\n","\"use client\";\n\nimport { useEffect, useRef } from \"react\";\nimport { usePathname, useSearchParams } from \"next/navigation\";\n\nexport interface ObserverProps {\n error?: Error & { digest?: string };\n reset?: () => void;\n trackNavigation?: boolean;\n appMeta?: Record<string, unknown>;\n}\n\nexport function Observer({\n error,\n reset,\n trackNavigation = true,\n appMeta,\n}: ObserverProps) {\n const previousOverlayContent = useRef(\"\");\n const monitorInterval = useRef<NodeJS.Timeout>(undefined);\n const isInitialNav = useRef(true);\n\n const pathname = usePathname();\n const searchParams = useSearchParams();\n\n // Navigation tracking\n\n if (!trackNavigation) return;\n const isEmbedded = window.parent !== window;\n useEffect(() => {\n console.log(\n { pathname, searchParams, trackNavigation, appMeta, isEmbedded }\n )\n if (!isEmbedded) return;\n\n const queryObj: Record<string, string> = {};\n searchParams.forEach((val, key) => {\n queryObj[key] = val;\n });\n\n const href = searchParams.toString()\n ? `${pathname}?${searchParams.toString()}`\n : pathname;\n\n window.parent.postMessage(\n {\n type: \"VIBEX_NAVIGATION\",\n route: {\n path: pathname,\n query: Object.keys(queryObj).length > 0 ? queryObj : null,\n href,\n },\n context: {\n initial: isInitialNav.current,\n timestamp: Date.now(),\n ...appMeta,\n },\n },\n \"*\"\n );\n\n isInitialNav.current = false;\n }, [pathname, searchParams, trackNavigation, appMeta]);\n\n // Error monitoring\n useEffect(() => {\n const isEmbedded = window.parent !== window;\n if (!isEmbedded) return;\n\n const dispatch = (data: unknown) => window.parent.postMessage(data, \"*\");\n\n const handleRuntimeError = (evt: ErrorEvent) =>\n dispatch({\n type: \"VIBEX_EXCEPTION\",\n details: {\n message: evt.message,\n stack: evt.error?.stack,\n file: evt.filename,\n line: evt.lineno,\n column: evt.colno,\n origin: \"runtime\",\n },\n capturedAt: Date.now(),\n });\n\n const handlePromiseError = (evt: PromiseRejectionEvent) =>\n dispatch({\n type: \"VIBEX_EXCEPTION\",\n details: {\n message: evt.reason?.message ?? String(evt.reason),\n stack: evt.reason?.stack,\n origin: \"promise\",\n },\n capturedAt: Date.now(),\n });\n\n const checkDevOverlay = () => {\n const overlayEl = document.querySelector(\"[data-nextjs-dialog-overlay]\");\n const contentEl =\n overlayEl?.querySelector(\n \"h1, h2, .error-message, [data-nextjs-dialog-body]\"\n ) ?? null;\n const content = contentEl?.textContent ?? contentEl?.innerHTML ?? \"\";\n if (content && content !== previousOverlayContent.current) {\n previousOverlayContent.current = content;\n dispatch({\n type: \"VIBEX_EXCEPTION\",\n details: { message: content, origin: \"dev-overlay\" },\n capturedAt: Date.now(),\n });\n }\n };\n\n window.addEventListener(\"error\", handleRuntimeError);\n window.addEventListener(\"unhandledrejection\", handlePromiseError);\n monitorInterval.current = setInterval(checkDevOverlay, 1000);\n\n return () => {\n window.removeEventListener(\"error\", handleRuntimeError);\n window.removeEventListener(\"unhandledrejection\", handlePromiseError);\n monitorInterval.current && clearInterval(monitorInterval.current);\n };\n }, []);\n\n useEffect(() => {\n if (!error) return;\n window.parent.postMessage(\n {\n type: \"vibex-boundary-error\",\n details: {\n message: error.message,\n stack: error.stack,\n digest: error.digest,\n name: error.name,\n },\n capturedAt: Date.now(),\n client: navigator.userAgent,\n },\n \"*\"\n );\n }, [error]);\n\n if (!error) return null;\n\n const requestAIFix = () => {\n window.parent.postMessage(\n {\n type: \"vibex-fix-with-ai\",\n details: {\n message: error.message,\n stack: error.stack,\n digest: error.digest,\n name: error.name,\n },\n capturedAt: Date.now(),\n },\n \"*\"\n );\n };\n\n return (\n <html>\n <body className=\"min-h-screen bg-background text-foreground flex items-end sm:items-center justify-center p-4 sm:p-8\">\n <div className=\"w-full max-w-lg\">\n {/* Accent bar + Card */}\n <div className=\"flex rounded-xl overflow-hidden border border-border shadow-sm\">\n <div className=\"w-1.5 bg-destructive shrink-0\" />\n <div className=\"flex-1 p-5 sm:p-6 space-y-5\">\n {/* Header row */}\n <div className=\"flex items-start justify-between gap-4\">\n <div className=\"space-y-1\">\n <p className=\"text-xs font-medium tracking-wide text-muted-foreground uppercase\">\n Runtime Error\n </p>\n <h1 className=\"text-lg font-medium leading-snug\">\n {error.name || \"Error\"}\n </h1>\n </div>\n {error.digest && (\n <code className=\"text-[10px] px-2 py-1 rounded bg-muted text-muted-foreground font-mono shrink-0\">\n {error.digest}\n </code>\n )}\n </div>\n\n {/* Error message */}\n <p className=\"text-sm text-muted-foreground leading-relaxed\">\n {error.message}\n </p>\n\n {/* Actions row */}\n <div className=\"flex items-center gap-3 pt-1\">\n <button\n onClick={requestAIFix}\n className=\"inline-flex items-center gap-2 py-2 px-4 bg-primary text-primary-foreground text-sm font-medium rounded-md hover:bg-primary/90 transition-colors\"\n >\n <svg className=\"w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M13 10V3L4 14h7v7l9-11h-7z\" />\n </svg>\n Fix with AI\n </button>\n {reset && (\n <button\n onClick={reset}\n className=\"text-sm text-muted-foreground hover:text-foreground transition-colors\"\n >\n Retry\n </button>\n )}\n </div>\n\n {/* Stack trace - dev only */}\n {process.env.NODE_ENV === \"development\" && error.stack && (\n <div className=\"pt-3 border-t border-border\">\n <pre className=\"text-[11px] font-mono text-muted-foreground leading-relaxed overflow-x-auto whitespace-pre-wrap break-all\">\n {error.stack}\n </pre>\n </div>\n )}\n </div>\n </div>\n\n {/* Footer */}\n <p className=\"mt-4 text-center text-xs text-muted-foreground/60\">\n Vibex Inspector\n </p>\n </div>\n </body>\n </html>\n );\n}\n","import { dirname, join } from 'path';\n\n/**\n * Resolves the loader path in both CJS and ESM environments\n */\nfunction resolveLoaderPath(): 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), 'next', 'element-tagger.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, '..', '..', 'next', 'element-tagger.cjs');\n }\n}\n\n/**\n * Absolute path to the element-tagger.js loader file.\n * Use this with Turbopack/Webpack loader configuration.\n *\n * @example\n * ```typescript\n * import { loaderPath } from '@vibexdotnew/inspector/next';\n *\n * const nextConfig = {\n * turbopack: {\n * rules: {\n * \"*.{jsx,tsx}\": {\n * loaders: [loaderPath]\n * }\n * }\n * }\n * };\n * ```\n *\n * @example\n * ```typescript\n * // Alternative: use require.resolve directly\n * const loaderPath = require.resolve('@vibexdotnew/inspector/next/loader.js');\n * ```\n */\nexport const loaderPath = resolveLoaderPath();\n","import type { NextConfig } from 'next';\nimport { loaderPath } from './loader';\n\nexport interface InspectorConfig {\n /**\n * File extensions to process with the element tagger.\n * @default ['jsx', 'tsx']\n */\n extensions?: string[];\n\n /**\n * Enable the inspector in production builds.\n * @default false\n */\n enableInProduction?: boolean;\n}\n\n/**\n * Wraps a Next.js config to add the Vibex Inspector element tagger loader.\n *\n * @example\n * ```typescript\n * import { withInspector } from '@vibex/inspector/next';\n *\n * const nextConfig = {\n * // your config\n * };\n *\n * export default withInspector(nextConfig);\n * ```\n */\nexport function withInspector(\n nextConfig: NextConfig = {},\n options: InspectorConfig = {}\n): NextConfig {\n const {\n extensions = ['jsx', 'tsx'],\n enableInProduction = false,\n } = options;\n\n // Skip in production unless explicitly enabled\n if (process.env.NODE_ENV === 'production' && !enableInProduction) {\n return nextConfig;\n }\n\n // Build the glob pattern for file matching\n const extPattern = extensions.length === 1\n ? extensions[0]\n : `{${extensions.join(',')}}`;\n const filePattern = `*.${extPattern}`;\n\n return {\n ...nextConfig,\n\n // Add Turbopack loader rules\n turbopack: {\n ...nextConfig.turbopack,\n rules: {\n ...nextConfig.turbopack?.rules,\n [filePattern]: {\n loaders: [loaderPath],\n },\n },\n }\n };\n}\n"],"mappings":"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","names":["import_react","import_jsx_runtime","isEmbedded"]}
|
|
1
|
+
{"version":3,"sources":["../../src/next/index.ts","../../src/next/components/VisualInspector.tsx","../../src/next/components/Observer.tsx","../../src/next/loader.ts","../../src/next/config.ts"],"sourcesContent":["// Components\nexport { VisualInspector } from './components/VisualInspector';\nexport { Observer, type ObserverProps } from './components/Observer';\n\n// Config helper\nexport { withInspector, type InspectorConfig } from './config';\n\n// Loader path for direct use\nexport { loaderPath } from './loader';\n","\"use client\";\n\nimport { useEffect, useReducer, useRef, useCallback } from \"react\";\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 | { channel: typeof CHANNEL; action: \"REMOVE_SELECTED\"; elementId: string };\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: \"REMOVE_SELECTED\"; elementId: string }\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 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 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 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 if (url.pathname === \"/_next/image\") {\n const real = url.searchParams.get(\"url\");\n if (real) return decodeURIComponent(real);\n }\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 \"REMOVE_SELECTED\":\n return { ...state, selectedElements: state.selectedElements.filter((sel) => sel.id !== action.elementId) };\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 function VisualInspector() {\n const [state, dispatch] = useReducer(reducer, initialState, (init) => {\n if (typeof window !== \"undefined\") {\n const stored = localStorage.getItem(STORAGE_KEY);\n return { ...init, active: stored === \"true\" };\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 localStorage.setItem(STORAGE_KEY, String(state.active));\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 alert(`Selection limit reached! You can only select up to ${MAX_SELECTIONS} elements.`);\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 localStorage.setItem(SELECTED_KEY, JSON.stringify({ ids: allSelected.map(s => s.id) }));\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 localStorage.removeItem(SELECTED_KEY);\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 case \"REMOVE_SELECTED\": {\n // Clean up editing if this element is being edited\n const removedElement = state.selectedElements.find(s => s.id === msg.elementId);\n if (removedElement?.element === editingElRef.current) {\n cleanupEditing();\n }\n\n dispatch({ type: \"REMOVE_SELECTED\", elementId: msg.elementId });\n\n // Update localStorage\n const remaining = state.selectedElements.filter(s => s.id !== msg.elementId);\n if (remaining.length > 0) {\n localStorage.setItem(SELECTED_KEY, JSON.stringify({ ids: remaining.map(s => s.id) }));\n } else {\n localStorage.removeItem(SELECTED_KEY);\n }\n\n // Emit updated selection\n if (remaining.length > 0) {\n const allInfos = remaining.map(s => buildElementInfo(s.element));\n emit({ channel: CHANNEL, event: \"SELECT\", elements: allInfos, position: { x: 0, y: 0 } });\n } else {\n emit({ channel: CHANNEL, event: \"DESELECT\" });\n }\n break;\n }\n }\n };\n\n window.addEventListener(\"message\", onMessage);\n return () => window.removeEventListener(\"message\", onMessage);\n }, [handleDeselect, buildElementInfo, state.selectedElements, cleanupEditing]);\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((e: React.MouseEvent, handle: string) => {\n if (!selectedElRef.current) return;\n e.preventDefault();\n e.stopPropagation();\n\n const rect = selectedElRef.current.getBoundingClientRect();\n resizeStartRef.current = { x: e.clientX, y: e.clientY, 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) 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) 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 embedded or not active\n if (!state.active) return null;\n\n const resizeHandles = [\"n\", \"ne\", \"e\", \"se\", \"s\", \"sw\", \"w\", \"nw\"];\n\n const getHandleStyle = (handle: string): React.CSSProperties => {\n const base: React.CSSProperties = {\n position: \"absolute\",\n width: 8,\n height: 8,\n background: \"#3b82f6\",\n border: \"1px solid white\",\n borderRadius: 2,\n zIndex: 10002,\n };\n\n const posMap: Record<string, React.CSSProperties> = {\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 <>\n {/* Hover overlay */}\n {state.hoveredRect && !state.selectedElements.some(s => s.id === state.hoveredId) && !state.isScrolling && (\n <div\n style={{\n position: \"fixed\",\n top: state.hoveredRect.top,\n left: state.hoveredRect.left,\n width: state.hoveredRect.width,\n height: state.hoveredRect.height,\n border: \"2px dashed #3b82f6\",\n background: \"rgba(59, 130, 246, 0.08)\",\n pointerEvents: \"none\",\n zIndex: 10000,\n borderRadius: 4,\n }}\n >\n {state.hoveredTag && (\n <span\n style={{\n position: \"absolute\",\n top: -22,\n left: 0,\n background: \"#3b82f6\",\n color: \"white\",\n fontSize: 11,\n padding: \"2px 6px\",\n borderRadius: 3,\n fontFamily: \"system-ui, sans-serif\",\n }}\n >\n {state.hoveredTag}\n </span>\n )}\n </div>\n )}\n\n {/* Selected overlays */}\n {!state.isScrolling && state.selectedElements.map((selected, index) => (\n <div\n key={selected.id}\n style={{\n position: \"fixed\",\n top: selected.rect.top,\n left: selected.rect.left,\n width: selected.rect.width,\n height: selected.rect.height,\n border: \"2px solid #3b82f6\",\n background: \"rgba(59, 130, 246, 0.04)\",\n pointerEvents: \"none\",\n zIndex: 10001 + index,\n borderRadius: 4,\n }}\n >\n {selected.tag && (\n <span\n style={{\n position: \"absolute\",\n top: -22,\n left: 0,\n background: \"#3b82f6\",\n color: \"white\",\n fontSize: 11,\n padding: \"2px 6px\",\n borderRadius: 3,\n fontFamily: \"system-ui, sans-serif\",\n fontWeight: 500,\n }}\n >\n {selected.tag} ({index + 1}/{state.selectedElements.length})\n </span>\n )}\n\n {/* Resize handles - only show for last selected element */}\n {index === state.selectedElements.length - 1 && resizeHandles.map((handle) => (\n <div\n key={handle}\n style={{ ...getHandleStyle(handle), pointerEvents: \"auto\" }}\n onMouseDown={(e) => onResizeStart(e, handle)}\n />\n ))}\n </div>\n ))}\n\n {/* Global styles for editing */}\n <style>{`\n [contenteditable=\"true\"]:focus {\n outline: none !important;\n }\n [contenteditable=\"true\"]::selection {\n background: rgba(59, 130, 246, 0.3);\n }\n `}</style>\n <style>{`\n nextjs-portal {\n display: none !important;\n }\n `}</style>\n </>\n );\n}\n\nexport default VisualInspector;\n","\"use client\";\n\nimport { useEffect, useRef } from \"react\";\nimport { usePathname, useSearchParams } from \"next/navigation\";\n\nexport interface ObserverProps {\n error?: Error & { digest?: string };\n reset?: () => void;\n trackNavigation?: boolean;\n appMeta?: Record<string, unknown>;\n}\n\nexport function Observer({\n error,\n reset,\n trackNavigation = true,\n appMeta,\n}: ObserverProps) {\n const previousOverlayContent = useRef(\"\");\n const monitorInterval = useRef<NodeJS.Timeout>(undefined);\n const isInitialNav = useRef(true);\n\n const pathname = usePathname();\n const searchParams = useSearchParams();\n\n // Navigation tracking\n\n if (!trackNavigation) return;\n const isEmbedded = window.parent !== window;\n useEffect(() => {\n console.log(\n { pathname, searchParams, trackNavigation, appMeta, isEmbedded }\n )\n if (!isEmbedded) return;\n\n const queryObj: Record<string, string> = {};\n searchParams.forEach((val, key) => {\n queryObj[key] = val;\n });\n\n const href = searchParams.toString()\n ? `${pathname}?${searchParams.toString()}`\n : pathname;\n\n window.parent.postMessage(\n {\n type: \"VIBEX_NAVIGATION\",\n route: {\n path: pathname,\n query: Object.keys(queryObj).length > 0 ? queryObj : null,\n href,\n },\n context: {\n initial: isInitialNav.current,\n timestamp: Date.now(),\n ...appMeta,\n },\n },\n \"*\"\n );\n\n isInitialNav.current = false;\n }, [pathname, searchParams, trackNavigation, appMeta]);\n\n // Error monitoring\n useEffect(() => {\n const isEmbedded = window.parent !== window;\n if (!isEmbedded) return;\n\n const dispatch = (data: unknown) => window.parent.postMessage(data, \"*\");\n\n const handleRuntimeError = (evt: ErrorEvent) =>\n dispatch({\n type: \"VIBEX_EXCEPTION\",\n details: {\n message: evt.message,\n stack: evt.error?.stack,\n file: evt.filename,\n line: evt.lineno,\n column: evt.colno,\n origin: \"runtime\",\n },\n capturedAt: Date.now(),\n });\n\n const handlePromiseError = (evt: PromiseRejectionEvent) =>\n dispatch({\n type: \"VIBEX_EXCEPTION\",\n details: {\n message: evt.reason?.message ?? String(evt.reason),\n stack: evt.reason?.stack,\n origin: \"promise\",\n },\n capturedAt: Date.now(),\n });\n\n const checkDevOverlay = () => {\n const overlayEl = document.querySelector(\"[data-nextjs-dialog-overlay]\");\n const contentEl =\n overlayEl?.querySelector(\n \"h1, h2, .error-message, [data-nextjs-dialog-body]\"\n ) ?? null;\n const content = contentEl?.textContent ?? contentEl?.innerHTML ?? \"\";\n if (content && content !== previousOverlayContent.current) {\n previousOverlayContent.current = content;\n dispatch({\n type: \"VIBEX_EXCEPTION\",\n details: { message: content, origin: \"dev-overlay\" },\n capturedAt: Date.now(),\n });\n }\n };\n\n window.addEventListener(\"error\", handleRuntimeError);\n window.addEventListener(\"unhandledrejection\", handlePromiseError);\n monitorInterval.current = setInterval(checkDevOverlay, 1000);\n\n return () => {\n window.removeEventListener(\"error\", handleRuntimeError);\n window.removeEventListener(\"unhandledrejection\", handlePromiseError);\n monitorInterval.current && clearInterval(monitorInterval.current);\n };\n }, []);\n\n useEffect(() => {\n if (!error) return;\n window.parent.postMessage(\n {\n type: \"vibex-boundary-error\",\n details: {\n message: error.message,\n stack: error.stack,\n digest: error.digest,\n name: error.name,\n },\n capturedAt: Date.now(),\n client: navigator.userAgent,\n },\n \"*\"\n );\n }, [error]);\n\n if (!error) return null;\n\n const requestAIFix = () => {\n window.parent.postMessage(\n {\n type: \"vibex-fix-with-ai\",\n details: {\n message: error.message,\n stack: error.stack,\n digest: error.digest,\n name: error.name,\n },\n capturedAt: Date.now(),\n },\n \"*\"\n );\n };\n\n return (\n <html>\n <body className=\"min-h-screen bg-background text-foreground flex items-end sm:items-center justify-center p-4 sm:p-8\">\n <div className=\"w-full max-w-lg\">\n {/* Accent bar + Card */}\n <div className=\"flex rounded-xl overflow-hidden border border-border shadow-sm\">\n <div className=\"w-1.5 bg-destructive shrink-0\" />\n <div className=\"flex-1 p-5 sm:p-6 space-y-5\">\n {/* Header row */}\n <div className=\"flex items-start justify-between gap-4\">\n <div className=\"space-y-1\">\n <p className=\"text-xs font-medium tracking-wide text-muted-foreground uppercase\">\n Runtime Error\n </p>\n <h1 className=\"text-lg font-medium leading-snug\">\n {error.name || \"Error\"}\n </h1>\n </div>\n {error.digest && (\n <code className=\"text-[10px] px-2 py-1 rounded bg-muted text-muted-foreground font-mono shrink-0\">\n {error.digest}\n </code>\n )}\n </div>\n\n {/* Error message */}\n <p className=\"text-sm text-muted-foreground leading-relaxed\">\n {error.message}\n </p>\n\n {/* Actions row */}\n <div className=\"flex items-center gap-3 pt-1\">\n <button\n onClick={requestAIFix}\n className=\"inline-flex items-center gap-2 py-2 px-4 bg-primary text-primary-foreground text-sm font-medium rounded-md hover:bg-primary/90 transition-colors\"\n >\n <svg className=\"w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M13 10V3L4 14h7v7l9-11h-7z\" />\n </svg>\n Fix with AI\n </button>\n {reset && (\n <button\n onClick={reset}\n className=\"text-sm text-muted-foreground hover:text-foreground transition-colors\"\n >\n Retry\n </button>\n )}\n </div>\n\n {/* Stack trace - dev only */}\n {process.env.NODE_ENV === \"development\" && error.stack && (\n <div className=\"pt-3 border-t border-border\">\n <pre className=\"text-[11px] font-mono text-muted-foreground leading-relaxed overflow-x-auto whitespace-pre-wrap break-all\">\n {error.stack}\n </pre>\n </div>\n )}\n </div>\n </div>\n\n {/* Footer */}\n <p className=\"mt-4 text-center text-xs text-muted-foreground/60\">\n Vibex Inspector\n </p>\n </div>\n </body>\n </html>\n );\n}\n","import { dirname, join } from 'path';\n\n/**\n * Resolves the loader path in both CJS and ESM environments\n */\nfunction resolveLoaderPath(): 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), 'next', 'element-tagger.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, '..', '..', 'next', 'element-tagger.js');\n }\n}\n\n/**\n * Absolute path to the element-tagger.js loader file.\n * Use this with Turbopack/Webpack loader configuration.\n *\n * @example\n * ```typescript\n * import { loaderPath } from '@vibexdotnew/inspector/next';\n *\n * const nextConfig = {\n * turbopack: {\n * rules: {\n * \"*.{jsx,tsx}\": {\n * loaders: [loaderPath]\n * }\n * }\n * }\n * };\n * ```\n *\n * @example\n * ```typescript\n * // Alternative: use require.resolve directly\n * const loaderPath = require.resolve('@vibexdotnew/inspector/next/loader.js');\n * ```\n */\nexport const loaderPath = resolveLoaderPath();\n","import type { NextConfig } from 'next';\nimport { loaderPath } from './loader';\n\nexport interface InspectorConfig {\n /**\n * File extensions to process with the element tagger.\n * @default ['jsx', 'tsx']\n */\n extensions?: string[];\n\n /**\n * Enable the inspector in production builds.\n * @default false\n */\n enableInProduction?: boolean;\n}\n\n/**\n * Wraps a Next.js config to add the Vibex Inspector element tagger loader.\n *\n * @example\n * ```typescript\n * import { withInspector } from '@vibex/inspector/next';\n *\n * const nextConfig = {\n * // your config\n * };\n *\n * export default withInspector(nextConfig);\n * ```\n */\nexport function withInspector(\n nextConfig: NextConfig = {},\n options: InspectorConfig = {}\n): NextConfig {\n const {\n extensions = ['jsx', 'tsx'],\n enableInProduction = false,\n } = options;\n\n // Skip in production unless explicitly enabled\n if (process.env.NODE_ENV === 'production' && !enableInProduction) {\n return nextConfig;\n }\n\n // Build the glob pattern for file matching\n const extPattern = extensions.length === 1\n ? extensions[0]\n : `{${extensions.join(',')}}`;\n const filePattern = `*.${extPattern}`;\n\n return {\n ...nextConfig,\n\n // Add Turbopack loader rules\n turbopack: {\n ...nextConfig.turbopack,\n rules: {\n ...nextConfig.turbopack?.rules,\n [filePattern]: {\n loaders: [loaderPath],\n },\n },\n }\n };\n}\n"],"mappings":"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","names":["import_react","import_jsx_runtime","isEmbedded"]}
|
package/dist/next/index.js
CHANGED
|
@@ -855,11 +855,11 @@ import { dirname, join } from "path";
|
|
|
855
855
|
function resolveLoaderPath() {
|
|
856
856
|
try {
|
|
857
857
|
const pkgPath = __require.resolve("@vibexdotnew/inspector/package.json");
|
|
858
|
-
return join(dirname(pkgPath), "next", "element-tagger.
|
|
858
|
+
return join(dirname(pkgPath), "next", "element-tagger.js");
|
|
859
859
|
} catch {
|
|
860
860
|
const { fileURLToPath } = __require("url");
|
|
861
861
|
const currentDir = dirname(fileURLToPath(import.meta.url));
|
|
862
|
-
return join(currentDir, "..", "..", "next", "element-tagger.
|
|
862
|
+
return join(currentDir, "..", "..", "next", "element-tagger.js");
|
|
863
863
|
}
|
|
864
864
|
}
|
|
865
865
|
var loaderPath = resolveLoaderPath();
|
package/dist/next/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/next/components/VisualInspector.tsx","../../src/next/components/Observer.tsx","../../src/next/loader.ts","../../src/next/config.ts"],"sourcesContent":["\"use client\";\n\nimport { useEffect, useReducer, useRef, useCallback } from \"react\";\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 | { channel: typeof CHANNEL; action: \"REMOVE_SELECTED\"; elementId: string };\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: \"REMOVE_SELECTED\"; elementId: string }\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 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 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 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 if (url.pathname === \"/_next/image\") {\n const real = url.searchParams.get(\"url\");\n if (real) return decodeURIComponent(real);\n }\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 \"REMOVE_SELECTED\":\n return { ...state, selectedElements: state.selectedElements.filter((sel) => sel.id !== action.elementId) };\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 function VisualInspector() {\n const [state, dispatch] = useReducer(reducer, initialState, (init) => {\n if (typeof window !== \"undefined\") {\n const stored = localStorage.getItem(STORAGE_KEY);\n return { ...init, active: stored === \"true\" };\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 localStorage.setItem(STORAGE_KEY, String(state.active));\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 alert(`Selection limit reached! You can only select up to ${MAX_SELECTIONS} elements.`);\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 localStorage.setItem(SELECTED_KEY, JSON.stringify({ ids: allSelected.map(s => s.id) }));\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 localStorage.removeItem(SELECTED_KEY);\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 case \"REMOVE_SELECTED\": {\n // Clean up editing if this element is being edited\n const removedElement = state.selectedElements.find(s => s.id === msg.elementId);\n if (removedElement?.element === editingElRef.current) {\n cleanupEditing();\n }\n\n dispatch({ type: \"REMOVE_SELECTED\", elementId: msg.elementId });\n\n // Update localStorage\n const remaining = state.selectedElements.filter(s => s.id !== msg.elementId);\n if (remaining.length > 0) {\n localStorage.setItem(SELECTED_KEY, JSON.stringify({ ids: remaining.map(s => s.id) }));\n } else {\n localStorage.removeItem(SELECTED_KEY);\n }\n\n // Emit updated selection\n if (remaining.length > 0) {\n const allInfos = remaining.map(s => buildElementInfo(s.element));\n emit({ channel: CHANNEL, event: \"SELECT\", elements: allInfos, position: { x: 0, y: 0 } });\n } else {\n emit({ channel: CHANNEL, event: \"DESELECT\" });\n }\n break;\n }\n }\n };\n\n window.addEventListener(\"message\", onMessage);\n return () => window.removeEventListener(\"message\", onMessage);\n }, [handleDeselect, buildElementInfo, state.selectedElements, cleanupEditing]);\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((e: React.MouseEvent, handle: string) => {\n if (!selectedElRef.current) return;\n e.preventDefault();\n e.stopPropagation();\n\n const rect = selectedElRef.current.getBoundingClientRect();\n resizeStartRef.current = { x: e.clientX, y: e.clientY, 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) 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) 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 embedded or not active\n if (!state.active) return null;\n\n const resizeHandles = [\"n\", \"ne\", \"e\", \"se\", \"s\", \"sw\", \"w\", \"nw\"];\n\n const getHandleStyle = (handle: string): React.CSSProperties => {\n const base: React.CSSProperties = {\n position: \"absolute\",\n width: 8,\n height: 8,\n background: \"#3b82f6\",\n border: \"1px solid white\",\n borderRadius: 2,\n zIndex: 10002,\n };\n\n const posMap: Record<string, React.CSSProperties> = {\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 <>\n {/* Hover overlay */}\n {state.hoveredRect && !state.selectedElements.some(s => s.id === state.hoveredId) && !state.isScrolling && (\n <div\n style={{\n position: \"fixed\",\n top: state.hoveredRect.top,\n left: state.hoveredRect.left,\n width: state.hoveredRect.width,\n height: state.hoveredRect.height,\n border: \"2px dashed #3b82f6\",\n background: \"rgba(59, 130, 246, 0.08)\",\n pointerEvents: \"none\",\n zIndex: 10000,\n borderRadius: 4,\n }}\n >\n {state.hoveredTag && (\n <span\n style={{\n position: \"absolute\",\n top: -22,\n left: 0,\n background: \"#3b82f6\",\n color: \"white\",\n fontSize: 11,\n padding: \"2px 6px\",\n borderRadius: 3,\n fontFamily: \"system-ui, sans-serif\",\n }}\n >\n {state.hoveredTag}\n </span>\n )}\n </div>\n )}\n\n {/* Selected overlays */}\n {!state.isScrolling && state.selectedElements.map((selected, index) => (\n <div\n key={selected.id}\n style={{\n position: \"fixed\",\n top: selected.rect.top,\n left: selected.rect.left,\n width: selected.rect.width,\n height: selected.rect.height,\n border: \"2px solid #3b82f6\",\n background: \"rgba(59, 130, 246, 0.04)\",\n pointerEvents: \"none\",\n zIndex: 10001 + index,\n borderRadius: 4,\n }}\n >\n {selected.tag && (\n <span\n style={{\n position: \"absolute\",\n top: -22,\n left: 0,\n background: \"#3b82f6\",\n color: \"white\",\n fontSize: 11,\n padding: \"2px 6px\",\n borderRadius: 3,\n fontFamily: \"system-ui, sans-serif\",\n fontWeight: 500,\n }}\n >\n {selected.tag} ({index + 1}/{state.selectedElements.length})\n </span>\n )}\n\n {/* Resize handles - only show for last selected element */}\n {index === state.selectedElements.length - 1 && resizeHandles.map((handle) => (\n <div\n key={handle}\n style={{ ...getHandleStyle(handle), pointerEvents: \"auto\" }}\n onMouseDown={(e) => onResizeStart(e, handle)}\n />\n ))}\n </div>\n ))}\n\n {/* Global styles for editing */}\n <style>{`\n [contenteditable=\"true\"]:focus {\n outline: none !important;\n }\n [contenteditable=\"true\"]::selection {\n background: rgba(59, 130, 246, 0.3);\n }\n `}</style>\n <style>{`\n nextjs-portal {\n display: none !important;\n }\n `}</style>\n </>\n );\n}\n\nexport default VisualInspector;\n","\"use client\";\n\nimport { useEffect, useRef } from \"react\";\nimport { usePathname, useSearchParams } from \"next/navigation\";\n\nexport interface ObserverProps {\n error?: Error & { digest?: string };\n reset?: () => void;\n trackNavigation?: boolean;\n appMeta?: Record<string, unknown>;\n}\n\nexport function Observer({\n error,\n reset,\n trackNavigation = true,\n appMeta,\n}: ObserverProps) {\n const previousOverlayContent = useRef(\"\");\n const monitorInterval = useRef<NodeJS.Timeout>(undefined);\n const isInitialNav = useRef(true);\n\n const pathname = usePathname();\n const searchParams = useSearchParams();\n\n // Navigation tracking\n\n if (!trackNavigation) return;\n const isEmbedded = window.parent !== window;\n useEffect(() => {\n console.log(\n { pathname, searchParams, trackNavigation, appMeta, isEmbedded }\n )\n if (!isEmbedded) return;\n\n const queryObj: Record<string, string> = {};\n searchParams.forEach((val, key) => {\n queryObj[key] = val;\n });\n\n const href = searchParams.toString()\n ? `${pathname}?${searchParams.toString()}`\n : pathname;\n\n window.parent.postMessage(\n {\n type: \"VIBEX_NAVIGATION\",\n route: {\n path: pathname,\n query: Object.keys(queryObj).length > 0 ? queryObj : null,\n href,\n },\n context: {\n initial: isInitialNav.current,\n timestamp: Date.now(),\n ...appMeta,\n },\n },\n \"*\"\n );\n\n isInitialNav.current = false;\n }, [pathname, searchParams, trackNavigation, appMeta]);\n\n // Error monitoring\n useEffect(() => {\n const isEmbedded = window.parent !== window;\n if (!isEmbedded) return;\n\n const dispatch = (data: unknown) => window.parent.postMessage(data, \"*\");\n\n const handleRuntimeError = (evt: ErrorEvent) =>\n dispatch({\n type: \"VIBEX_EXCEPTION\",\n details: {\n message: evt.message,\n stack: evt.error?.stack,\n file: evt.filename,\n line: evt.lineno,\n column: evt.colno,\n origin: \"runtime\",\n },\n capturedAt: Date.now(),\n });\n\n const handlePromiseError = (evt: PromiseRejectionEvent) =>\n dispatch({\n type: \"VIBEX_EXCEPTION\",\n details: {\n message: evt.reason?.message ?? String(evt.reason),\n stack: evt.reason?.stack,\n origin: \"promise\",\n },\n capturedAt: Date.now(),\n });\n\n const checkDevOverlay = () => {\n const overlayEl = document.querySelector(\"[data-nextjs-dialog-overlay]\");\n const contentEl =\n overlayEl?.querySelector(\n \"h1, h2, .error-message, [data-nextjs-dialog-body]\"\n ) ?? null;\n const content = contentEl?.textContent ?? contentEl?.innerHTML ?? \"\";\n if (content && content !== previousOverlayContent.current) {\n previousOverlayContent.current = content;\n dispatch({\n type: \"VIBEX_EXCEPTION\",\n details: { message: content, origin: \"dev-overlay\" },\n capturedAt: Date.now(),\n });\n }\n };\n\n window.addEventListener(\"error\", handleRuntimeError);\n window.addEventListener(\"unhandledrejection\", handlePromiseError);\n monitorInterval.current = setInterval(checkDevOverlay, 1000);\n\n return () => {\n window.removeEventListener(\"error\", handleRuntimeError);\n window.removeEventListener(\"unhandledrejection\", handlePromiseError);\n monitorInterval.current && clearInterval(monitorInterval.current);\n };\n }, []);\n\n useEffect(() => {\n if (!error) return;\n window.parent.postMessage(\n {\n type: \"vibex-boundary-error\",\n details: {\n message: error.message,\n stack: error.stack,\n digest: error.digest,\n name: error.name,\n },\n capturedAt: Date.now(),\n client: navigator.userAgent,\n },\n \"*\"\n );\n }, [error]);\n\n if (!error) return null;\n\n const requestAIFix = () => {\n window.parent.postMessage(\n {\n type: \"vibex-fix-with-ai\",\n details: {\n message: error.message,\n stack: error.stack,\n digest: error.digest,\n name: error.name,\n },\n capturedAt: Date.now(),\n },\n \"*\"\n );\n };\n\n return (\n <html>\n <body className=\"min-h-screen bg-background text-foreground flex items-end sm:items-center justify-center p-4 sm:p-8\">\n <div className=\"w-full max-w-lg\">\n {/* Accent bar + Card */}\n <div className=\"flex rounded-xl overflow-hidden border border-border shadow-sm\">\n <div className=\"w-1.5 bg-destructive shrink-0\" />\n <div className=\"flex-1 p-5 sm:p-6 space-y-5\">\n {/* Header row */}\n <div className=\"flex items-start justify-between gap-4\">\n <div className=\"space-y-1\">\n <p className=\"text-xs font-medium tracking-wide text-muted-foreground uppercase\">\n Runtime Error\n </p>\n <h1 className=\"text-lg font-medium leading-snug\">\n {error.name || \"Error\"}\n </h1>\n </div>\n {error.digest && (\n <code className=\"text-[10px] px-2 py-1 rounded bg-muted text-muted-foreground font-mono shrink-0\">\n {error.digest}\n </code>\n )}\n </div>\n\n {/* Error message */}\n <p className=\"text-sm text-muted-foreground leading-relaxed\">\n {error.message}\n </p>\n\n {/* Actions row */}\n <div className=\"flex items-center gap-3 pt-1\">\n <button\n onClick={requestAIFix}\n className=\"inline-flex items-center gap-2 py-2 px-4 bg-primary text-primary-foreground text-sm font-medium rounded-md hover:bg-primary/90 transition-colors\"\n >\n <svg className=\"w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M13 10V3L4 14h7v7l9-11h-7z\" />\n </svg>\n Fix with AI\n </button>\n {reset && (\n <button\n onClick={reset}\n className=\"text-sm text-muted-foreground hover:text-foreground transition-colors\"\n >\n Retry\n </button>\n )}\n </div>\n\n {/* Stack trace - dev only */}\n {process.env.NODE_ENV === \"development\" && error.stack && (\n <div className=\"pt-3 border-t border-border\">\n <pre className=\"text-[11px] font-mono text-muted-foreground leading-relaxed overflow-x-auto whitespace-pre-wrap break-all\">\n {error.stack}\n </pre>\n </div>\n )}\n </div>\n </div>\n\n {/* Footer */}\n <p className=\"mt-4 text-center text-xs text-muted-foreground/60\">\n Vibex Inspector\n </p>\n </div>\n </body>\n </html>\n );\n}\n","import { dirname, join } from 'path';\n\n/**\n * Resolves the loader path in both CJS and ESM environments\n */\nfunction resolveLoaderPath(): 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), 'next', 'element-tagger.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, '..', '..', 'next', 'element-tagger.cjs');\n }\n}\n\n/**\n * Absolute path to the element-tagger.js loader file.\n * Use this with Turbopack/Webpack loader configuration.\n *\n * @example\n * ```typescript\n * import { loaderPath } from '@vibexdotnew/inspector/next';\n *\n * const nextConfig = {\n * turbopack: {\n * rules: {\n * \"*.{jsx,tsx}\": {\n * loaders: [loaderPath]\n * }\n * }\n * }\n * };\n * ```\n *\n * @example\n * ```typescript\n * // Alternative: use require.resolve directly\n * const loaderPath = require.resolve('@vibexdotnew/inspector/next/loader.js');\n * ```\n */\nexport const loaderPath = resolveLoaderPath();\n","import type { NextConfig } from 'next';\nimport { loaderPath } from './loader';\n\nexport interface InspectorConfig {\n /**\n * File extensions to process with the element tagger.\n * @default ['jsx', 'tsx']\n */\n extensions?: string[];\n\n /**\n * Enable the inspector in production builds.\n * @default false\n */\n enableInProduction?: boolean;\n}\n\n/**\n * Wraps a Next.js config to add the Vibex Inspector element tagger loader.\n *\n * @example\n * ```typescript\n * import { withInspector } from '@vibex/inspector/next';\n *\n * const nextConfig = {\n * // your config\n * };\n *\n * export default withInspector(nextConfig);\n * ```\n */\nexport function withInspector(\n nextConfig: NextConfig = {},\n options: InspectorConfig = {}\n): NextConfig {\n const {\n extensions = ['jsx', 'tsx'],\n enableInProduction = false,\n } = options;\n\n // Skip in production unless explicitly enabled\n if (process.env.NODE_ENV === 'production' && !enableInProduction) {\n return nextConfig;\n }\n\n // Build the glob pattern for file matching\n const extPattern = extensions.length === 1\n ? extensions[0]\n : `{${extensions.join(',')}}`;\n const filePattern = `*.${extPattern}`;\n\n return {\n ...nextConfig,\n\n // Add Turbopack loader rules\n turbopack: {\n ...nextConfig.turbopack,\n rules: {\n ...nextConfig.turbopack?.rules,\n [filePattern]: {\n loaders: [loaderPath],\n },\n },\n }\n };\n}\n"],"mappings":"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","names":["useEffect","useRef","jsx","jsxs","isEmbedded"]}
|
|
1
|
+
{"version":3,"sources":["../../src/next/components/VisualInspector.tsx","../../src/next/components/Observer.tsx","../../src/next/loader.ts","../../src/next/config.ts"],"sourcesContent":["\"use client\";\n\nimport { useEffect, useReducer, useRef, useCallback } from \"react\";\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 | { channel: typeof CHANNEL; action: \"REMOVE_SELECTED\"; elementId: string };\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: \"REMOVE_SELECTED\"; elementId: string }\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 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 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 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 if (url.pathname === \"/_next/image\") {\n const real = url.searchParams.get(\"url\");\n if (real) return decodeURIComponent(real);\n }\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 \"REMOVE_SELECTED\":\n return { ...state, selectedElements: state.selectedElements.filter((sel) => sel.id !== action.elementId) };\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 function VisualInspector() {\n const [state, dispatch] = useReducer(reducer, initialState, (init) => {\n if (typeof window !== \"undefined\") {\n const stored = localStorage.getItem(STORAGE_KEY);\n return { ...init, active: stored === \"true\" };\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 localStorage.setItem(STORAGE_KEY, String(state.active));\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 alert(`Selection limit reached! You can only select up to ${MAX_SELECTIONS} elements.`);\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 localStorage.setItem(SELECTED_KEY, JSON.stringify({ ids: allSelected.map(s => s.id) }));\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 localStorage.removeItem(SELECTED_KEY);\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 case \"REMOVE_SELECTED\": {\n // Clean up editing if this element is being edited\n const removedElement = state.selectedElements.find(s => s.id === msg.elementId);\n if (removedElement?.element === editingElRef.current) {\n cleanupEditing();\n }\n\n dispatch({ type: \"REMOVE_SELECTED\", elementId: msg.elementId });\n\n // Update localStorage\n const remaining = state.selectedElements.filter(s => s.id !== msg.elementId);\n if (remaining.length > 0) {\n localStorage.setItem(SELECTED_KEY, JSON.stringify({ ids: remaining.map(s => s.id) }));\n } else {\n localStorage.removeItem(SELECTED_KEY);\n }\n\n // Emit updated selection\n if (remaining.length > 0) {\n const allInfos = remaining.map(s => buildElementInfo(s.element));\n emit({ channel: CHANNEL, event: \"SELECT\", elements: allInfos, position: { x: 0, y: 0 } });\n } else {\n emit({ channel: CHANNEL, event: \"DESELECT\" });\n }\n break;\n }\n }\n };\n\n window.addEventListener(\"message\", onMessage);\n return () => window.removeEventListener(\"message\", onMessage);\n }, [handleDeselect, buildElementInfo, state.selectedElements, cleanupEditing]);\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((e: React.MouseEvent, handle: string) => {\n if (!selectedElRef.current) return;\n e.preventDefault();\n e.stopPropagation();\n\n const rect = selectedElRef.current.getBoundingClientRect();\n resizeStartRef.current = { x: e.clientX, y: e.clientY, 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) 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) 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 embedded or not active\n if (!state.active) return null;\n\n const resizeHandles = [\"n\", \"ne\", \"e\", \"se\", \"s\", \"sw\", \"w\", \"nw\"];\n\n const getHandleStyle = (handle: string): React.CSSProperties => {\n const base: React.CSSProperties = {\n position: \"absolute\",\n width: 8,\n height: 8,\n background: \"#3b82f6\",\n border: \"1px solid white\",\n borderRadius: 2,\n zIndex: 10002,\n };\n\n const posMap: Record<string, React.CSSProperties> = {\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 <>\n {/* Hover overlay */}\n {state.hoveredRect && !state.selectedElements.some(s => s.id === state.hoveredId) && !state.isScrolling && (\n <div\n style={{\n position: \"fixed\",\n top: state.hoveredRect.top,\n left: state.hoveredRect.left,\n width: state.hoveredRect.width,\n height: state.hoveredRect.height,\n border: \"2px dashed #3b82f6\",\n background: \"rgba(59, 130, 246, 0.08)\",\n pointerEvents: \"none\",\n zIndex: 10000,\n borderRadius: 4,\n }}\n >\n {state.hoveredTag && (\n <span\n style={{\n position: \"absolute\",\n top: -22,\n left: 0,\n background: \"#3b82f6\",\n color: \"white\",\n fontSize: 11,\n padding: \"2px 6px\",\n borderRadius: 3,\n fontFamily: \"system-ui, sans-serif\",\n }}\n >\n {state.hoveredTag}\n </span>\n )}\n </div>\n )}\n\n {/* Selected overlays */}\n {!state.isScrolling && state.selectedElements.map((selected, index) => (\n <div\n key={selected.id}\n style={{\n position: \"fixed\",\n top: selected.rect.top,\n left: selected.rect.left,\n width: selected.rect.width,\n height: selected.rect.height,\n border: \"2px solid #3b82f6\",\n background: \"rgba(59, 130, 246, 0.04)\",\n pointerEvents: \"none\",\n zIndex: 10001 + index,\n borderRadius: 4,\n }}\n >\n {selected.tag && (\n <span\n style={{\n position: \"absolute\",\n top: -22,\n left: 0,\n background: \"#3b82f6\",\n color: \"white\",\n fontSize: 11,\n padding: \"2px 6px\",\n borderRadius: 3,\n fontFamily: \"system-ui, sans-serif\",\n fontWeight: 500,\n }}\n >\n {selected.tag} ({index + 1}/{state.selectedElements.length})\n </span>\n )}\n\n {/* Resize handles - only show for last selected element */}\n {index === state.selectedElements.length - 1 && resizeHandles.map((handle) => (\n <div\n key={handle}\n style={{ ...getHandleStyle(handle), pointerEvents: \"auto\" }}\n onMouseDown={(e) => onResizeStart(e, handle)}\n />\n ))}\n </div>\n ))}\n\n {/* Global styles for editing */}\n <style>{`\n [contenteditable=\"true\"]:focus {\n outline: none !important;\n }\n [contenteditable=\"true\"]::selection {\n background: rgba(59, 130, 246, 0.3);\n }\n `}</style>\n <style>{`\n nextjs-portal {\n display: none !important;\n }\n `}</style>\n </>\n );\n}\n\nexport default VisualInspector;\n","\"use client\";\n\nimport { useEffect, useRef } from \"react\";\nimport { usePathname, useSearchParams } from \"next/navigation\";\n\nexport interface ObserverProps {\n error?: Error & { digest?: string };\n reset?: () => void;\n trackNavigation?: boolean;\n appMeta?: Record<string, unknown>;\n}\n\nexport function Observer({\n error,\n reset,\n trackNavigation = true,\n appMeta,\n}: ObserverProps) {\n const previousOverlayContent = useRef(\"\");\n const monitorInterval = useRef<NodeJS.Timeout>(undefined);\n const isInitialNav = useRef(true);\n\n const pathname = usePathname();\n const searchParams = useSearchParams();\n\n // Navigation tracking\n\n if (!trackNavigation) return;\n const isEmbedded = window.parent !== window;\n useEffect(() => {\n console.log(\n { pathname, searchParams, trackNavigation, appMeta, isEmbedded }\n )\n if (!isEmbedded) return;\n\n const queryObj: Record<string, string> = {};\n searchParams.forEach((val, key) => {\n queryObj[key] = val;\n });\n\n const href = searchParams.toString()\n ? `${pathname}?${searchParams.toString()}`\n : pathname;\n\n window.parent.postMessage(\n {\n type: \"VIBEX_NAVIGATION\",\n route: {\n path: pathname,\n query: Object.keys(queryObj).length > 0 ? queryObj : null,\n href,\n },\n context: {\n initial: isInitialNav.current,\n timestamp: Date.now(),\n ...appMeta,\n },\n },\n \"*\"\n );\n\n isInitialNav.current = false;\n }, [pathname, searchParams, trackNavigation, appMeta]);\n\n // Error monitoring\n useEffect(() => {\n const isEmbedded = window.parent !== window;\n if (!isEmbedded) return;\n\n const dispatch = (data: unknown) => window.parent.postMessage(data, \"*\");\n\n const handleRuntimeError = (evt: ErrorEvent) =>\n dispatch({\n type: \"VIBEX_EXCEPTION\",\n details: {\n message: evt.message,\n stack: evt.error?.stack,\n file: evt.filename,\n line: evt.lineno,\n column: evt.colno,\n origin: \"runtime\",\n },\n capturedAt: Date.now(),\n });\n\n const handlePromiseError = (evt: PromiseRejectionEvent) =>\n dispatch({\n type: \"VIBEX_EXCEPTION\",\n details: {\n message: evt.reason?.message ?? String(evt.reason),\n stack: evt.reason?.stack,\n origin: \"promise\",\n },\n capturedAt: Date.now(),\n });\n\n const checkDevOverlay = () => {\n const overlayEl = document.querySelector(\"[data-nextjs-dialog-overlay]\");\n const contentEl =\n overlayEl?.querySelector(\n \"h1, h2, .error-message, [data-nextjs-dialog-body]\"\n ) ?? null;\n const content = contentEl?.textContent ?? contentEl?.innerHTML ?? \"\";\n if (content && content !== previousOverlayContent.current) {\n previousOverlayContent.current = content;\n dispatch({\n type: \"VIBEX_EXCEPTION\",\n details: { message: content, origin: \"dev-overlay\" },\n capturedAt: Date.now(),\n });\n }\n };\n\n window.addEventListener(\"error\", handleRuntimeError);\n window.addEventListener(\"unhandledrejection\", handlePromiseError);\n monitorInterval.current = setInterval(checkDevOverlay, 1000);\n\n return () => {\n window.removeEventListener(\"error\", handleRuntimeError);\n window.removeEventListener(\"unhandledrejection\", handlePromiseError);\n monitorInterval.current && clearInterval(monitorInterval.current);\n };\n }, []);\n\n useEffect(() => {\n if (!error) return;\n window.parent.postMessage(\n {\n type: \"vibex-boundary-error\",\n details: {\n message: error.message,\n stack: error.stack,\n digest: error.digest,\n name: error.name,\n },\n capturedAt: Date.now(),\n client: navigator.userAgent,\n },\n \"*\"\n );\n }, [error]);\n\n if (!error) return null;\n\n const requestAIFix = () => {\n window.parent.postMessage(\n {\n type: \"vibex-fix-with-ai\",\n details: {\n message: error.message,\n stack: error.stack,\n digest: error.digest,\n name: error.name,\n },\n capturedAt: Date.now(),\n },\n \"*\"\n );\n };\n\n return (\n <html>\n <body className=\"min-h-screen bg-background text-foreground flex items-end sm:items-center justify-center p-4 sm:p-8\">\n <div className=\"w-full max-w-lg\">\n {/* Accent bar + Card */}\n <div className=\"flex rounded-xl overflow-hidden border border-border shadow-sm\">\n <div className=\"w-1.5 bg-destructive shrink-0\" />\n <div className=\"flex-1 p-5 sm:p-6 space-y-5\">\n {/* Header row */}\n <div className=\"flex items-start justify-between gap-4\">\n <div className=\"space-y-1\">\n <p className=\"text-xs font-medium tracking-wide text-muted-foreground uppercase\">\n Runtime Error\n </p>\n <h1 className=\"text-lg font-medium leading-snug\">\n {error.name || \"Error\"}\n </h1>\n </div>\n {error.digest && (\n <code className=\"text-[10px] px-2 py-1 rounded bg-muted text-muted-foreground font-mono shrink-0\">\n {error.digest}\n </code>\n )}\n </div>\n\n {/* Error message */}\n <p className=\"text-sm text-muted-foreground leading-relaxed\">\n {error.message}\n </p>\n\n {/* Actions row */}\n <div className=\"flex items-center gap-3 pt-1\">\n <button\n onClick={requestAIFix}\n className=\"inline-flex items-center gap-2 py-2 px-4 bg-primary text-primary-foreground text-sm font-medium rounded-md hover:bg-primary/90 transition-colors\"\n >\n <svg className=\"w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M13 10V3L4 14h7v7l9-11h-7z\" />\n </svg>\n Fix with AI\n </button>\n {reset && (\n <button\n onClick={reset}\n className=\"text-sm text-muted-foreground hover:text-foreground transition-colors\"\n >\n Retry\n </button>\n )}\n </div>\n\n {/* Stack trace - dev only */}\n {process.env.NODE_ENV === \"development\" && error.stack && (\n <div className=\"pt-3 border-t border-border\">\n <pre className=\"text-[11px] font-mono text-muted-foreground leading-relaxed overflow-x-auto whitespace-pre-wrap break-all\">\n {error.stack}\n </pre>\n </div>\n )}\n </div>\n </div>\n\n {/* Footer */}\n <p className=\"mt-4 text-center text-xs text-muted-foreground/60\">\n Vibex Inspector\n </p>\n </div>\n </body>\n </html>\n );\n}\n","import { dirname, join } from 'path';\n\n/**\n * Resolves the loader path in both CJS and ESM environments\n */\nfunction resolveLoaderPath(): 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), 'next', 'element-tagger.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, '..', '..', 'next', 'element-tagger.js');\n }\n}\n\n/**\n * Absolute path to the element-tagger.js loader file.\n * Use this with Turbopack/Webpack loader configuration.\n *\n * @example\n * ```typescript\n * import { loaderPath } from '@vibexdotnew/inspector/next';\n *\n * const nextConfig = {\n * turbopack: {\n * rules: {\n * \"*.{jsx,tsx}\": {\n * loaders: [loaderPath]\n * }\n * }\n * }\n * };\n * ```\n *\n * @example\n * ```typescript\n * // Alternative: use require.resolve directly\n * const loaderPath = require.resolve('@vibexdotnew/inspector/next/loader.js');\n * ```\n */\nexport const loaderPath = resolveLoaderPath();\n","import type { NextConfig } from 'next';\nimport { loaderPath } from './loader';\n\nexport interface InspectorConfig {\n /**\n * File extensions to process with the element tagger.\n * @default ['jsx', 'tsx']\n */\n extensions?: string[];\n\n /**\n * Enable the inspector in production builds.\n * @default false\n */\n enableInProduction?: boolean;\n}\n\n/**\n * Wraps a Next.js config to add the Vibex Inspector element tagger loader.\n *\n * @example\n * ```typescript\n * import { withInspector } from '@vibex/inspector/next';\n *\n * const nextConfig = {\n * // your config\n * };\n *\n * export default withInspector(nextConfig);\n * ```\n */\nexport function withInspector(\n nextConfig: NextConfig = {},\n options: InspectorConfig = {}\n): NextConfig {\n const {\n extensions = ['jsx', 'tsx'],\n enableInProduction = false,\n } = options;\n\n // Skip in production unless explicitly enabled\n if (process.env.NODE_ENV === 'production' && !enableInProduction) {\n return nextConfig;\n }\n\n // Build the glob pattern for file matching\n const extPattern = extensions.length === 1\n ? extensions[0]\n : `{${extensions.join(',')}}`;\n const filePattern = `*.${extPattern}`;\n\n return {\n ...nextConfig,\n\n // Add Turbopack loader rules\n turbopack: {\n ...nextConfig.turbopack,\n rules: {\n ...nextConfig.turbopack?.rules,\n [filePattern]: {\n loaders: [loaderPath],\n },\n },\n }\n };\n}\n"],"mappings":"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","names":["useEffect","useRef","jsx","jsxs","isEmbedded"]}
|
package/dist/next/loader.cjs
CHANGED
|
@@ -39,11 +39,11 @@ var import_meta = {};
|
|
|
39
39
|
function resolveLoaderPath() {
|
|
40
40
|
try {
|
|
41
41
|
const pkgPath = require.resolve("@vibexdotnew/inspector/package.json");
|
|
42
|
-
return (0, import_path.join)((0, import_path.dirname)(pkgPath), "next", "element-tagger.
|
|
42
|
+
return (0, import_path.join)((0, import_path.dirname)(pkgPath), "next", "element-tagger.js");
|
|
43
43
|
} catch {
|
|
44
44
|
const { fileURLToPath } = require("url");
|
|
45
45
|
const currentDir = (0, import_path.dirname)(fileURLToPath(import_meta.url));
|
|
46
|
-
return (0, import_path.join)(currentDir, "..", "..", "next", "element-tagger.
|
|
46
|
+
return (0, import_path.join)(currentDir, "..", "..", "next", "element-tagger.js");
|
|
47
47
|
}
|
|
48
48
|
}
|
|
49
49
|
var loaderPath = resolveLoaderPath();
|
package/dist/next/loader.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/next/loader.ts"],"sourcesContent":["import { dirname, join } from 'path';\n\n/**\n * Resolves the loader path in both CJS and ESM environments\n */\nfunction resolveLoaderPath(): 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), 'next', 'element-tagger.
|
|
1
|
+
{"version":3,"sources":["../../src/next/loader.ts"],"sourcesContent":["import { dirname, join } from 'path';\n\n/**\n * Resolves the loader path in both CJS and ESM environments\n */\nfunction resolveLoaderPath(): 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), 'next', 'element-tagger.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, '..', '..', 'next', 'element-tagger.js');\n }\n}\n\n/**\n * Absolute path to the element-tagger.js loader file.\n * Use this with Turbopack/Webpack loader configuration.\n *\n * @example\n * ```typescript\n * import { loaderPath } from '@vibexdotnew/inspector/next';\n *\n * const nextConfig = {\n * turbopack: {\n * rules: {\n * \"*.{jsx,tsx}\": {\n * loaders: [loaderPath]\n * }\n * }\n * }\n * };\n * ```\n *\n * @example\n * ```typescript\n * // Alternative: use require.resolve directly\n * const loaderPath = require.resolve('@vibexdotnew/inspector/next/loader.js');\n * ```\n */\nexport const loaderPath = resolveLoaderPath();\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAA8B;AAA9B;AAKA,SAAS,oBAA4B;AACjC,MAAI;AAGA,UAAM,UAAU,gBAAgB,qCAAqC;AACrE,eAAO,sBAAK,qBAAQ,OAAO,GAAG,QAAQ,mBAAmB;AAAA,EAC7D,QAAQ;AAGJ,UAAM,EAAE,cAAc,IAAI,QAAQ,KAAK;AACvC,UAAM,iBAAa,qBAAQ,cAAc,YAAY,GAAG,CAAC;AACzD,eAAO,kBAAK,YAAY,MAAM,MAAM,QAAQ,mBAAmB;AAAA,EACnE;AACJ;AA2BO,IAAM,aAAa,kBAAkB;","names":[]}
|
package/dist/next/loader.js
CHANGED
|
@@ -11,11 +11,11 @@ import { dirname, join } from "path";
|
|
|
11
11
|
function resolveLoaderPath() {
|
|
12
12
|
try {
|
|
13
13
|
const pkgPath = __require.resolve("@vibexdotnew/inspector/package.json");
|
|
14
|
-
return join(dirname(pkgPath), "next", "element-tagger.
|
|
14
|
+
return join(dirname(pkgPath), "next", "element-tagger.js");
|
|
15
15
|
} catch {
|
|
16
16
|
const { fileURLToPath } = __require("url");
|
|
17
17
|
const currentDir = dirname(fileURLToPath(import.meta.url));
|
|
18
|
-
return join(currentDir, "..", "..", "next", "element-tagger.
|
|
18
|
+
return join(currentDir, "..", "..", "next", "element-tagger.js");
|
|
19
19
|
}
|
|
20
20
|
}
|
|
21
21
|
var loaderPath = resolveLoaderPath();
|
package/dist/next/loader.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/next/loader.ts"],"sourcesContent":["import { dirname, join } from 'path';\n\n/**\n * Resolves the loader path in both CJS and ESM environments\n */\nfunction resolveLoaderPath(): 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), 'next', 'element-tagger.
|
|
1
|
+
{"version":3,"sources":["../../src/next/loader.ts"],"sourcesContent":["import { dirname, join } from 'path';\n\n/**\n * Resolves the loader path in both CJS and ESM environments\n */\nfunction resolveLoaderPath(): 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), 'next', 'element-tagger.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, '..', '..', 'next', 'element-tagger.js');\n }\n}\n\n/**\n * Absolute path to the element-tagger.js loader file.\n * Use this with Turbopack/Webpack loader configuration.\n *\n * @example\n * ```typescript\n * import { loaderPath } from '@vibexdotnew/inspector/next';\n *\n * const nextConfig = {\n * turbopack: {\n * rules: {\n * \"*.{jsx,tsx}\": {\n * loaders: [loaderPath]\n * }\n * }\n * }\n * };\n * ```\n *\n * @example\n * ```typescript\n * // Alternative: use require.resolve directly\n * const loaderPath = require.resolve('@vibexdotnew/inspector/next/loader.js');\n * ```\n */\nexport const loaderPath = resolveLoaderPath();\n"],"mappings":";;;;;;;;;AAAA,SAAS,SAAS,YAAY;AAK9B,SAAS,oBAA4B;AACjC,MAAI;AAGA,UAAM,UAAU,UAAQ,QAAQ,qCAAqC;AACrE,WAAO,KAAK,QAAQ,OAAO,GAAG,QAAQ,mBAAmB;AAAA,EAC7D,QAAQ;AAGJ,UAAM,EAAE,cAAc,IAAI,UAAQ,KAAK;AACvC,UAAM,aAAa,QAAQ,cAAc,YAAY,GAAG,CAAC;AACzD,WAAO,KAAK,YAAY,MAAM,MAAM,QAAQ,mBAAmB;AAAA,EACnE;AACJ;AA2BO,IAAM,aAAa,kBAAkB;","names":[]}
|