@vibexdotnew/inspector 0.0.8 → 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/next/element-tagger.js +461 -0
- package/package.json +2 -2
- package/next/element-tagger.cjs +0 -372
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();
|