@bcdflow/dev-inspector 2.0.0
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/bin/cli.js +244 -0
- package/dist/client/dev-inspector.js +7065 -0
- package/dist/client/dev-inspector.js.map +7 -0
- package/dist/mcp/server.js +189 -0
- package/dist/mcp/server.js.map +7 -0
- package/dist/middleware/index.js +444 -0
- package/dist/middleware/index.js.map +7 -0
- package/package.json +42 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/shared/constants.ts", "../../src/shared/selectors.ts", "../../src/content/inspect.ts", "../../src/shared/event-bus.ts", "../../src/content/core.ts", "inline-css:styles", "../../src/content/index.ts", "../../src/content/overlay.ts", "../../src/content/panel.ts", "../../src/shared/formatters.ts", "../../src/content/drag.ts", "../../src/content/annotate.ts", "../../src/content/animation.ts", "../../src/content/keyboard.ts", "../../src/content/theme.ts", "../../src/content/react-inspector.ts", "../../src/content/bridge.ts", "../../src/content/inline-popup.ts"],
|
|
4
|
+
"sourcesContent": ["import type { OutputMode, AnnotationIntent, AnnotationSeverity } from './types';\n\nexport const MODE_ORDER: OutputMode[] = ['compact', 'standard', 'detailed', 'forensic'];\nexport const MODE_LABELS: Record<OutputMode, string> = {\n compact: 'Compact',\n standard: 'Standard',\n detailed: 'Detailed',\n forensic: 'Forensic',\n};\n\nexport const HIGHLIGHT_CLASS = 'di-selected-highlight';\n\nexport const INSPECT_STYLES_BASIC = [\n 'display', 'position', 'width', 'height', 'padding', 'margin',\n 'font-size', 'font-weight', 'color', 'background-color',\n 'border', 'border-radius', 'z-index', 'opacity',\n];\n\nexport const INSPECT_STYLES_EXTENDED: Record<string, string[]> = {\n layout: ['flex-direction', 'flex-wrap', 'justify-content', 'align-items', 'align-self', 'gap', 'overflow', 'box-sizing'],\n grid: ['grid-template-columns', 'grid-template-rows', 'grid-gap'],\n text: ['font-family', 'line-height', 'letter-spacing', 'text-align', 'text-decoration', 'text-transform', 'white-space', 'word-break'],\n visual: ['box-shadow', 'outline', 'transform', 'transition', 'cursor', 'visibility', 'pointer-events'],\n misc: ['content', 'list-style', 'table-layout'],\n};\n\nexport const EXTENDED_CAT_LABELS: Record<string, string> = {\n layout: 'Layout', grid: 'Grid', text: 'Text', visual: 'Visual', misc: 'Misc',\n};\n\nexport const COLOR_PRESETS = [\n { label: 'Accent', color: '#7c8cf5' },\n { label: 'Red', color: '#ff6b6b' },\n { label: 'Green', color: '#34c759' },\n { label: 'Orange', color: '#ff9f43' },\n { label: 'Yellow', color: '#feca57' },\n { label: 'Cyan', color: '#48dbfb' },\n];\n\n// ========== Intent / Severity (Agentation pattern) ==========\nexport const INTENT_OPTIONS: { value: AnnotationIntent; label: string; icon: string }[] = [\n { value: 'fix', label: 'Fix', icon: '\\uD83D\\uDD27' },\n { value: 'change', label: 'Change', icon: '\\u270F\\uFE0F' },\n { value: 'question', label: 'Question', icon: '\\u2753' },\n { value: 'approve', label: 'Approve', icon: '\\u2705' },\n];\n\nexport const SEVERITY_OPTIONS: { value: AnnotationSeverity; label: string; color: string }[] = [\n { value: 'blocking', label: 'Blocking', color: '#ff6b6b' },\n { value: 'important', label: 'Important', color: '#ff9f43' },\n { value: 'suggestion', label: 'Suggestion', color: '#48dbfb' },\n];\n\nexport const DEFAULT_SETTINGS = {\n theme: 'dark' as const,\n outputMode: 'standard' as OutputMode,\n markersVisible: true,\n markerColor: '#7c8cf5',\n clearOnCopy: false,\n blockInteractions: false,\n webhookUrl: '',\n reactMode: true,\n panelMode: 'developer' as const,\n};\n", "const INSPECTOR_IDS = new Set([\n 'dev-inspector-host', 'dev-inspector-overlay', 'dev-inspector-panel',\n 'dev-inspector-toggle', 'di-area-select-rect',\n]);\n\nexport function isInspectorElement(el: Element | null): boolean {\n if (!el) return false;\n let node: Element | null = el;\n while (node) {\n if (node.shadowRoot) return false; // crossed shadow boundary\n const id = node.id || node.getAttribute?.('id');\n if (id && INSPECTOR_IDS.has(id)) return true;\n // Check if inside our shadow DOM host\n const root = node.getRootNode();\n if (root instanceof ShadowRoot && root.host?.id === 'dev-inspector-host') return true;\n node = node.parentElement;\n }\n return false;\n}\n\nexport function getSelector(el: Element): string {\n if (el.id) return `#${el.id}`;\n const parts: string[] = [];\n let current: Element | null = el;\n while (current && current !== document.body && parts.length < 4) {\n let part = current.tagName.toLowerCase();\n if (current.id) { parts.unshift(`#${current.id}`); break; }\n if (current.className && typeof current.className === 'string') {\n const cls = current.className.trim().split(/\\s+/)\n .filter(c => !c.startsWith('dip-') && !c.startsWith('dev-inspector') && !c.startsWith('di-'))\n .slice(0, 2).join('.');\n if (cls) part += `.${cls}`;\n }\n const parent = current.parentElement;\n if (parent) {\n const siblings = Array.from(parent.children).filter(s => s.tagName === current!.tagName);\n if (siblings.length > 1) part += `:nth-child(${siblings.indexOf(current) + 1})`;\n }\n parts.unshift(part);\n current = current.parentElement;\n }\n return parts.join(' > ');\n}\n\nfunction isAutoGeneratedId(id: string): boolean {\n if (/^:r[0-9a-z]+:$/i.test(id)) return true;\n if (/^(cdk-|ng-|_next-|radix-)/.test(id)) return true;\n if (/^[0-9a-f]{8,}$/i.test(id)) return true;\n if (/^\\d+$/.test(id)) return true;\n return false;\n}\n\nexport function getSmartSelector(el: Element): string {\n if (el.id && !isAutoGeneratedId(el.id)) return `#${el.id}`;\n const testId = el.getAttribute('data-testid') || el.getAttribute('data-test-id');\n if (testId) return `[data-testid=\"${testId}\"]`;\n const ariaLabel = el.getAttribute('aria-label');\n if (ariaLabel) return `[aria-label=\"${ariaLabel}\"]`;\n const tag = el.tagName.toLowerCase();\n if ((tag === 'button' || tag === 'a') && el.textContent) {\n const text = el.textContent.trim().substring(0, 30);\n if (text && !text.includes('\\n')) return `${tag}:text(\"${text}\")`;\n }\n if (tag === 'img' && (el as HTMLImageElement).alt) {\n return `img[alt=\"${(el as HTMLImageElement).alt.substring(0, 40)}\"]`;\n }\n const role = el.getAttribute('role');\n if (role) {\n const name = el.textContent?.trim().substring(0, 20);\n return name && !name.includes('\\n') ? `[role=\"${role}\"]:text(\"${name}\")` : `[role=\"${role}\"]`;\n }\n return getSelector(el);\n}\n\nexport function getHierarchy(el: Element): Array<{ label: string; isCurrent: boolean; el: Element }> {\n const chain: Array<{ label: string; isCurrent: boolean; el: Element }> = [];\n let current: Element | null = el;\n while (current && current !== document.documentElement && chain.length < 6) {\n let label = current.tagName.toLowerCase();\n if (current.id) label += `#${current.id}`;\n else if (current.className && typeof current.className === 'string') {\n const cls = current.className.trim().split(/\\s+/).filter(c => !c.startsWith('dip-')).slice(0, 2).join('.');\n if (cls) label += `.${cls}`;\n }\n chain.unshift({ label, isCurrent: current === el, el: current });\n current = current.parentElement;\n }\n return chain;\n}\n\nexport function getClassString(el: Element): string {\n if (!el.className || typeof el.className !== 'string') return '';\n return el.className.trim().split(/\\s+/).filter(c => !c.startsWith('dip-') && !c.startsWith('di-')).join(' ');\n}\n", "import { INSPECT_STYLES_BASIC, INSPECT_STYLES_EXTENDED } from '../shared/constants';\nimport type { StyleEntry, AccessibilityInfo } from '../shared/types';\nimport { isInspectorElement } from '../shared/selectors';\n\nexport function getComputedStyles(el: Element, extended?: boolean): StyleEntry[] | { basic: StyleEntry[]; categories: Record<string, StyleEntry[]> } {\n const cs = window.getComputedStyle(el);\n const isDefault = (val: string) => !val || val === 'none' || val === 'normal'\n || val === 'auto' || val === '0px' || val === 'rgba(0, 0, 0, 0)' || val === 'rgb(0, 0, 0)';\n const basic: StyleEntry[] = [];\n for (const prop of INSPECT_STYLES_BASIC) {\n const val = cs.getPropertyValue(prop);\n if (!isDefault(val)) basic.push({ prop, val });\n }\n if (!extended) return basic;\n const categories: Record<string, StyleEntry[]> = {};\n for (const [cat, props] of Object.entries(INSPECT_STYLES_EXTENDED)) {\n const items: StyleEntry[] = [];\n for (const prop of props) {\n const val = cs.getPropertyValue(prop);\n if (!isDefault(val)) items.push({ prop, val });\n }\n if (items.length) categories[cat] = items;\n }\n return { basic, categories };\n}\n\nexport function getBoundingInfo(el: Element): string {\n const r = el.getBoundingClientRect();\n return `${Math.round(r.width)} x ${Math.round(r.height)} @ (${Math.round(r.left)}, ${Math.round(r.top)})`;\n}\n\nexport function getBoundingRect(el: Element): { x: number; y: number; width: number; height: number } {\n const r = el.getBoundingClientRect();\n return { x: Math.round(r.x), y: Math.round(r.y), width: Math.round(r.width), height: Math.round(r.height) };\n}\n\nexport function escapeHtml(str: string): string {\n const div = document.createElement('div');\n div.textContent = str;\n return div.innerHTML;\n}\n\n// ========== Accessibility Info (Agentation pattern) ==========\nexport function getAccessibilityInfo(el: Element): AccessibilityInfo | undefined {\n const info: AccessibilityInfo = {};\n let hasData = false;\n\n const role = el.getAttribute('role');\n if (role) { info.role = role; hasData = true; }\n\n const ariaLabel = el.getAttribute('aria-label');\n if (ariaLabel) { info.ariaLabel = ariaLabel; hasData = true; }\n\n const ariaDescribedBy = el.getAttribute('aria-describedby');\n if (ariaDescribedBy) { info.ariaDescribedBy = ariaDescribedBy; hasData = true; }\n\n const ariaExpanded = el.getAttribute('aria-expanded');\n if (ariaExpanded !== null) { info.ariaExpanded = ariaExpanded; hasData = true; }\n\n const ariaHidden = el.getAttribute('aria-hidden');\n if (ariaHidden !== null) { info.ariaHidden = ariaHidden; hasData = true; }\n\n const ariaLive = el.getAttribute('aria-live');\n if (ariaLive) { info.ariaLive = ariaLive; hasData = true; }\n\n const tabIndex = el.getAttribute('tabindex');\n if (tabIndex !== null) { info.tabIndex = tabIndex; hasData = true; }\n\n const alt = (el as HTMLImageElement).alt;\n if (alt) { info.altText = alt; hasData = true; }\n\n const title = el.getAttribute('title');\n if (title) { info.title = title; hasData = true; }\n\n return hasData ? info : undefined;\n}\n\n// ========== Nearby Text Context ==========\nexport function getNearbyText(el: Element): string {\n const texts: string[] = [];\n\n // Previous sibling text\n const prev = el.previousElementSibling;\n if (prev && !isInspectorElement(prev)) {\n const t = prev.textContent?.trim().substring(0, 50);\n if (t) texts.push(`[prev] ${t}`);\n }\n\n // Next sibling text\n const next = el.nextElementSibling;\n if (next && !isInspectorElement(next)) {\n const t = next.textContent?.trim().substring(0, 50);\n if (t) texts.push(`[next] ${t}`);\n }\n\n // Parent label text\n const parent = el.parentElement;\n if (parent) {\n const label = parent.querySelector('label');\n if (label && label !== el) {\n const t = label.textContent?.trim().substring(0, 50);\n if (t) texts.push(`[label] ${t}`);\n }\n }\n\n return texts.join(' | ');\n}\n\n// ========== Nearby Elements ==========\nexport function getNearbyElements(el: Element): string[] {\n const result: string[] = [];\n const parent = el.parentElement;\n if (!parent) return result;\n\n const siblings = Array.from(parent.children).filter(\n c => c !== el && !isInspectorElement(c) && c.tagName !== 'SCRIPT' && c.tagName !== 'STYLE'\n );\n\n for (const sib of siblings.slice(0, 5)) {\n let desc = sib.tagName.toLowerCase();\n if (sib.id) desc += `#${sib.id}`;\n else if (sib.className && typeof sib.className === 'string') {\n const cls = sib.className.trim().split(/\\s+/).filter(c => !c.startsWith('di-')).slice(0, 2).join('.');\n if (cls) desc += `.${cls}`;\n }\n const text = sib.textContent?.trim().substring(0, 30);\n if (text) desc += ` \"${text}\"`;\n result.push(desc);\n }\n\n return result;\n}\n\n// ========== Source File Detection Hint ==========\nexport function getSourceFileHint(el: Element): string | undefined {\n // Check for common dev-tool source annotations\n // Vite/React dev tools add data attributes\n let node: Element | null = el;\n while (node) {\n // React source (added by babel plugin)\n const source = node.getAttribute('data-source') ||\n node.getAttribute('data-source-file') ||\n node.getAttribute('__source');\n if (source) return source;\n\n // Next.js dev mode\n const nextSource = node.getAttribute('data-nextjs-source');\n if (nextSource) return nextSource;\n\n node = node.parentElement;\n if (node === document.body) break;\n }\n return undefined;\n}\n", "type Handler = (data?: unknown) => void;\n\nconst listeners: Record<string, Handler[]> = {};\n\nexport function on(event: string, handler: Handler): void {\n (listeners[event] = listeners[event] || []).push(handler);\n}\n\nexport function off(event: string, handler: Handler): void {\n if (!listeners[event]) return;\n listeners[event] = listeners[event].filter(h => h !== handler);\n}\n\nexport function emit(event: string, data?: unknown): void {\n (listeners[event] || []).forEach(h => h(data));\n}\n", "import type { InspectorState, SelectionItem, AnnotationIntent, AnnotationSeverity, ThreadMessage, WebhookEvent, SerializedAnnotation } from '../shared/types';\nimport { DEFAULT_SETTINGS, HIGHLIGHT_CLASS } from '../shared/constants';\nimport { getSelector, getSmartSelector } from '../shared/selectors';\nimport { getBoundingRect, getAccessibilityInfo, getNearbyText, getNearbyElements, getSourceFileHint } from './inspect';\nimport * as bus from '../shared/event-bus';\n\nlet annotationCounter = 0;\n\nfunction generateId(): string {\n return `ann_${Date.now()}_${(++annotationCounter).toString(36)}`;\n}\n\nfunction generateSessionId(): string {\n return `session_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;\n}\n\nexport const state: InspectorState = {\n isActive: false,\n selectedElements: [],\n hoveredElement: null,\n animationsPaused: false,\n theme: DEFAULT_SETTINGS.theme,\n outputMode: DEFAULT_SETTINGS.outputMode,\n markersVisible: DEFAULT_SETTINGS.markersVisible,\n markerColor: DEFAULT_SETTINGS.markerColor,\n clearOnCopy: DEFAULT_SETTINGS.clearOnCopy,\n blockInteractions: DEFAULT_SETTINGS.blockInteractions,\n webhookUrl: DEFAULT_SETTINGS.webhookUrl,\n reactMode: DEFAULT_SETTINGS.reactMode,\n panelMode: DEFAULT_SETTINGS.panelMode,\n _mcpConnected: false,\n _areaDragging: false,\n _initialized: false,\n isPro: false,\n sessionId: generateSessionId(),\n sessionCreatedAt: Date.now(),\n};\n\n// \uBBF8\uB4E4\uC6E8\uC5B4\uC758 /license-status \uC870\uD68C\uD558\uC5EC Pro \uC0C1\uD0DC \uACB0\uC815\nexport function checkProStatus(): void {\n const base = (window as any).__DEV_INSPECTOR_BASE__ || '/api/v1/dev-inspector';\n fetch(`${base}/license-status`)\n .then(res => res.json())\n .then(data => {\n state.isPro = data.tier === 'pro';\n })\n .catch(() => {\n state.isPro = false;\n });\n}\n\n// Load settings from localStorage\nexport async function loadSettings(): Promise<void> {\n try {\n const saved = localStorage.getItem('dev-inspector-settings');\n if (!saved) return;\n const data = JSON.parse(saved);\n if (data.theme) state.theme = data.theme;\n if (data.outputMode) state.outputMode = data.outputMode;\n if (data.markersVisible !== undefined) state.markersVisible = data.markersVisible;\n if (data.markerColor) state.markerColor = data.markerColor;\n if (data.clearOnCopy !== undefined) state.clearOnCopy = data.clearOnCopy;\n if (data.blockInteractions !== undefined) state.blockInteractions = data.blockInteractions;\n if (data.webhookUrl) state.webhookUrl = data.webhookUrl;\n if (data.reactMode !== undefined) state.reactMode = data.reactMode;\n if (data.panelMode) state.panelMode = data.panelMode;\n } catch {\n // Storage unavailable, use defaults\n }\n}\n\nexport function saveSetting(key: string, value: unknown): void {\n try {\n const saved = localStorage.getItem('dev-inspector-settings');\n const data = saved ? JSON.parse(saved) : {};\n data[key] = value;\n localStorage.setItem('dev-inspector-settings', JSON.stringify(data));\n } catch {\n // Ignore storage errors\n }\n}\n\n// ========== Selection Highlights ==========\nexport function syncHighlights(): void {\n document.querySelectorAll(`.${HIGHLIGHT_CLASS}`).forEach(el => {\n el.classList.remove(HIGHLIGHT_CLASS);\n });\n if (!state.isActive || !state.markersVisible) return;\n state.selectedElements.forEach(item => {\n if (item.type === 'element' && item.el && item.el.classList) {\n item.el.classList.add(HIGHLIGHT_CLASS);\n }\n });\n}\n\n// ========== Annotation Factory ==========\nexport function createAnnotationMeta() {\n return {\n id: generateId(),\n note: '',\n intent: undefined as AnnotationIntent | undefined,\n severity: undefined as AnnotationSeverity | undefined,\n status: 'pending' as const,\n thread: [] as ThreadMessage[],\n createdAt: Date.now(),\n };\n}\n\n// ========== Selection Management ==========\nexport function addSelection(item: SelectionItem): void {\n // Ensure annotation metadata\n if (!item.id) Object.assign(item, createAnnotationMeta());\n state.selectedElements.push(item);\n syncHighlights();\n bus.emit('selectionChanged', state.selectedElements);\n emitWebhookEvent('annotation.add', item);\n emitSSEEvent('annotation.created', serializeAnnotation(item));\n}\n\nexport function removeSelection(idx: number): void {\n const removed = state.selectedElements[idx];\n state.selectedElements.splice(idx, 1);\n syncHighlights();\n bus.emit('selectionChanged', state.selectedElements);\n if (removed) {\n emitWebhookEvent('annotation.delete', removed);\n emitSSEEvent('annotation.deleted', serializeAnnotation(removed));\n }\n}\n\nexport function clearSelections(): void {\n const cleared = [...state.selectedElements];\n state.selectedElements = [];\n syncHighlights();\n bus.emit('selectionChanged', state.selectedElements);\n emitWebhookEvent('annotations.clear', undefined, cleared);\n emitSSEEvent('annotation.deleted', { cleared: cleared.length });\n}\n\nexport function updateAnnotation(id: string, updates: Partial<SelectionItem>): SelectionItem | null {\n const item = state.selectedElements.find(i => i.id === id);\n if (!item) return null;\n Object.assign(item, updates);\n bus.emit('selectionChanged', state.selectedElements);\n emitWebhookEvent('annotation.update', item);\n emitSSEEvent('annotation.updated', serializeAnnotation(item));\n return item;\n}\n\n// ========== Annotation Lifecycle (Agentation pattern) ==========\nexport function acknowledgeAnnotation(id: string): SelectionItem | null {\n const item = state.selectedElements.find(i => i.id === id);\n if (!item || item.status !== 'pending') return null;\n item.status = 'acknowledged';\n bus.emit('selectionChanged', state.selectedElements);\n emitSSEEvent('annotation.acknowledged', serializeAnnotation(item));\n return item;\n}\n\nexport function resolveAnnotation(id: string, summary?: string): SelectionItem | null {\n const item = state.selectedElements.find(i => i.id === id);\n if (!item) return null;\n item.status = 'resolved';\n item.resolvedAt = new Date().toISOString();\n item.resolvedBy = 'agent';\n if (summary) item.note = summary;\n bus.emit('selectionChanged', state.selectedElements);\n emitWebhookEvent('annotation.resolved', item);\n emitSSEEvent('annotation.resolved', serializeAnnotation(item));\n return item;\n}\n\nexport function dismissAnnotation(id: string, reason: string): SelectionItem | null {\n const item = state.selectedElements.find(i => i.id === id);\n if (!item) return null;\n item.status = 'dismissed';\n item.dismissReason = reason;\n bus.emit('selectionChanged', state.selectedElements);\n emitWebhookEvent('annotation.dismissed', item);\n emitSSEEvent('annotation.dismissed', serializeAnnotation(item));\n return item;\n}\n\nexport function addThreadMessage(id: string, role: 'human' | 'agent', content: string): ThreadMessage | null {\n const item = state.selectedElements.find(i => i.id === id);\n if (!item) return null;\n const msg: ThreadMessage = {\n id: `msg_${Date.now()}_${Math.random().toString(36).slice(2, 6)}`,\n role,\n content,\n timestamp: Date.now(),\n };\n item.thread.push(msg);\n bus.emit('selectionChanged', state.selectedElements);\n emitSSEEvent('thread.message', { annotationId: id, message: msg });\n return msg;\n}\n\nexport function setAnnotationIntent(id: string, intent: AnnotationIntent): void {\n const item = state.selectedElements.find(i => i.id === id);\n if (item) {\n item.intent = intent;\n bus.emit('selectionChanged', state.selectedElements);\n }\n}\n\nexport function setAnnotationSeverity(id: string, severity: AnnotationSeverity): void {\n const item = state.selectedElements.find(i => i.id === id);\n if (item) {\n item.severity = severity;\n bus.emit('selectionChanged', state.selectedElements);\n }\n}\n\n// ========== Serialize Annotation for MCP/Webhook ==========\nexport function serializeAnnotation(item: SelectionItem): SerializedAnnotation {\n const base: SerializedAnnotation = {\n id: item.id,\n type: item.type === 'text-selection' ? 'text' : item.type === 'area' ? 'area' : 'element',\n comment: item.note,\n intent: item.intent,\n severity: item.severity,\n status: item.status,\n thread: item.thread,\n createdAt: item.createdAt,\n resolvedAt: item.resolvedAt,\n resolvedBy: item.resolvedBy,\n dismissReason: item.dismissReason,\n };\n\n if (item.type === 'element' && item.el) {\n base.element = item.el.tagName.toLowerCase();\n base.elementPath = getSelector(item.el);\n base.smartSelector = getSmartSelector(item.el);\n base.boundingBox = getBoundingRect(item.el);\n base.cssClasses = item.el.className && typeof item.el.className === 'string'\n ? item.el.className.trim().split(/\\s+/).filter(c => !c.startsWith('di-')).join(' ') : undefined;\n const a11y = getAccessibilityInfo(item.el);\n if (a11y) base.accessibility = JSON.stringify(a11y);\n const nearby = getNearbyText(item.el);\n if (nearby) base.nearbyText = nearby;\n const nearbyEls = getNearbyElements(item.el);\n if (nearbyEls.length) base.nearbyElements = nearbyEls.join(', ');\n const src = getSourceFileHint(item.el);\n if (src) base.sourceFile = src;\n } else if (item.type === 'text-selection') {\n base.selectedText = item.selectedText;\n base.parentElement = item.parentSelector;\n } else if (item.type === 'area') {\n base.region = { x: item.x, y: item.y, width: item.width, height: item.height };\n base.elementCount = (item.elements || []).length;\n }\n\n return base;\n}\n\nexport function getAnnotationById(id: string): SelectionItem | undefined {\n return state.selectedElements.find(i => i.id === id);\n}\n\nexport function getPendingAnnotations(): SelectionItem[] {\n return state.selectedElements.filter(i => i.status === 'pending');\n}\n\n// ========== Webhook Event Emission ==========\nfunction emitWebhookEvent(event: WebhookEvent['event'], item?: SelectionItem, items?: SelectionItem[]): void {\n if (!state.webhookUrl) return;\n const payload: WebhookEvent = {\n event,\n timestamp: Date.now(),\n url: location.href,\n sessionId: state.sessionId,\n };\n if (item) payload.annotation = serializeAnnotation(item);\n if (items) payload.annotations = items.map(serializeAnnotation);\n // \uC9C1\uC811 fetch\uB85C \uC804\uC1A1 (npm \uD328\uD0A4\uC9C0\uB294 same-origin\uC774\uBBC0\uB85C CORS \uBD88\uD544\uC694)\n try {\n fetch(state.webhookUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(payload),\n }).catch(() => {});\n } catch { /* ignore */ }\n}\n\n// ========== SSE Event Emission ==========\nlet sseSequence = 0;\nfunction emitSSEEvent(type: string, payload: unknown): void {\n bus.emit('sseEvent', {\n type,\n timestamp: new Date().toISOString(),\n sessionId: state.sessionId,\n sequence: ++sseSequence,\n payload,\n });\n}\n\n// ========== Markers ==========\nexport function toggleMarkers(): void {\n state.markersVisible = !state.markersVisible;\n saveSetting('markersVisible', state.markersVisible);\n syncHighlights();\n bus.emit('settingsChanged');\n}\n\nexport function setMarkerColor(color: string): void {\n state.markerColor = color;\n saveSetting('markerColor', color);\n document.documentElement.style.setProperty('--di-marker-color', color);\n bus.emit('settingsChanged');\n}\n\nexport function setBlockInteractions(enabled: boolean): void {\n state.blockInteractions = enabled;\n saveSetting('blockInteractions', enabled);\n let blockStyle = document.getElementById('di-block-style');\n if (enabled) {\n if (!blockStyle) {\n blockStyle = document.createElement('style');\n blockStyle.id = 'di-block-style';\n blockStyle.textContent = `body * { pointer-events: none !important; }\n #dev-inspector-host, #dev-inspector-host * { pointer-events: auto !important; }`;\n document.head.appendChild(blockStyle);\n }\n } else if (blockStyle) {\n blockStyle.remove();\n }\n bus.emit('settingsChanged');\n}\n\n// ========== Feature 3: Bug Context ==========\nlet _consoleErrorsFn: (() => unknown[]) | null = null;\nexport function setConsoleErrorsFn(fn: () => unknown[]): void { _consoleErrorsFn = fn; }\n\nexport function getBugContext(): Record<string, unknown> {\n const consoleErrors = _consoleErrorsFn ? _consoleErrorsFn() : [];\n\n return {\n userAgent: navigator.userAgent,\n viewport: { width: window.innerWidth, height: window.innerHeight },\n devicePixelRatio: window.devicePixelRatio,\n url: location.href,\n title: document.title,\n consoleErrors,\n pageUptime: Math.round(performance.now()),\n timestamp: new Date().toISOString(),\n };\n}\n\n// ========== Toggle ==========\nexport function toggle(): void {\n state.isActive = !state.isActive;\n if (!state.isActive) {\n state.hoveredElement = null;\n syncHighlights();\n removeSiteOverrides();\n } else {\n syncHighlights();\n bus.emit('selectionChanged', state.selectedElements);\n applySiteOverrides();\n }\n bus.emit('toggled', state.isActive);\n}\n\n// ========== Site Restriction Overrides ==========\n// Override user-select:none, context menu blocking, text selection blocking\nlet overrideStyleEl: HTMLStyleElement | null = null;\nconst blockedHandlers: Array<{ target: EventTarget; type: string; handler: (e: Event) => void }> = [];\n\nconst OVERRIDE_CSS = `\n *:not(#dev-inspector-host):not(#dev-inspector-host *), *:not(#dev-inspector-host):not(#dev-inspector-host *)::before, *:not(#dev-inspector-host):not(#dev-inspector-host *)::after {\n -webkit-user-select: auto !important;\n user-select: auto !important;\n -webkit-touch-callout: default !important;\n }\n`;\n\nconst EVENTS_TO_UNBLOCK = ['selectstart', 'contextmenu', 'copy', 'dragstart'];\n\nfunction applySiteOverrides(): void {\n // Apply to main document\n applyOverridesToDocument(document);\n\n // Apply to all same-origin iframes\n try {\n const iframes = document.querySelectorAll('iframe');\n iframes.forEach(iframe => {\n try {\n const iframeDoc = iframe.contentDocument;\n if (iframeDoc) applyOverridesToDocument(iframeDoc);\n } catch { /* cross-origin iframe, skip */ }\n });\n } catch { /* ignore */ }\n\n // Watch for new iframes that load later\n if (!iframeObserver) {\n iframeObserver = new MutationObserver(() => {\n if (!state.isActive) return;\n document.querySelectorAll('iframe').forEach(iframe => {\n try {\n const iframeDoc = iframe.contentDocument;\n if (iframeDoc && !iframeDoc.getElementById('di-site-overrides')) {\n applyOverridesToDocument(iframeDoc);\n }\n } catch { /* cross-origin */ }\n });\n });\n iframeObserver.observe(document.body, { childList: true, subtree: true });\n }\n}\n\nfunction applyOverridesToDocument(doc: Document): void {\n // 1. CSS override\n if (!doc.getElementById('di-site-overrides')) {\n const style = doc.createElement('style');\n style.id = 'di-site-overrides';\n style.textContent = OVERRIDE_CSS;\n (doc.head || doc.documentElement).appendChild(style);\n }\n\n // 2. Nullify inline event handlers\n const targets = [doc, doc.documentElement, doc.body].filter(Boolean);\n for (const t of targets) {\n if ((t as any).onselectstart) (t as any).onselectstart = null;\n if ((t as any).oncontextmenu) (t as any).oncontextmenu = null;\n if ((t as any).oncopy) (t as any).oncopy = null;\n if ((t as any).ondragstart) (t as any).ondragstart = null;\n }\n\n // 3. Capture-phase: prevent site handlers from calling preventDefault\n // But skip events originating from dev-inspector's own UI\n for (const type of EVENTS_TO_UNBLOCK) {\n const handler = (e: Event) => {\n const target = e.target as Element;\n // Don't interfere with dev-inspector's own elements\n if (target?.id === 'dev-inspector-host' || target?.closest?.('#dev-inspector-host')) return;\n if ((target as any)?.host?.id === 'dev-inspector-host') return;\n // Check composedPath for shadow DOM\n const path = e.composedPath?.() || [];\n for (const el of path) {\n if ((el as Element)?.id === 'dev-inspector-host') return;\n }\n e.stopPropagation();\n };\n doc.addEventListener(type, handler, true);\n blockedHandlers.push({ target: doc, type, handler });\n }\n}\n\nlet iframeObserver: MutationObserver | null = null;\n\nfunction removeSiteOverrides(): void {\n // Remove from main document\n removeOverridesFromDocument(document);\n\n // Remove from iframes\n try {\n document.querySelectorAll('iframe').forEach(iframe => {\n try {\n const iframeDoc = iframe.contentDocument;\n if (iframeDoc) removeOverridesFromDocument(iframeDoc);\n } catch { /* cross-origin */ }\n });\n } catch { /* ignore */ }\n\n // Stop observing\n if (iframeObserver) {\n iframeObserver.disconnect();\n iframeObserver = null;\n }\n\n // Clean up event handlers\n for (const { target, type, handler } of blockedHandlers) {\n target.removeEventListener(type, handler, true);\n }\n blockedHandlers.length = 0;\n}\n\nfunction removeOverridesFromDocument(doc: Document): void {\n const style = doc.getElementById('di-site-overrides');\n if (style) style.remove();\n}\n", "export default \"/* ========== CSS Variables (Dark theme default) ========== */\\n:host([data-di-theme=\\\"dark\\\"]), :host(:not([data-di-theme])) {\\n --di-bg: #1a1a2e; --di-bg-alt: rgba(255,255,255,0.05);\\n --di-text: #e0e0e0; --di-text-muted: #888; --di-text-dim: #666;\\n --di-accent: #7c8cf5; --di-accent-bg: rgba(124,140,245,0.3);\\n --di-border: rgba(255,255,255,0.08); --di-border-light: rgba(255,255,255,0.05);\\n --di-selector: #a5d6ff; --di-class: #c792ea; --di-value: #c8d0e0;\\n --di-prop: #c792ea; --di-danger: #ff6b6b; --di-success: #34c759;\\n --di-scrollbar: rgba(124,140,245,0.3);\\n --di-shadow: 0 8px 32px rgba(0,0,0,0.4);\\n}\\n:host([data-di-theme=\\\"light\\\"]) {\\n --di-bg: #ffffff; --di-bg-alt: rgba(0,0,0,0.04);\\n --di-text: #1a1a2e; --di-text-muted: #666; --di-text-dim: #999;\\n --di-accent: #5b6bf5; --di-accent-bg: rgba(91,107,245,0.15);\\n --di-border: rgba(0,0,0,0.08); --di-border-light: rgba(0,0,0,0.05);\\n --di-selector: #0550ae; --di-class: #6639ba; --di-value: #333;\\n --di-prop: #6639ba; --di-danger: #d1242f; --di-success: #1a7f37;\\n --di-scrollbar: rgba(91,107,245,0.2);\\n --di-shadow: 0 8px 32px rgba(0,0,0,0.12);\\n}\\n\\n/* ========== Toggle Button ========== */\\n#dev-inspector-toggle {\\n position: fixed; bottom: 16px; right: 16px; z-index: 99999;\\n width: 40px; height: 40px; border-radius: 50%;\\n background: var(--di-bg); color: var(--di-accent); border: 2px solid var(--di-accent);\\n cursor: grab; display: flex; align-items: center; justify-content: center;\\n box-shadow: 0 2px 12px var(--di-accent-bg); transition: all 0.2s ease;\\n user-select: none;\\n}\\n#dev-inspector-toggle:active { cursor: grabbing; }\\n#dev-inspector-toggle:hover { background: var(--di-accent); color: #fff; }\\n#dev-inspector-toggle.active { background: var(--di-accent); color: #fff; box-shadow: 0 0 0 3px var(--di-accent-bg); }\\n\\n/* ========== Hover Overlay ========== */\\n#dev-inspector-overlay {\\n position: fixed; pointer-events: none; z-index: 99997;\\n border: 2px solid var(--di-accent); background: rgba(124,140,245,0.08);\\n border-radius: 2px; transition: all 0.1s ease; display: none;\\n}\\n#dev-inspector-overlay::after {\\n content: attr(data-tag); position: absolute; top: -22px; left: -2px;\\n background: var(--di-accent); color: #fff; font-size: 11px; padding: 1px 6px;\\n border-radius: 3px 3px 0 0; font-family: monospace; white-space: nowrap;\\n}\\n\\n/* ========== Panel ========== */\\n#dev-inspector-panel {\\n position: fixed; bottom: 64px; right: 16px; z-index: 99998;\\n width: 380px; max-height: 60vh;\\n background: var(--di-bg); color: var(--di-text); border-radius: 12px;\\n box-shadow: var(--di-shadow); font-family: system-ui, sans-serif;\\n font-size: 13px; display: none;\\n border: 1px solid var(--di-accent-bg);\\n overflow: hidden;\\n}\\n.dip-content {\\n overflow-y: auto; height: 100%;\\n}\\n.dip-content::-webkit-scrollbar { width: 6px; }\\n.dip-content::-webkit-scrollbar-thumb { background: var(--di-scrollbar); border-radius: 3px; }\\n\\n/* ========== Resize Grip ========== */\\n.dip-resize-grip {\\n position: absolute; bottom: 0; right: 0;\\n width: 16px; height: 16px; cursor: nwse-resize; z-index: 3;\\n}\\n.dip-resize-grip::before, .dip-resize-grip::after {\\n content: ''; position: absolute; background: var(--di-text-dim);\\n border-radius: 1px;\\n}\\n.dip-resize-grip::before {\\n width: 10px; height: 2px; bottom: 4px; right: 2px;\\n transform: rotate(-45deg); transform-origin: right bottom;\\n}\\n.dip-resize-grip::after {\\n width: 6px; height: 2px; bottom: 3px; right: 1px;\\n transform: rotate(-45deg); transform-origin: right bottom;\\n}\\n\\n/* ========== Panel Header ========== */\\n.dip-header {\\n display: flex; justify-content: space-between; align-items: center;\\n cursor: grab; user-select: none;\\n padding: 12px 14px; border-bottom: 1px solid var(--di-border);\\n position: sticky; top: 0; background: var(--di-bg); z-index: 1;\\n}\\n.dip-header-title { font-weight: 600; font-size: 13px; color: var(--di-accent); white-space: nowrap; }\\n.dip-header-actions { display: flex; gap: 6px; align-items: center; }\\n.dip-header-actions button {\\n background: var(--di-bg-alt); border: none; color: var(--di-text-muted);\\n padding: 4px 10px; border-radius: 6px; cursor: pointer; font-size: 11px;\\n transition: all 0.15s;\\n}\\n.dip-header-actions button:hover { background: var(--di-accent-bg); color: var(--di-accent); }\\n.dip-header-actions button.active { background: var(--di-accent); color: #fff; }\\n.dip-header:active { cursor: grabbing; }\\n\\n/* ========== Mobile ========== */\\n@media (max-width: 480px) {\\n #dev-inspector-panel {\\n width: calc(100vw - 16px); max-width: 380px;\\n }\\n #dev-inspector-toggle { width: 44px; height: 44px; }\\n}\\n@media (max-width: 768px) {\\n #dev-inspector-panel { max-height: 50vh; }\\n}\\n\\n/* ========== Panel Items ========== */\\n.dip-empty { padding: 24px; text-align: center; color: var(--di-text-dim); font-size: 12px; }\\n.dip-item { padding: 12px 14px; border-bottom: 1px solid var(--di-border-light); }\\n.dip-item:last-child { border-bottom: none; }\\n.dip-section { margin-bottom: 8px; }\\n.dip-section:last-child { margin-bottom: 0; }\\n.dip-label {\\n font-size: 10px; text-transform: uppercase; letter-spacing: 0.5px;\\n color: var(--di-accent); margin-bottom: 3px; font-weight: 600;\\n}\\n.dip-value {\\n font-family: 'SF Mono', Consolas, monospace; font-size: 12px;\\n background: var(--di-bg-alt); padding: 4px 8px; border-radius: 4px;\\n word-break: break-all; line-height: 1.5; color: var(--di-value);\\n}\\n.dip-value.dip-selector { color: var(--di-selector); }\\n.dip-value.dip-classes { color: var(--di-class); }\\n.dip-styles-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 2px 12px; }\\n.dip-style-row { font-family: monospace; font-size: 11px; display: flex; justify-content: space-between; }\\n.dip-style-prop { color: var(--di-prop); }\\n.dip-style-val { color: var(--di-value); }\\n\\n.dip-note-area {\\n width: 100%; background: var(--di-bg-alt); border: 1px solid var(--di-border);\\n color: var(--di-text); padding: 6px 8px; border-radius: 6px; font-size: 12px;\\n resize: none; outline: none; font-family: inherit; margin-top: 4px;\\n box-sizing: border-box;\\n}\\n.dip-note-area:focus { border-color: var(--di-accent); }\\n.dip-remove {\\n float: right; background: none; border: none; color: var(--di-text-dim);\\n cursor: pointer; font-size: 14px; padding: 0 2px; line-height: 1;\\n}\\n.dip-remove:hover { color: var(--di-danger); }\\n\\n.dip-item-actions { float: right; display: flex; gap: 4px; align-items: center; }\\n.dip-screenshot-btn {\\n background: none; border: none; cursor: pointer; font-size: 13px;\\n padding: 0 2px; line-height: 1; opacity: 0.6; transition: opacity 0.15s;\\n color: var(--di-text-muted);\\n}\\n.dip-screenshot-btn:hover { opacity: 1; }\\n\\n/* ========== Output Mode Dropdown ========== */\\n.dip-mode-wrap { position: relative; }\\n.dip-mode-wrap > button {\\n background: var(--di-accent-bg) !important;\\n color: var(--di-accent) !important;\\n font-weight: 600 !important;\\n}\\n.dip-mode-menu {\\n display: none; position: absolute; top: 100%; right: 0; margin-top: 4px;\\n background: var(--di-bg); border: 1px solid var(--di-border);\\n border-radius: 8px; box-shadow: var(--di-shadow); z-index: 10;\\n min-width: 100px; padding: 4px 0;\\n}\\n.dip-mode-menu.open { display: block; }\\n.dip-mode-menu button {\\n display: block; width: 100%; text-align: left;\\n background: none; border: none; color: var(--di-text);\\n padding: 6px 12px; cursor: pointer; font-size: 11px;\\n transition: background 0.1s;\\n}\\n.dip-mode-menu button:hover {\\n background: var(--di-accent-bg); color: var(--di-accent);\\n}\\n.dip-mode-menu button.active {\\n background: var(--di-accent-bg) !important;\\n color: var(--di-accent) !important;\\n font-weight: 600;\\n}\\n.dip-mode-menu button.active::after {\\n content: ' \u2713'; font-size: 10px;\\n}\\n\\n/* ========== Theme Toggle ========== */\\n.dip-theme-toggle {\\n background: none !important; border: none; cursor: pointer;\\n padding: 2px 6px !important; font-size: 14px; line-height: 1;\\n}\\n\\n/* ========== Tailwind Classes ========== */\\n.dip-tailwind-classes {\\n font-family: monospace;\\n font-size: 10px;\\n word-break: break-all;\\n color: var(--di-accent);\\n cursor: pointer;\\n}\\n\\n/* ========== Contrast Badges ========== */\\n.dip-contrast-badge {\\n display: inline-block;\\n padding: 1px 4px;\\n border-radius: 3px;\\n font-size: 9px;\\n font-weight: 600;\\n margin-left: 4px;\\n}\\n.dip-contrast-badge.pass { background: rgba(52, 199, 89, 0.2); color: #34c759; }\\n.dip-contrast-badge.fail { background: rgba(255, 107, 107, 0.2); color: #ff6b6b; }\\n\\n/* ========== A11y Warnings ========== */\\n.dip-a11y-warn .dip-value {\\n color: #ffb84d;\\n font-size: 11px;\\n}\\n\\n/* ========== Feature 1: Color Palette ========== */\\n.dip-colors-panel {\\n padding: 12px 14px; border-top: 2px solid var(--di-accent);\\n}\\n.dip-colors-header {\\n font-size: 12px; font-weight: 700; color: var(--di-accent); margin-bottom: 10px;\\n text-transform: uppercase; letter-spacing: 0.5px;\\n}\\n.dip-color-group { margin-bottom: 10px; }\\n.dip-color-group-title {\\n font-size: 10px; color: var(--di-text-muted); margin-bottom: 6px; font-weight: 600;\\n text-transform: uppercase; letter-spacing: 0.3px;\\n}\\n.dip-color-swatches {\\n display: grid; grid-template-columns: repeat(auto-fill, minmax(70px, 1fr)); gap: 6px;\\n}\\n.dip-color-swatch {\\n display: flex; align-items: center; gap: 4px; padding: 3px 6px;\\n background: var(--di-bg-alt); border-radius: 4px; cursor: pointer;\\n transition: background 0.15s; font-size: 10px; color: var(--di-text);\\n}\\n.dip-color-swatch:hover { background: var(--di-accent-bg); }\\n.dip-swatch-circle {\\n display: inline-block; width: 14px; height: 14px; border-radius: 50%;\\n border: 1px solid var(--di-border); flex-shrink: 0;\\n}\\n.dip-swatch-label { font-family: monospace; font-size: 9px; word-break: break-all; }\\n\\n/* ========== Feature 2: Typography Summary ========== */\\n.dip-typography-panel {\\n padding: 12px 14px; border-top: 2px solid var(--di-accent);\\n}\\n.dip-typo-header {\\n font-size: 12px; font-weight: 700; color: var(--di-accent); margin-bottom: 10px;\\n text-transform: uppercase; letter-spacing: 0.5px;\\n}\\n.dip-typo-empty { color: var(--di-text-dim); font-size: 12px; text-align: center; padding: 12px 0; }\\n.dip-typo-row {\\n padding: 6px 8px; margin-bottom: 4px; background: var(--di-bg-alt);\\n border-radius: 4px; cursor: pointer; transition: background 0.15s;\\n}\\n.dip-typo-row:hover { background: var(--di-accent-bg); }\\n.dip-typo-preview {\\n color: var(--di-text); margin-bottom: 3px; white-space: nowrap;\\n overflow: hidden; text-overflow: ellipsis;\\n}\\n.dip-typo-details { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; }\\n.dip-typo-family { font-size: 10px; font-weight: 600; color: var(--di-accent); }\\n.dip-typo-meta { font-size: 9px; color: var(--di-text-muted); font-family: monospace; }\\n.dip-typo-count {\\n font-size: 9px; color: var(--di-text-dim); background: var(--di-bg);\\n padding: 1px 4px; border-radius: 3px;\\n}\\n.dip-typo-copy-icon { font-size: 11px; margin-left: auto; opacity: 0.5; }\\n.dip-typo-row:hover .dip-typo-copy-icon { opacity: 1; }\\n\\n/* ========== Feature 4: Editable Styles ========== */\\n.dip-editable-val {\\n cursor: pointer; border-bottom: 1px dashed var(--di-border);\\n transition: border-color 0.15s;\\n}\\n.dip-editable-val:hover { border-bottom-color: var(--di-accent); }\\n.dip-style-edited { background: rgba(124, 140, 245, 0.1); border-radius: 2px; }\\n.dip-style-edited .dip-style-val { color: var(--di-accent); font-weight: 600; }\\n.dip-reset-btn {\\n display: inline-block; margin-left: 8px; font-size: 9px; cursor: pointer;\\n background: var(--di-accent-bg); color: var(--di-accent); border: 1px solid var(--di-accent);\\n border-radius: 3px; padding: 1px 5px; vertical-align: middle;\\n text-transform: none; letter-spacing: 0; font-weight: 500;\\n}\\n.dip-reset-btn:hover { background: var(--di-accent); color: white; }\\n\\n/* ========== Feature 5: Spacing Section ========== */\\n.dip-spacing-section { border-top: 2px solid var(--di-accent); }\\n.dip-spacing-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 4px 12px; }\\n.dip-spacing-row { font-size: 11px; font-family: monospace; color: var(--di-text); }\\n.dip-spacing-row strong { color: var(--di-accent); }\\n\\n/* ========== Copy Dropdown ========== */\\n.dip-copy-wrap { position: relative; }\\n.dip-copy-menu {\\n display: none; position: absolute; top: 100%; right: 0; margin-top: 4px;\\n background: var(--di-bg); border: 1px solid var(--di-border);\\n border-radius: 8px; box-shadow: var(--di-shadow); z-index: 10;\\n min-width: 140px; padding: 4px 0;\\n}\\n.dip-copy-menu.open { display: block; }\\n.dip-copy-menu button {\\n display: block; width: 100%; text-align: left;\\n background: none; border: none; color: var(--di-text);\\n padding: 6px 12px; cursor: pointer; font-size: 11px;\\n transition: background 0.1s;\\n}\\n.dip-copy-menu button:hover {\\n background: var(--di-accent-bg); color: var(--di-accent);\\n}\\n\\n/* ========== Hierarchy Navigation ========== */\\n.dip-hierarchy { font-family: monospace; font-size: 11px; line-height: 1.6; color: var(--di-text-muted); }\\n.dip-hierarchy-current { color: var(--di-selector); font-weight: 600; }\\n.dip-hierarchy-link {\\n cursor: pointer; text-decoration: underline;\\n text-decoration-style: dotted; text-underline-offset: 2px;\\n transition: color 0.15s;\\n}\\n.dip-hierarchy-link:hover { color: var(--di-accent); }\\n.dip-hierarchy-nav {\\n display: flex; gap: 6px; margin-top: 6px;\\n}\\n.dip-hierarchy-nav button {\\n background: var(--di-bg-alt); border: 1px solid var(--di-border);\\n color: var(--di-text-muted); padding: 2px 8px; border-radius: 4px;\\n cursor: pointer; font-size: 10px; transition: all 0.15s;\\n}\\n.dip-hierarchy-nav button:hover {\\n background: var(--di-accent-bg); color: var(--di-accent);\\n border-color: var(--di-accent);\\n}\\n\\n/* ========== Settings Dropdown ========== */\\n.dip-settings-wrap { position: relative; }\\n.dip-settings-btn {\\n cursor: pointer; line-height: 1;\\n}\\n.dip-settings-panel {\\n display: none; position: absolute; top: 100%; left: 0; margin-top: 4px;\\n background: var(--di-bg); border: 1px solid var(--di-border);\\n border-radius: 10px; box-shadow: var(--di-shadow); z-index: 20;\\n min-width: 220px; padding: 10px 12px;\\n}\\n.dip-settings-panel.open { display: block; }\\n.dip-settings-section { margin-bottom: 10px; }\\n.dip-settings-section:last-child { margin-bottom: 0; }\\n.dip-settings-label {\\n font-size: 10px; text-transform: uppercase; letter-spacing: 0.5px;\\n color: var(--di-text-muted); margin-bottom: 4px; font-weight: 600;\\n}\\n\\n/* ========== Color Presets ========== */\\n.dip-color-row { display: flex; gap: 4px; align-items: center; flex-wrap: wrap; }\\n.dip-color-preset {\\n width: 20px; height: 20px; border-radius: 50%; border: 2px solid transparent;\\n cursor: pointer; transition: all 0.15s; padding: 0;\\n}\\n.dip-color-preset:hover { transform: scale(1.2); }\\n.dip-color-preset.dip-color-active { border-color: var(--di-text); box-shadow: 0 0 0 1px var(--di-text); }\\n.dip-color-picker {\\n width: 22px; height: 22px; padding: 0; border: 1px solid var(--di-border);\\n border-radius: 4px; cursor: pointer; background: none;\\n}\\n\\n/* ========== Toggle Switch ========== */\\n.dip-toggle-row {\\n display: flex; justify-content: space-between; align-items: center;\\n cursor: pointer; font-size: 12px; color: var(--di-text); position: relative;\\n padding: 2px 0;\\n}\\n.dip-toggle-input { position: absolute; opacity: 0; width: 0; height: 0; }\\n.dip-toggle-slider {\\n width: 32px; height: 18px; background: var(--di-bg-alt); border-radius: 9px;\\n border: 1px solid var(--di-border); position: relative; transition: all 0.2s;\\n flex-shrink: 0;\\n}\\n.dip-toggle-slider::after {\\n content: ''; position: absolute; top: 2px; left: 2px;\\n width: 12px; height: 12px; background: var(--di-text-muted);\\n border-radius: 50%; transition: all 0.2s;\\n}\\n.dip-toggle-input:checked + .dip-toggle-slider { background: var(--di-accent-bg); border-color: var(--di-accent); }\\n.dip-toggle-input:checked + .dip-toggle-slider::after { left: 16px; background: var(--di-accent); }\\n\\n/* ========== Webhook URL Input ========== */\\n.dip-webhook-input {\\n width: 100%; background: var(--di-bg-alt); border: 1px solid var(--di-border);\\n color: var(--di-text); padding: 4px 8px; border-radius: 6px; font-size: 11px;\\n outline: none; font-family: monospace; box-sizing: border-box;\\n}\\n.dip-webhook-input:focus { border-color: var(--di-accent); }\\n\\n/* ========== MCP Setup ========== */\\n.dip-mcp-step {\\n display: flex; gap: 8px; align-items: flex-start;\\n margin-bottom: 8px;\\n}\\n.dip-mcp-step:last-child { margin-bottom: 0; }\\n.dip-mcp-step-num {\\n flex-shrink: 0; width: 18px; height: 18px;\\n background: var(--di-accent); color: #fff;\\n border-radius: 50%; font-size: 10px; font-weight: 700;\\n display: flex; align-items: center; justify-content: center;\\n margin-top: 4px;\\n}\\n.dip-mcp-step-body { flex: 1; }\\n.dip-mcp-setup-btn {\\n width: 100%; padding: 6px 10px; border-radius: 6px; cursor: pointer;\\n background: var(--di-accent-bg); border: 1px solid var(--di-accent);\\n color: var(--di-accent); font-size: 11px; font-weight: 600;\\n transition: all 0.15s; text-align: center;\\n}\\n.dip-mcp-setup-btn:hover { background: var(--di-accent); color: #fff; }\\n.dip-mcp-step2-btn {\\n background: var(--di-bg-alt); border-color: var(--di-border);\\n color: var(--di-text-muted);\\n}\\n.dip-mcp-step2-btn:hover { background: var(--di-accent-bg); border-color: var(--di-accent); color: var(--di-accent); }\\n.dip-mcp-hint {\\n font-size: 9px; color: var(--di-text-dim); margin-top: 3px;\\n line-height: 1.4;\\n}\\n\\n/* ========== Shortcut Hints ========== */\\n.dip-shortcuts-info { border-top: 1px solid var(--di-border); padding-top: 8px; margin-top: 4px; }\\n.dip-shortcut-list { display: flex; gap: 8px; flex-wrap: wrap; }\\n.dip-shortcut-hint { font-size: 10px; color: var(--di-text-muted); }\\n.dip-shortcut-hint kbd {\\n background: var(--di-bg-alt); border: 1px solid var(--di-border);\\n padding: 1px 4px; border-radius: 3px; font-family: monospace;\\n font-size: 10px; color: var(--di-accent); margin-right: 2px;\\n}\\n\\n/* ========== Area Drag Selection ========== */\\n#di-area-select-rect {\\n position: fixed; border: 2px dashed var(--di-accent);\\n background: rgba(124,140,245,0.06); z-index: 99996;\\n pointer-events: none; display: none;\\n}\\n\\n/* ========== React Component Info ========== */\\n.dip-react-info .dip-value { font-size: 11px; }\\n.dip-react-hierarchy { color: var(--di-text-muted); font-size: 10px; margin-top: 2px; }\\n.dip-react-props { color: var(--di-class); font-size: 10px; margin-top: 2px; }\\n\\n/* ========== MCP Status Indicator ========== */\\n.di-mcp-dot {\\n width: 8px; height: 8px; border-radius: 50%; display: inline-block;\\n margin-right: 4px; vertical-align: middle;\\n}\\n.di-mcp-dot.connected { background: var(--di-success); }\\n.di-mcp-dot.disconnected { background: var(--di-danger); }\\n.di-mcp-port {\\n font-size: 10px; color: var(--di-text-muted); margin-right: 6px;\\n vertical-align: middle; font-family: monospace;\\n}\\n\\n/* ========== Block Interactions Badge ========== */\\n.di-block-badge {\\n position: fixed; top: 12px; left: 50%; transform: translateX(-50%); z-index: 99999;\\n background: var(--di-danger); color: #fff; font-size: 11px; font-weight: 600;\\n padding: 4px 10px; border-radius: 12px; pointer-events: none;\\n}\\n\\n/* ========== Annotation Metadata (Intent / Severity / Status) ========== */\\n.dip-annotation-meta {\\n margin-bottom: 8px;\\n display: flex; flex-direction: column; gap: 4px;\\n}\\n.dip-meta-row {\\n display: flex; align-items: center; gap: 6px; flex-wrap: wrap;\\n}\\n.dip-status-badge {\\n font-size: 10px; font-weight: 600; letter-spacing: 0.3px;\\n}\\n\\n/* Intent buttons */\\n.dip-intent-group { display: flex; gap: 2px; }\\n.dip-intent-btn {\\n background: var(--di-bg-alt); border: 1px solid transparent;\\n padding: 2px 6px; border-radius: 4px; cursor: pointer;\\n font-size: 12px; line-height: 1; transition: all 0.15s;\\n color: var(--di-text-muted);\\n}\\n.dip-intent-btn:hover { border-color: var(--di-accent); }\\n.dip-intent-btn.active {\\n background: var(--di-accent-bg); border-color: var(--di-accent);\\n}\\n\\n/* Severity buttons */\\n.dip-severity-group { display: flex; gap: 3px; }\\n.dip-severity-btn {\\n background: var(--di-bg-alt); border: 1px solid var(--di-border);\\n padding: 2px 8px; border-radius: 10px; cursor: pointer;\\n font-size: 9px; font-weight: 600; text-transform: uppercase;\\n letter-spacing: 0.3px; transition: all 0.15s;\\n color: var(--di-text-muted);\\n}\\n.dip-severity-btn:hover { border-color: var(--di-accent); color: var(--di-accent); }\\n\\n/* Pending badge in header */\\n.dip-pending-badge {\\n background: var(--di-danger); color: #fff;\\n font-size: 10px; font-weight: 700;\\n padding: 1px 6px; border-radius: 8px;\\n margin-left: 4px;\\n}\\n\\n/* Resolved/Dismissed item styling */\\n.dip-item.dip-resolved { opacity: 0.6; }\\n.dip-item.dip-dismissed { opacity: 0.4; }\\n.dip-item.dip-resolved .dip-label,\\n.dip-item.dip-dismissed .dip-label { text-decoration: line-through; }\\n\\n/* Submit button */\\n.dip-submit-btn {\\n background: var(--di-success) !important;\\n color: #fff !important;\\n font-weight: 600 !important;\\n}\\n.dip-submit-btn:hover {\\n filter: brightness(0.9);\\n}\\n\\n/* ========== Thread Messages ========== */\\n.dip-thread-wrap {\\n display: none;\\n margin-top: 4px;\\n}\\n.dip-thread-wrap.open { display: block; }\\n\\n.dip-thread-msg {\\n display: flex; align-items: flex-start; gap: 6px;\\n padding: 4px 8px; margin-bottom: 3px;\\n border-radius: 6px; font-size: 11px; line-height: 1.4;\\n}\\n.dip-thread-human { background: var(--di-bg-alt); }\\n.dip-thread-agent { background: var(--di-accent-bg); }\\n.dip-thread-role { flex-shrink: 0; font-size: 12px; }\\n.dip-thread-content {\\n flex: 1; color: var(--di-text); word-break: break-word;\\n}\\n.dip-thread-time {\\n flex-shrink: 0; font-size: 9px; color: var(--di-text-dim);\\n font-family: monospace;\\n}\\n\\n.dip-thread-input-wrap {\\n display: flex; gap: 4px; margin-top: 4px;\\n}\\n.dip-thread-input {\\n flex: 1;\\n background: var(--di-bg-alt); border: 1px solid var(--di-border);\\n color: var(--di-text); padding: 4px 8px; border-radius: 6px;\\n font-size: 11px; resize: none; outline: none;\\n font-family: inherit; box-sizing: border-box;\\n max-height: 48px; overflow-y: auto;\\n scrollbar-width: none;\\n}\\n.dip-thread-input::-webkit-scrollbar { display: none; }\\n.dip-thread-input:focus { border-color: var(--di-accent); }\\n.dip-thread-send {\\n background: var(--di-accent) !important; color: #fff !important;\\n border: none; border-radius: 6px; padding: 4px 8px;\\n cursor: pointer; font-size: 12px; line-height: 1;\\n flex-shrink: 0;\\n}\\n.dip-thread-send:hover { filter: brightness(0.9); }\\n\\n/* ========== Accessibility Info ========== */\\n.dip-a11y-details {\\n display: none;\\n margin-top: 4px;\\n}\\n.dip-a11y-details.open { display: block; }\\n\\n/* ========== Nearby Context ========== */\\n.dip-nearby-text {\\n font-size: 11px; color: var(--di-text-muted);\\n font-style: italic; margin-bottom: 4px;\\n}\\n.dip-nearby-elements {\\n display: flex; flex-wrap: wrap; gap: 4px;\\n}\\n.dip-nearby-el {\\n font-size: 10px; font-family: monospace;\\n background: var(--di-bg-alt); border: 1px solid var(--di-border);\\n padding: 1px 6px; border-radius: 4px;\\n color: var(--di-text-muted); white-space: nowrap;\\n max-width: 200px; overflow: hidden; text-overflow: ellipsis;\\n}\\n\\n/* ========== Source File ========== */\\n.dip-source-file {\\n color: var(--di-success) !important;\\n font-size: 11px !important;\\n}\\n.dip-react-source {\\n color: var(--di-success); font-size: 10px; margin-top: 2px;\\n font-family: monospace;\\n}\\n\\n/* ========== Inline Annotation Popup ========== */\\n.di-inline-popup {\\n position: fixed; z-index: 99999;\\n background: var(--di-bg); border: 1px solid var(--di-accent-bg);\\n border-radius: 10px; box-shadow: var(--di-shadow);\\n padding: 8px 10px; width: 260px;\\n font-family: system-ui, sans-serif; font-size: 12px;\\n color: var(--di-text);\\n animation: di-popup-in 0.15s ease;\\n}\\n@keyframes di-popup-in {\\n from { opacity: 0; transform: translateY(-4px); }\\n to { opacity: 1; transform: translateY(0); }\\n}\\n\\n/* Intent buttons row */\\n.di-ip-intents {\\n display: flex; gap: 4px; margin-bottom: 6px;\\n}\\n.di-ip-intent {\\n flex: 1; padding: 4px; border-radius: 6px;\\n background: var(--di-bg-alt); border: 1px solid transparent;\\n cursor: pointer; font-size: 14px; text-align: center;\\n transition: all 0.15s; color: var(--di-text-muted);\\n}\\n.di-ip-intent:hover { border-color: var(--di-accent); }\\n.di-ip-intent.active {\\n background: var(--di-accent-bg); border-color: var(--di-accent);\\n}\\n\\n/* Severity buttons row */\\n.di-ip-severities {\\n display: flex; gap: 4px; margin-bottom: 6px;\\n}\\n.di-ip-severity {\\n flex: 1; padding: 3px 4px; border-radius: 8px;\\n background: var(--di-bg-alt); border: 1px solid var(--di-border);\\n cursor: pointer; font-size: 9px; font-weight: 600;\\n text-transform: uppercase; letter-spacing: 0.3px;\\n text-align: center; transition: all 0.15s;\\n color: var(--di-text-muted);\\n}\\n.di-ip-severity:hover { border-color: var(--di-accent); color: var(--di-accent); }\\n\\n/* Input row */\\n.di-ip-input-row {\\n display: flex; gap: 4px;\\n}\\n.di-ip-input {\\n flex: 1; padding: 5px 8px; border-radius: 6px;\\n background: var(--di-bg-alt); border: 1px solid var(--di-border);\\n color: var(--di-text); font-size: 12px; outline: none;\\n font-family: inherit;\\n}\\n.di-ip-input:focus { border-color: var(--di-accent); }\\n.di-ip-input::placeholder { color: var(--di-text-dim); }\\n.di-ip-submit {\\n padding: 4px 10px; border-radius: 6px;\\n background: var(--di-accent); border: none;\\n color: #fff; cursor: pointer; font-size: 13px; font-weight: 700;\\n transition: all 0.15s;\\n}\\n.di-ip-submit:hover { filter: brightness(0.9); }\\n\\n/* Hint */\\n.di-ip-hint {\\n font-size: 9px; color: var(--di-text-dim);\\n margin-top: 4px; text-align: center;\\n}\\n\\n/* ========== Feature 7: Layout Overlay Section ========== */\\n.dip-layout-toggle-btn {\\n display: inline-block; margin-left: 8px; font-size: 9px; cursor: pointer;\\n background: var(--di-accent-bg); color: var(--di-accent); border: 1px solid var(--di-accent);\\n border-radius: 3px; padding: 1px 5px; vertical-align: middle;\\n text-transform: none; letter-spacing: 0; font-weight: 500;\\n}\\n.dip-layout-toggle-btn:hover { background: var(--di-accent); color: white; }\\n.dip-layout-toggle-btn.active { background: var(--di-accent); color: white; }\\n.dip-layout-details { display: grid; grid-template-columns: 1fr; gap: 2px; }\\n.dip-layout-children { margin-top: 4px; }\\n\\n/* ========== Feature 8: Reporter Mode ========== */\\n.dip-panel-mode-toggle {\\n display: flex; gap: 2px; background: var(--di-bg-alt); border-radius: 6px; padding: 2px;\\n}\\n.dip-mode-opt {\\n flex: 1; padding: 4px 8px; border: none; background: transparent;\\n color: var(--di-text-muted); font-size: 11px; border-radius: 4px;\\n cursor: pointer; transition: all 0.15s; text-align: center; font-weight: 500;\\n}\\n.dip-mode-opt:hover { color: var(--di-text); }\\n.dip-mode-opt.active {\\n background: var(--di-accent); color: #fff; font-weight: 600;\\n}\\n.dip-reporter-item { border-left: 3px solid var(--di-accent); }\\n.dip-reporter-element-name {\\n font-size: 16px; font-weight: 700; color: var(--di-accent);\\n margin-bottom: 8px; font-family: 'SF Mono', Consolas, monospace;\\n}\\n.dip-reporter-intent-group { display: flex; gap: 4px; flex-wrap: wrap; }\\n.dip-reporter-intent-group .dip-intent-btn {\\n padding: 4px 10px; font-size: 11px;\\n}\\n.dip-reporter-severity-group { display: flex; gap: 4px; flex-wrap: wrap; }\\n.dip-reporter-comment {\\n min-height: 60px !important; resize: vertical;\\n}\\n.dip-reporter-submit-btn {\\n display: block; width: 100%; padding: 8px; margin-top: 8px;\\n background: var(--di-accent); color: #fff; border: none;\\n border-radius: 6px; font-size: 12px; font-weight: 600;\\n cursor: pointer; transition: opacity 0.15s;\\n}\\n.dip-reporter-submit-btn:hover { opacity: 0.9; }\\n\\n/* ========== Feature 9: Assets Panel ========== */\\n.dip-assets-panel {\\n padding: 12px 14px; border-top: 2px solid var(--di-accent);\\n}\\n.dip-assets-header {\\n font-size: 12px; font-weight: 700; color: var(--di-accent); margin-bottom: 10px;\\n text-transform: uppercase; letter-spacing: 0.5px;\\n}\\n.dip-asset-group { margin-bottom: 10px; }\\n.dip-asset-group-title {\\n font-size: 10px; color: var(--di-text-muted); margin-bottom: 6px; font-weight: 600;\\n text-transform: uppercase; letter-spacing: 0.3px;\\n}\\n.dip-asset-row {\\n display: flex; align-items: center; gap: 8px; padding: 4px 6px;\\n background: var(--di-bg-alt); border-radius: 4px; cursor: pointer;\\n transition: background 0.15s; margin-bottom: 3px;\\n}\\n.dip-asset-row:hover { background: var(--di-accent-bg); }\\n.dip-asset-thumb {\\n width: 36px; height: 36px; object-fit: cover; border-radius: 3px;\\n border: 1px solid var(--di-border); flex-shrink: 0;\\n background: var(--di-bg);\\n}\\n.dip-asset-svg-icon {\\n width: 36px; height: 36px; display: flex; align-items: center;\\n justify-content: center; font-size: 18px; color: var(--di-accent);\\n background: var(--di-accent-bg); border-radius: 3px; flex-shrink: 0;\\n}\\n.dip-asset-info { flex: 1; min-width: 0; }\\n.dip-asset-name {\\n font-size: 11px; font-weight: 600; color: var(--di-text);\\n white-space: nowrap; overflow: hidden; text-overflow: ellipsis;\\n}\\n.dip-asset-meta {\\n font-size: 9px; color: var(--di-text-muted); font-family: monospace;\\n}\\n.dip-asset-alt {\\n font-size: 9px; color: var(--di-text-dim); font-style: italic;\\n white-space: nowrap; overflow: hidden; text-overflow: ellipsis;\\n}\\n\";", "/**\n * Dev InSpector Client \u2014 Bootstrap\n * npm \uD328\uD0A4\uC9C0 \uBC84\uC804: Chrome API \uC5C6\uC774 SSE + REST\uB85C \uB3D9\uC791\n * Creates Shadow DOM host and initializes all modules\n */\nimport cssText from '__styles__';\nimport { state, loadSettings, addSelection, removeSelection, toggle, syncHighlights, createAnnotationMeta, setConsoleErrorsFn, checkProStatus } from './core';\nimport { createOverlay, handleMouseMove, hideOverlay } from './overlay';\nimport { createPanel, renderPanel, showPanel } from './panel';\nimport { makeDraggable } from './drag';\nimport { initAnnotate } from './annotate';\nimport { initAnimation } from './animation';\nimport { initKeyboard } from './keyboard';\nimport { initTheme } from './theme';\nimport { initReactInspector } from './react-inspector';\nimport { initBridge } from './bridge';\nimport { initInlinePopup, showInlinePopup, hideInlinePopup, isInlinePopupVisible } from './inline-popup';\nimport * as bus from '../shared/event-bus';\n\n// ========== Console Error Capture ==========\nconst capturedConsoleErrors: Array<{ level: string; message: string; timestamp: number }> = [];\nconst MAX_CAPTURED = 10;\n\nconst _origConsoleError = console.error;\nconst _origConsoleWarn = console.warn;\n\nconsole.error = function (...args: unknown[]) {\n capturedConsoleErrors.push({\n level: 'error',\n message: args.map(a => typeof a === 'string' ? a : JSON.stringify(a)).join(' ').substring(0, 200),\n timestamp: Date.now(),\n });\n if (capturedConsoleErrors.length > MAX_CAPTURED) capturedConsoleErrors.shift();\n _origConsoleError.apply(console, args);\n};\n\nconsole.warn = function (...args: unknown[]) {\n capturedConsoleErrors.push({\n level: 'warn',\n message: args.map(a => typeof a === 'string' ? a : JSON.stringify(a)).join(' ').substring(0, 200),\n timestamp: Date.now(),\n });\n if (capturedConsoleErrors.length > MAX_CAPTURED) capturedConsoleErrors.shift();\n _origConsoleWarn.apply(console, args);\n};\n\nexport function getCapturedConsoleErrors() {\n return capturedConsoleErrors.slice();\n}\n\nsetConsoleErrorsFn(getCapturedConsoleErrors);\n\nasync function bootstrap() {\n await loadSettings();\n checkProStatus();\n\n // Create Shadow DOM host\n const host = document.createElement('div');\n host.id = 'dev-inspector-host';\n host.style.cssText = 'all: initial; position: fixed; z-index: 99999; top: 0; left: 0; width: 0; height: 0;';\n document.body.appendChild(host);\n\n const shadow = host.attachShadow({ mode: 'open' });\n\n // Inject styles into shadow DOM\n const styleEl = document.createElement('style');\n styleEl.textContent = cssText;\n shadow.appendChild(styleEl);\n\n // Page-level styles for highlight/annotation markers\n const pageStyleEl = document.createElement('style');\n pageStyleEl.id = 'dev-inspector-page-styles';\n pageStyleEl.textContent = `\n .di-selected-highlight {\n box-shadow: inset 0 0 0 2px var(--di-marker-color, #7c8cf5) !important;\n background-color: rgba(124,140,245,0.12) !important;\n }\n .di-text-annotation {\n background: rgba(124,140,245,0.2);\n border-bottom: 2px solid #7c8cf5;\n cursor: pointer;\n border-radius: 2px;\n }\n .di-pause-badge {\n position: fixed; top: 12px; right: 12px; z-index: 99999;\n background: #ff6b6b; color: #fff; font-size: 11px; font-weight: 600;\n padding: 4px 10px; border-radius: 12px; pointer-events: none;\n animation: di-pulse 1.5s infinite;\n }\n @keyframes di-pulse { 0%,100% { opacity: 1; } 50% { opacity: 0.6; } }\n `;\n document.head.appendChild(pageStyleEl);\n\n // Create UI elements in shadow DOM\n createOverlay(shadow);\n const panelEl = createPanel(shadow);\n\n // Create toggle button\n const toggleBtn = document.createElement('button');\n toggleBtn.id = 'dev-inspector-toggle';\n toggleBtn.title = 'Dev InSpector (Ctrl+Shift+X)';\n toggleBtn.innerHTML = '<svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"11\" cy=\"11\" r=\"8\"/><path d=\"M21 21l-4.35-4.35\"/><path d=\"M11 8v6M8 11h6\"/></svg>';\n // npm \uD328\uD0A4\uC9C0: \uAE30\uBCF8\uC801\uC73C\uB85C \uD45C\uC2DC (\uC775\uC2A4\uD150\uC158 \uD31D\uC5C5 \uC5C6\uC73C\uBBC0\uB85C)\n toggleBtn.style.display = 'flex';\n shadow.appendChild(toggleBtn);\n\n // Draggable toggle button and panel\n makeDraggable(toggleBtn);\n makeDraggable(panelEl, '.dip-header');\n\n // Toggle button click\n toggleBtn.addEventListener('click', (e) => {\n e.stopPropagation();\n if ((toggleBtn as any)._diHasMoved?.()) return;\n toggle();\n });\n\n // Update toggle button + panel visibility on inspector toggle\n bus.on('toggled', (active) => {\n toggleBtn.classList.toggle('active', active as boolean);\n if (active) {\n showPanel();\n positionPanelNearButton(panelEl, toggleBtn);\n }\n });\n\n // Prevent clicks inside shadow DOM from reaching the document\n shadow.addEventListener('click', (e) => {\n e.stopPropagation();\n });\n\n // Mouse move for overlay\n document.addEventListener('mousemove', handleMouseMove, true);\n\n // Click handler for element selection\n document.addEventListener('click', (e) => {\n if (!state.isActive) return;\n const target = e.target as Element;\n\n if (target === host || target.id === 'dev-inspector-host') return;\n const path = e.composedPath();\n if (path.some(el => (el as Element).id === 'dev-inspector-host' || (el as any).host?.id === 'dev-inspector-host')) return;\n\n if (isInlinePopupVisible()) {\n hideInlinePopup();\n e.preventDefault();\n e.stopPropagation();\n return;\n }\n\n const sel = window.getSelection();\n if (sel && sel.toString().trim().length > 0) return;\n if (state._areaDragging) return;\n\n e.preventDefault();\n e.stopPropagation();\n\n const existIdx = state.selectedElements.findIndex(item => item.type === 'element' && item.el === target);\n if (existIdx >= 0) {\n removeSelection(existIdx);\n } else {\n showInlinePopup(target);\n }\n }, true);\n\n // Right-click on highlighted element\n document.addEventListener('contextmenu', (e) => {\n if (!state.isActive) return;\n const target = e.target as Element;\n if (!target.classList?.contains('di-selected-highlight')) return;\n e.preventDefault();\n const idx = state.selectedElements.findIndex(item => item.type === 'element' && item.el === target);\n if (idx < 0) return;\n requestAnimationFrame(() => {\n const noteArea = shadow.querySelector(`.dip-item[data-idx=\"${idx}\"] .dip-note-area`) as HTMLTextAreaElement;\n if (noteArea) noteArea.focus();\n });\n }, true);\n\n // iframe support\n function bindIframeEvents(iframeDoc: Document): void {\n iframeDoc.addEventListener('click', (e) => {\n if (!state.isActive) return;\n const target = e.target as Element;\n if (!target) return;\n const sel = iframeDoc.getSelection?.();\n if (sel && sel.toString().trim().length > 0) return;\n e.preventDefault();\n e.stopPropagation();\n const existIdx = state.selectedElements.findIndex(item => item.type === 'element' && item.el === target);\n if (existIdx >= 0) {\n removeSelection(existIdx);\n } else {\n showInlinePopup(target);\n }\n }, true);\n iframeDoc.addEventListener('mousemove', handleMouseMove, true);\n if (!iframeDoc.getElementById('dev-inspector-iframe-styles')) {\n const iframeStyle = iframeDoc.createElement('style');\n iframeStyle.id = 'dev-inspector-iframe-styles';\n iframeStyle.textContent = `\n .di-selected-highlight {\n box-shadow: inset 0 0 0 2px var(--di-marker-color, #7c8cf5) !important;\n background-color: rgba(124,140,245,0.12) !important;\n }\n .di-text-annotation {\n background: rgba(124,140,245,0.2);\n border-bottom: 2px solid #7c8cf5;\n cursor: pointer;\n border-radius: 2px;\n }\n `;\n (iframeDoc.head || iframeDoc.documentElement).appendChild(iframeStyle);\n }\n }\n\n function scanAndBindIframes(): void {\n document.querySelectorAll('iframe').forEach(iframe => {\n if ((iframe as any)._diEventsBound) return;\n try {\n const iframeDoc = iframe.contentDocument;\n if (iframeDoc && iframeDoc.body) {\n bindIframeEvents(iframeDoc);\n (iframe as any)._diEventsBound = true;\n }\n } catch { /* cross-origin iframe */ }\n });\n }\n\n scanAndBindIframes();\n window.addEventListener('load', scanAndBindIframes);\n let iframeScanCount = 0;\n const iframeScanInterval = setInterval(() => {\n scanAndBindIframes();\n if (++iframeScanCount > 20) clearInterval(iframeScanInterval);\n }, 500);\n\n // Initialize modules\n initInlinePopup(shadow);\n initAnnotate(shadow);\n initAnimation();\n initKeyboard();\n initTheme(host);\n initReactInspector();\n initBridge();\n\n // Apply initial settings\n if (state.markerColor !== '#7c8cf5') {\n document.documentElement.style.setProperty('--di-marker-color', state.markerColor);\n }\n if (state.blockInteractions) {\n const blockStyle = document.createElement('style');\n blockStyle.id = 'di-block-style';\n blockStyle.textContent = `body * { pointer-events: none !important; }\n #dev-inspector-host, #dev-inspector-host * { pointer-events: auto !important; }`;\n document.head.appendChild(blockStyle);\n }\n\n state._initialized = true;\n console.log('[dev-inspector] Initialized \u2014 Ctrl+Shift+X to toggle');\n}\n\nfunction positionPanelNearButton(panel: HTMLElement, toggleBtn: HTMLElement): void {\n // localStorage\uC5D0\uC11C \uC800\uC7A5\uB41C \uC704\uCE58\uAC00 \uC788\uC73C\uBA74 \uC0AC\uC6A9\n try {\n const savedPos = localStorage.getItem('di-pos-dev-inspector-panel');\n if (savedPos) return;\n } catch { /* ignore */ }\n\n const btnRect = toggleBtn.getBoundingClientRect();\n const panelW = 380;\n const panelH = Math.min(panel.scrollHeight, window.innerHeight * 0.6);\n let top = btnRect.top > panelH + 8 ? btnRect.top - panelH - 8 : btnRect.bottom + 8;\n let left = btnRect.right - panelW;\n if (left < 8) left = 8;\n if (left + panelW > window.innerWidth - 8) left = window.innerWidth - panelW - 8;\n top = Math.max(8, Math.min(top, window.innerHeight - panelH - 8));\n panel.style.right = 'auto'; panel.style.bottom = 'auto';\n panel.style.left = left + 'px'; panel.style.top = top + 'px';\n}\n\n// Start\nbootstrap();\n", "import { state } from './core';\nimport { isInspectorElement } from '../shared/selectors';\n\nlet overlayEl: HTMLElement;\n\nexport function createOverlay(shadowRoot: ShadowRoot): HTMLElement {\n overlayEl = document.createElement('div');\n overlayEl.id = 'dev-inspector-overlay';\n shadowRoot.appendChild(overlayEl);\n return overlayEl;\n}\n\nexport function handleMouseMove(e: MouseEvent): void {\n if (!state.isActive) return;\n const target = e.target as Element;\n // Check if target is inside our shadow DOM\n const root = target.getRootNode();\n if (root instanceof ShadowRoot && root.host?.id === 'dev-inspector-host') {\n overlayEl.style.display = 'none';\n state.hoveredElement = null;\n return;\n }\n if (target.id === 'dev-inspector-host' || isInspectorElement(target)) {\n overlayEl.style.display = 'none';\n state.hoveredElement = null;\n return;\n }\n state.hoveredElement = target;\n const r = target.getBoundingClientRect();\n let offsetX = 0;\n let offsetY = 0;\n\n // If target is inside an iframe, add iframe's position offset\n const ownerDoc = target.ownerDocument;\n if (ownerDoc !== document && ownerDoc.defaultView) {\n // Find the iframe element in the parent document\n try {\n const iframeEl = ownerDoc.defaultView.frameElement;\n if (iframeEl) {\n const iframeRect = iframeEl.getBoundingClientRect();\n offsetX = iframeRect.left;\n offsetY = iframeRect.top;\n }\n } catch { /* cross-origin */ }\n }\n\n overlayEl.style.display = 'block';\n overlayEl.style.top = (r.top + offsetY) + 'px';\n overlayEl.style.left = (r.left + offsetX) + 'px';\n overlayEl.style.width = r.width + 'px';\n overlayEl.style.height = r.height + 'px';\n overlayEl.dataset.tag = `${target.tagName.toLowerCase()}${target.id ? '#' + target.id : ''}`;\n}\n\nexport function hideOverlay(): void {\n if (overlayEl) overlayEl.style.display = 'none';\n}\n", "import { state, clearSelections, removeSelection, addSelection, toggleMarkers, setMarkerColor, setBlockInteractions, saveSetting, setAnnotationIntent, setAnnotationSeverity, addThreadMessage, createAnnotationMeta, serializeAnnotation, getBugContext } from './core';\nimport { escapeHtml, getComputedStyles, getBoundingInfo, getAccessibilityInfo, getNearbyText, getNearbyElements, getSourceFileHint } from './inspect';\nimport { getSelector, getSmartSelector, getHierarchy, getClassString } from '../shared/selectors';\nimport { MODE_LABELS, MODE_ORDER, COLOR_PRESETS, EXTENDED_CAT_LABELS, INTENT_OPTIONS, SEVERITY_OPTIONS } from '../shared/constants';\nimport { toMarkdown, toJSON, toGitHubIssue, toBugReport } from '../shared/formatters';\nimport * as bus from '../shared/event-bus';\nimport type { SelectionItem, CopyFormat, ReactInfo } from '../shared/types';\n\nlet panelEl: HTMLElement;\nlet contentWrap: HTMLElement;\nlet shadowRoot: ShadowRoot;\n\n// Track which sub-panels are open\nlet colorsOpen = false;\nlet typographyOpen = false;\nlet assetsOpen = false;\nlet getReactInfo: ((el: Element) => ReactInfo | null) | null = null;\n\nfunction updateSubPanelButtons(): void {\n if (!contentWrap) return;\n const colorBtn = contentWrap.querySelector('[data-action=\"show-colors\"]');\n const typoBtn = contentWrap.querySelector('[data-action=\"show-typography\"]');\n const assetsBtn = contentWrap.querySelector('[data-action=\"show-assets\"]');\n colorBtn?.classList.toggle('active', colorsOpen);\n typoBtn?.classList.toggle('active', typographyOpen);\n assetsBtn?.classList.toggle('active', assetsOpen);\n}\n\n// ========== Feature 4: Live CSS Editing State ==========\nconst liveEditMap = new Map<Element, Map<string, string>>(); // el -> (prop -> originalValue)\n\nexport function setReactInfoFn(fn: (el: Element) => ReactInfo | null): void {\n getReactInfo = fn;\n}\n\nexport function createPanel(sr: ShadowRoot): HTMLElement {\n shadowRoot = sr;\n panelEl = document.createElement('div');\n panelEl.id = 'dev-inspector-panel';\n contentWrap = document.createElement('div');\n contentWrap.className = 'dip-content';\n panelEl.appendChild(contentWrap);\n\n const grip = document.createElement('div');\n grip.className = 'dip-resize-grip';\n panelEl.appendChild(grip);\n initResize(grip);\n\n sr.appendChild(panelEl);\n return panelEl;\n}\n\n// ========== Bind event listeners to all [data-action] elements after render ==========\nfunction bindActions(): void {\n // Bind all action buttons\n contentWrap.querySelectorAll('[data-action]').forEach((el) => {\n const actionEl = el as HTMLElement;\n const action = actionEl.dataset.action!;\n actionEl.addEventListener('click', (e) => {\n e.stopPropagation();\n handleAction(action, actionEl);\n });\n });\n\n // Bind webhook input\n contentWrap.querySelectorAll('.dip-webhook-input').forEach((el) => {\n const input = el as HTMLInputElement;\n input.addEventListener('change', () => {\n state.webhookUrl = input.value;\n saveSetting('webhookUrl', input.value);\n });\n });\n\n // Bind color picker\n contentWrap.querySelectorAll('.dip-color-picker').forEach((el) => {\n const input = el as HTMLInputElement;\n input.addEventListener('input', () => setMarkerColor(input.value));\n });\n\n // Bind setting checkboxes\n contentWrap.querySelectorAll('[data-setting]').forEach((el) => {\n const input = el as HTMLInputElement;\n input.addEventListener('change', () => {\n const key = input.dataset.setting!;\n const val = input.checked;\n switch (key) {\n case 'clearOnCopy': state.clearOnCopy = val; saveSetting('clearOnCopy', val); break;\n case 'blockInteractions': setBlockInteractions(val); break;\n case 'reactMode': state.reactMode = val; saveSetting('reactMode', val); bus.emit('selectionChanged', state.selectedElements); break;\n case 'panelMode': state.panelMode = val ? 'reporter' : 'developer'; saveSetting('panelMode', state.panelMode); renderPanel(); break;\n }\n });\n });\n\n // Bind thread inputs\n contentWrap.querySelectorAll('.dip-thread-input').forEach((el) => {\n const textarea = el as HTMLTextAreaElement;\n textarea.addEventListener('keydown', (e) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault();\n const annId = textarea.dataset.annId!;\n if (textarea.value.trim()) {\n addThreadMessage(annId, 'human', textarea.value.trim());\n textarea.value = '';\n }\n }\n });\n });\n\n // Close dropdowns on outside clicks within shadow\n shadowRoot.addEventListener('click', (e) => {\n const target = e.target as Element;\n if (!target.closest?.('.dip-copy-wrap')) {\n const m = contentWrap.querySelector('.dip-copy-menu');\n if (m) m.classList.remove('open');\n }\n if (!target.closest?.('.dip-mode-wrap')) {\n const m = contentWrap.querySelector('.dip-mode-menu');\n if (m) m.classList.remove('open');\n }\n if (!target.closest?.('.dip-settings-wrap')) {\n const sp = contentWrap.querySelector('.dip-settings-panel');\n if (sp) sp.classList.remove('open');\n }\n }, { once: true }); // re-registered every render\n}\n\nfunction handleAction(action: string, el: HTMLElement): void {\n const idx = el.dataset.idx !== undefined ? parseInt(el.dataset.idx) : -1;\n const annId = el.dataset.annId;\n\n switch (action) {\n case 'remove': removeSelection(idx); break;\n case 'clear': clearSelections(); break;\n case 'toggle-theme': toggleTheme(); break;\n case 'toggle-markers': toggleMarkers(); break;\n case 'toggle-animations': bus.emit('toggleAnimations'); break;\n case 'send-webhook': bus.emit('sendWebhook'); break;\n case 'submit-annotations': bus.emit('submitAnnotations'); break;\n case 'cycle-mode': cycleOutputMode(); break;\n case 'toggle-mode-menu': {\n const menu = contentWrap.querySelector('.dip-mode-menu');\n if (menu) menu.classList.toggle('open');\n break;\n }\n case 'set-mode': {\n const mode = el.dataset.mode;\n if (mode) {\n if ((mode === 'detailed' || mode === 'forensic') && !state.isPro) {\n showProGate(`${mode.charAt(0).toUpperCase() + mode.slice(1)} mode`);\n break;\n }\n state.outputMode = mode as any;\n saveSetting('outputMode', state.outputMode);\n const menu = contentWrap.querySelector('.dip-mode-menu');\n if (menu) menu.classList.remove('open');\n renderPanel();\n }\n break;\n }\n case 'toggle-copy-menu': {\n const menu = contentWrap.querySelector('.dip-copy-menu');\n if (menu) menu.classList.toggle('open');\n break;\n }\n case 'copy': copyAs(el.dataset.format as CopyFormat); break;\n case 'screenshot': bus.emit('captureElement', idx); break;\n case 'toggle-settings': {\n const sp = contentWrap.querySelector('.dip-settings-panel');\n if (sp) sp.classList.toggle('open');\n break;\n }\n case 'set-color': setMarkerColor(el.dataset.color!); break;\n case 'nav-parent': navParent(idx); break;\n case 'nav-child': navChild(idx); break;\n case 'hierarchy-select': {\n const hierIdx = parseInt(el.dataset.hierIdx!);\n selectHierarchyEl(idx, hierIdx);\n break;\n }\n case 'set-intent':\n if (annId) setAnnotationIntent(annId, el.dataset.intent as any);\n break;\n case 'set-severity':\n if (annId) setAnnotationSeverity(annId, el.dataset.severity as any);\n break;\n case 'add-thread-msg': {\n if (!annId) break;\n const textarea = contentWrap.querySelector(`.dip-thread-input[data-ann-id=\"${annId}\"]`) as HTMLTextAreaElement;\n if (textarea && textarea.value.trim()) {\n const text = textarea.value.trim();\n const item = state.selectedElements.find(i => i.id === annId);\n // First human message also becomes the note (for backward compat)\n if (item && !item.note) item.note = text;\n addThreadMessage(annId, 'human', text);\n textarea.value = '';\n }\n break;\n }\n case 'toggle-thread': break; // Comment section always open now\n case 'toggle-a11y': {\n const a11yWrap = el.closest('.dip-section')?.querySelector('.dip-a11y-details');\n if (a11yWrap) a11yWrap.classList.toggle('open');\n break;\n }\n // ===== Feature 1: Color Palette =====\n case 'show-colors':\n if (!state.isPro) { showProGate('Color Palette'); break; }\n toggleColorsPanel(); break;\n // ===== Feature 2: Typography Summary =====\n case 'show-typography':\n if (!state.isPro) { showProGate('Typography Summary'); break; }\n toggleTypographyPanel(); break;\n // ===== Feature 4: Live CSS Editing =====\n case 'edit-style': {\n if (!state.isPro) { showProGate('Live CSS Editing'); break; }\n const prop = el.dataset.prop!;\n const editIdx = parseInt(el.dataset.idx!);\n startStyleEdit(el, prop, editIdx);\n break;\n }\n case 'reset-styles': {\n if (!state.isPro) { showProGate('Live CSS Editing'); break; }\n const resetIdx = parseInt(el.dataset.idx!);\n resetLiveEdits(resetIdx);\n break;\n }\n // ===== Feature 5: Copy color swatch =====\n case 'copy-color': {\n const hex = el.dataset.hex!;\n navigator.clipboard.writeText(hex).then(() => {\n el.title = 'Copied!';\n setTimeout(() => { el.title = hex; }, 1200);\n });\n break;\n }\n // ===== Feature 2: Copy typography =====\n case 'copy-typo': {\n const css = el.dataset.css!;\n navigator.clipboard.writeText(css).then(() => {\n const span = el.querySelector('.dip-typo-copy-icon');\n if (span) { span.textContent = '\\u2713'; setTimeout(() => { span.textContent = '\\uD83D\\uDCCB'; }, 1200); }\n });\n break;\n }\n // ===== Feature 6: Screenshot Annotate =====\n case 'screenshot-annotate':\n if (!state.isPro) { showProGate('Screenshot Annotator'); break; }\n launchScreenshotAnnotator(); break;\n // ===== Feature 7: Layout Overlay =====\n case 'toggle-layout-overlay': {\n if (!state.isPro) { showProGate('Layout Overlay'); break; }\n const overlayIdx = parseInt(el.dataset.idx!);\n toggleLayoutOverlay(overlayIdx);\n break;\n }\n // ===== Feature 8: PM Mode =====\n case 'set-panel-mode': {\n if (!state.isPro) { showProGate('PM/Reporter Mode'); break; }\n const mode = el.dataset.panelMode as 'developer' | 'reporter';\n if (mode) {\n state.panelMode = mode;\n saveSetting('panelMode', mode);\n renderPanel();\n }\n break;\n }\n case 'reporter-submit': {\n bus.emit('submitAnnotations');\n break;\n }\n // ===== Feature 9: Asset Extraction =====\n case 'show-assets':\n if (!state.isPro) { showProGate('Asset Extraction'); break; }\n toggleAssetsPanel(); break;\n case 'download-asset': {\n const assetUrl = el.dataset.assetUrl!;\n const assetName = el.dataset.assetName || 'asset';\n downloadAsset(assetUrl, assetName);\n break;\n }\n case 'copy-svg': {\n const svgSelector = el.dataset.svgSelector!;\n copySvgCode(svgSelector);\n break;\n }\n }\n}\n\n// ========== Pro Feature Gate ==========\nfunction showProGate(featureName: string): void {\n // Show a temporary toast-style message in the panel\n const toast = document.createElement('div');\n toast.style.cssText = 'position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);background:rgba(0,0,0,0.92);color:#fff;padding:16px 24px;border-radius:12px;font-size:13px;z-index:999999;text-align:center;border:1px solid rgba(124,140,245,0.4);max-width:280px;line-height:1.5;';\n toast.innerHTML = `<div style=\"font-size:20px;margin-bottom:8px\">🔒</div><strong>${featureName}</strong> is a Pro feature.<br><span style=\"color:#7c8cf5;font-size:11px;margin-top:6px;display:inline-block\">Upgrade at extensionpay.com/dev-inspector</span>`;\n document.body.appendChild(toast);\n setTimeout(() => toast.remove(), 3000);\n}\n\n// ========== Rendering ==========\nexport function renderPanel(): void {\n const items = state.selectedElements;\n const themeIcon = state.theme === 'dark' ? '\\u2600\\uFE0F' : '\\uD83C\\uDF19';\n const pauseActiveClass = state.animationsPaused ? ' active' : '';\n const modeLabel = MODE_LABELS[state.outputMode] || 'Standard';\n const markerIcon = state.markersVisible ? '\\uD83D\\uDC41' : '\\uD83D\\uDC41\\u200D\\uD83D\\uDDE8';\n\n const mcpDot = state._mcpConnected ? 'connected' : 'disconnected';\n const pendingCount = items.filter(i => i.status === 'pending').length;\n // Only show pending badge when some items are NOT pending (otherwise it duplicates the total count)\n const pendingBadge = (pendingCount > 0 && pendingCount < items.length) ? `<span class=\"dip-pending-badge\">${pendingCount}</span>` : '';\n\n const headerActions = `\n <div class=\"dip-header-actions\">\n <span class=\"di-mcp-dot ${mcpDot}\"></span><span class=\"di-mcp-port\">MCP</span>\n <div class=\"dip-settings-wrap\">\n <button class=\"dip-settings-btn\" data-action=\"toggle-settings\" title=\"Settings\">\\u2699\\uFE0F</button>\n ${buildSettingsHTML()}\n </div>\n <button class=\"dip-theme-toggle\" data-action=\"toggle-theme\" title=\"Toggle theme\">${themeIcon}</button>\n <button data-action=\"toggle-markers\" title=\"Toggle markers\">${markerIcon}</button>\n <button data-action=\"toggle-animations\"${pauseActiveClass ? ' class=\"active\"' : ''} title=\"Pause animations\">\\u23F8</button>\n <button data-action=\"show-colors\"${colorsOpen ? ' class=\"active\"' : ''} title=\"Color Palette${!state.isPro ? ' (Pro)' : ''}\">${!state.isPro ? '\\uD83D\\uDD12' : '\\uD83C\\uDFA8'}</button>\n <button data-action=\"show-typography\"${typographyOpen ? ' class=\"active\"' : ''} title=\"Typography Summary${!state.isPro ? ' (Pro)' : ''}\">${!state.isPro ? '\\uD83D\\uDD12' : 'Aa'}</button>\n <button data-action=\"screenshot-annotate\" title=\"Annotate Screenshot${!state.isPro ? ' (Pro)' : ''}\">${!state.isPro ? '\\uD83D\\uDD12' : '\\uD83D\\uDCF8'}</button>\n <button data-action=\"show-assets\"${assetsOpen ? ' class=\"active\"' : ''} title=\"Page Assets${!state.isPro ? ' (Pro)' : ''}\">${!state.isPro ? '\\uD83D\\uDD12' : '\\uD83D\\uDDBC'}</button>\n <div class=\"dip-mode-wrap\">\n <button data-action=\"toggle-mode-menu\">${modeLabel} \\u25BE</button>\n <div class=\"dip-mode-menu\">\n ${MODE_ORDER.map(m => `<button data-action=\"set-mode\" data-mode=\"${m}\"${m === state.outputMode ? ' class=\"active\"' : ''}>${MODE_LABELS[m]}${(!state.isPro && (m === 'detailed' || m === 'forensic')) ? ' \\uD83D\\uDD12' : ''}</button>`).join('')}\n </div>\n </div>\n <div class=\"dip-copy-wrap\">\n <button data-action=\"toggle-copy-menu\">Copy \\u25BE</button>\n <div class=\"dip-copy-menu\">\n <button data-action=\"copy\" data-format=\"markdown\">Markdown</button>\n <button data-action=\"copy\" data-format=\"json\">JSON</button>\n <button data-action=\"copy\" data-format=\"selector\">Selector Only</button>\n <button data-action=\"copy\" data-format=\"querySelector\">querySelector()</button>\n <div style=\"border-top:1px solid var(--di-border);margin:4px 0\"></div>\n <button data-action=\"copy\" data-format=\"github-issue\">GitHub Issue</button>\n <button data-action=\"copy\" data-format=\"bug-report\">Bug Report</button>\n </div>\n </div>\n ${state.webhookUrl ? '<button data-action=\"submit-annotations\" class=\"dip-submit-btn\" title=\"Send Annotations\">\\uD83D\\uDCE4 Send</button>' : ''}\n <button data-action=\"clear\">Clear</button>\n </div>`;\n\n if (!items.length) {\n contentWrap.innerHTML = `\n <div class=\"dip-header\">\n <span class=\"dip-header-title\">Dev InSpector</span>\n ${headerActions}\n </div>\n <div class=\"dip-empty\">\n Click elements to select<br>\n <small>Click: select | Click again: deselect | Shift+drag: area select</small>\n </div>`;\n bindActions();\n return;\n }\n\n let html = `\n <div class=\"dip-header\">\n <span class=\"dip-header-title\">Dev InSpector (${items.length}) ${pendingBadge}</span>\n ${headerActions}\n </div>`;\n\n items.forEach((item, i) => {\n if (item.type === 'text-selection') html += renderTextItem(item, i);\n else if (item.type === 'area') html += renderAreaItem(item, i);\n else html += renderElementItem(item, i);\n });\n\n // ===== Feature 5: Inter-Element Spacing Ruler =====\n const elItems = items.filter(i => {\n if (i.type !== 'element' || !i.el) return false;\n const r = i.el.getBoundingClientRect();\n return r.width > 0 && r.height > 0; // Exclude hidden/zero-size elements\n });\n // Always clean up old rulers + scroll listeners first\n removeSpacingRulers();\n\n if (elItems.length === 2 && state.isPro) {\n const el1 = (elItems[0] as any).el as Element;\n const el2 = (elItems[1] as any).el as Element;\n html += renderSpacingSection(el1, el2);\n renderSpacingRuler(el1, el2);\n setupSpacingScrollUpdate(el1, el2);\n }\n\n contentWrap.innerHTML = html;\n bindActions();\n}\n\n// ========== Intent/Severity/Status Badges ==========\nfunction renderAnnotationMeta(item: SelectionItem, idx: number): string {\n const statusColors: Record<string, string> = {\n pending: 'var(--di-text-muted)', acknowledged: 'var(--di-accent)',\n resolved: 'var(--di-success)', dismissed: 'var(--di-danger)',\n };\n const statusLabel = item.status.charAt(0).toUpperCase() + item.status.slice(1);\n const intentBtns = INTENT_OPTIONS.map(o =>\n `<button class=\"dip-intent-btn${item.intent === o.value ? ' active' : ''}\" data-action=\"set-intent\" data-ann-id=\"${item.id}\" data-intent=\"${o.value}\" title=\"${o.label}\">${o.icon}</button>`\n ).join('');\n const severityBtns = SEVERITY_OPTIONS.map(o =>\n `<button class=\"dip-severity-btn${item.severity === o.value ? ' active' : ''}\" style=\"${item.severity === o.value ? `background:${o.color}20;border-color:${o.color};color:${o.color}` : ''}\" data-action=\"set-severity\" data-ann-id=\"${item.id}\" data-severity=\"${o.value}\" title=\"${o.label}\">${o.label}</button>`\n ).join('');\n return `<div class=\"dip-annotation-meta\">\n <div class=\"dip-meta-row\">\n <span class=\"dip-status-badge\" style=\"color:${statusColors[item.status]}\">\\u25CF ${statusLabel}</span>\n <div class=\"dip-intent-group\">${intentBtns}</div>\n </div>\n <div class=\"dip-meta-row\">\n <div class=\"dip-severity-group\">${severityBtns}</div>\n </div>\n </div>`;\n}\n\n// ========== Comment Section (always open) ==========\nfunction renderCommentSection(item: SelectionItem): string {\n const threadCount = item.thread.length;\n const hasNote = !!(item.note && item.note.trim());\n // Don't double-count: if note equals first thread message, skip note display\n const noteShownInThread = hasNote && threadCount > 0 && item.thread[0].content === item.note;\n const showNote = hasNote && !noteShownInThread;\n const totalCount = threadCount + (showNote ? 1 : 0);\n\n let messages = '';\n\n if (showNote) {\n messages += `<div class=\"dip-thread-msg dip-thread-human\">\n <span class=\"dip-thread-role\">\\uD83D\\uDCDD</span>\n <span class=\"dip-thread-content\">${escapeHtml(item.note)}</span>\n </div>`;\n }\n\n if (threadCount > 0) {\n messages += item.thread.map(msg => {\n const roleClass = msg.role === 'agent' ? 'dip-thread-agent' : 'dip-thread-human';\n const roleLabel = msg.role === 'agent' ? '\\uD83E\\uDD16' : '\\uD83D\\uDC64';\n const time = new Date(msg.timestamp).toLocaleTimeString();\n return `<div class=\"dip-thread-msg ${roleClass}\">\n <span class=\"dip-thread-role\">${roleLabel}</span>\n <span class=\"dip-thread-content\">${escapeHtml(msg.content)}</span>\n <span class=\"dip-thread-time\">${time}</span>\n </div>`;\n }).join('');\n }\n\n return `<div class=\"dip-section\">\n ${totalCount > 0 ? `<div class=\"dip-label\">\\uD83D\\uDCAC Comment (${totalCount})</div>` : ''}\n <div class=\"dip-thread-wrap open\" data-ann-id=\"${item.id}\">\n ${messages}\n <div class=\"dip-thread-input-wrap\">\n <textarea class=\"dip-thread-input\" data-ann-id=\"${item.id}\" rows=\"1\" placeholder=\"Add a note...\"></textarea>\n <button data-action=\"add-thread-msg\" data-ann-id=\"${item.id}\" class=\"dip-thread-send\">\\u27A4</button>\n </div>\n </div>\n </div>`;\n}\n\n// ========== Accessibility Section ==========\nfunction renderAccessibilitySection(el: Element): string {\n const a11y = getAccessibilityInfo(el);\n if (!a11y) return '';\n const entries: string[] = [];\n if (a11y.role) entries.push(`role=\"${a11y.role}\"`);\n if (a11y.ariaLabel) entries.push(`aria-label=\"${a11y.ariaLabel}\"`);\n if (a11y.ariaDescribedBy) entries.push(`aria-describedby=\"${a11y.ariaDescribedBy}\"`);\n if (a11y.ariaExpanded) entries.push(`aria-expanded=\"${a11y.ariaExpanded}\"`);\n if (a11y.ariaHidden) entries.push(`aria-hidden=\"${a11y.ariaHidden}\"`);\n if (a11y.ariaLive) entries.push(`aria-live=\"${a11y.ariaLive}\"`);\n if (a11y.tabIndex) entries.push(`tabindex=\"${a11y.tabIndex}\"`);\n if (a11y.altText) entries.push(`alt=\"${a11y.altText}\"`);\n if (a11y.title) entries.push(`title=\"${a11y.title}\"`);\n return `<div class=\"dip-section\">\n <div class=\"dip-label\" style=\"cursor:pointer\" data-action=\"toggle-a11y\">\\u267F Accessibility (${entries.length})</div>\n <div class=\"dip-a11y-details\">\n <div class=\"dip-value\">${entries.map(e => escapeHtml(e)).join('<br>')}</div>\n </div>\n </div>`;\n}\n\nfunction renderNearbySection(el: Element): string {\n const nearby = getNearbyText(el);\n const nearbyEls = getNearbyElements(el);\n if (!nearby && !nearbyEls.length) return '';\n let html = '<div class=\"dip-section\"><div class=\"dip-label\">\\uD83D\\uDD0D Context</div><div class=\"dip-value\">';\n if (nearby) html += `<div class=\"dip-nearby-text\">${escapeHtml(nearby)}</div>`;\n if (nearbyEls.length) html += `<div class=\"dip-nearby-elements\">${nearbyEls.map(e => `<span class=\"dip-nearby-el\">${escapeHtml(e)}</span>`).join(' ')}</div>`;\n html += '</div></div>';\n return html;\n}\n\nfunction renderSourceFileSection(el: Element): string {\n const src = getSourceFileHint(el);\n if (!src) return '';\n return `<div class=\"dip-section\"><div class=\"dip-label\">\\uD83D\\uDCC1 Source File</div><div class=\"dip-value dip-source-file\">${escapeHtml(src)}</div></div>`;\n}\n\n// ========== Quick Tailwind Mapping ==========\nfunction getQuickTailwind(el: Element): string {\n const cs = window.getComputedStyle(el);\n const classes: string[] = [];\n\n const displayMap: Record<string, string> = { block: 'block', flex: 'flex', grid: 'grid', inline: 'inline', 'inline-block': 'inline-block', 'inline-flex': 'inline-flex', none: 'hidden' };\n if (displayMap[cs.display]) classes.push(displayMap[cs.display]);\n\n const posMap: Record<string, string> = { relative: 'relative', absolute: 'absolute', fixed: 'fixed', sticky: 'sticky' };\n if (posMap[cs.position]) classes.push(posMap[cs.position]);\n\n const spacingProps = [\n { css: 'paddingTop', prefix: 'pt' }, { css: 'paddingBottom', prefix: 'pb' },\n { css: 'paddingLeft', prefix: 'pl' }, { css: 'paddingRight', prefix: 'pr' },\n { css: 'marginTop', prefix: 'mt' }, { css: 'marginBottom', prefix: 'mb' },\n { css: 'marginLeft', prefix: 'ml' }, { css: 'marginRight', prefix: 'mr' },\n ] as const;\n const pxToTw = (px: string): string => {\n const v = parseFloat(px);\n if (v === 0) return '0';\n if (v === 1) return 'px';\n if (v === 2) return '0.5';\n if (v === 4) return '1';\n if (v === 8) return '2';\n if (v === 12) return '3';\n if (v === 16) return '4';\n if (v === 20) return '5';\n if (v === 24) return '6';\n if (v === 32) return '8';\n if (v === 40) return '10';\n if (v === 48) return '12';\n if (v === 64) return '16';\n return `[${px}]`;\n };\n for (const { css, prefix } of spacingProps) {\n const val = cs.getPropertyValue(css.replace(/[A-Z]/g, m => '-' + m.toLowerCase()));\n if (val && parseFloat(val) !== 0) classes.push(`${prefix}-${pxToTw(val)}`);\n }\n\n const fs = parseFloat(cs.fontSize);\n const fsMap: Record<number, string> = { 12: 'text-xs', 14: 'text-sm', 16: 'text-base', 18: 'text-lg', 20: 'text-xl', 24: 'text-2xl', 30: 'text-3xl' };\n if (fsMap[fs]) classes.push(fsMap[fs]);\n else if (fs) classes.push(`text-[${cs.fontSize}]`);\n\n const fwMap: Record<string, string> = { '300': 'font-light', '400': 'font-normal', '500': 'font-medium', '600': 'font-semibold', '700': 'font-bold', '800': 'font-extrabold' };\n if (fwMap[cs.fontWeight]) classes.push(fwMap[cs.fontWeight]);\n\n const br = parseFloat(cs.borderRadius);\n if (br > 0) {\n if (br >= 9999) classes.push('rounded-full');\n else if (br <= 2) classes.push('rounded-sm');\n else if (br <= 4) classes.push('rounded');\n else if (br <= 6) classes.push('rounded-md');\n else if (br <= 8) classes.push('rounded-lg');\n else classes.push('rounded-xl');\n }\n\n return classes.join(' ');\n}\n\n// ========== Quick Contrast Calculation ==========\nfunction parseColor(color: string): { r: number; g: number; b: number } | null {\n const m = color.match(/rgba?\\((\\d+),\\s*(\\d+),\\s*(\\d+)/);\n if (!m) return null;\n return { r: parseInt(m[1]), g: parseInt(m[2]), b: parseInt(m[3]) };\n}\n\nfunction relativeLuminance(r: number, g: number, b: number): number {\n const [rs, gs, bs] = [r, g, b].map(c => {\n const s = c / 255;\n return s <= 0.03928 ? s / 12.92 : Math.pow((s + 0.055) / 1.055, 2.4);\n });\n return 0.2126 * rs + 0.7152 * gs + 0.0722 * bs;\n}\n\nfunction getQuickContrast(el: Element): { fg: string; bg: string; ratio: number; passAA: boolean; passAAA: boolean } | null {\n const cs = window.getComputedStyle(el);\n const fg = cs.color;\n const fgParsed = parseColor(fg);\n if (!fgParsed) return null;\n\n // Walk up to find a non-transparent background\n let bgColor = 'rgb(255, 255, 255)';\n let current: Element | null = el;\n while (current) {\n const bgVal = window.getComputedStyle(current).backgroundColor;\n const parsed = parseColor(bgVal);\n if (parsed && (parsed.r !== 0 || parsed.g !== 0 || parsed.b !== 0 || !bgVal.includes('0)'))) {\n // Check if it's not fully transparent\n const alphaMatch = bgVal.match(/rgba\\(\\d+,\\s*\\d+,\\s*\\d+,\\s*([\\d.]+)\\)/);\n if (!alphaMatch || parseFloat(alphaMatch[1]) > 0) {\n bgColor = bgVal;\n break;\n }\n }\n current = current.parentElement;\n }\n\n const bgParsed = parseColor(bgColor);\n if (!bgParsed) return null;\n\n const l1 = relativeLuminance(fgParsed.r, fgParsed.g, fgParsed.b);\n const l2 = relativeLuminance(bgParsed.r, bgParsed.g, bgParsed.b);\n const ratio = (Math.max(l1, l2) + 0.05) / (Math.min(l1, l2) + 0.05);\n\n return {\n fg,\n bg: bgColor,\n ratio: Math.round(ratio * 100) / 100,\n passAA: ratio >= 4.5,\n passAAA: ratio >= 7,\n };\n}\n\n// ========== Quick A11y Checks ==========\nfunction getQuickA11y(el: Element): string[] {\n const warnings: string[] = [];\n const tag = el.tagName.toLowerCase();\n\n if (tag === 'img' && !el.getAttribute('alt') && !el.getAttribute('aria-label')) {\n warnings.push('Missing alt attribute on <img>');\n }\n if ((tag === 'input' || tag === 'textarea' || tag === 'select') && !el.getAttribute('aria-label') && !el.getAttribute('aria-labelledby')) {\n const id = el.getAttribute('id');\n if (!id || !el.ownerDocument.querySelector(`label[for=\"${id}\"]`)) {\n warnings.push(`Missing label on <${tag}>`);\n }\n }\n if ((tag === 'button' || tag === 'a') && !(el.textContent?.trim()) && !el.getAttribute('aria-label') && !el.querySelector('img, svg')) {\n warnings.push(`Empty text in <${tag}>`);\n }\n // Contrast check\n const text = el.textContent?.trim();\n if (text) {\n const contrast = getQuickContrast(el);\n if (contrast && !contrast.passAA) {\n warnings.push(`Low contrast ratio (${contrast.ratio}:1, needs 4.5:1 for AA)`);\n }\n }\n\n return warnings;\n}\n\nfunction renderElementItem(item: SelectionItem & { type: 'element' }, idx: number): string {\n const mode = state.outputMode;\n const el = item.el;\n if (!el) return '';\n const smartSel = getSmartSelector(el);\n\n // ===== Feature 8: Reporter Mode =====\n if (state.panelMode === 'reporter') {\n return renderReporterElementItem(item, idx);\n }\n\n let html = `<div class=\"dip-item${item.status === 'resolved' ? ' dip-resolved' : item.status === 'dismissed' ? ' dip-dismissed' : ''}\" data-idx=\"${idx}\">\n <div class=\"dip-item-actions\">\n <button class=\"dip-screenshot-btn\" data-action=\"screenshot\" data-idx=\"${idx}\" title=\"Screenshot\">\\uD83D\\uDCF7</button>\n <button class=\"dip-remove\" data-action=\"remove\" data-idx=\"${idx}\">×</button>\n </div>\n ${renderAnnotationMeta(item, idx)}\n <div class=\"dip-section\"><div class=\"dip-label\">Smart Selector</div><div class=\"dip-value dip-selector\">${escapeHtml(smartSel)}</div></div>`;\n\n if (mode === 'compact') return html + renderCommentSection(item) + '</div>';\n\n html += `<div class=\"dip-section\"><div class=\"dip-label\">Bounding Box</div><div class=\"dip-value\">${escapeHtml(getBoundingInfo(el))}</div></div>`;\n const textContent = el.textContent?.trim().substring(0, 100);\n if (textContent) html += `<div class=\"dip-section\"><div class=\"dip-label\">Text Content</div><div class=\"dip-value\">${escapeHtml(textContent)}</div></div>`;\n\n html += renderHierarchySection(el, idx);\n html += renderReactSection(el);\n html += renderAccessibilitySection(el);\n\n if (mode === 'standard') return html + renderNearbySection(el) + renderCommentSection(item) + '</div>';\n\n html += `<div class=\"dip-section\"><div class=\"dip-label\">CSS Path</div><div class=\"dip-value dip-selector\">${escapeHtml(getSelector(el))}</div></div>`;\n const classes = getClassString(el);\n if (classes) html += `<div class=\"dip-section\"><div class=\"dip-label\">Classes</div><div class=\"dip-value dip-classes\">${escapeHtml(classes)}</div></div>`;\n\n const basicStyles = getComputedStyles(el) as Array<{ prop: string; val: string }>;\n const hasEdits = liveEditMap.has(el);\n if (basicStyles.length) {\n html += `<div class=\"dip-section\"><div class=\"dip-label\">Computed Styles ${hasEdits ? '<button class=\"dip-reset-btn\" data-action=\"reset-styles\" data-idx=\"' + idx + '\" title=\"Reset all live edits\">\\u21A9 Reset</button>' : ''}</div><div class=\"dip-value\"><div class=\"dip-styles-grid\">\n ${basicStyles.map(s => {\n const isEdited = hasEdits && liveEditMap.get(el)!.has(s.prop);\n return `<div class=\"dip-style-row${isEdited ? ' dip-style-edited' : ''}\"><span class=\"dip-style-prop\">${s.prop}:</span><span class=\"dip-style-val dip-editable-val\" data-action=\"edit-style\" data-prop=\"${s.prop}\" data-idx=\"${idx}\" title=\"Click to edit\">${escapeHtml(s.val)}</span></div>`;\n }).join('')}\n </div></div></div>`;\n }\n\n // ===== Feature 7: Flexbox/Grid Layout Overlay =====\n html += renderLayoutSection(el, idx);\n\n html += renderNearbySection(el);\n html += renderSourceFileSection(el);\n\n if (mode === 'detailed') return html + renderCommentSection(item) + '</div>';\n\n const extended = getComputedStyles(el, true) as { basic: Array<{ prop: string; val: string }>; categories: Record<string, Array<{ prop: string; val: string }>> };\n if (extended.categories) {\n for (const [cat, catItems] of Object.entries(extended.categories)) {\n html += `<div class=\"dip-section\"><div class=\"dip-label\">${EXTENDED_CAT_LABELS[cat] || cat}</div><div class=\"dip-value\"><div class=\"dip-styles-grid\">\n ${catItems.map(s => `<div class=\"dip-style-row\"><span class=\"dip-style-prop\">${s.prop}:</span><span class=\"dip-style-val\">${escapeHtml(s.val)}</span></div>`).join('')}\n </div></div></div>`;\n }\n }\n\n // Tailwind classes section\n const twClasses = getQuickTailwind(el);\n if (twClasses) {\n html += `<div class=\"dip-section\"><div class=\"dip-label\">Tailwind</div><div class=\"dip-value dip-tailwind-classes\">${escapeHtml(twClasses)}</div></div>`;\n }\n\n // Contrast ratio section\n const contrast = getQuickContrast(el);\n if (contrast) {\n const aaBadge = contrast.passAA\n ? '<span class=\"dip-contrast-badge pass\">AA \\u2705</span>'\n : '<span class=\"dip-contrast-badge fail\">AA \\u274C</span>';\n const aaaBadge = contrast.passAAA\n ? '<span class=\"dip-contrast-badge pass\">AAA \\u2705</span>'\n : '<span class=\"dip-contrast-badge fail\">AAA \\u274C</span>';\n html += `<div class=\"dip-section\"><div class=\"dip-label\">Contrast</div><div class=\"dip-value\">${escapeHtml(contrast.fg)} / ${escapeHtml(contrast.bg)} \\u00B7 ${contrast.ratio}:1 ${aaBadge} ${aaaBadge}</div></div>`;\n }\n\n // Accessibility warnings section\n const a11yWarnings = getQuickA11y(el);\n if (a11yWarnings.length) {\n html += `<div class=\"dip-section dip-a11y-warn\"><div class=\"dip-label\">A11y</div><div class=\"dip-value\">\\u26A0\\uFE0F ${a11yWarnings.map(w => escapeHtml(w)).join('<br>\\u26A0\\uFE0F ')}</div></div>`;\n }\n\n return html + renderCommentSection(item) + '</div>';\n}\n\nfunction renderHierarchySection(el: Element, idx: number): string {\n const hierarchy = getHierarchy(el);\n const links = hierarchy.map((h, hi) => {\n if (h.isCurrent) return `<span class=\"dip-hierarchy-current\">${escapeHtml(h.label)}</span>`;\n return `<span class=\"dip-hierarchy-link\" data-action=\"hierarchy-select\" data-idx=\"${idx}\" data-hier-idx=\"${hi}\">${escapeHtml(h.label)}</span>`;\n }).join(' > ');\n return `<div class=\"dip-section\"><div class=\"dip-label\">Hierarchy</div><div class=\"dip-value dip-hierarchy\">${links}</div>\n <div class=\"dip-hierarchy-nav\">\n <button data-action=\"nav-parent\" data-idx=\"${idx}\" title=\"Select parent\">\\u2191 Parent</button>\n <button data-action=\"nav-child\" data-idx=\"${idx}\" title=\"Select first child\">\\u2193 Child</button>\n </div></div>`;\n}\n\nfunction renderTextItem(item: SelectionItem & { type: 'text-selection' }, idx: number): string {\n const parentSelector = item.parentEl ? getSelector(item.parentEl) : '(unknown)';\n return `<div class=\"dip-item${item.status === 'resolved' ? ' dip-resolved' : ''}\" data-idx=\"${idx}\">\n <button class=\"dip-remove\" data-action=\"remove\" data-idx=\"${idx}\">×</button>\n ${renderAnnotationMeta(item, idx)}\n <div class=\"dip-section\"><div class=\"dip-label\">\\uD83D\\uDCDD Text Selection</div><div class=\"dip-value\">\"${escapeHtml(item.selectedText)}\"</div></div>\n <div class=\"dip-section\"><div class=\"dip-label\">Parent Element</div><div class=\"dip-value dip-selector\">${escapeHtml(parentSelector)}</div></div>\n ${renderCommentSection(item)}\n </div>`;\n}\n\nfunction renderAreaItem(item: SelectionItem & { type: 'area' }, idx: number): string {\n const { x, y, width, height, elements } = item;\n return `<div class=\"dip-item${item.status === 'resolved' ? ' dip-resolved' : ''}\" data-idx=\"${idx}\">\n <button class=\"dip-remove\" data-action=\"remove\" data-idx=\"${idx}\">×</button>\n ${renderAnnotationMeta(item, idx)}\n <div class=\"dip-section\"><div class=\"dip-label\">\\uD83D\\uDCD0 Area Selection</div><div class=\"dip-value\">${width} x ${height} @ (${x}, ${y})</div></div>\n <div class=\"dip-section\"><div class=\"dip-label\">Contained elements (${(elements || []).length})</div><div class=\"dip-value dip-selector\">${(elements || []).map(el => escapeHtml(getSelector(el))).join('<br>')}</div></div>\n ${renderCommentSection(item)}\n </div>`;\n}\n\nfunction renderReactSection(el: Element): string {\n if (!getReactInfo) return '';\n const info = getReactInfo(el);\n if (!info) return '';\n const hierarchy = info.componentHierarchy.join(' > ');\n const props = info.propsKeys.length ? info.propsKeys.join(', ') : '(none)';\n let sourceHtml = info.sourceFile ? `<div class=\"dip-react-source\">\\uD83D\\uDCC1 ${escapeHtml(info.sourceFile)}</div>` : '';\n return `<div class=\"dip-section dip-react-info\"><div class=\"dip-label\">\\u269B React Component</div><div class=\"dip-value\">\n <div><strong>${escapeHtml(info.componentName)}</strong></div>\n <div class=\"dip-react-hierarchy\">${escapeHtml(hierarchy)}</div>\n <div class=\"dip-react-props\">Props: ${escapeHtml(props)}</div>${sourceHtml}\n </div></div>`;\n}\n\n// ========== Settings ==========\nfunction buildSettingsHTML(): string {\n const s = state;\n const colorButtons = COLOR_PRESETS.map(p => {\n const active = s.markerColor === p.color ? ' dip-color-active' : '';\n return `<button class=\"dip-color-preset${active}\" style=\"background:${p.color}\" data-action=\"set-color\" data-color=\"${p.color}\" title=\"${p.label}\"></button>`;\n }).join('');\n return `<div class=\"dip-settings-panel\">\n <div class=\"dip-settings-section\"><div class=\"dip-settings-label\">Marker Color</div><div class=\"dip-color-row\">${colorButtons}<input type=\"color\" class=\"dip-color-picker\" value=\"${escapeHtml(s.markerColor)}\"></div></div>\n <div class=\"dip-settings-section\"><label class=\"dip-toggle-row\"><span>Clear after copy</span><input type=\"checkbox\" class=\"dip-toggle-input\" data-setting=\"clearOnCopy\" ${s.clearOnCopy ? 'checked' : ''}><span class=\"dip-toggle-slider\"></span></label></div>\n <div class=\"dip-settings-section\"><label class=\"dip-toggle-row\"><span>Block interactions</span><input type=\"checkbox\" class=\"dip-toggle-input\" data-setting=\"blockInteractions\" ${s.blockInteractions ? 'checked' : ''}><span class=\"dip-toggle-slider\"></span></label></div>\n <div class=\"dip-settings-section\"><label class=\"dip-toggle-row\"><span>React Mode</span><input type=\"checkbox\" class=\"dip-toggle-input\" data-setting=\"reactMode\" ${s.reactMode ? 'checked' : ''}><span class=\"dip-toggle-slider\"></span></label></div>\n <div class=\"dip-settings-section\"><div class=\"dip-settings-label\">Webhook URL</div><input type=\"text\" class=\"dip-webhook-input\" value=\"${escapeHtml(s.webhookUrl)}\" placeholder=\"https://hooks.slack.com/...\"></div>\n <div class=\"dip-settings-section\"><div class=\"dip-settings-label\">Panel Mode</div><div class=\"dip-panel-mode-toggle\"><button class=\"dip-mode-opt${s.panelMode === 'developer' ? ' active' : ''}\" data-action=\"set-panel-mode\" data-panel-mode=\"developer\">Developer</button><button class=\"dip-mode-opt${s.panelMode === 'reporter' ? ' active' : ''}\" data-action=\"set-panel-mode\" data-panel-mode=\"reporter\">Reporter</button></div></div>\n </div>`;\n}\n\n// ========== Actions ==========\nfunction toggleTheme(): void {\n state.theme = state.theme === 'dark' ? 'light' : 'dark';\n saveSetting('theme', state.theme);\n bus.emit('themeChanged', state.theme);\n renderPanel();\n}\n\nfunction cycleOutputMode(): void {\n const cur = MODE_ORDER.indexOf(state.outputMode);\n state.outputMode = MODE_ORDER[(cur + 1) % MODE_ORDER.length];\n saveSetting('outputMode', state.outputMode);\n renderPanel();\n}\n\nfunction copyAs(format: CopyFormat): void {\n const menu = contentWrap.querySelector('.dip-copy-menu');\n if (menu) menu.classList.remove('open');\n const items = state.selectedElements;\n if (!items.length) return;\n let text = '';\n switch (format) {\n case 'markdown': text = toMarkdown(items, state.outputMode, getReactInfo || undefined); break;\n case 'json': text = toJSON(items, state.outputMode, getReactInfo || undefined); break;\n case 'selector':\n text = items.map(item => {\n if (item.type === 'text-selection') return `\"${item.selectedText}\"`;\n if (item.type === 'area') return `area(${item.width}x${item.height})`;\n return item.el ? getSmartSelector(item.el) : '';\n }).join('\\n');\n break;\n case 'querySelector':\n text = items.filter(item => item.type === 'element' && item.el).map(item => {\n const sel = getSelector((item as { el: Element }).el);\n return `document.querySelector('${sel.replace(/'/g, \"\\\\'\")}')`;\n }).join('\\n');\n break;\n case 'github-issue':\n text = toGitHubIssue(items, getBugContext());\n break;\n case 'bug-report':\n text = toBugReport(items, getBugContext());\n break;\n }\n if (!text) return;\n navigator.clipboard.writeText(text).then(() => {\n const btn = contentWrap.querySelector('.dip-copy-wrap > button');\n if (btn) {\n const orig = btn.textContent;\n btn.textContent = 'Copied!';\n (btn as HTMLElement).style.color = 'var(--di-success)';\n setTimeout(() => { btn.textContent = orig; (btn as HTMLElement).style.color = ''; }, 1500);\n }\n if (state.clearOnCopy) clearSelections();\n });\n}\n\n// ========== Hierarchy Navigation ==========\nfunction selectHierarchyEl(itemIdx: number, hierIdx: number): void {\n const item = state.selectedElements[itemIdx];\n if (!item || item.type !== 'element' || !item.el) return;\n const hierarchy = getHierarchy(item.el);\n const target = hierarchy[hierIdx];\n if (!target?.el) return;\n const exists = state.selectedElements.some(s => s.type === 'element' && s.el === target.el);\n if (!exists) addSelection({\n ...createAnnotationMeta(), type: 'element', el: target.el,\n selector: '', smartSelector: '', tagName: '', classes: '', boundingBox: '',\n textContent: '', hierarchy: [], computedStyles: [], extendedStyles: {},\n });\n}\n\nfunction navParent(idx: number): void {\n const item = state.selectedElements[idx];\n if (!item || item.type !== 'element' || !item.el?.parentElement) return;\n const parent = item.el.parentElement;\n if (parent === document.documentElement) return;\n item.el.classList.remove('di-selected-highlight');\n item.el = parent;\n if (state.isActive && state.markersVisible) parent.classList.add('di-selected-highlight');\n bus.emit('selectionChanged', state.selectedElements);\n}\n\nfunction navChild(idx: number): void {\n const item = state.selectedElements[idx];\n if (!item || item.type !== 'element' || !item.el) return;\n const child = item.el.firstElementChild;\n if (!child || child.id === 'dev-inspector-host') return;\n item.el.classList.remove('di-selected-highlight');\n item.el = child;\n if (state.isActive && state.markersVisible) child.classList.add('di-selected-highlight');\n bus.emit('selectionChanged', state.selectedElements);\n}\n\n// ========== Panel Visibility ==========\nexport function showPanel(): void { panelEl.style.display = 'block'; }\nexport function hidePanel(): void { panelEl.style.display = 'none'; }\n\n// ========== Resize ==========\nfunction initResize(grip: HTMLElement): void {\n let startX: number, startY: number, startW: number, startH: number, resizing = false;\n grip.addEventListener('mousedown', (e) => {\n e.preventDefault(); e.stopPropagation(); resizing = true;\n startX = e.clientX; startY = e.clientY; startW = panelEl.offsetWidth; startH = panelEl.offsetHeight;\n document.body.style.userSelect = 'none'; document.body.style.cursor = 'nwse-resize';\n // Disable iframe pointer-events during resize\n document.querySelectorAll('iframe').forEach(f => {\n (f as HTMLElement).style.setProperty('pointer-events', 'none', 'important');\n });\n });\n document.addEventListener('mousemove', (e) => {\n if (!resizing) return;\n panelEl.style.width = Math.max(300, startW + (e.clientX - startX)) + 'px';\n panelEl.style.height = Math.max(200, startH + (e.clientY - startY)) + 'px';\n panelEl.style.maxHeight = 'none';\n });\n document.addEventListener('mouseup', () => {\n if (!resizing) return; resizing = false;\n document.body.style.userSelect = ''; document.body.style.cursor = '';\n // Restore iframe pointer-events\n document.querySelectorAll('iframe').forEach(f => {\n (f as HTMLElement).style.removeProperty('pointer-events');\n });\n try { localStorage.setItem('di-panel-size', JSON.stringify({ width: panelEl.style.width, height: panelEl.style.height })); } catch { /* ignore */ }\n });\n try {\n const saved = localStorage.getItem('di-panel-size');\n if (saved) {\n const s = JSON.parse(saved);\n if (s?.width) panelEl.style.width = s.width;\n if (s?.height) { panelEl.style.height = s.height; panelEl.style.maxHeight = 'none'; }\n }\n } catch { /* ignore */ }\n}\n\n// ========== Feature 1: Color Palette ==========\nfunction rgbToHex(r: number, g: number, b: number): string {\n return '#' + [r, g, b].map(c => Math.round(Math.min(255, Math.max(0, c))).toString(16).padStart(2, '0')).join('');\n}\n\nfunction parseRgb(color: string): { r: number; g: number; b: number } | null {\n const m = color.match(/rgba?\\((\\d+),\\s*(\\d+),\\s*(\\d+)/);\n if (!m) return null;\n return { r: parseInt(m[1]), g: parseInt(m[2]), b: parseInt(m[3]) };\n}\n\ninterface ColorEntry { hex: string; rgb: string; count: number; category: 'text' | 'background' | 'border'; }\n\nfunction scanPageColors(): { text: ColorEntry[]; background: ColorEntry[]; border: ColorEntry[] } {\n const textMap = new Map<string, { rgb: string; count: number }>();\n const bgMap = new Map<string, { rgb: string; count: number }>();\n const borderMap = new Map<string, { rgb: string; count: number }>();\n\n const allEls = document.querySelectorAll('*');\n const limit = Math.min(allEls.length, 2000);\n for (let i = 0; i < limit; i++) {\n const el = allEls[i];\n if (el.id === 'dev-inspector-host' || el.closest('#dev-inspector-host')) continue;\n const cs = window.getComputedStyle(el);\n\n const textColor = cs.color;\n const bgColor = cs.backgroundColor;\n const borderColor = cs.borderColor;\n\n const textP = parseRgb(textColor);\n if (textP) {\n const hex = rgbToHex(textP.r, textP.g, textP.b);\n const existing = textMap.get(hex);\n if (existing) existing.count++;\n else textMap.set(hex, { rgb: textColor, count: 1 });\n }\n\n const bgP = parseRgb(bgColor);\n if (bgP && !(bgP.r === 0 && bgP.g === 0 && bgP.b === 0 && bgColor.includes('0)'))) {\n const hex = rgbToHex(bgP.r, bgP.g, bgP.b);\n const existing = bgMap.get(hex);\n if (existing) existing.count++;\n else bgMap.set(hex, { rgb: bgColor, count: 1 });\n }\n\n const borderP = parseRgb(borderColor);\n if (borderP && borderColor !== textColor) {\n const hex = rgbToHex(borderP.r, borderP.g, borderP.b);\n const existing = borderMap.get(hex);\n if (existing) existing.count++;\n else borderMap.set(hex, { rgb: borderColor, count: 1 });\n }\n }\n\n const toEntries = (map: Map<string, { rgb: string; count: number }>, cat: 'text' | 'background' | 'border') =>\n Array.from(map.entries())\n .sort((a, b) => b[1].count - a[1].count)\n .slice(0, 30)\n .map(([hex, { rgb, count }]) => ({ hex, rgb, count, category: cat }));\n\n return {\n text: toEntries(textMap, 'text'),\n background: toEntries(bgMap, 'background'),\n border: toEntries(borderMap, 'border'),\n };\n}\n\nfunction toggleColorsPanel(): void {\n const existing = contentWrap.querySelector('.dip-colors-panel');\n if (existing) { existing.remove(); colorsOpen = false; updateSubPanelButtons(); return; }\n\n // Remove other panels if open\n const typoPanel = contentWrap.querySelector('.dip-typography-panel');\n if (typoPanel) { typoPanel.remove(); typographyOpen = false; }\n const assetsPanel = contentWrap.querySelector('.dip-assets-panel');\n if (assetsPanel) { assetsPanel.remove(); assetsOpen = false; }\n colorsOpen = true; updateSubPanelButtons();\n\n const colors = scanPageColors();\n let html = '<div class=\"dip-colors-panel\"><div class=\"dip-colors-header\">Color Palette</div>';\n\n const renderGroup = (title: string, entries: ColorEntry[]) => {\n if (!entries.length) return '';\n let groupHtml = `<div class=\"dip-color-group\"><div class=\"dip-color-group-title\">${title} (${entries.length})</div><div class=\"dip-color-swatches\">`;\n entries.forEach(e => {\n groupHtml += `<div class=\"dip-color-swatch\" data-action=\"copy-color\" data-hex=\"${e.hex}\" title=\"${e.hex} (${e.count}x)\">\n <span class=\"dip-swatch-circle\" style=\"background:${e.hex}\"></span>\n <span class=\"dip-swatch-label\">${e.hex}</span>\n </div>`;\n });\n groupHtml += '</div></div>';\n return groupHtml;\n };\n\n html += renderGroup('Text Colors', colors.text);\n html += renderGroup('Background Colors', colors.background);\n html += renderGroup('Border Colors', colors.border);\n html += '</div>';\n\n contentWrap.insertAdjacentHTML('beforeend', html);\n // Bind new actions\n contentWrap.querySelectorAll('.dip-colors-panel [data-action]').forEach((el) => {\n const actionEl = el as HTMLElement;\n actionEl.addEventListener('click', (e) => {\n e.stopPropagation();\n handleAction(actionEl.dataset.action!, actionEl);\n });\n });\n}\n\n// ========== Feature 2: Typography Summary ==========\ninterface TypoEntry { fontFamily: string; fontSize: string; fontWeight: string; lineHeight: string; count: number; cssShorthand: string; }\n\nfunction scanPageTypography(): TypoEntry[] {\n const typoMap = new Map<string, TypoEntry>();\n const allEls = document.querySelectorAll('*');\n const limit = Math.min(allEls.length, 2000);\n\n for (let i = 0; i < limit; i++) {\n const el = allEls[i];\n if (el.id === 'dev-inspector-host' || el.closest('#dev-inspector-host')) continue;\n // Only count elements that contain direct text\n let hasText = false;\n for (const child of Array.from(el.childNodes)) {\n if (child.nodeType === Node.TEXT_NODE && child.textContent && child.textContent.trim().length > 0) {\n hasText = true;\n break;\n }\n }\n if (!hasText) continue;\n\n const cs = window.getComputedStyle(el);\n const fontFamily = cs.fontFamily.split(',')[0].trim().replace(/[\"']/g, '');\n const fontSize = cs.fontSize;\n const fontWeight = cs.fontWeight;\n const lineHeight = cs.lineHeight;\n const key = `${fontFamily}|${fontSize}|${fontWeight}|${lineHeight}`;\n const cssShorthand = `font: ${fontWeight} ${fontSize}/${lineHeight} ${fontFamily}`;\n\n const existing = typoMap.get(key);\n if (existing) existing.count++;\n else typoMap.set(key, { fontFamily, fontSize, fontWeight, lineHeight, count: 1, cssShorthand });\n }\n\n return Array.from(typoMap.values()).sort((a, b) => b.count - a.count).slice(0, 30);\n}\n\nfunction toggleTypographyPanel(): void {\n const existing = contentWrap.querySelector('.dip-typography-panel');\n if (existing) { existing.remove(); typographyOpen = false; updateSubPanelButtons(); return; }\n\n // Remove other panels if open\n const colorsPanel = contentWrap.querySelector('.dip-colors-panel');\n if (colorsPanel) { colorsPanel.remove(); colorsOpen = false; }\n const assetsPanel = contentWrap.querySelector('.dip-assets-panel');\n if (assetsPanel) { assetsPanel.remove(); assetsOpen = false; }\n typographyOpen = true; updateSubPanelButtons();\n\n const entries = scanPageTypography();\n let html = '<div class=\"dip-typography-panel\"><div class=\"dip-typo-header\">Typography Summary</div>';\n\n if (!entries.length) {\n html += '<div class=\"dip-typo-empty\">No typography found</div>';\n } else {\n entries.forEach(e => {\n html += `<div class=\"dip-typo-row\" data-action=\"copy-typo\" data-css=\"${escapeHtml(e.cssShorthand)}\" title=\"Click to copy CSS\">\n <div class=\"dip-typo-preview\" style=\"font-family:${escapeHtml(e.fontFamily)};font-size:min(${e.fontSize},16px);font-weight:${e.fontWeight};line-height:${e.lineHeight}\">The quick brown fox</div>\n <div class=\"dip-typo-details\">\n <span class=\"dip-typo-family\">${escapeHtml(e.fontFamily)}</span>\n <span class=\"dip-typo-meta\">${e.fontSize} / ${e.fontWeight} / ${e.lineHeight}</span>\n <span class=\"dip-typo-count\">${e.count}x</span>\n <span class=\"dip-typo-copy-icon\">\\uD83D\\uDCCB</span>\n </div>\n </div>`;\n });\n }\n\n html += '</div>';\n contentWrap.insertAdjacentHTML('beforeend', html);\n // Bind new actions\n contentWrap.querySelectorAll('.dip-typography-panel [data-action]').forEach((el) => {\n const actionEl = el as HTMLElement;\n actionEl.addEventListener('click', (e) => {\n e.stopPropagation();\n handleAction(actionEl.dataset.action!, actionEl);\n });\n });\n}\n\n// ========== Feature 4: Live CSS Editing ==========\nfunction startStyleEdit(valEl: HTMLElement, prop: string, idx: number): void {\n const item = state.selectedElements[idx];\n if (!item || item.type !== 'element' || !item.el) return;\n const el = item.el as HTMLElement;\n const currentVal = window.getComputedStyle(el).getPropertyValue(prop);\n\n // Replace the span with an input\n const input = document.createElement('input');\n input.type = 'text';\n input.value = currentVal;\n input.className = 'dip-style-edit-input';\n input.style.cssText = 'width:100%;font-size:11px;font-family:monospace;padding:1px 4px;background:var(--di-bg-alt);color:var(--di-text);border:1px solid var(--di-accent);border-radius:3px;outline:none;box-sizing:border-box;';\n\n valEl.textContent = '';\n valEl.appendChild(input);\n input.focus();\n input.select();\n\n const commit = () => {\n const newVal = input.value.trim();\n if (newVal && newVal !== currentVal) {\n // Store original value for revert\n if (!liveEditMap.has(el)) liveEditMap.set(el, new Map());\n const propMap = liveEditMap.get(el)!;\n if (!propMap.has(prop)) propMap.set(prop, currentVal);\n el.style.setProperty(prop, newVal);\n }\n renderPanel();\n };\n\n input.addEventListener('keydown', (e) => {\n if (e.key === 'Enter') { e.preventDefault(); commit(); }\n if (e.key === 'Escape') { e.preventDefault(); renderPanel(); }\n });\n input.addEventListener('blur', commit);\n}\n\nfunction resetLiveEdits(idx: number): void {\n const item = state.selectedElements[idx];\n if (!item || item.type !== 'element' || !item.el) return;\n const el = item.el as HTMLElement;\n const propMap = liveEditMap.get(el);\n if (propMap) {\n for (const [prop, originalVal] of propMap.entries()) {\n el.style.setProperty(prop, originalVal);\n }\n liveEditMap.delete(el);\n }\n renderPanel();\n}\n\n// ========== Feature 5: Inter-Element Spacing ==========\nfunction renderSpacingSection(el1: Element, el2: Element): string {\n const r1 = el1.getBoundingClientRect();\n const r2 = el2.getBoundingClientRect();\n\n // Skip if either element has zero size\n if (r1.width === 0 || r1.height === 0 || r2.width === 0 || r2.height === 0) {\n return '<div class=\"dip-item dip-spacing-section\"><div class=\"dip-section\"><div class=\"dip-label\">\\uD83D\\uDCCF Spacing</div><div class=\"dip-value\">One or both elements are hidden (0 size)</div></div></div>';\n }\n\n const hGap = Math.max(0, Math.max(r2.left - r1.right, r1.left - r2.right));\n const vGap = Math.max(0, Math.max(r2.top - r1.bottom, r1.top - r2.bottom));\n const distTop = Math.round(r2.top - r1.top);\n const distLeft = Math.round(r2.left - r1.left);\n const distRight = Math.round(r2.right - r1.right);\n const distBottom = Math.round(r2.bottom - r1.bottom);\n\n return `<div class=\"dip-item dip-spacing-section\">\n <div class=\"dip-section\">\n <div class=\"dip-label\">\\uD83D\\uDCCF Spacing (between 2 selected elements)</div>\n <div class=\"dip-value\">\n <div class=\"dip-spacing-grid\">\n <div class=\"dip-spacing-row\">\\u2194 Horizontal gap: <strong>${Math.round(hGap)}px</strong></div>\n <div class=\"dip-spacing-row\">\\u2195 Vertical gap: <strong>${Math.round(vGap)}px</strong></div>\n <div class=\"dip-spacing-row\">\\u2191 Top offset: <strong>${distTop}px</strong></div>\n <div class=\"dip-spacing-row\">\\u2192 Right offset: <strong>${distRight}px</strong></div>\n <div class=\"dip-spacing-row\">\\u2193 Bottom offset: <strong>${distBottom}px</strong></div>\n <div class=\"dip-spacing-row\">\\u2190 Left offset: <strong>${distLeft}px</strong></div>\n </div>\n </div>\n </div>\n </div>`;\n}\n\nfunction getIframeOffset(el: Element): { x: number; y: number } {\n const ownerDoc = el.ownerDocument;\n if (ownerDoc !== document && ownerDoc.defaultView) {\n try {\n const iframeEl = ownerDoc.defaultView.frameElement;\n if (iframeEl) {\n const iframeRect = iframeEl.getBoundingClientRect();\n return { x: iframeRect.left, y: iframeRect.top };\n }\n } catch { /* cross-origin */ }\n }\n return { x: 0, y: 0 };\n}\n\nfunction renderSpacingRuler(el1: Element, el2: Element): void {\n // Only remove ruler divs, NOT scroll listeners\n removeSpacingRulersOnly();\n\n const raw1 = el1.getBoundingClientRect();\n const raw2 = el2.getBoundingClientRect();\n const off1 = getIframeOffset(el1);\n const off2 = getIframeOffset(el2);\n\n // Adjust for iframe offset \u2014 convert to main frame viewport coordinates\n const r1 = { top: raw1.top + off1.y, left: raw1.left + off1.x, right: raw1.right + off1.x, bottom: raw1.bottom + off1.y, width: raw1.width, height: raw1.height };\n const r2 = { top: raw2.top + off2.y, left: raw2.left + off2.x, right: raw2.right + off2.x, bottom: raw2.bottom + off2.y, width: raw2.width, height: raw2.height };\n\n // Skip if either element has zero size\n if (r1.width === 0 || r1.height === 0 || r2.width === 0 || r2.height === 0) return;\n\n // Center points of each element (getBoundingClientRect is viewport-relative)\n const c1x = r1.left + r1.width / 2;\n const c1y = r1.top + r1.height / 2;\n const c2x = r2.left + r2.width / 2;\n const c2y = r2.top + r2.height / 2;\n\n // Horizontal ruler \u2014 only if elements don't overlap horizontally\n const hGap = Math.max(r2.left - r1.right, r1.left - r2.right);\n if (hGap > 2) {\n const leftEl = r1.right < r2.left ? r1 : r2;\n const rightEl = r1.right < r2.left ? r2 : r1;\n const overlapTop = Math.max(leftEl.top, rightEl.top);\n const overlapBottom = Math.min(leftEl.bottom, rightEl.bottom);\n const y = overlapTop < overlapBottom ? (overlapTop + overlapBottom) / 2 : (c1y + c2y) / 2;\n\n const lineLeft = leftEl.right;\n const lineWidth = rightEl.left - leftEl.right;\n\n const line = document.createElement('div');\n line.className = 'di-spacing-ruler';\n line.style.cssText = `position:fixed;top:${y}px;left:${lineLeft}px;width:${lineWidth}px;height:0;border-top:2px dashed #ff6b6b;z-index:99998;pointer-events:none;`;\n document.body.appendChild(line);\n\n const label = document.createElement('div');\n label.className = 'di-spacing-ruler';\n label.textContent = `${Math.round(hGap)}px`;\n label.style.cssText = `position:fixed;top:${y - 22}px;left:${lineLeft + lineWidth / 2 - 20}px;font-size:13px;font-weight:900;color:#fff;background:#e03131;padding:4px 10px;border-radius:5px;z-index:999999;pointer-events:none;font-family:monospace;box-shadow:0 2px 8px rgba(0,0,0,0.5);border:2px solid #fff;line-height:1;`;\n document.body.appendChild(label);\n }\n\n // Vertical ruler \u2014 only if elements don't overlap vertically\n const vGap = Math.max(r2.top - r1.bottom, r1.top - r2.bottom);\n if (vGap > 2) {\n const topEl = r1.bottom < r2.top ? r1 : r2;\n const bottomEl = r1.bottom < r2.top ? r2 : r1;\n const overlapLeft = Math.max(topEl.left, bottomEl.left);\n const overlapRight = Math.min(topEl.right, bottomEl.right);\n const x = overlapLeft < overlapRight ? (overlapLeft + overlapRight) / 2 : (c1x + c2x) / 2;\n\n const lineTop = topEl.bottom;\n const lineHeight = bottomEl.top - topEl.bottom;\n\n const line = document.createElement('div');\n line.className = 'di-spacing-ruler';\n line.style.cssText = `position:fixed;left:${x}px;top:${lineTop}px;width:0;height:${lineHeight}px;border-left:2px dashed #5b8cff;z-index:99998;pointer-events:none;`;\n document.body.appendChild(line);\n\n const label = document.createElement('div');\n label.className = 'di-spacing-ruler';\n label.textContent = `${Math.round(vGap)}px`;\n label.style.cssText = `position:fixed;left:${x + 8}px;top:${lineTop + lineHeight / 2 - 12}px;font-size:13px;font-weight:900;color:#fff;background:#1971c2;padding:4px 10px;border-radius:5px;z-index:999999;pointer-events:none;font-family:monospace;box-shadow:0 2px 8px rgba(0,0,0,0.5);border:2px solid #fff;line-height:1;`;\n document.body.appendChild(label);\n }\n}\n\nfunction removeSpacingRulers(): void {\n document.querySelectorAll('.di-spacing-ruler').forEach(el => el.remove());\n // Remove scroll listeners\n for (const cleanup of spacingScrollCleanups) cleanup();\n spacingScrollCleanups.length = 0;\n}\n\nlet spacingScrollCleanups: Array<() => void> = [];\n\nfunction setupSpacingScrollUpdate(el1: Element, el2: Element): void {\n // Find all scrollable ancestors (including iframe documents)\n const scrollTargets = new Set<EventTarget>();\n scrollTargets.add(window);\n\n for (const el of [el1, el2]) {\n let current: Element | null = el;\n while (current) {\n if (current.scrollHeight > current.clientHeight || current.scrollWidth > current.clientWidth) {\n scrollTargets.add(current);\n }\n current = current.parentElement;\n }\n // If inside iframe, also listen to iframe's window scroll\n const ownerDoc = el.ownerDocument;\n if (ownerDoc !== document && ownerDoc.defaultView) {\n scrollTargets.add(ownerDoc.defaultView);\n scrollTargets.add(ownerDoc);\n }\n }\n\n const onScroll = () => {\n removeSpacingRulersOnly();\n renderSpacingRuler(el1, el2);\n };\n\n for (const target of scrollTargets) {\n target.addEventListener('scroll', onScroll, { passive: true });\n spacingScrollCleanups.push(() => target.removeEventListener('scroll', onScroll));\n }\n}\n\n// Remove just the ruler divs without cleaning up scroll listeners\nfunction removeSpacingRulersOnly(): void {\n document.querySelectorAll('.di-spacing-ruler').forEach(el => el.remove());\n}\n\n// ========== Feature 6: Screenshot Annotator ==========\ntype AnnotatorTool = 'rectangle' | 'arrow' | 'freehand' | 'text';\ninterface DrawnShape {\n tool: AnnotatorTool;\n color: string;\n points?: { x: number; y: number }[];\n startX?: number;\n startY?: number;\n endX?: number;\n endY?: number;\n text?: string;\n}\n\nfunction launchScreenshotAnnotator(): void {\n // html2canvas\uB85C \uC2A4\uD06C\uB9B0\uC0F7 \uCEA1\uCC98\n const html2canvas = (window as any).html2canvas;\n if (!html2canvas) {\n console.warn('[dev-inspector] Screenshot requires html2canvas library');\n return;\n }\n html2canvas(document.body, {\n useCORS: true,\n logging: false,\n scale: window.devicePixelRatio,\n }).then((canvas: HTMLCanvasElement) => {\n const dataUrl = canvas.toDataURL('image/png');\n openAnnotatorCanvas(dataUrl);\n }).catch((err: Error) => {\n console.error('[dev-inspector] Screenshot failed:', err);\n });\n}\n\nfunction openAnnotatorCanvas(dataUrl: string): void {\n const ANNOTATOR_COLORS = ['#ff0000', '#3b82f6', '#22c55e', '#eab308', '#ffffff'];\n let currentTool: AnnotatorTool = 'rectangle';\n let currentColor = '#ff0000';\n let isDrawing = false;\n let startX = 0, startY = 0;\n let freehandPoints: { x: number; y: number }[] = [];\n const shapes: DrawnShape[] = [];\n\n // Create full-screen canvas overlay (outside Shadow DOM)\n const container = document.createElement('div');\n container.id = 'di-annotator-overlay';\n container.style.cssText = 'position:fixed;top:0;left:0;width:100vw;height:100vh;z-index:999999;background:#000;';\n\n const canvas = document.createElement('canvas');\n canvas.width = window.innerWidth * window.devicePixelRatio;\n canvas.height = window.innerHeight * window.devicePixelRatio;\n canvas.style.cssText = 'width:100vw;height:100vh;cursor:crosshair;';\n container.appendChild(canvas);\n\n const ctx = canvas.getContext('2d')!;\n ctx.scale(window.devicePixelRatio, window.devicePixelRatio);\n\n // Load screenshot as background\n const bgImg = new Image();\n bgImg.onload = () => {\n redraw();\n };\n bgImg.src = dataUrl;\n\n // Toolbar\n const toolbar = document.createElement('div');\n toolbar.style.cssText = 'position:fixed;top:10px;left:50%;transform:translateX(-50%);z-index:1000000;display:flex;gap:4px;background:rgba(0,0,0,0.8);padding:6px 12px;border-radius:8px;align-items:center;font-family:Arial,sans-serif;';\n\n const tools: { tool: AnnotatorTool; label: string }[] = [\n { tool: 'rectangle', label: '\\u25A1 Rect' },\n { tool: 'arrow', label: '\\u2192 Arrow' },\n { tool: 'freehand', label: '\\u270E Draw' },\n { tool: 'text', label: 'T Text' },\n ];\n\n tools.forEach(t => {\n const btn = document.createElement('button');\n btn.textContent = t.label;\n btn.className = 'di-ann-tool-btn';\n btn.style.cssText = `padding:4px 8px;border:1px solid ${currentTool === t.tool ? '#fff' : '#555'};background:${currentTool === t.tool ? '#555' : 'transparent'};color:#fff;border-radius:4px;cursor:pointer;font-size:12px;`;\n btn.addEventListener('click', () => {\n currentTool = t.tool;\n toolbar.querySelectorAll('.di-ann-tool-btn').forEach((b: any) => {\n b.style.border = '1px solid #555';\n b.style.background = 'transparent';\n });\n btn.style.border = '1px solid #fff';\n btn.style.background = '#555';\n });\n toolbar.appendChild(btn);\n });\n\n // Color selector\n const sep = document.createElement('div');\n sep.style.cssText = 'width:1px;height:20px;background:#555;margin:0 4px;';\n toolbar.appendChild(sep);\n\n ANNOTATOR_COLORS.forEach(c => {\n const swatch = document.createElement('div');\n swatch.style.cssText = `width:20px;height:20px;border-radius:50%;background:${c};cursor:pointer;border:2px solid ${currentColor === c ? '#fff' : 'transparent'};`;\n swatch.addEventListener('click', () => {\n currentColor = c;\n toolbar.querySelectorAll('.di-ann-color-swatch').forEach((s: any) => {\n s.style.border = '2px solid transparent';\n });\n swatch.style.border = '2px solid #fff';\n });\n swatch.className = 'di-ann-color-swatch';\n toolbar.appendChild(swatch);\n });\n\n // Undo / Save / Cancel buttons\n const sep2 = document.createElement('div');\n sep2.style.cssText = 'width:1px;height:20px;background:#555;margin:0 4px;';\n toolbar.appendChild(sep2);\n\n const btnStyle = 'padding:4px 10px;border:1px solid #555;background:transparent;color:#fff;border-radius:4px;cursor:pointer;font-size:12px;';\n\n const undoBtn = document.createElement('button');\n undoBtn.textContent = '\\u21A9 Undo';\n undoBtn.style.cssText = btnStyle;\n undoBtn.addEventListener('click', () => {\n shapes.pop();\n redraw();\n });\n toolbar.appendChild(undoBtn);\n\n const saveBtn = document.createElement('button');\n saveBtn.textContent = '\\uD83D\\uDCBE Save';\n saveBtn.style.cssText = btnStyle + 'border-color:#22c55e;color:#22c55e;';\n saveBtn.addEventListener('click', () => {\n canvas.toBlob(async (blob) => {\n if (!blob) return;\n try {\n if (navigator.clipboard?.write && typeof ClipboardItem !== 'undefined') {\n await navigator.clipboard.write([new ClipboardItem({ 'image/png': blob })]);\n } else {\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url; a.download = 'annotated-screenshot.png'; a.click();\n URL.revokeObjectURL(url);\n }\n } catch {\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url; a.download = 'annotated-screenshot.png'; a.click();\n URL.revokeObjectURL(url);\n }\n cleanup();\n }, 'image/png');\n });\n toolbar.appendChild(saveBtn);\n\n const cancelBtn = document.createElement('button');\n cancelBtn.textContent = '\\u2715 Cancel';\n cancelBtn.style.cssText = btnStyle + 'border-color:#ff6b6b;color:#ff6b6b;';\n cancelBtn.addEventListener('click', cleanup);\n toolbar.appendChild(cancelBtn);\n\n container.appendChild(toolbar);\n document.body.appendChild(container);\n\n function cleanup() {\n container.remove();\n document.removeEventListener('keydown', onKeyDown);\n }\n\n function onKeyDown(e: KeyboardEvent) {\n if (e.key === 'Escape') { cleanup(); e.preventDefault(); }\n if (e.key === 'z' && (e.ctrlKey || e.metaKey)) { shapes.pop(); redraw(); e.preventDefault(); }\n }\n document.addEventListener('keydown', onKeyDown);\n\n function redraw() {\n ctx.clearRect(0, 0, canvas.width / window.devicePixelRatio, canvas.height / window.devicePixelRatio);\n if (bgImg.complete) {\n ctx.drawImage(bgImg, 0, 0, window.innerWidth, window.innerHeight);\n }\n shapes.forEach(s => drawShape(ctx, s));\n }\n\n function drawShape(c: CanvasRenderingContext2D, s: DrawnShape) {\n c.strokeStyle = s.color;\n c.fillStyle = s.color;\n c.lineWidth = 2;\n\n if (s.tool === 'rectangle' && s.startX != null && s.endX != null) {\n c.strokeRect(s.startX, s.startY!, s.endX - s.startX, s.endY! - s.startY!);\n } else if (s.tool === 'arrow' && s.startX != null && s.endX != null) {\n const dx = s.endX - s.startX;\n const dy = s.endY! - s.startY!;\n const angle = Math.atan2(dy, dx);\n const headLen = 12;\n c.beginPath();\n c.moveTo(s.startX, s.startY!);\n c.lineTo(s.endX, s.endY!);\n c.stroke();\n // Arrowhead\n c.beginPath();\n c.moveTo(s.endX, s.endY!);\n c.lineTo(s.endX - headLen * Math.cos(angle - Math.PI / 6), s.endY! - headLen * Math.sin(angle - Math.PI / 6));\n c.lineTo(s.endX - headLen * Math.cos(angle + Math.PI / 6), s.endY! - headLen * Math.sin(angle + Math.PI / 6));\n c.closePath();\n c.fill();\n } else if (s.tool === 'freehand' && s.points && s.points.length > 1) {\n c.beginPath();\n c.moveTo(s.points[0].x, s.points[0].y);\n for (let i = 1; i < s.points.length; i++) {\n c.lineTo(s.points[i].x, s.points[i].y);\n }\n c.stroke();\n } else if (s.tool === 'text' && s.text && s.startX != null) {\n c.font = '16px Arial, sans-serif';\n c.fillText(s.text, s.startX, s.startY!);\n }\n }\n\n // Mouse events on canvas\n canvas.addEventListener('mousedown', (e) => {\n if (currentTool === 'text') {\n const text = prompt('Enter text:');\n if (text) {\n shapes.push({ tool: 'text', color: currentColor, startX: e.offsetX, startY: e.offsetY, text });\n redraw();\n }\n return;\n }\n isDrawing = true;\n startX = e.offsetX;\n startY = e.offsetY;\n if (currentTool === 'freehand') {\n freehandPoints = [{ x: e.offsetX, y: e.offsetY }];\n }\n });\n\n canvas.addEventListener('mousemove', (e) => {\n if (!isDrawing) return;\n if (currentTool === 'freehand') {\n freehandPoints.push({ x: e.offsetX, y: e.offsetY });\n redraw();\n // Draw live preview\n ctx.strokeStyle = currentColor;\n ctx.lineWidth = 2;\n ctx.beginPath();\n ctx.moveTo(freehandPoints[0].x, freehandPoints[0].y);\n for (let i = 1; i < freehandPoints.length; i++) {\n ctx.lineTo(freehandPoints[i].x, freehandPoints[i].y);\n }\n ctx.stroke();\n } else {\n // Preview for rect/arrow\n redraw();\n const previewShape: DrawnShape = {\n tool: currentTool,\n color: currentColor,\n startX, startY,\n endX: e.offsetX, endY: e.offsetY,\n };\n drawShape(ctx, previewShape);\n }\n });\n\n canvas.addEventListener('mouseup', (e) => {\n if (!isDrawing) return;\n isDrawing = false;\n if (currentTool === 'freehand') {\n shapes.push({ tool: 'freehand', color: currentColor, points: [...freehandPoints] });\n } else {\n shapes.push({ tool: currentTool, color: currentColor, startX, startY, endX: e.offsetX, endY: e.offsetY });\n }\n redraw();\n });\n}\n\n// ========== Feature 7: Flexbox/Grid Visual Overlay ==========\nconst activeLayoutOverlays = new Map<number, HTMLElement[]>();\n\nfunction renderLayoutSection(el: Element, idx: number): string {\n const cs = window.getComputedStyle(el);\n const display = cs.display;\n const isFlexLike = display === 'flex' || display === 'inline-flex';\n const isGridLike = display === 'grid' || display === 'inline-grid';\n if (!isFlexLike && !isGridLike) return '';\n\n const isActive = activeLayoutOverlays.has(idx);\n const layoutType = isFlexLike ? 'Flexbox' : 'Grid';\n\n let details = '';\n if (isFlexLike) {\n details = `\n <div class=\"dip-layout-details\">\n <div class=\"dip-style-row\"><span class=\"dip-style-prop\">flex-direction:</span><span class=\"dip-style-val\">${cs.flexDirection}</span></div>\n <div class=\"dip-style-row\"><span class=\"dip-style-prop\">justify-content:</span><span class=\"dip-style-val\">${cs.justifyContent}</span></div>\n <div class=\"dip-style-row\"><span class=\"dip-style-prop\">align-items:</span><span class=\"dip-style-val\">${cs.alignItems}</span></div>\n <div class=\"dip-style-row\"><span class=\"dip-style-prop\">flex-wrap:</span><span class=\"dip-style-val\">${cs.flexWrap}</span></div>\n <div class=\"dip-style-row\"><span class=\"dip-style-prop\">gap:</span><span class=\"dip-style-val\">${cs.gap}</span></div>\n </div>`;\n // Children flex info\n const children = Array.from(el.children).slice(0, 10);\n if (children.length) {\n details += '<div class=\"dip-layout-children\"><div class=\"dip-label\" style=\"margin-top:4px\">Children</div>';\n children.forEach((child, ci) => {\n const ccs = window.getComputedStyle(child);\n details += `<div class=\"dip-style-row\"><span class=\"dip-style-prop\">[${ci}]</span><span class=\"dip-style-val\">grow:${ccs.flexGrow} shrink:${ccs.flexShrink} basis:${ccs.flexBasis}</span></div>`;\n });\n details += '</div>';\n }\n } else {\n details = `\n <div class=\"dip-layout-details\">\n <div class=\"dip-style-row\"><span class=\"dip-style-prop\">grid-template-columns:</span><span class=\"dip-style-val\">${cs.gridTemplateColumns}</span></div>\n <div class=\"dip-style-row\"><span class=\"dip-style-prop\">grid-template-rows:</span><span class=\"dip-style-val\">${cs.gridTemplateRows}</span></div>\n <div class=\"dip-style-row\"><span class=\"dip-style-prop\">gap:</span><span class=\"dip-style-val\">${cs.gap}</span></div>\n <div class=\"dip-style-row\"><span class=\"dip-style-prop\">grid-template-areas:</span><span class=\"dip-style-val\">${cs.gridTemplateAreas || 'none'}</span></div>\n </div>`;\n }\n\n return `<div class=\"dip-section\">\n <div class=\"dip-label\">\\uD83D\\uDCD0 ${layoutType} Layout\n <button class=\"dip-layout-toggle-btn${isActive ? ' active' : ''}\" data-action=\"toggle-layout-overlay\" data-idx=\"${idx}\">\n ${isActive ? 'Hide Overlay' : 'Show Overlay'}\n </button>\n </div>\n <div class=\"dip-value\">${details}</div>\n </div>`;\n}\n\nfunction toggleLayoutOverlay(idx: number): void {\n if (activeLayoutOverlays.has(idx)) {\n removeLayoutOverlay(idx);\n renderPanel();\n return;\n }\n\n const item = state.selectedElements[idx];\n if (!item || item.type !== 'element' || !item.el) return;\n const el = item.el;\n const cs = window.getComputedStyle(el);\n const display = cs.display;\n const isFlexLike = display === 'flex' || display === 'inline-flex';\n const rect = el.getBoundingClientRect();\n const scrollX = window.scrollX;\n const scrollY = window.scrollY;\n const overlays: HTMLElement[] = [];\n\n if (isFlexLike) {\n // Show flex direction arrow\n const direction = cs.flexDirection;\n const arrowEl = document.createElement('div');\n arrowEl.className = 'di-layout-overlay';\n const isRow = direction === 'row' || direction === 'row-reverse';\n const arrowChar = direction === 'row' ? '\\u2192' : direction === 'row-reverse' ? '\\u2190' : direction === 'column' ? '\\u2193' : '\\u2191';\n arrowEl.textContent = `flex: ${arrowChar}`;\n arrowEl.style.cssText = `position:absolute;top:${rect.top + scrollY - 18}px;left:${rect.left + scrollX}px;font-size:11px;font-weight:700;color:#7c8cf5;background:rgba(124,140,245,0.15);padding:1px 6px;border-radius:3px;z-index:99998;pointer-events:none;font-family:monospace;`;\n document.body.appendChild(arrowEl);\n overlays.push(arrowEl);\n\n // Highlight gaps between children\n const children = Array.from(el.children);\n for (let i = 0; i < children.length - 1; i++) {\n const r1 = children[i].getBoundingClientRect();\n const r2 = children[i + 1].getBoundingClientRect();\n const gap = document.createElement('div');\n gap.className = 'di-layout-overlay';\n\n if (isRow) {\n const gapWidth = r2.left - r1.right;\n if (gapWidth > 0) {\n gap.style.cssText = `position:absolute;top:${r1.top + scrollY}px;left:${r1.right + scrollX}px;width:${gapWidth}px;height:${r1.height}px;background:rgba(124,140,245,0.15);border-left:1px dashed #7c8cf5;border-right:1px dashed #7c8cf5;z-index:99998;pointer-events:none;`;\n document.body.appendChild(gap);\n overlays.push(gap);\n }\n } else {\n const gapHeight = r2.top - r1.bottom;\n if (gapHeight > 0) {\n gap.style.cssText = `position:absolute;top:${r1.bottom + scrollY}px;left:${r1.left + scrollX}px;width:${r1.width}px;height:${gapHeight}px;background:rgba(124,140,245,0.15);border-top:1px dashed #7c8cf5;border-bottom:1px dashed #7c8cf5;z-index:99998;pointer-events:none;`;\n document.body.appendChild(gap);\n overlays.push(gap);\n }\n }\n }\n } else {\n // Grid overlay \u2014 draw grid lines\n const colTemplate = cs.gridTemplateColumns;\n const rowTemplate = cs.gridTemplateRows;\n const colTracks = colTemplate.split(/\\s+/).filter(Boolean);\n const rowTracks = rowTemplate.split(/\\s+/).filter(Boolean);\n\n // Draw column lines\n let xOffset = 0;\n const gapVal = parseFloat(cs.columnGap) || 0;\n for (let i = 0; i < colTracks.length; i++) {\n const trackWidth = parseFloat(colTracks[i]);\n if (isNaN(trackWidth)) continue;\n xOffset += trackWidth;\n if (i < colTracks.length - 1) {\n const line = document.createElement('div');\n line.className = 'di-layout-overlay';\n line.style.cssText = `position:absolute;top:${rect.top + scrollY}px;left:${rect.left + scrollX + xOffset + (gapVal * i)}px;width:1px;height:${rect.height}px;background:#7c8cf5;opacity:0.5;z-index:99998;pointer-events:none;`;\n document.body.appendChild(line);\n overlays.push(line);\n xOffset += gapVal;\n }\n }\n\n // Draw row lines\n let yOffset = 0;\n const rowGapVal = parseFloat(cs.rowGap) || 0;\n for (let i = 0; i < rowTracks.length; i++) {\n const trackHeight = parseFloat(rowTracks[i]);\n if (isNaN(trackHeight)) continue;\n yOffset += trackHeight;\n if (i < rowTracks.length - 1) {\n const line = document.createElement('div');\n line.className = 'di-layout-overlay';\n line.style.cssText = `position:absolute;top:${rect.top + scrollY + yOffset + (rowGapVal * i)}px;left:${rect.left + scrollX}px;width:${rect.width}px;height:1px;background:#7c8cf5;opacity:0.5;z-index:99998;pointer-events:none;`;\n document.body.appendChild(line);\n overlays.push(line);\n yOffset += rowGapVal;\n }\n }\n\n // Number grid cells\n const children = Array.from(el.children).slice(0, 20);\n children.forEach((child, ci) => {\n const cr = child.getBoundingClientRect();\n const label = document.createElement('div');\n label.className = 'di-layout-overlay';\n label.textContent = String(ci + 1);\n label.style.cssText = `position:absolute;top:${cr.top + scrollY + 2}px;left:${cr.left + scrollX + 2}px;font-size:9px;font-weight:700;color:#fff;background:rgba(124,140,245,0.7);padding:0 3px;border-radius:2px;z-index:99998;pointer-events:none;font-family:monospace;`;\n document.body.appendChild(label);\n overlays.push(label);\n });\n }\n\n activeLayoutOverlays.set(idx, overlays);\n renderPanel();\n}\n\nfunction removeLayoutOverlay(idx: number): void {\n const overlays = activeLayoutOverlays.get(idx);\n if (overlays) {\n overlays.forEach(el => el.remove());\n activeLayoutOverlays.delete(idx);\n }\n}\n\nfunction removeAllLayoutOverlays(): void {\n for (const [idx] of activeLayoutOverlays) {\n removeLayoutOverlay(idx);\n }\n}\n\n// ========== Feature 8: Reporter Mode ==========\nfunction renderReporterElementItem(item: SelectionItem & { type: 'element' }, idx: number): string {\n const el = item.el;\n if (!el) return '';\n const tagName = el.tagName.toLowerCase();\n const intentBtns = INTENT_OPTIONS.map(o =>\n `<button class=\"dip-intent-btn${item.intent === o.value ? ' active' : ''}\" data-action=\"set-intent\" data-ann-id=\"${item.id}\" data-intent=\"${o.value}\" title=\"${o.label}\">${o.icon} ${o.label}</button>`\n ).join('');\n const severityBtns = SEVERITY_OPTIONS.map(o =>\n `<button class=\"dip-severity-btn${item.severity === o.value ? ' active' : ''}\" style=\"${item.severity === o.value ? `background:${o.color}20;border-color:${o.color};color:${o.color}` : ''}\" data-action=\"set-severity\" data-ann-id=\"${item.id}\" data-severity=\"${o.value}\" title=\"${o.label}\">${o.label}</button>`\n ).join('');\n\n const threadMessages = item.thread.map(msg => {\n const roleClass = msg.role === 'agent' ? 'dip-thread-agent' : 'dip-thread-human';\n const roleLabel = msg.role === 'agent' ? '\\uD83E\\uDD16' : '\\uD83D\\uDC64';\n return `<div class=\"dip-thread-msg ${roleClass}\"><span class=\"dip-thread-role\">${roleLabel}</span><span class=\"dip-thread-content\">${escapeHtml(msg.content)}</span></div>`;\n }).join('');\n\n return `<div class=\"dip-item dip-reporter-item\" data-idx=\"${idx}\">\n <div class=\"dip-item-actions\">\n <button class=\"dip-screenshot-btn\" data-action=\"screenshot\" data-idx=\"${idx}\" title=\"Screenshot\">\\uD83D\\uDCF7</button>\n <button class=\"dip-remove\" data-action=\"remove\" data-idx=\"${idx}\">×</button>\n </div>\n <div class=\"dip-reporter-element-name\"><${escapeHtml(tagName)}></div>\n <div class=\"dip-section\">\n <div class=\"dip-label\">Intent</div>\n <div class=\"dip-reporter-intent-group\">${intentBtns}</div>\n </div>\n <div class=\"dip-section\">\n <div class=\"dip-label\">Severity</div>\n <div class=\"dip-reporter-severity-group\">${severityBtns}</div>\n </div>\n <div class=\"dip-section\">\n ${threadMessages}\n <div class=\"dip-thread-input-wrap\">\n <textarea class=\"dip-thread-input dip-reporter-comment\" data-ann-id=\"${item.id}\" rows=\"3\" placeholder=\"Describe the issue...\"></textarea>\n <button data-action=\"add-thread-msg\" data-ann-id=\"${item.id}\" class=\"dip-thread-send\">\\u27A4</button>\n </div>\n </div>\n ${state.webhookUrl ? '<button data-action=\"reporter-submit\" class=\"dip-reporter-submit-btn\">\\uD83D\\uDCE4 Submit Report</button>' : ''}\n </div>`;\n}\n\n// ========== Feature 9: Asset Extraction ==========\ninterface PageAsset {\n type: 'image' | 'svg' | 'background';\n src?: string;\n alt?: string;\n width?: number;\n height?: number;\n format?: string;\n selector?: string;\n viewBox?: string;\n fileName?: string;\n}\n\nfunction scanPageAssets(): PageAsset[] {\n const assets: PageAsset[] = [];\n\n // <img> elements\n document.querySelectorAll('img').forEach(img => {\n if (img.closest('#dev-inspector-host')) return;\n const src = img.src || img.getAttribute('data-src') || '';\n if (!src) return;\n const ext = src.split('?')[0].split('.').pop()?.toLowerCase() || '';\n const fileName = src.split('/').pop()?.split('?')[0] || 'image';\n assets.push({\n type: 'image',\n src,\n alt: img.alt || '',\n width: img.naturalWidth || img.width || 0,\n height: img.naturalHeight || img.height || 0,\n format: ext,\n fileName,\n });\n });\n\n // <svg> elements\n document.querySelectorAll('svg').forEach((svg, i) => {\n if (svg.closest('#dev-inspector-host')) return;\n const viewBox = svg.getAttribute('viewBox') || '';\n const w = svg.getAttribute('width') || svg.getBoundingClientRect().width;\n const h = svg.getAttribute('height') || svg.getBoundingClientRect().height;\n assets.push({\n type: 'svg',\n viewBox,\n width: typeof w === 'string' ? parseInt(w) : Math.round(w),\n height: typeof h === 'string' ? parseInt(h) : Math.round(h),\n selector: `svg:nth-of-type(${i + 1})`,\n fileName: `svg-${i + 1}`,\n });\n });\n\n // <picture> sources\n document.querySelectorAll('picture source').forEach(source => {\n if (source.closest('#dev-inspector-host')) return;\n const srcset = source.getAttribute('srcset') || '';\n const src = srcset.split(',')[0]?.trim().split(' ')[0] || '';\n if (src) {\n const fileName = src.split('/').pop()?.split('?')[0] || 'picture-source';\n const ext = src.split('?')[0].split('.').pop()?.toLowerCase() || '';\n assets.push({ type: 'image', src, format: ext, fileName });\n }\n });\n\n // CSS background images (limited scan)\n const allEls = document.querySelectorAll('*');\n const limit = Math.min(allEls.length, 500);\n for (let i = 0; i < limit; i++) {\n const el = allEls[i];\n if (el.closest('#dev-inspector-host')) continue;\n const cs = window.getComputedStyle(el);\n const bgImage = cs.backgroundImage;\n if (bgImage && bgImage !== 'none') {\n const urlMatch = bgImage.match(/url\\([\"']?([^\"')]+)[\"']?\\)/);\n if (urlMatch && urlMatch[1]) {\n const url = urlMatch[1];\n if (url.startsWith('data:') && url.length > 200) continue; // skip large data URIs\n const sel = getSelector(el);\n const fileName = url.split('/').pop()?.split('?')[0] || 'bg-image';\n assets.push({ type: 'background', src: url, selector: sel, fileName });\n }\n }\n }\n\n // Favicon and meta images\n document.querySelectorAll('link[rel*=\"icon\"], meta[property=\"og:image\"], meta[name=\"twitter:image\"]').forEach(el => {\n const src = el.getAttribute('href') || el.getAttribute('content') || '';\n if (src) {\n const fileName = src.split('/').pop()?.split('?')[0] || 'meta-image';\n assets.push({ type: 'image', src, fileName, format: src.split('?')[0].split('.').pop()?.toLowerCase() || '' });\n }\n });\n\n return assets;\n}\n\nfunction toggleAssetsPanel(): void {\n const existing = contentWrap.querySelector('.dip-assets-panel');\n if (existing) { existing.remove(); assetsOpen = false; updateSubPanelButtons(); return; }\n\n // Remove other special panels\n const colorsPanel = contentWrap.querySelector('.dip-colors-panel');\n if (colorsPanel) { colorsPanel.remove(); colorsOpen = false; }\n const typoPanel = contentWrap.querySelector('.dip-typography-panel');\n if (typoPanel) { typoPanel.remove(); typographyOpen = false; }\n assetsOpen = true; updateSubPanelButtons();\n\n const assets = scanPageAssets();\n let html = '<div class=\"dip-assets-panel\"><div class=\"dip-assets-header\">\\uD83D\\uDDBC Page Assets (' + assets.length + ')</div>';\n\n const images = assets.filter(a => a.type === 'image');\n const svgs = assets.filter(a => a.type === 'svg');\n const bgImages = assets.filter(a => a.type === 'background');\n\n if (images.length) {\n html += '<div class=\"dip-asset-group\"><div class=\"dip-asset-group-title\">Images (' + images.length + ')</div>';\n images.forEach(a => {\n const dims = (a.width && a.height) ? `${a.width}x${a.height}` : '?';\n const thumb = a.src ? `<img src=\"${escapeHtml(a.src)}\" class=\"dip-asset-thumb\" onerror=\"this.style.display='none'\">` : '';\n html += `<div class=\"dip-asset-row\" data-action=\"download-asset\" data-asset-url=\"${escapeHtml(a.src || '')}\" data-asset-name=\"${escapeHtml(a.fileName || '')}\">\n ${thumb}\n <div class=\"dip-asset-info\">\n <div class=\"dip-asset-name\">${escapeHtml(a.fileName || '')}</div>\n <div class=\"dip-asset-meta\">${dims} ${a.format ? '\\xB7 ' + a.format.toUpperCase() : ''}</div>\n ${a.alt ? '<div class=\"dip-asset-alt\">alt: ' + escapeHtml(a.alt) + '</div>' : ''}\n </div>\n </div>`;\n });\n html += '</div>';\n }\n\n if (svgs.length) {\n html += '<div class=\"dip-asset-group\"><div class=\"dip-asset-group-title\">SVGs (' + svgs.length + ')</div>';\n svgs.forEach(a => {\n const dims = (a.width && a.height) ? `${a.width}x${a.height}` : '?';\n html += `<div class=\"dip-asset-row\" data-action=\"copy-svg\" data-svg-selector=\"${escapeHtml(a.selector || '')}\">\n <div class=\"dip-asset-svg-icon\">\\u25C6</div>\n <div class=\"dip-asset-info\">\n <div class=\"dip-asset-name\">${escapeHtml(a.fileName || '')}</div>\n <div class=\"dip-asset-meta\">${dims}${a.viewBox ? ' \\xB7 viewBox: ' + a.viewBox : ''}</div>\n </div>\n </div>`;\n });\n html += '</div>';\n }\n\n if (bgImages.length) {\n html += '<div class=\"dip-asset-group\"><div class=\"dip-asset-group-title\">Background Images (' + bgImages.length + ')</div>';\n bgImages.forEach(a => {\n html += `<div class=\"dip-asset-row\" data-action=\"download-asset\" data-asset-url=\"${escapeHtml(a.src || '')}\" data-asset-name=\"${escapeHtml(a.fileName || '')}\">\n <div class=\"dip-asset-info\">\n <div class=\"dip-asset-name\">${escapeHtml(a.fileName || '')}</div>\n <div class=\"dip-asset-meta\">${escapeHtml(a.selector || '')}</div>\n </div>\n </div>`;\n });\n html += '</div>';\n }\n\n if (!assets.length) {\n html += '<div class=\"dip-typo-empty\">No assets found</div>';\n }\n\n html += '</div>';\n contentWrap.insertAdjacentHTML('beforeend', html);\n\n // Bind actions\n contentWrap.querySelectorAll('.dip-assets-panel [data-action]').forEach((el) => {\n const actionEl = el as HTMLElement;\n actionEl.addEventListener('click', (e) => {\n e.stopPropagation();\n handleAction(actionEl.dataset.action!, actionEl);\n });\n });\n}\n\nfunction downloadAsset(url: string, name: string): void {\n if (!url) return;\n const a = document.createElement('a');\n a.href = url;\n a.download = name;\n a.target = '_blank';\n a.rel = 'noopener';\n a.click();\n}\n\nfunction copySvgCode(selector: string): void {\n if (!selector) return;\n const svg = document.querySelector(selector);\n if (!svg) return;\n const code = svg.outerHTML;\n navigator.clipboard.writeText(code).then(() => {\n // Visual feedback\n const row = contentWrap.querySelector(`[data-svg-selector=\"${selector}\"]`);\n if (row) {\n const name = row.querySelector('.dip-asset-name');\n if (name) { const orig = name.textContent; name.textContent = 'Copied!'; setTimeout(() => { name.textContent = orig; }, 1200); }\n }\n });\n}\n\n// Clean up layout overlays when selection changes\nbus.on('selectionChanged', () => {\n // Remove overlays for items no longer selected\n for (const [idx] of activeLayoutOverlays) {\n if (!state.selectedElements[idx]) {\n removeLayoutOverlay(idx);\n }\n }\n});\n\n// ========== Event Subscriptions ==========\nbus.on('selectionChanged', renderPanel);\nbus.on('toggled', (active) => { if (active) { showPanel(); renderPanel(); } else { hidePanel(); } });\nbus.on('themeChanged', renderPanel);\nbus.on('mcpStatusChanged', renderPanel);\nbus.on('settingsChanged', renderPanel);\nbus.on('copyMarkdown', () => copyAs('markdown'));\n", "import type { SelectionItem, OutputMode, StyleEntry, ReactInfo } from './types';\nimport { MODE_LABELS } from './constants';\nimport { getSelector, getSmartSelector, getHierarchy, getClassString } from './selectors';\nimport { getComputedStyles, getBoundingInfo } from '../content/inspect';\n\n// Feature 3: Bug context helper (lazy import to avoid circular deps)\nfunction tryGetBugContext(): Record<string, unknown> | null {\n try {\n const core = require('../content/core');\n if (core.getBugContext) return core.getBugContext();\n } catch { /* ignore */ }\n return null;\n}\n\nexport function toMarkdown(items: SelectionItem[], mode: OutputMode, getReactInfo?: (el: Element) => ReactInfo | null): string {\n if (!items.length) return '';\n const lines = [`## Dev Inspector Report (${MODE_LABELS[mode]})`, ''];\n\n // Feature 3: Include bug context\n const bugCtx = tryGetBugContext();\n if (bugCtx) {\n lines.push('### Environment');\n lines.push(`- **URL**: ${bugCtx.url}`);\n lines.push(`- **Title**: ${bugCtx.title}`);\n lines.push(`- **Viewport**: ${(bugCtx.viewport as any).width}x${(bugCtx.viewport as any).height} @${bugCtx.devicePixelRatio}x`);\n lines.push(`- **User Agent**: ${bugCtx.userAgent}`);\n lines.push(`- **Page Uptime**: ${bugCtx.pageUptime}ms`);\n const errors = bugCtx.consoleErrors as Array<{ level: string; message: string }>;\n if (errors && errors.length > 0) {\n lines.push(`- **Console Errors** (${errors.length}):`);\n errors.forEach(e => lines.push(` - [${e.level}] ${e.message}`));\n }\n lines.push('');\n }\n\n items.forEach((item, i) => {\n if (item.type === 'text-selection') {\n lines.push(`### ${i + 1}. Text Selection`);\n if (item.note) lines.push(`> ${item.note}`);\n lines.push('', `- **Text**: \"${item.selectedText}\"`);\n if (item.parentEl) lines.push(`- **Parent**: \\`${getSelector(item.parentEl)}\\``);\n } else if (item.type === 'area') {\n lines.push(`### ${i + 1}. Area Selection`);\n if (item.note) lines.push(`> ${item.note}`);\n lines.push('', `- **Region**: ${item.width} x ${item.height} @ (${item.x}, ${item.y})`);\n lines.push(`- **Elements** (${(item.elements || []).length}):`);\n (item.elements || []).forEach(el => lines.push(` - \\`${getSelector(el)}\\``));\n } else {\n if (!item.el) return;\n const smartSel = getSmartSelector(item.el);\n lines.push(`### ${i + 1}. \\`${smartSel}\\``);\n if (item.note) lines.push(`> ${item.note}`);\n lines.push('', `- **Smart Selector**: \\`${smartSel}\\``);\n\n if (mode !== 'compact') {\n lines.push(`- **Bounding Box**: ${getBoundingInfo(item.el)}`);\n const text = item.el.textContent?.trim().substring(0, 100);\n if (text) lines.push(`- **Text**: \"${text}\"`);\n const reactInfo = getReactInfo?.(item.el);\n if (reactInfo) {\n lines.push(`- **React Component**: \\`${reactInfo.componentName}\\``);\n lines.push(`- **Component Hierarchy**: ${reactInfo.componentHierarchy.join(' > ')}`);\n if (reactInfo.propsKeys.length) lines.push(`- **Props**: ${reactInfo.propsKeys.join(', ')}`);\n }\n }\n if (mode === 'detailed' || mode === 'forensic') {\n lines.push(`- **CSS Path**: \\`${getSelector(item.el)}\\``);\n const cls = getClassString(item.el);\n if (cls) lines.push(`- **Classes**: \\`${cls}\\``);\n lines.push(`- **Hierarchy**: ${getHierarchy(item.el).map(h => h.label).join(' > ')}`);\n const styles = getComputedStyles(item.el) as StyleEntry[];\n if (styles.length) {\n lines.push('- **Computed Styles**:');\n lines.push(' ```css');\n styles.forEach(s => lines.push(` ${s.prop}: ${s.val};`));\n lines.push(' ```');\n }\n }\n if (mode === 'forensic') {\n const ext = getComputedStyles(item.el, true) as { basic: StyleEntry[]; categories: Record<string, StyleEntry[]> };\n if (ext.categories) {\n for (const [cat, catItems] of Object.entries(ext.categories)) {\n lines.push(`- **${cat}**:`);\n lines.push(' ```css');\n catItems.forEach(s => lines.push(` ${s.prop}: ${s.val};`));\n lines.push(' ```');\n }\n }\n }\n }\n lines.push('');\n });\n return lines.join('\\n');\n}\n\nexport function toJSON(items: SelectionItem[], mode: OutputMode, getReactInfo?: (el: Element) => ReactInfo | null): string {\n const bugCtx = tryGetBugContext();\n const output: Record<string, unknown> = {};\n if (bugCtx) output.environment = bugCtx;\n output.items = items.map((item, i) => {\n if (item.type === 'text-selection') {\n return { index: i, type: 'text', text: item.selectedText, parent: item.parentEl ? getSelector(item.parentEl) : null, note: item.note || '' };\n }\n if (item.type === 'area') {\n return { index: i, type: 'area', region: { x: item.x, y: item.y, width: item.width, height: item.height }, elements: (item.elements || []).map(el => getSelector(el)), note: item.note || '' };\n }\n if (!item.el) return { index: i, type: 'element', note: item.note || '' };\n const obj: Record<string, unknown> = { index: i, type: 'element', smartSelector: getSmartSelector(item.el), note: item.note || '' };\n if (mode !== 'compact') {\n obj.boundingBox = getBoundingInfo(item.el);\n obj.textContent = item.el.textContent?.trim().substring(0, 100) || '';\n const reactInfo = getReactInfo?.(item.el);\n if (reactInfo) obj.reactComponent = reactInfo;\n }\n if (mode === 'detailed' || mode === 'forensic') {\n obj.cssPath = getSelector(item.el);\n obj.classes = getClassString(item.el);\n obj.hierarchy = getHierarchy(item.el).map(h => h.label);\n obj.computedStyles = getComputedStyles(item.el);\n }\n if (mode === 'forensic') {\n const ext = getComputedStyles(item.el, true) as { basic: StyleEntry[]; categories: Record<string, StyleEntry[]> };\n obj.extendedStyles = ext.categories || {};\n }\n return obj;\n });\n return JSON.stringify(output, null, 2);\n}\n\n// ========== Feature 10: Issue Tracker Formatters ==========\n\nexport function toGitHubIssue(items: SelectionItem[], bugContext?: Record<string, unknown> | null): string {\n const ctx = bugContext || tryGetBugContext();\n const lines: string[] = [];\n\n // Title suggestion\n const titleHints: string[] = [];\n items.forEach(item => {\n if (item.note) titleHints.push(item.note);\n else if (item.type === 'element' && item.el) titleHints.push(`Issue with <${item.el.tagName.toLowerCase()}>`);\n else if (item.type === 'text-selection') titleHints.push(`Text issue: \"${item.selectedText.substring(0, 40)}\"`);\n else if (item.type === 'area') titleHints.push(`Area issue at (${item.x}, ${item.y})`);\n });\n const titleSuggestion = titleHints[0] || 'UI Bug Report';\n\n lines.push(`**Title suggestion**: ${titleSuggestion}`);\n lines.push('');\n lines.push('---');\n lines.push('');\n\n // Bug context\n if (ctx) {\n lines.push('## Environment');\n lines.push(`- **URL**: ${ctx.url}`);\n lines.push(`- **Viewport**: ${(ctx.viewport as any).width}x${(ctx.viewport as any).height} @${ctx.devicePixelRatio}x`);\n lines.push(`- **Browser**: ${ctx.userAgent}`);\n lines.push(`- **Timestamp**: ${ctx.timestamp}`);\n const errors = ctx.consoleErrors as Array<{ level: string; message: string }>;\n if (errors && errors.length > 0) {\n lines.push('');\n lines.push('### Console Errors');\n errors.forEach(e => lines.push(`- \\`[${e.level}]\\` ${e.message}`));\n }\n lines.push('');\n }\n\n // Annotations\n lines.push('## Annotations');\n lines.push('');\n items.forEach((item, i) => {\n const intentLabel = item.intent ? ` [${item.intent.toUpperCase()}]` : '';\n const severityLabel = item.severity ? ` (${item.severity})` : '';\n\n if (item.type === 'element' && item.el) {\n const sel = getSmartSelector(item.el);\n lines.push(`### ${i + 1}. \\`${sel}\\`${intentLabel}${severityLabel}`);\n if (item.note) lines.push(`> ${item.note}`);\n lines.push(`- **Element**: \\`<${item.el.tagName.toLowerCase()}>\\``);\n lines.push(`- **Selector**: \\`${sel}\\``);\n const text = item.el.textContent?.trim().substring(0, 100);\n if (text) lines.push(`- **Text**: \"${text}\"`);\n } else if (item.type === 'text-selection') {\n lines.push(`### ${i + 1}. Text Selection${intentLabel}${severityLabel}`);\n if (item.note) lines.push(`> ${item.note}`);\n lines.push(`- **Text**: \"${item.selectedText}\"`);\n } else if (item.type === 'area') {\n lines.push(`### ${i + 1}. Area Selection${intentLabel}${severityLabel}`);\n if (item.note) lines.push(`> ${item.note}`);\n lines.push(`- **Region**: ${item.width}x${item.height} @ (${item.x}, ${item.y})`);\n }\n\n // Thread messages\n if (item.thread.length > 0) {\n lines.push('');\n lines.push('**Thread**:');\n item.thread.forEach(msg => {\n const role = msg.role === 'agent' ? 'Agent' : 'Human';\n lines.push(`- **${role}**: ${msg.content}`);\n });\n }\n lines.push('');\n });\n\n // Labels suggestion\n const severities = items.map(i => i.severity).filter(Boolean);\n const labels: string[] = ['bug'];\n if (severities.includes('blocking')) labels.push('priority: critical');\n else if (severities.includes('important')) labels.push('priority: high');\n else if (severities.includes('suggestion')) labels.push('enhancement');\n\n lines.push(`**Suggested labels**: ${labels.join(', ')}`);\n lines.push('');\n lines.push('---');\n lines.push('*Generated by Dev InSpector*');\n\n return lines.join('\\n');\n}\n\nexport function toBugReport(items: SelectionItem[], bugContext?: Record<string, unknown> | null): string {\n const ctx = bugContext || tryGetBugContext();\n const lines: string[] = [];\n\n lines.push('# Bug Report');\n lines.push('');\n\n // Summary\n const summaryHints = items.filter(i => i.note).map(i => i.note);\n lines.push('## Summary');\n lines.push(summaryHints.length > 0 ? summaryHints.join('; ') : '[Describe the bug briefly]');\n lines.push('');\n\n // Steps to Reproduce\n lines.push('## Steps to Reproduce');\n if (ctx) {\n lines.push(`1. Navigate to ${ctx.url}`);\n } else {\n lines.push('1. Navigate to [URL]');\n }\n lines.push('2. [Describe steps to reproduce]');\n lines.push('3. Observe the issue');\n lines.push('');\n\n // Expected / Actual\n lines.push('## Expected Behavior');\n lines.push('[What should happen]');\n lines.push('');\n lines.push('## Actual Behavior');\n lines.push('[What actually happens]');\n lines.push('');\n\n // Technical Context\n if (ctx) {\n lines.push('## Technical Context');\n lines.push(`- **URL**: ${ctx.url}`);\n lines.push(`- **Page Title**: ${ctx.title}`);\n lines.push(`- **Viewport**: ${(ctx.viewport as any).width}x${(ctx.viewport as any).height}`);\n lines.push(`- **Device Pixel Ratio**: ${ctx.devicePixelRatio}`);\n lines.push(`- **User Agent**: ${ctx.userAgent}`);\n lines.push(`- **Page Uptime**: ${ctx.pageUptime}ms`);\n lines.push(`- **Timestamp**: ${ctx.timestamp}`);\n const errors = ctx.consoleErrors as Array<{ level: string; message: string }>;\n if (errors && errors.length > 0) {\n lines.push('');\n lines.push('### Console Errors');\n errors.forEach(e => lines.push(`- \\`[${e.level}]\\` ${e.message}`));\n }\n lines.push('');\n }\n\n // Annotations\n lines.push('## Annotations');\n lines.push('');\n items.forEach((item, i) => {\n const severityTag = item.severity ? ` **[${item.severity.toUpperCase()}]**` : '';\n const intentTag = item.intent ? ` _${item.intent}_` : '';\n\n if (item.type === 'element' && item.el) {\n const sel = getSmartSelector(item.el);\n lines.push(`### ${i + 1}. \\`${sel}\\`${severityTag}${intentTag}`);\n if (item.note) lines.push(`> ${item.note}`);\n lines.push(`- Element: \\`<${item.el.tagName.toLowerCase()}>\\``);\n lines.push(`- Selector: \\`${sel}\\``);\n lines.push(`- Bounding Box: ${getBoundingInfo(item.el)}`);\n const cls = getClassString(item.el);\n if (cls) lines.push(`- Classes: \\`${cls}\\``);\n } else if (item.type === 'text-selection') {\n lines.push(`### ${i + 1}. Text Selection${severityTag}${intentTag}`);\n if (item.note) lines.push(`> ${item.note}`);\n lines.push(`- Text: \"${item.selectedText}\"`);\n } else if (item.type === 'area') {\n lines.push(`### ${i + 1}. Area Selection${severityTag}${intentTag}`);\n if (item.note) lines.push(`> ${item.note}`);\n lines.push(`- Region: ${item.width}x${item.height} @ (${item.x}, ${item.y})`);\n lines.push(`- Elements in area: ${(item.elements || []).length}`);\n }\n\n if (item.thread.length > 0) {\n lines.push('');\n lines.push('**Discussion**:');\n item.thread.forEach(msg => {\n const role = msg.role === 'agent' ? 'Agent' : 'Human';\n lines.push(`- **${role}**: ${msg.content}`);\n });\n }\n lines.push('');\n });\n\n lines.push('## Screenshots');\n lines.push('[Attach screenshots here]');\n lines.push('');\n lines.push('---');\n lines.push('*Generated by Dev InSpector*');\n\n return lines.join('\\n');\n}\n", "export function makeDraggable(el: HTMLElement, handleSelector?: string): void {\n let isDragging = false, hasMoved = false, startX = 0, startY = 0, origLeft = 0, origTop = 0;\n\n const isInteractive = (t: Element) => {\n const tag = t.tagName;\n return tag === 'BUTTON' || tag === 'TEXTAREA' || tag === 'INPUT' || tag === 'SELECT'\n || !!(t.closest?.('button') || t.closest?.('textarea'));\n };\n const isHandle = (t: Element) => !handleSelector || !!(t.closest?.(handleSelector));\n const getPointer = (e: MouseEvent | TouchEvent): { x: number; y: number } => {\n if ('touches' in e && e.touches.length > 0) {\n return { x: e.touches[0].clientX, y: e.touches[0].clientY };\n }\n return { x: (e as MouseEvent).clientX, y: (e as MouseEvent).clientY };\n };\n\n function onStart(e: MouseEvent | TouchEvent) {\n const target = e.target as Element;\n if (handleSelector && isInteractive(target)) return;\n if (!isHandle(target)) return;\n isDragging = true; hasMoved = false;\n const rect = el.getBoundingClientRect();\n const p = getPointer(e);\n startX = p.x; startY = p.y; origLeft = rect.left; origTop = rect.top;\n el.style.transition = 'none';\n if (e.type === 'mousedown') e.preventDefault();\n document.querySelectorAll('iframe').forEach(f => {\n (f as HTMLElement).style.setProperty('pointer-events', 'none', 'important');\n });\n }\n\n function onMove(e: MouseEvent | TouchEvent) {\n if (!isDragging) return;\n const p = getPointer(e);\n if (Math.abs(p.x - startX) > 3 || Math.abs(p.y - startY) > 3) hasMoved = true;\n if (!hasMoved) return;\n if (e.cancelable) e.preventDefault();\n el.style.right = 'auto'; el.style.bottom = 'auto';\n el.style.left = Math.max(0, Math.min(origLeft + (p.x - startX), window.innerWidth - el.offsetWidth)) + 'px';\n el.style.top = Math.max(0, Math.min(origTop + (p.y - startY), window.innerHeight - el.offsetHeight)) + 'px';\n }\n\n function onEnd() {\n if (!isDragging) return;\n isDragging = false; el.style.transition = '';\n document.querySelectorAll('iframe').forEach(f => {\n (f as HTMLElement).style.removeProperty('pointer-events');\n });\n if (hasMoved) {\n try {\n localStorage.setItem(`di-pos-${el.id}`, JSON.stringify({ left: el.style.left, top: el.style.top }));\n } catch { /* ignore */ }\n }\n }\n\n el.addEventListener('mousedown', onStart);\n document.addEventListener('mousemove', onMove);\n document.addEventListener('mouseup', onEnd);\n el.addEventListener('touchstart', onStart, { passive: true });\n document.addEventListener('touchmove', onMove, { passive: false });\n document.addEventListener('touchend', onEnd);\n\n (el as any)._diHasMoved = () => hasMoved;\n\n // Restore saved position\n try {\n const saved = localStorage.getItem(`di-pos-${el.id}`);\n if (saved) {\n const pos = JSON.parse(saved);\n const left = parseInt(pos.left);\n const top = parseInt(pos.top);\n if (left >= 0 && left < window.innerWidth - 20 && top >= 0 && top < window.innerHeight - 20) {\n el.style.right = 'auto'; el.style.bottom = 'auto';\n el.style.left = pos.left; el.style.top = pos.top;\n } else {\n localStorage.removeItem(`di-pos-${el.id}`);\n }\n }\n } catch { /* ignore */ }\n}\n", "import { state, addSelection, createAnnotationMeta } from './core';\nimport { isInspectorElement, getSelector } from '../shared/selectors';\nimport { hideOverlay } from './overlay';\n\nlet areaRect: HTMLElement;\nlet dragStart: { x: number; y: number } | null = null;\n\nexport function initAnnotate(shadowRoot: ShadowRoot): void {\n areaRect = document.createElement('div');\n areaRect.id = 'di-area-select-rect';\n shadowRoot.appendChild(areaRect);\n\n document.addEventListener('mousedown', onAreaMouseDown, true);\n document.addEventListener('mousemove', onAreaMouseMove, true);\n document.addEventListener('mouseup', onAreaMouseUp, true);\n document.addEventListener('mouseup', onTextSelection, false);\n}\n\n// ========== Area Drag Selection ==========\nfunction onAreaMouseDown(e: MouseEvent): void {\n if (!state.isActive || !e.shiftKey) return;\n if (isInspectorElement(e.target as Element)) return;\n\n e.preventDefault();\n state._areaDragging = true;\n hideOverlay();\n dragStart = { x: e.clientX, y: e.clientY };\n areaRect.style.display = 'block';\n areaRect.style.left = e.clientX + 'px';\n areaRect.style.top = e.clientY + 'px';\n areaRect.style.width = '0px';\n areaRect.style.height = '0px';\n}\n\nfunction onAreaMouseMove(e: MouseEvent): void {\n if (!dragStart) return;\n const x = Math.min(dragStart.x, e.clientX);\n const y = Math.min(dragStart.y, e.clientY);\n const w = Math.abs(e.clientX - dragStart.x);\n const h = Math.abs(e.clientY - dragStart.y);\n areaRect.style.left = x + 'px';\n areaRect.style.top = y + 'px';\n areaRect.style.width = w + 'px';\n areaRect.style.height = h + 'px';\n}\n\nfunction onAreaMouseUp(e: MouseEvent): void {\n if (!dragStart) return;\n const x = Math.min(dragStart.x, e.clientX);\n const y = Math.min(dragStart.y, e.clientY);\n const w = Math.abs(e.clientX - dragStart.x);\n const h = Math.abs(e.clientY - dragStart.y);\n dragStart = null;\n areaRect.style.display = 'none';\n\n if (w < 10 || h < 10) {\n state._areaDragging = false;\n return;\n }\n\n const areaBox = { left: x, top: y, right: x + w, bottom: y + h };\n const elements = findElementsInArea(areaBox);\n\n if (elements.length > 0) {\n addSelection({\n ...createAnnotationMeta(),\n type: 'area',\n x: Math.round(x), y: Math.round(y),\n width: Math.round(w), height: Math.round(h),\n elementSelectors: elements.map(el => getSelector(el)),\n elements,\n });\n }\n\n setTimeout(() => { state._areaDragging = false; }, 50);\n}\n\nfunction findElementsInArea(area: { left: number; top: number; right: number; bottom: number }): Element[] {\n const found = new Set<Element>();\n const step = 20;\n for (let x = area.left + 5; x < area.right; x += step) {\n for (let y = area.top + 5; y < area.bottom; y += step) {\n const el = document.elementFromPoint(x, y);\n if (el && !isInspectorElement(el) && el !== document.body && el !== document.documentElement) {\n found.add(el);\n }\n }\n }\n return Array.from(found);\n}\n\n// ========== Text Selection Annotation ==========\nfunction onTextSelection(e: MouseEvent): void {\n if (!state.isActive) return;\n if (isInspectorElement(e.target as Element)) return;\n\n const sel = window.getSelection();\n if (!sel || sel.isCollapsed || sel.toString().trim().length === 0) return;\n\n const selectedText = sel.toString().trim();\n if (selectedText.length < 2) return;\n\n const range = sel.getRangeAt(0);\n const parentEl = range.commonAncestorContainer.nodeType === Node.ELEMENT_NODE\n ? range.commonAncestorContainer as Element\n : (range.commonAncestorContainer as Node).parentElement;\n\n try {\n const mark = document.createElement('mark');\n mark.className = 'di-text-annotation';\n mark.dataset.diAnnotation = state.selectedElements.length.toString();\n range.surroundContents(mark);\n } catch {\n // Complex DOM structure, ignore\n }\n\n sel.removeAllRanges();\n\n addSelection({\n ...createAnnotationMeta(),\n type: 'text-selection',\n selectedText,\n parentSelector: parentEl ? getSelector(parentEl) : '',\n parentEl: parentEl || undefined,\n });\n}\n", "import { state } from './core';\nimport * as bus from '../shared/event-bus';\n\nlet pauseStyleEl: HTMLStyleElement | null = null;\nlet pausedVideos: HTMLVideoElement[] = [];\nlet pauseBadge: HTMLElement | null = null;\n\nconst PAUSE_CSS = `\n *, *::before, *::after {\n animation-play-state: paused !important;\n transition-duration: 0s !important;\n }\n`;\n\nfunction pauseAnimations(): void {\n if (!pauseStyleEl) {\n pauseStyleEl = document.createElement('style');\n pauseStyleEl.id = 'di-animation-pause';\n }\n pauseStyleEl.textContent = PAUSE_CSS;\n document.head.appendChild(pauseStyleEl);\n\n pausedVideos = [];\n document.querySelectorAll('video').forEach(v => {\n if (!v.paused) {\n v.pause();\n pausedVideos.push(v);\n }\n });\n\n document.querySelectorAll('animate, animateTransform, animateMotion').forEach(el => {\n if (el.parentElement) {\n try { (el.parentElement as any).pauseAnimations?.(); } catch { /* no-op */ }\n }\n });\n\n if (!pauseBadge) {\n pauseBadge = document.createElement('div');\n pauseBadge.className = 'di-pause-badge';\n pauseBadge.textContent = '\\u23F8 Paused';\n }\n document.body.appendChild(pauseBadge);\n state.animationsPaused = true;\n}\n\nfunction resumeAnimations(): void {\n if (pauseStyleEl?.parentNode) pauseStyleEl.remove();\n\n pausedVideos.forEach(v => {\n try { v.play(); } catch { /* no-op */ }\n });\n pausedVideos = [];\n\n document.querySelectorAll('animate, animateTransform, animateMotion').forEach(el => {\n if (el.parentElement) {\n try { (el.parentElement as any).unpauseAnimations?.(); } catch { /* no-op */ }\n }\n });\n\n if (pauseBadge?.parentNode) pauseBadge.remove();\n state.animationsPaused = false;\n}\n\nfunction toggleAnimations(): void {\n if (state.animationsPaused) resumeAnimations();\n else pauseAnimations();\n bus.emit('selectionChanged', state.selectedElements);\n}\n\nexport function initAnimation(): void {\n bus.on('toggleAnimations', toggleAnimations);\n}\n\nexport { pauseAnimations, resumeAnimations };\n", "import { state, clearSelections, toggleMarkers, toggle } from './core';\nimport * as bus from '../shared/event-bus';\n\nconst SHORTCUTS: Record<string, () => void> = {\n 'p': () => bus.emit('toggleAnimations'),\n 'h': () => toggleMarkers(),\n 'c': () => bus.emit('copyMarkdown'),\n 'x': () => clearSelections(),\n};\n\nfunction isInputFocused(): boolean {\n const active = document.activeElement;\n if (!active) return false;\n const tag = active.tagName;\n if (tag === 'INPUT' || tag === 'TEXTAREA' || tag === 'SELECT') return true;\n if ((active as HTMLElement).isContentEditable) return true;\n // Also check shadow DOM focused element\n const host = document.getElementById('dev-inspector-host');\n if (host?.shadowRoot) {\n const shadowActive = host.shadowRoot.activeElement;\n if (shadowActive) {\n const sTag = shadowActive.tagName;\n if (sTag === 'INPUT' || sTag === 'TEXTAREA' || sTag === 'SELECT') return true;\n }\n }\n return false;\n}\n\nfunction onKeyDown(e: KeyboardEvent): void {\n // Global toggle: Ctrl+Shift+X \u2014 show float + toggle inspector\n if ((e.ctrlKey || e.metaKey) && e.shiftKey && e.key === 'X') {\n e.preventDefault();\n const host = document.getElementById('dev-inspector-host');\n const toggleEl = host?.shadowRoot?.getElementById('dev-inspector-toggle');\n if (toggleEl && !state.isActive) {\n // Show float button when activating via keyboard\n toggleEl.style.display = 'flex';\n }\n toggle();\n return;\n }\n if (e.key === 'Escape' && state.isActive) {\n toggle();\n return;\n }\n if (!state.isActive) return;\n if (isInputFocused()) return;\n if (e.ctrlKey || e.metaKey || e.altKey || e.shiftKey) return;\n\n const handler = SHORTCUTS[e.key.toLowerCase()];\n if (handler) {\n e.preventDefault();\n handler();\n }\n}\n\nexport function initKeyboard(): void {\n document.addEventListener('keydown', onKeyDown);\n}\n", "import { state, saveSetting } from './core';\nimport * as bus from '../shared/event-bus';\n\nlet shadowHost: HTMLElement;\n\nexport function initTheme(host: HTMLElement): void {\n shadowHost = host;\n applyTheme();\n\n window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', (e) => {\n try {\n const saved = localStorage.getItem('dev-inspector-settings');\n const data = saved ? JSON.parse(saved) : {};\n if (!data.theme) {\n state.theme = e.matches ? 'dark' : 'light';\n applyTheme();\n }\n } catch { /* ignore */ }\n });\n\n bus.on('themeChanged', applyTheme);\n}\n\nfunction applyTheme(): void {\n shadowHost.setAttribute('data-di-theme', state.theme);\n}\n", "/**\n * React Inspector \u2014 npm \uD328\uD0A4\uC9C0 \uBC84\uC804\n * \uD398\uC774\uC9C0 \uCEE8\uD14D\uC2A4\uD2B8\uC5D0\uC11C \uC9C1\uC811 \uC2E4\uD589\uB418\uBBC0\uB85C MAIN world \uBE0C\uB9BF\uC9C0 \uC5C6\uC774 fiber \uC9C1\uC811 \uC811\uADFC\n */\nimport { state } from './core';\nimport { getSelector } from '../shared/selectors';\nimport { setReactInfoFn } from './panel';\nimport type { ReactInfo } from '../shared/types';\n\nexport function initReactInspector(): void {\n setReactInfoFn(getReactInfoSync);\n}\n\n// ========== Fiber \uC811\uADFC \uC720\uD2F8 ==========\nfunction getFiber(el: Element): any {\n const key = Object.keys(el).find(k =>\n k.startsWith('__reactFiber$') || k.startsWith('__reactInternalInstance$')\n );\n return key ? (el as any)[key] : null;\n}\n\nfunction getComponentName(f: any): string | null {\n if (!f?.type) return null;\n if (typeof f.type === 'function') return f.type.displayName || f.type.name || null;\n if (typeof f.type === 'object' && f.type.$$typeof) {\n const inner = f.type.render || f.type.type;\n if (inner) return inner.displayName || inner.name || null;\n }\n return null;\n}\n\nfunction findComponentFiber(fiber: any): { name: string; fiber: any } | null {\n let current = fiber;\n while (current) {\n const name = getComponentName(current);\n if (name) return { name, fiber: current };\n current = current.return;\n }\n return null;\n}\n\nfunction getHierarchy(fiber: any, maxDepth = 8): string[] {\n const hierarchy: string[] = [];\n let current = fiber;\n while (current && hierarchy.length < maxDepth) {\n const name = getComponentName(current);\n if (name) hierarchy.push(name);\n current = current.return;\n }\n return hierarchy;\n}\n\n// ========== Sync: \uD328\uB110\uC5D0\uC11C \uC0AC\uC6A9 ==========\nfunction getReactInfoSync(el: Element): ReactInfo | null {\n if (!state.reactMode) return null;\n const fiber = getFiber(el);\n if (!fiber) return null;\n\n const comp = findComponentFiber(fiber);\n if (!comp) return null;\n\n const propsKeys = comp.fiber.memoizedProps\n ? Object.keys(comp.fiber.memoizedProps).filter(k => k !== 'children' && !k.startsWith('__')).slice(0, 15)\n : [];\n\n return {\n componentName: comp.name,\n componentHierarchy: getHierarchy(comp.fiber),\n propsKeys,\n };\n}\n\n// ========== MCP \uB3C4\uAD6C: inspect_component ==========\nexport interface ReactInspectResult {\n componentName: string;\n componentHierarchy: string[];\n props: Record<string, unknown>;\n sourceFile: string | null;\n}\n\nexport async function inspectReactComponent(selectorOrName: string, byName?: boolean): Promise<ReactInspectResult | null> {\n let el: Element | null = null;\n\n if (byName) {\n // \uC774\uB984\uC73C\uB85C \uAC80\uC0C9: body \uD558\uC704 \uBAA8\uB4E0 \uC694\uC18C \uC21C\uD68C\n const all = document.querySelectorAll('*');\n for (const candidate of all) {\n const fiber = getFiber(candidate);\n if (!fiber) continue;\n const comp = findComponentFiber(fiber);\n if (comp && comp.name === selectorOrName) { el = candidate; break; }\n }\n } else {\n el = document.querySelector(selectorOrName);\n }\n\n if (!el) return null;\n const fiber = getFiber(el);\n if (!fiber) return null;\n\n const comp = findComponentFiber(fiber);\n if (!comp) return null;\n\n // prop values (\uC9C1\uB82C\uD654 \uAC00\uB2A5\uD55C \uAC83\uB9CC)\n const props: Record<string, unknown> = {};\n if (comp.fiber.memoizedProps) {\n for (const [k, v] of Object.entries(comp.fiber.memoizedProps)) {\n if (k === 'children' || k.startsWith('__')) continue;\n try {\n if (typeof v === 'function') props[k] = `[Function: ${v.name || 'anonymous'}]`;\n else if (typeof v === 'object' && v !== null) props[k] = JSON.parse(JSON.stringify(v));\n else props[k] = v;\n } catch { props[k] = String(v); }\n }\n }\n\n // source file hint\n let sourceFile: string | null = null;\n try {\n if (comp.fiber._debugSource) {\n const src = comp.fiber._debugSource;\n sourceFile = `${src.fileName}:${src.lineNumber}`;\n }\n } catch { /* ignore */ }\n\n return {\n componentName: comp.name,\n componentHierarchy: getHierarchy(comp.fiber),\n props,\n sourceFile,\n };\n}\n\n// ========== MCP \uB3C4\uAD6C: find_components ==========\nexport interface ReactScanResult {\n components: Array<{ name: string; count: number; exampleSelector: string }>;\n totalUnique: number;\n}\n\nexport async function scanReactComponents(rootSelector?: string): Promise<ReactScanResult | null> {\n const root = rootSelector ? document.querySelector(rootSelector) : document.body;\n if (!root) return null;\n\n const componentMap = new Map<string, { count: number; exampleEl: Element }>();\n const all = root.querySelectorAll('*');\n\n for (const el of all) {\n const fiber = getFiber(el);\n if (!fiber) continue;\n const comp = findComponentFiber(fiber);\n if (!comp) continue;\n\n const existing = componentMap.get(comp.name);\n if (existing) {\n existing.count++;\n } else {\n componentMap.set(comp.name, { count: 1, exampleEl: el });\n }\n }\n\n if (componentMap.size === 0) return null;\n\n const components = Array.from(componentMap.entries()).map(([name, info]) => ({\n name,\n count: info.count,\n exampleSelector: getSelector(info.exampleEl),\n }));\n\n return { components, totalUnique: components.length };\n}\n\n// ========== MCP \uB3C4\uAD6C: inspect_react_state ==========\nexport interface ReactStateResult {\n componentName: string;\n hooks: Array<{ type: string; value: unknown }>;\n stateCount: number;\n contextValues: Array<{ name: string; value: unknown }>;\n}\n\nexport async function inspectReactState(selector: string): Promise<ReactStateResult | null> {\n const el = document.querySelector(selector);\n if (!el) return null;\n\n const fiber = getFiber(el);\n if (!fiber) return null;\n\n const comp = findComponentFiber(fiber);\n if (!comp) return null;\n\n const hooks: Array<{ type: string; value: unknown }> = [];\n const contextValues: Array<{ name: string; value: unknown }> = [];\n let stateCount = 0;\n\n // Walk memoizedState linked list\n let hookState = comp.fiber.memoizedState;\n let hookIndex = 0;\n while (hookState && hookIndex < 50) {\n const queue = hookState.queue;\n if (queue) {\n // useState or useReducer\n const type = queue.lastRenderedReducer?.name === 'basicStateReducer' ? 'useState' : 'useReducer';\n let value: unknown;\n try {\n value = JSON.parse(JSON.stringify(hookState.memoizedState));\n } catch {\n value = String(hookState.memoizedState);\n }\n hooks.push({ type, value });\n if (type === 'useState') stateCount++;\n } else if (hookState.memoizedState && typeof hookState.memoizedState === 'object') {\n // useRef or useMemo\n if ('current' in hookState.memoizedState) {\n let value: unknown;\n try { value = JSON.parse(JSON.stringify(hookState.memoizedState.current)); }\n catch { value = String(hookState.memoizedState.current); }\n hooks.push({ type: 'useRef', value });\n }\n }\n\n hookState = hookState.next;\n hookIndex++;\n }\n\n // Walk fiber tree for context\n let contextFiber = comp.fiber;\n while (contextFiber) {\n if (contextFiber.type?._context || contextFiber.type?.Provider) {\n try {\n const ctxName = contextFiber.type._context?.displayName || contextFiber.type.displayName || 'unknown';\n let ctxValue: unknown;\n try { ctxValue = JSON.parse(JSON.stringify(contextFiber.memoizedProps?.value)); }\n catch { ctxValue = String(contextFiber.memoizedProps?.value); }\n contextValues.push({ name: ctxName, value: ctxValue });\n } catch { /* ignore */ }\n }\n contextFiber = contextFiber.return;\n if (contextValues.length >= 10) break;\n }\n\n return {\n componentName: comp.name,\n hooks,\n stateCount,\n contextValues,\n };\n}\n", "import { state, addSelection, clearSelections, toggle, acknowledgeAnnotation, resolveAnnotation, dismissAnnotation, addThreadMessage, getPendingAnnotations, getAnnotationById, serializeAnnotation, createAnnotationMeta, getBugContext } from './core';\nimport { getSelector, getSmartSelector, getHierarchy, getClassString, isInspectorElement } from '../shared/selectors';\nimport { getComputedStyles, getBoundingInfo, getAccessibilityInfo, getNearbyText, getNearbyElements, getSourceFileHint } from './inspect';\nimport { pauseAnimations, resumeAnimations } from './animation';\nimport { toMarkdown as toMarkdownFn, toGitHubIssue, toBugReport } from '../shared/formatters';\nimport * as bus from '../shared/event-bus';\nimport { inspectReactComponent, scanReactComponents, inspectReactState } from './react-inspector';\n\n// MCP API \uAE30\uBCF8 URL (\uAC19\uC740 \uC11C\uBC84\uC758 Express \uBBF8\uB4E4\uC6E8\uC5B4)\nconst MCP_BASE = (window as any).__DEV_INSPECTOR_BASE__ || '/api/v1/dev-inspector';\n\nexport function initBridge(): void {\n // SSE\uB85C \uB3C4\uAD6C \uD638\uCD9C \uC218\uC2E0\n const eventSource = new EventSource(`${MCP_BASE}/stream`);\n\n eventSource.addEventListener('tool_call', async (e: MessageEvent) => {\n try {\n const { id, tool, params } = JSON.parse(e.data);\n const result = await handleToolCall(id, tool, params);\n // \uACB0\uACFC\uB97C Express\uB85C POST\n fetch(`${MCP_BASE}/result`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ id, result }),\n }).catch(() => {});\n } catch (err: any) {\n console.error('[dev-inspector] Tool call error:', err);\n }\n });\n\n eventSource.addEventListener('connected', () => {\n state._mcpConnected = true;\n bus.emit('selectionChanged', state.selectedElements);\n });\n\n eventSource.onerror = () => {\n state._mcpConnected = false;\n bus.emit('selectionChanged', state.selectedElements);\n };\n\n // SSE \uC774\uBCA4\uD2B8\uB97C \uC11C\uBC84\uB85C \uC804\uC1A1\n bus.on('sseEvent', (event) => {\n fetch(`${MCP_BASE}/event`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(event),\n }).catch(() => {});\n });\n\n // Submit annotations\n bus.on('submitAnnotations', () => {\n if (!state.webhookUrl || !state.selectedElements.length) return;\n const output = toMarkdownFn(state.selectedElements, state.outputMode);\n fetch(state.webhookUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n event: 'submit',\n timestamp: Date.now(),\n url: location.href,\n sessionId: state.sessionId,\n output,\n annotations: state.selectedElements.map(serializeAnnotation),\n bugContext: getBugContext(),\n }),\n }).catch(() => {});\n });\n}\n\n// ========== MCP Tool Call Handler (34 tools) \u2014 \uC804\uCCB4 \uC0AC\uC6A9 \uAC00\uB2A5 ==========\nasync function handleToolCall(_id: string, tool: string, params: Record<string, unknown>): Promise<unknown> {\n try {\n switch (tool) {\n case 'inspect_element':\n return inspectElement(params.selector as string);\n case 'list_selections':\n return listSelections();\n case 'get_computed_styles':\n return getStyles(params.selector as string, params.properties as string[] | undefined);\n case 'annotate_text':\n return annotateText(params.pattern as string, params.note as string);\n case 'pause_animations':\n return togglePause(params.paused as boolean);\n case 'select_element':\n return selectElement(params.selector as string, params.note as string | undefined, params.intent as string | undefined, params.severity as string | undefined);\n case 'clear_selections':\n clearSelections();\n return { success: true };\n // ===== New tools (Agentation pattern) =====\n case 'get_pending':\n return getPending(params.sessionId as string | undefined);\n case 'acknowledge':\n return acknowledge(params.annotationId as string);\n case 'resolve':\n return resolve(params.annotationId as string, params.summary as string | undefined);\n case 'dismiss':\n return dismiss(params.annotationId as string, params.reason as string);\n case 'reply':\n return reply(params.annotationId as string, params.message as string);\n case 'watch_annotations':\n return watchAnnotations(params.batchWindowSeconds as number | undefined, params.timeoutSeconds as number | undefined);\n // ===== New tools (v2) =====\n case 'inspect_component':\n return inspectComponentTool(params.selector as string | undefined, params.name as string | undefined);\n case 'find_components':\n return findComponentsTool(params.root as string | undefined);\n case 'capture_page':\n return capturePageTool(params.selector as string | undefined, params.fullPage as boolean | undefined);\n case 'extract_page_structure':\n return extractPageStructureTool(params.selector as string | undefined, params.maxDepth as number | undefined);\n case 'verify_element':\n return verifyElementTool(params.selector as string, params.expected as Record<string, unknown>);\n case 'check_responsive':\n return checkResponsiveTool(params.selector as string, params.breakpoints as number[] | undefined);\n // ===== Tier 1 tools =====\n case 'audit_accessibility':\n return auditAccessibilityTool(params.selector as string | undefined, params.rules as string[] | undefined);\n case 'check_contrast':\n return checkContrastTool(params.selector as string | undefined, params.selectors as string[] | undefined);\n case 'inspect_css_rules':\n return inspectCssRulesTool(params.selector as string, params.pseudo as string | undefined);\n case 'capture_labeled':\n return captureLabeledTool(params.selector as string | undefined, params.labelTypes as string[] | undefined);\n // ===== Tier 2 tools =====\n case 'extract_design_tokens':\n return extractDesignTokensTool(params.selector as string | undefined);\n case 'compare_screenshots':\n return compareScreenshotsTool(params.before as string, params.after as string);\n case 'inspect_react_state':\n return inspectReactStateTool(params.selector as string);\n case 'validate_page_structure':\n return validatePageStructureTool(params.selector as string | undefined);\n // ===== Tier 3 tools =====\n case 'map_to_tailwind':\n return mapToTailwindTool(params.selector as string);\n case 'get_performance_metrics':\n return getPerformanceMetricsTool();\n case 'generate_test_code':\n return generateTestCodeTool(params.selector as string, params.framework as string | undefined, params.assertions as string[] | undefined);\n case 'inspect_tab_order':\n return inspectTabOrderTool(params.selector as string | undefined);\n // ===== Feature 3: Bug Context =====\n case 'get_bug_context':\n return getBugContext();\n // ===== Feature 9: Asset Extraction =====\n case 'list_assets':\n return listAssetsTool();\n // ===== Feature 10: Export Bug Report =====\n case 'export_bug_report':\n return exportBugReportTool(params.format as string | undefined);\n default:\n return { error: `Unknown tool: ${tool}` };\n }\n } catch (err: any) {\n return { error: err.message };\n }\n}\n\n// ========== Select Element (Claude \u2192 visual selection) ==========\nfunction selectElement(selector: string, note?: string, intent?: string, severity?: string): unknown {\n const el = document.querySelector(selector);\n if (!el) return { error: `Element not found: ${selector}` };\n\n // Check if already selected\n const existing = state.selectedElements.findIndex(item => item.type === 'element' && item.el === el);\n if (existing >= 0) return { error: 'Element already selected', annotationId: state.selectedElements[existing].id };\n\n // Activate inspector if not active\n if (!state.isActive) toggle();\n\n const meta = createAnnotationMeta();\n if (note) meta.note = note;\n if (intent && ['fix', 'change', 'question', 'approve'].includes(intent)) meta.intent = intent as any;\n if (severity && ['blocking', 'important', 'suggestion'].includes(severity)) meta.severity = severity as any;\n\n const styles = getComputedStyles(el) as Array<{ prop: string; val: string }>;\n const a11y = getAccessibilityInfo(el);\n\n addSelection({\n ...meta,\n type: 'element',\n el,\n selector: getSelector(el),\n smartSelector: getSmartSelector(el),\n tagName: el.tagName.toLowerCase(),\n classes: getClassString(el),\n boundingBox: getBoundingInfo(el),\n textContent: el.textContent?.substring(0, 200) || '',\n hierarchy: getHierarchy(el).map(h => h.label),\n computedStyles: styles,\n extendedStyles: {},\n accessibility: a11y || undefined,\n nearbyText: getNearbyText(el) || undefined,\n nearbyElements: getNearbyElements(el) || undefined,\n sourceFile: getSourceFileHint(el) || undefined,\n });\n\n return {\n success: true,\n annotationId: meta.id,\n selector: getSelector(el),\n tagName: el.tagName.toLowerCase(),\n textContent: el.textContent?.substring(0, 100) || '',\n };\n}\n\n// ========== Original Tools ==========\nfunction inspectElement(selector: string): unknown {\n const el = document.querySelector(selector);\n if (!el) return { error: `Element not found: ${selector}` };\n const a11y = getAccessibilityInfo(el);\n const nearbyText = getNearbyText(el);\n const nearbyElements = getNearbyElements(el);\n const sourceFile = getSourceFileHint(el);\n return {\n selector: getSelector(el),\n smartSelector: getSmartSelector(el),\n classes: getClassList(el),\n boundingBox: getBoundingInfo(el),\n hierarchy: getHierarchy(el).map(h => h.label),\n computedStyles: getComputedStyles(el),\n textContent: el.textContent?.substring(0, 200) || '',\n tagName: el.tagName.toLowerCase(),\n attributes: getAttributes(el),\n accessibility: a11y || undefined,\n nearbyText: nearbyText || undefined,\n nearbyElements: nearbyElements.length ? nearbyElements : undefined,\n sourceFile: sourceFile || undefined,\n };\n}\n\nfunction listSelections(): unknown {\n return {\n sessionId: state.sessionId,\n count: state.selectedElements.length,\n annotations: state.selectedElements.map(serializeAnnotation),\n };\n}\n\nfunction getStyles(selector: string, properties?: string[]): unknown {\n const el = document.querySelector(selector);\n if (!el) return { error: `Element not found: ${selector}` };\n const cs = window.getComputedStyle(el);\n const props = properties?.length ? properties : [\n 'display', 'position', 'width', 'height', 'padding', 'margin',\n 'font-size', 'color', 'background-color', 'border', 'z-index'\n ];\n const result: Record<string, string> = {};\n props.forEach(p => { result[p] = cs.getPropertyValue(p); });\n return result;\n}\n\nfunction annotateText(pattern: string, note?: string): unknown {\n const walker = document.createTreeWalker(document.body, NodeFilter.SHOW_TEXT);\n let count = 0;\n const matches: Node[] = [];\n while (walker.nextNode()) {\n const node = walker.currentNode;\n if (isInspectorElement(node.parentElement)) continue;\n const idx = node.textContent!.indexOf(pattern);\n if (idx === -1) continue;\n matches.push(node);\n count++;\n if (count >= 10) break;\n }\n matches.forEach(node => {\n const range = document.createRange();\n const idx = node.textContent!.indexOf(pattern);\n range.setStart(node, idx);\n range.setEnd(node, idx + pattern.length);\n try {\n const mark = document.createElement('mark');\n mark.className = 'di-text-annotation';\n range.surroundContents(mark);\n } catch { /* no-op */ }\n });\n if (count > 0) {\n addSelection({\n ...createAnnotationMeta(),\n type: 'text-selection',\n selectedText: pattern,\n parentSelector: '',\n parentEl: matches[0]?.parentElement || undefined,\n note: note || '',\n });\n }\n return { found: count, pattern };\n}\n\nfunction togglePause(paused: boolean): unknown {\n if (paused && !state.animationsPaused) pauseAnimations();\n if (!paused && state.animationsPaused) resumeAnimations();\n return { animationsPaused: state.animationsPaused };\n}\n\n// ========== New Tools (Agentation pattern) ==========\nfunction getPending(_sessionId?: string): unknown {\n const pending = getPendingAnnotations();\n return {\n count: pending.length,\n annotations: pending.map(serializeAnnotation),\n };\n}\n\nfunction acknowledge(annotationId: string): unknown {\n const item = acknowledgeAnnotation(annotationId);\n if (!item) return { error: `Annotation not found or not pending: ${annotationId}` };\n return { success: true, annotation: serializeAnnotation(item) };\n}\n\nfunction resolve(annotationId: string, summary?: string): unknown {\n const item = resolveAnnotation(annotationId, summary);\n if (!item) return { error: `Annotation not found: ${annotationId}` };\n return { success: true, annotation: serializeAnnotation(item) };\n}\n\nfunction dismiss(annotationId: string, reason: string): unknown {\n if (!reason) return { error: 'reason is required' };\n const item = dismissAnnotation(annotationId, reason);\n if (!item) return { error: `Annotation not found: ${annotationId}` };\n return { success: true, annotation: serializeAnnotation(item) };\n}\n\nfunction reply(annotationId: string, message: string): unknown {\n if (!message) return { error: 'message is required' };\n const msg = addThreadMessage(annotationId, 'agent', message);\n if (!msg) return { error: `Annotation not found: ${annotationId}` };\n return { success: true, message: msg };\n}\n\nfunction watchAnnotations(batchWindowSeconds?: number, timeoutSeconds?: number): Promise<unknown> {\n const batchWindow = Math.min(batchWindowSeconds || 10, 60) * 1000;\n const timeout = Math.min(timeoutSeconds || 120, 300) * 1000;\n\n return new Promise((resolve) => {\n const collected: unknown[] = [];\n let batchTimer: ReturnType<typeof setTimeout> | null = null;\n\n const timeoutTimer = setTimeout(() => {\n cleanup();\n resolve({ timedOut: true, annotations: collected });\n }, timeout);\n\n function onSelection(items: unknown) {\n const pending = getPendingAnnotations();\n if (pending.length === 0) return;\n collected.push(...pending.map(serializeAnnotation));\n\n // Reset batch window\n if (batchTimer) clearTimeout(batchTimer);\n batchTimer = setTimeout(() => {\n cleanup();\n resolve({ timedOut: false, annotations: collected });\n }, batchWindow);\n }\n\n function cleanup() {\n bus.off('selectionChanged', onSelection);\n if (batchTimer) clearTimeout(batchTimer);\n clearTimeout(timeoutTimer);\n }\n\n bus.on('selectionChanged', onSelection);\n\n // Check if there are already pending annotations\n const existing = getPendingAnnotations();\n if (existing.length > 0) {\n collected.push(...existing.map(serializeAnnotation));\n batchTimer = setTimeout(() => {\n cleanup();\n resolve({ timedOut: false, annotations: collected });\n }, batchWindow);\n }\n });\n}\n\n// ========== New Tools (v2) ==========\n\nasync function inspectComponentTool(selector?: string, name?: string): Promise<unknown> {\n if (!selector && !name) return { error: 'Either selector or name is required' };\n\n const result = await inspectReactComponent(\n (selector || name) as string,\n !selector && !!name\n );\n\n if (!result) {\n return { error: 'No React component found. Ensure React is loaded and reactMode is enabled.' };\n }\n\n return {\n componentName: result.componentName,\n componentHierarchy: result.componentHierarchy,\n props: result.props,\n sourceFile: result.sourceFile || undefined,\n };\n}\n\nasync function findComponentsTool(root?: string): Promise<unknown> {\n const result = await scanReactComponents(root);\n\n if (!result) {\n return { error: 'No React components found. Ensure React is loaded and reactMode is enabled.' };\n }\n\n return {\n totalUnique: result.totalUnique,\n components: result.components,\n root: root || 'body',\n };\n}\n\nasync function capturePageTool(selector?: string, _fullPage?: boolean): Promise<unknown> {\n try {\n // npm \uD328\uD0A4\uC9C0: html2canvas\uAC00 \uB85C\uB4DC\uB418\uC5B4 \uC788\uC73C\uBA74 \uC0AC\uC6A9, \uC544\uB2C8\uBA74 \uC5D0\uB7EC \uBA54\uC2DC\uC9C0\n const html2canvas = (window as any).html2canvas;\n if (!html2canvas) {\n return {\n error: 'Screenshot requires html2canvas. Add <script src=\"https://cdn.jsdelivr.net/npm/html2canvas@1.4.1/dist/html2canvas.min.js\"></script> to your page.',\n };\n }\n\n const target = selector ? document.querySelector(selector) : document.body;\n if (!target) return { error: `Element not found: ${selector}` };\n\n const canvas = await html2canvas(target as HTMLElement, {\n useCORS: true,\n logging: false,\n scale: window.devicePixelRatio,\n });\n const dataUrl = canvas.toDataURL('image/png');\n const rect = (target as HTMLElement).getBoundingClientRect();\n\n return {\n success: true,\n dataUrl,\n selector: selector || 'viewport',\n dimensions: { width: Math.round(rect.width), height: Math.round(rect.height) },\n };\n } catch (err: any) {\n return { error: `Screenshot failed: ${err.message}` };\n }\n}\n\nfunction extractPageStructureTool(selector?: string, maxDepth?: number): unknown {\n const root = selector ? document.querySelector(selector) : document.body;\n if (!root) return { error: `Element not found: ${selector}` };\n\n const depth = Math.min(maxDepth || 5, 10);\n\n const headings: Array<{ level: number; text: string }> = [];\n const images: Array<{ alt: string; src: string; width: number; height: number }> = [];\n const buttons: Array<{ text: string; type?: string; selector: string }> = [];\n const links: Array<{ text: string; href: string }> = [];\n const inputs: Array<{ type: string; name: string; label: string; placeholder?: string }> = [];\n const layoutContainers: Array<{ selector: string; display: string; childCount: number }> = [];\n const colors = new Set<string>();\n const fonts = new Set<string>();\n\n function walk(el: Element, currentDepth: number): void {\n if (currentDepth > depth) return;\n if (isInspectorElement(el)) return;\n\n const tag = el.tagName.toLowerCase();\n const cs = window.getComputedStyle(el);\n\n // Headings\n if (/^h[1-6]$/.test(tag)) {\n headings.push({ level: parseInt(tag[1]), text: (el.textContent || '').trim().substring(0, 100) });\n }\n\n // Images\n if (tag === 'img') {\n const img = el as HTMLImageElement;\n images.push({\n alt: img.alt || '',\n src: img.src ? img.src.substring(0, 100) : '',\n width: img.naturalWidth || img.width,\n height: img.naturalHeight || img.height,\n });\n }\n\n // Buttons\n if (tag === 'button' || (tag === 'input' && (el as HTMLInputElement).type === 'submit')) {\n buttons.push({\n text: (el.textContent || (el as HTMLInputElement).value || '').trim().substring(0, 60),\n type: (el as HTMLButtonElement).type || undefined,\n selector: getSelector(el),\n });\n }\n\n // Links\n if (tag === 'a' && (el as HTMLAnchorElement).href) {\n links.push({\n text: (el.textContent || '').trim().substring(0, 60),\n href: (el as HTMLAnchorElement).href.substring(0, 100),\n });\n }\n\n // Form inputs\n if ((tag === 'input' || tag === 'textarea' || tag === 'select') && (el as HTMLInputElement).type !== 'submit') {\n const inp = el as HTMLInputElement;\n // Find label\n let label = '';\n if (inp.id) {\n const labelEl = document.querySelector(`label[for=\"${inp.id}\"]`);\n if (labelEl) label = (labelEl.textContent || '').trim().substring(0, 60);\n }\n if (!label) label = inp.getAttribute('aria-label') || '';\n inputs.push({\n type: inp.type || tag,\n name: inp.name || '',\n label,\n placeholder: inp.placeholder || undefined,\n });\n }\n\n // Layout containers (flex/grid)\n const display = cs.getPropertyValue('display');\n if (display === 'flex' || display === 'inline-flex' || display === 'grid' || display === 'inline-grid') {\n layoutContainers.push({\n selector: getSelector(el),\n display,\n childCount: el.children.length,\n });\n }\n\n // Colors\n const bgColor = cs.getPropertyValue('background-color');\n const textColor = cs.getPropertyValue('color');\n if (bgColor && bgColor !== 'rgba(0, 0, 0, 0)' && bgColor !== 'transparent') colors.add(bgColor);\n if (textColor) colors.add(textColor);\n\n // Fonts\n const fontFamily = cs.getPropertyValue('font-family');\n if (fontFamily) fonts.add(fontFamily.split(',')[0].trim().replace(/[\"']/g, ''));\n\n // Recurse children\n for (const child of Array.from(el.children)) {\n walk(child, currentDepth + 1);\n }\n }\n\n walk(root, 0);\n\n return {\n root: selector || 'body',\n headings: headings.slice(0, 30),\n images: images.slice(0, 20),\n buttons: buttons.slice(0, 20),\n links: links.slice(0, 30),\n inputs: inputs.slice(0, 20),\n layoutContainers: layoutContainers.slice(0, 20),\n colors: Array.from(colors).slice(0, 20),\n fonts: Array.from(fonts).slice(0, 10),\n };\n}\n\nfunction verifyElementTool(selector: string, expected: Record<string, unknown>): unknown {\n if (!selector) return { error: 'selector is required' };\n if (!expected || typeof expected !== 'object') return { error: 'expected is required and must be an object' };\n\n const el = document.querySelector(selector);\n if (!el) return { error: `Element not found: ${selector}` };\n\n const cs = window.getComputedStyle(el);\n const rect = el.getBoundingClientRect();\n const results: Array<{ property: string; expected: unknown; actual: unknown; pass: boolean }> = [];\n\n for (const [prop, expVal] of Object.entries(expected)) {\n if (expVal === undefined || expVal === null) continue;\n\n let actual: unknown;\n let pass = false;\n\n switch (prop) {\n case 'width':\n actual = Math.round(rect.width);\n pass = numClose(actual as number, expVal as number, 5);\n break;\n case 'height':\n actual = Math.round(rect.height);\n pass = numClose(actual as number, expVal as number, 5);\n break;\n case 'color':\n actual = cs.getPropertyValue('color');\n pass = colorMatch(actual as string, expVal as string);\n break;\n case 'fontSize':\n actual = cs.getPropertyValue('font-size');\n pass = numClose(parseFloat(actual as string), parseFloat(String(expVal)), 1);\n break;\n case 'display':\n actual = cs.getPropertyValue('display');\n pass = actual === expVal;\n break;\n case 'text':\n actual = (el.textContent || '').trim().substring(0, 200);\n pass = (actual as string).includes(String(expVal));\n break;\n case 'visible': {\n const isVisible = rect.width > 0 && rect.height > 0\n && cs.getPropertyValue('display') !== 'none'\n && cs.getPropertyValue('visibility') !== 'hidden'\n && cs.getPropertyValue('opacity') !== '0';\n actual = isVisible;\n pass = actual === expVal;\n break;\n }\n case 'position':\n actual = cs.getPropertyValue('position');\n pass = actual === expVal;\n break;\n default: {\n // Try as a generic CSS property\n actual = cs.getPropertyValue(prop);\n pass = actual === String(expVal);\n break;\n }\n }\n\n results.push({ property: prop, expected: expVal, actual, pass });\n }\n\n const allPass = results.every(r => r.pass);\n return { selector, allPass, results };\n}\n\nfunction numClose(actual: number, expected: number, tolerance: number): boolean {\n if (isNaN(actual) || isNaN(expected)) return false;\n return Math.abs(actual - expected) <= tolerance;\n}\n\nfunction colorMatch(actual: string, expected: string): boolean {\n // Normalize both to compare (simple lowercase comparison)\n return actual.replace(/\\s/g, '').toLowerCase() === expected.replace(/\\s/g, '').toLowerCase();\n}\n\nfunction checkResponsiveTool(selector: string, breakpoints?: number[]): unknown {\n if (!selector) return { error: 'selector is required' };\n\n const el = document.querySelector(selector);\n if (!el) return { error: `Element not found: ${selector}` };\n\n const bps = breakpoints || [375, 768, 1024, 1440];\n const cs = window.getComputedStyle(el);\n\n // Current state\n const currentWidth = window.innerWidth;\n const currentState = {\n width: Math.round(el.getBoundingClientRect().width),\n height: Math.round(el.getBoundingClientRect().height),\n display: cs.getPropertyValue('display'),\n fontSize: cs.getPropertyValue('font-size'),\n visibility: cs.getPropertyValue('visibility'),\n position: cs.getPropertyValue('position'),\n };\n\n // Parse stylesheets for media queries affecting this element\n const mediaRules: Array<{ query: string; properties: string[] }> = [];\n try {\n for (const sheet of Array.from(document.styleSheets)) {\n try {\n const rules = sheet.cssRules || sheet.rules;\n if (!rules) continue;\n for (const rule of Array.from(rules)) {\n if (rule instanceof CSSMediaRule) {\n // Check if any rule inside targets our element\n const matchingProps: string[] = [];\n for (const innerRule of Array.from(rule.cssRules)) {\n if (innerRule instanceof CSSStyleRule) {\n try {\n if (el.matches(innerRule.selectorText)) {\n for (const prop of Array.from(innerRule.style)) {\n matchingProps.push(`${prop}: ${innerRule.style.getPropertyValue(prop)}`);\n }\n }\n } catch { /* invalid selector */ }\n }\n }\n if (matchingProps.length > 0) {\n mediaRules.push({\n query: rule.conditionText || rule.media.mediaText,\n properties: matchingProps.slice(0, 10),\n });\n }\n }\n }\n } catch { /* cross-origin stylesheet */ }\n }\n } catch { /* stylesheet access error */ }\n\n // Determine which breakpoints each media query applies to\n const breakpointAnalysis: Array<{ breakpoint: number; matchingQueries: string[]; predictedChanges: string[] }> = [];\n for (const bp of bps) {\n const matching: string[] = [];\n const changes: string[] = [];\n for (const mr of mediaRules) {\n // Simple heuristic: parse min-width/max-width from query\n const minMatch = mr.query.match(/min-width:\\s*(\\d+)px/);\n const maxMatch = mr.query.match(/max-width:\\s*(\\d+)px/);\n let applies = false;\n if (minMatch && maxMatch) {\n applies = bp >= parseInt(minMatch[1]) && bp <= parseInt(maxMatch[1]);\n } else if (minMatch) {\n applies = bp >= parseInt(minMatch[1]);\n } else if (maxMatch) {\n applies = bp <= parseInt(maxMatch[1]);\n }\n if (applies) {\n matching.push(mr.query);\n changes.push(...mr.properties);\n }\n }\n breakpointAnalysis.push({ breakpoint: bp, matchingQueries: matching, predictedChanges: changes.slice(0, 10) });\n }\n\n return {\n selector,\n currentViewportWidth: currentWidth,\n currentState,\n breakpoints: breakpointAnalysis,\n mediaQueriesFound: mediaRules.length,\n mediaRules: mediaRules.slice(0, 15),\n };\n}\n\n// ========== Tier 1 Tools ==========\n\n// --- Color / contrast helpers ---\nfunction parseColor(colorStr: string): [number, number, number, number] | null {\n const s = colorStr.trim();\n let m: RegExpMatchArray | null;\n m = s.match(/^rgba?\\(\\s*([\\d.]+)\\s*,\\s*([\\d.]+)\\s*,\\s*([\\d.]+)\\s*(?:,\\s*([\\d.]+))?\\s*\\)$/);\n if (m) return [parseFloat(m[1]), parseFloat(m[2]), parseFloat(m[3]), m[4] !== undefined ? parseFloat(m[4]) : 1];\n m = s.match(/^rgb\\(\\s*([\\d.]+)\\s+([\\d.]+)\\s+([\\d.]+)\\s*(?:\\/\\s*([\\d.%]+))?\\s*\\)$/);\n if (m) {\n const a = m[4] ? (m[4].endsWith('%') ? parseFloat(m[4]) / 100 : parseFloat(m[4])) : 1;\n return [parseFloat(m[1]), parseFloat(m[2]), parseFloat(m[3]), a];\n }\n return null;\n}\n\nfunction blendColors(fg: [number, number, number, number], bg: [number, number, number, number]): [number, number, number, number] {\n const a = fg[3] + bg[3] * (1 - fg[3]);\n if (a === 0) return [0, 0, 0, 0];\n return [\n (fg[0] * fg[3] + bg[0] * bg[3] * (1 - fg[3])) / a,\n (fg[1] * fg[3] + bg[1] * bg[3] * (1 - fg[3])) / a,\n (fg[2] * fg[3] + bg[2] * bg[3] * (1 - fg[3])) / a,\n a,\n ];\n}\n\nfunction linearize(c: number): number {\n const s = c / 255;\n return s <= 0.03928 ? s / 12.92 : Math.pow((s + 0.055) / 1.055, 2.4);\n}\n\nfunction relativeLuminance(r: number, g: number, b: number): number {\n return 0.2126 * linearize(r) + 0.7152 * linearize(g) + 0.0722 * linearize(b);\n}\n\nfunction contrastRatio(l1: number, l2: number): number {\n const lighter = Math.max(l1, l2);\n const darker = Math.min(l1, l2);\n return (lighter + 0.05) / (darker + 0.05);\n}\n\nfunction getEffectiveBackground(el: Element): [number, number, number, number] {\n let current: Element | null = el;\n const layers: Array<[number, number, number, number]> = [];\n while (current) {\n if (isInspectorElement(current)) { current = current.parentElement; continue; }\n const cs = window.getComputedStyle(current);\n const bg = parseColor(cs.backgroundColor);\n if (bg && bg[3] > 0) layers.unshift(bg);\n if (bg && bg[3] >= 1) break; // opaque \u2014 no need to go further\n current = current.parentElement;\n }\n // If we didn't hit an opaque background, assume white\n let result: [number, number, number, number] = [255, 255, 255, 1];\n for (const layer of layers) {\n result = blendColors(layer, result);\n }\n return result;\n}\n\nfunction isLargeText(fontSize: string, fontWeight: string): boolean {\n const size = parseFloat(fontSize);\n const weight = parseInt(fontWeight) || (fontWeight === 'bold' ? 700 : 400);\n return size >= 18 || (size >= 14 && weight >= 700);\n}\n\nfunction getVisibleTextElements(root: Element, limit: number): Element[] {\n const results: Element[] = [];\n const walker = document.createTreeWalker(root, NodeFilter.SHOW_ELEMENT, {\n acceptNode(node) {\n if (isInspectorElement(node as Element)) return NodeFilter.FILTER_REJECT;\n return NodeFilter.FILTER_ACCEPT;\n },\n });\n let node: Node | null = walker.currentNode;\n while (node && results.length < limit) {\n const el = node as Element;\n if (el.childNodes.length > 0) {\n for (const child of Array.from(el.childNodes)) {\n if (child.nodeType === Node.TEXT_NODE && child.textContent && child.textContent.trim().length > 0) {\n const cs = window.getComputedStyle(el);\n if (cs.display !== 'none' && cs.visibility !== 'hidden') {\n results.push(el);\n }\n break;\n }\n }\n }\n node = walker.nextNode();\n }\n return results;\n}\n\nfunction checkElementContrast(el: Element): {\n selector: string; text: string; foreground: string; background: string;\n ratio: number; fontSize: string; fontWeight: string; isLargeText: boolean;\n passAA: boolean; passAAA: boolean;\n} {\n const cs = window.getComputedStyle(el);\n const fgColor = parseColor(cs.color) || [0, 0, 0, 1];\n const bgColor = getEffectiveBackground(el);\n // Blend foreground alpha onto background\n const blended = blendColors(fgColor, bgColor);\n const fgLum = relativeLuminance(blended[0], blended[1], blended[2]);\n const bgLum = relativeLuminance(bgColor[0], bgColor[1], bgColor[2]);\n const ratio = contrastRatio(fgLum, bgLum);\n const large = isLargeText(cs.fontSize, cs.fontWeight);\n return {\n selector: getSelector(el),\n text: (el.textContent || '').trim().substring(0, 80),\n foreground: cs.color,\n background: `rgb(${Math.round(bgColor[0])}, ${Math.round(bgColor[1])}, ${Math.round(bgColor[2])})`,\n ratio: Math.round(ratio * 100) / 100,\n fontSize: cs.fontSize,\n fontWeight: cs.fontWeight,\n isLargeText: large,\n passAA: large ? ratio >= 3 : ratio >= 4.5,\n passAAA: large ? ratio >= 4.5 : ratio >= 7,\n };\n}\n\n// --- audit_accessibility ---\ninterface A11yViolation {\n rule: string;\n severity: 'critical' | 'serious' | 'moderate' | 'minor';\n selector: string;\n message: string;\n fix: string;\n}\n\nfunction checkAltText(root: Element): { violations: A11yViolation[]; checked: number } {\n const imgs = root.querySelectorAll('img');\n const violations: A11yViolation[] = [];\n let checked = 0;\n imgs.forEach(img => {\n if (isInspectorElement(img)) return;\n checked++;\n if (!img.hasAttribute('alt')) {\n violations.push({ rule: 'alt-text', severity: 'critical', selector: getSelector(img), message: 'Image missing alt attribute', fix: 'Add alt=\"\" for decorative images or descriptive alt text' });\n } else if (img.alt === '' && img.getAttribute('role') !== 'presentation' && !img.hasAttribute('aria-hidden')) {\n // Empty alt without role=presentation is fine if intentional, skip\n }\n });\n return { violations, checked };\n}\n\nfunction checkFormLabels(root: Element): { violations: A11yViolation[]; checked: number } {\n const inputs = root.querySelectorAll('input:not([type=\"hidden\"]):not([type=\"submit\"]):not([type=\"button\"]):not([type=\"reset\"]), textarea, select');\n const violations: A11yViolation[] = [];\n let checked = 0;\n inputs.forEach(inp => {\n if (isInspectorElement(inp)) return;\n checked++;\n const hasLabel = inp.id && root.querySelector(`label[for=\"${inp.id}\"]`);\n const hasAriaLabel = inp.hasAttribute('aria-label') || inp.hasAttribute('aria-labelledby');\n const hasTitle = inp.hasAttribute('title');\n const wrappedInLabel = inp.closest('label');\n if (!hasLabel && !hasAriaLabel && !hasTitle && !wrappedInLabel) {\n violations.push({ rule: 'form-labels', severity: 'critical', selector: getSelector(inp), message: 'Form input missing associated label', fix: 'Add a <label for=\"id\">, aria-label, or aria-labelledby attribute' });\n }\n });\n return { violations, checked };\n}\n\nfunction checkEmptyInteractive(root: Element): { violations: A11yViolation[]; checked: number } {\n const violations: A11yViolation[] = [];\n let checked = 0;\n root.querySelectorAll('button, a[href], [role=\"button\"]').forEach(el => {\n if (isInspectorElement(el)) return;\n checked++;\n const text = (el.textContent || '').trim();\n const ariaLabel = el.getAttribute('aria-label') || '';\n const ariaLabelledby = el.getAttribute('aria-labelledby');\n const title = el.getAttribute('title') || '';\n const hasImg = el.querySelector('img[alt]') || el.querySelector('svg[aria-label]');\n if (!text && !ariaLabel && !ariaLabelledby && !title && !hasImg) {\n const tag = el.tagName.toLowerCase();\n violations.push({\n rule: 'empty-interactive',\n severity: 'serious',\n selector: getSelector(el),\n message: `${tag === 'a' ? 'Link' : 'Button'} has no accessible text`,\n fix: 'Add text content, aria-label, or title attribute',\n });\n }\n });\n return { violations, checked };\n}\n\nfunction checkContrastAudit(root: Element): { violations: A11yViolation[]; checked: number } {\n const violations: A11yViolation[] = [];\n const elements = getVisibleTextElements(root, 50);\n for (const el of elements) {\n const result = checkElementContrast(el);\n if (!result.passAA) {\n violations.push({\n rule: 'contrast',\n severity: result.ratio < 3 ? 'critical' : 'serious',\n selector: result.selector,\n message: `Contrast ratio ${result.ratio}:1 fails AA (needs ${result.isLargeText ? '3:1' : '4.5:1'} for ${result.isLargeText ? 'large' : 'normal'} text)`,\n fix: 'Increase contrast between text color and background color',\n });\n }\n }\n return { violations, checked: elements.length };\n}\n\nfunction checkLangAttribute(): { violations: A11yViolation[]; checked: number } {\n const violations: A11yViolation[] = [];\n const html = document.documentElement;\n if (!html.hasAttribute('lang') || !html.getAttribute('lang')?.trim()) {\n violations.push({ rule: 'html-lang', severity: 'serious', selector: 'html', message: 'Missing lang attribute on <html> element', fix: 'Add lang=\"en\" (or appropriate language code) to the <html> element' });\n }\n return { violations, checked: 1 };\n}\n\nfunction checkHeadingHierarchy(root: Element): { violations: A11yViolation[]; checked: number } {\n const violations: A11yViolation[] = [];\n const headings = root.querySelectorAll('h1, h2, h3, h4, h5, h6');\n let checked = 0;\n let prevLevel = 0;\n let hasH1 = false;\n headings.forEach(h => {\n if (isInspectorElement(h)) return;\n checked++;\n const level = parseInt(h.tagName[1]);\n if (level === 1) hasH1 = true;\n if (prevLevel > 0 && level > prevLevel + 1) {\n violations.push({ rule: 'heading-hierarchy', severity: 'moderate', selector: getSelector(h), message: `Heading level skipped: h${prevLevel} \u2192 h${level}`, fix: `Use h${prevLevel + 1} instead, or add missing intermediate headings` });\n }\n prevLevel = level;\n });\n if (checked > 0 && !hasH1) {\n violations.push({ rule: 'heading-hierarchy', severity: 'moderate', selector: 'body', message: 'Page has headings but no h1 element', fix: 'Add an h1 element as the primary heading' });\n }\n return { violations, checked: Math.max(checked, 1) };\n}\n\nfunction checkLandmarks(root: Element): { violations: A11yViolation[]; checked: number } {\n const violations: A11yViolation[] = [];\n const hasMain = !!root.querySelector('main, [role=\"main\"]');\n const hasNav = !!root.querySelector('nav, [role=\"navigation\"]');\n if (!hasMain) {\n violations.push({ rule: 'landmarks', severity: 'moderate', selector: 'body', message: 'No main landmark found', fix: 'Use <main> or role=\"main\" to identify the primary content area' });\n }\n if (!hasNav) {\n violations.push({ rule: 'landmarks', severity: 'minor', selector: 'body', message: 'No navigation landmark found', fix: 'Use <nav> or role=\"navigation\" for navigation sections' });\n }\n return { violations, checked: 2 };\n}\n\nfunction checkAccessibleNames(root: Element): { violations: A11yViolation[]; checked: number } {\n const violations: A11yViolation[] = [];\n let checked = 0;\n root.querySelectorAll('input[type=\"image\"], area, [role=\"img\"]').forEach(el => {\n if (isInspectorElement(el)) return;\n checked++;\n const name = el.getAttribute('alt') || el.getAttribute('aria-label') || el.getAttribute('aria-labelledby') || el.getAttribute('title');\n if (!name) {\n violations.push({ rule: 'accessible-name', severity: 'serious', selector: getSelector(el), message: `${el.tagName.toLowerCase()} missing accessible name`, fix: 'Add alt, aria-label, or title attribute' });\n }\n });\n return { violations, checked };\n}\n\nfunction checkAriaAttributes(root: Element): { violations: A11yViolation[]; checked: number } {\n const violations: A11yViolation[] = [];\n let checked = 0;\n const validRoles = new Set(['alert','alertdialog','application','article','banner','button','cell','checkbox','columnheader','combobox','complementary','contentinfo','definition','dialog','directory','document','feed','figure','form','grid','gridcell','group','heading','img','link','list','listbox','listitem','log','main','marquee','math','menu','menubar','menuitem','menuitemcheckbox','menuitemradio','navigation','none','note','option','presentation','progressbar','radio','radiogroup','region','row','rowgroup','rowheader','scrollbar','search','searchbox','separator','slider','spinbutton','status','switch','tab','table','tablist','tabpanel','term','textbox','timer','toolbar','tooltip','tree','treegrid','treeitem']);\n root.querySelectorAll('[role]').forEach(el => {\n if (isInspectorElement(el)) return;\n checked++;\n const role = el.getAttribute('role') || '';\n if (role && !validRoles.has(role)) {\n violations.push({ rule: 'aria-roles', severity: 'serious', selector: getSelector(el), message: `Invalid ARIA role: \"${role}\"`, fix: 'Use a valid WAI-ARIA role' });\n }\n });\n // Check aria-required-* patterns\n root.querySelectorAll('[role=\"checkbox\"]:not([aria-checked]), [role=\"radio\"]:not([aria-checked]), [role=\"switch\"]:not([aria-checked])').forEach(el => {\n if (isInspectorElement(el)) return;\n checked++;\n const role = el.getAttribute('role');\n violations.push({ rule: 'aria-required-attr', severity: 'critical', selector: getSelector(el), message: `role=\"${role}\" requires aria-checked attribute`, fix: `Add aria-checked=\"true\" or aria-checked=\"false\"` });\n });\n root.querySelectorAll('[role=\"combobox\"]:not([aria-expanded]), [role=\"slider\"]:not([aria-valuenow])').forEach(el => {\n if (isInspectorElement(el)) return;\n checked++;\n const role = el.getAttribute('role');\n const missing = role === 'combobox' ? 'aria-expanded' : 'aria-valuenow';\n violations.push({ rule: 'aria-required-attr', severity: 'critical', selector: getSelector(el), message: `role=\"${role}\" requires ${missing} attribute`, fix: `Add the ${missing} attribute` });\n });\n return { violations, checked };\n}\n\nfunction checkTabindex(root: Element): { violations: A11yViolation[]; checked: number } {\n const violations: A11yViolation[] = [];\n let checked = 0;\n root.querySelectorAll('[tabindex]').forEach(el => {\n if (isInspectorElement(el)) return;\n checked++;\n const val = parseInt(el.getAttribute('tabindex') || '0');\n if (val > 0) {\n violations.push({ rule: 'tabindex', severity: 'moderate', selector: getSelector(el), message: `tabindex=\"${val}\" is an anti-pattern that disrupts natural tab order`, fix: 'Use tabindex=\"0\" to add to natural tab order, or tabindex=\"-1\" for programmatic focus only' });\n }\n });\n return { violations, checked };\n}\n\nfunction auditAccessibilityTool(selector?: string, rules?: string[]): unknown {\n const root = selector ? document.querySelector(selector) : document.documentElement;\n if (!root) return { error: `Element not found: ${selector}` };\n\n const allChecks: Record<string, (root: Element) => { violations: A11yViolation[]; checked: number }> = {\n 'alt-text': checkAltText,\n 'form-labels': checkFormLabels,\n 'empty-interactive': checkEmptyInteractive,\n 'contrast': checkContrastAudit,\n 'html-lang': () => checkLangAttribute(),\n 'heading-hierarchy': checkHeadingHierarchy,\n 'landmarks': checkLandmarks,\n 'accessible-name': checkAccessibleNames,\n 'aria': checkAriaAttributes,\n 'tabindex': checkTabindex,\n };\n\n const checksToRun = rules && rules.length > 0\n ? Object.entries(allChecks).filter(([key]) => rules.includes(key))\n : Object.entries(allChecks);\n\n const violations: A11yViolation[] = [];\n let passes = 0;\n let totalChecked = 0;\n\n for (const [, checkFn] of checksToRun) {\n const result = checkFn(root);\n violations.push(...result.violations);\n totalChecked += result.checked;\n }\n\n passes = totalChecked - violations.length;\n if (passes < 0) passes = 0;\n\n return { violations, passes, totalChecked };\n}\n\n// --- check_contrast ---\nfunction checkContrastTool(selector?: string, selectors?: string[]): unknown {\n const results: ReturnType<typeof checkElementContrast>[] = [];\n\n if (selectors && selectors.length > 0) {\n for (const sel of selectors) {\n const el = document.querySelector(sel);\n if (el) results.push(checkElementContrast(el));\n }\n } else if (selector) {\n const el = document.querySelector(selector);\n if (!el) return { error: `Element not found: ${selector}` };\n results.push(checkElementContrast(el));\n } else {\n // Check all visible text elements, limit 50\n const elements = getVisibleTextElements(document.body, 50);\n for (const el of elements) {\n results.push(checkElementContrast(el));\n }\n }\n\n return { results };\n}\n\n// --- inspect_css_rules ---\nfunction computeSpecificity(selectorText: string): [number, number, number] {\n // Estimate specificity: [ids, classes+attrs+pseudoClasses, elements+pseudoElements]\n const s = selectorText.replace(/:not\\(([^)]*)\\)/g, '$1').replace(/:is\\(([^)]*)\\)/g, '$1');\n const ids = (s.match(/#[a-zA-Z_-][\\w-]*/g) || []).length;\n const classes = (s.match(/\\.[a-zA-Z_-][\\w-]*/g) || []).length\n + (s.match(/\\[[^\\]]+\\]/g) || []).length\n + (s.match(/:(hover|focus|active|visited|first-child|last-child|nth-child|nth-of-type|focus-within|focus-visible|checked|disabled|enabled|required|optional|valid|invalid|placeholder-shown|empty|not|is|where|has|any-link|link|target|root|first-of-type|last-of-type|only-child|only-of-type|read-only|read-write|lang|dir)/g) || []).length;\n const elements = (s.match(/(^|[\\s+>~])([a-zA-Z][a-zA-Z0-9]*)/g) || []).length\n + (s.match(/::(before|after|first-line|first-letter|placeholder|selection|marker|backdrop)/g) || []).length;\n return [ids, classes, elements];\n}\n\nfunction specificityToNumber(s: [number, number, number]): number {\n return s[0] * 10000 + s[1] * 100 + s[2];\n}\n\nfunction extractRulesFromCSSRuleList(\n rules: CSSRuleList,\n el: Element,\n source: string,\n pseudo: string | undefined,\n matched: Array<{ source: string; selectorText: string; specificity: string; specificityValue: number; properties: Record<string, string> }>,\n pseudoRules: Array<{ source: string; selectorText: string; properties: Record<string, string> }>,\n): void {\n for (const rule of Array.from(rules)) {\n if (rule instanceof CSSMediaRule) {\n // Check if media applies\n if (window.matchMedia(rule.conditionText || rule.media.mediaText).matches) {\n extractRulesFromCSSRuleList(rule.cssRules, el, source, pseudo, matched, pseudoRules);\n }\n } else if (rule instanceof CSSSupportsRule) {\n if (CSS.supports(rule.conditionText)) {\n extractRulesFromCSSRuleList(rule.cssRules, el, source, pseudo, matched, pseudoRules);\n }\n } else if (rule instanceof CSSStyleRule) {\n const selText = rule.selectorText;\n // Check for pseudo-element rules\n if (pseudo && selText.includes(pseudo)) {\n const baseSel = selText.replace(new RegExp(`\\\\s*${pseudo.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')}\\\\s*`, 'g'), '').trim();\n try {\n if (baseSel && el.matches(baseSel)) {\n const props: Record<string, string> = {};\n for (const prop of Array.from(rule.style)) {\n props[prop] = rule.style.getPropertyValue(prop);\n }\n if (Object.keys(props).length > 0) {\n pseudoRules.push({ source, selectorText: selText, properties: props });\n }\n }\n } catch { /* invalid selector */ }\n }\n // Check main element match (skip pseudo-element selectors)\n if (!selText.includes('::')) {\n try {\n if (el.matches(selText)) {\n const props: Record<string, string> = {};\n for (const prop of Array.from(rule.style)) {\n props[prop] = rule.style.getPropertyValue(prop);\n }\n if (Object.keys(props).length > 0) {\n const spec = computeSpecificity(selText);\n matched.push({\n source,\n selectorText: selText,\n specificity: `(${spec[0]},${spec[1]},${spec[2]})`,\n specificityValue: specificityToNumber(spec),\n properties: props,\n });\n }\n }\n } catch { /* invalid selector */ }\n }\n }\n }\n}\n\nfunction inspectCssRulesTool(selector: string, pseudo?: string): unknown {\n if (!selector) return { error: 'selector is required' };\n const el = document.querySelector(selector);\n if (!el) return { error: `Element not found: ${selector}` };\n\n const matched: Array<{ source: string; selectorText: string; specificity: string; specificityValue: number; properties: Record<string, string> }> = [];\n const pseudoRules: Array<{ source: string; selectorText: string; properties: Record<string, string> }> = [];\n const crossOriginSkipped: string[] = [];\n\n for (let i = 0; i < document.styleSheets.length; i++) {\n const sheet = document.styleSheets[i];\n const source = sheet.href || `<style> #${i}`;\n try {\n const rules = sheet.cssRules || sheet.rules;\n if (!rules) continue;\n extractRulesFromCSSRuleList(rules, el, source, pseudo, matched, pseudoRules);\n } catch {\n crossOriginSkipped.push(source);\n }\n }\n\n // Sort by specificity descending\n matched.sort((a, b) => b.specificityValue - a.specificityValue);\n\n // Inline styles\n const inlineStyles: Record<string, string> = {};\n const htmlEl = el as HTMLElement;\n if (htmlEl.style && htmlEl.style.length > 0) {\n for (const prop of Array.from(htmlEl.style)) {\n inlineStyles[prop] = htmlEl.style.getPropertyValue(prop);\n }\n }\n\n const result: Record<string, unknown> = {\n element: `${el.tagName.toLowerCase()}${el.id ? '#' + el.id : ''}${el.className && typeof el.className === 'string' ? '.' + el.className.trim().split(/\\s+/).join('.') : ''}`,\n matchingRules: matched.map(({ specificityValue: _, ...rest }) => rest),\n inlineStyles,\n };\n\n if (pseudo) {\n result.pseudoRules = pseudoRules;\n }\n\n if (crossOriginSkipped.length > 0) {\n result.crossOriginSkipped = crossOriginSkipped;\n }\n\n return result;\n}\n\n// --- capture_labeled ---\nasync function captureLabeledTool(selector?: string, labelTypes?: string[]): Promise<unknown> {\n try {\n const types = labelTypes || ['button', 'a', 'input', 'select', 'textarea', '[role=\"button\"]', '[tabindex]'];\n const scopeEl = selector ? document.querySelector(selector) : document.body;\n if (!scopeEl) return { error: `Element not found: ${selector}` };\n\n const combinedSelector = types.join(', ');\n const elements = scopeEl.querySelectorAll(combinedSelector);\n const labels: Array<{\n index: number; selector: string; tagName: string;\n text: string; role: string | null; boundingBox: { x: number; y: number; width: number; height: number };\n }> = [];\n const overlayDivs: HTMLElement[] = [];\n\n let idx = 1;\n elements.forEach(el => {\n if (isInspectorElement(el)) return;\n const rect = el.getBoundingClientRect();\n // Skip elements not in viewport or zero-size\n if (rect.width === 0 || rect.height === 0) return;\n if (rect.bottom < 0 || rect.top > window.innerHeight || rect.right < 0 || rect.left > window.innerWidth) return;\n // Skip hidden elements\n const cs = window.getComputedStyle(el);\n if (cs.display === 'none' || cs.visibility === 'hidden' || cs.opacity === '0') return;\n\n const label = document.createElement('div');\n label.textContent = String(idx);\n label.setAttribute('data-di-label', 'true');\n label.style.cssText = `\n position: fixed !important;\n left: ${rect.left}px !important;\n top: ${rect.top}px !important;\n width: 18px !important;\n height: 18px !important;\n border-radius: 50% !important;\n background: #7c8cf5 !important;\n color: white !important;\n font-size: 10px !important;\n font-weight: bold !important;\n display: flex !important;\n align-items: center !important;\n justify-content: center !important;\n z-index: 2147483647 !important;\n pointer-events: none !important;\n line-height: 1 !important;\n font-family: Arial, sans-serif !important;\n box-shadow: 0 1px 3px rgba(0,0,0,0.3) !important;\n `;\n document.body.appendChild(label);\n overlayDivs.push(label);\n\n labels.push({\n index: idx,\n selector: getSelector(el),\n tagName: el.tagName.toLowerCase(),\n text: (el.textContent || (el as HTMLInputElement).value || el.getAttribute('aria-label') || '').trim().substring(0, 80),\n role: el.getAttribute('role'),\n boundingBox: {\n x: Math.round(rect.x),\n y: Math.round(rect.y),\n width: Math.round(rect.width),\n height: Math.round(rect.height),\n },\n });\n\n idx++;\n });\n\n // Take screenshot via html2canvas\n let dataUrl = '';\n try {\n const html2canvas = (window as any).html2canvas;\n if (html2canvas) {\n const canvas = await html2canvas(document.body, {\n useCORS: true,\n logging: false,\n scale: window.devicePixelRatio,\n });\n dataUrl = canvas.toDataURL('image/png');\n }\n } catch (err: any) {\n // Clean up before returning error\n overlayDivs.forEach(d => d.remove());\n return { error: `Screenshot failed: ${err.message}` };\n }\n\n // Clean up overlays\n overlayDivs.forEach(d => d.remove());\n\n if (!dataUrl) {\n return { error: 'Screenshot capture failed' };\n }\n\n return {\n dataUrl,\n labels,\n dimensions: { width: window.innerWidth, height: window.innerHeight },\n };\n } catch (err: any) {\n return { error: `capture_labeled failed: ${err.message}` };\n }\n}\n\n// ========== Tier 2 Tools ==========\n\n// --- Tailwind mapping lookups ---\nconst TW_SPACING: Record<string, string> = {\n '0px': '0', '1px': 'px', '2px': '0.5', '4px': '1', '6px': '1.5', '8px': '2', '10px': '2.5',\n '12px': '3', '14px': '3.5', '16px': '4', '20px': '5', '24px': '6', '28px': '7', '32px': '8',\n '36px': '9', '40px': '10', '44px': '11', '48px': '12', '56px': '14', '64px': '16',\n '72px': '18', '80px': '20', '96px': '24',\n};\n\nconst TW_FONT_SIZE: Record<string, string> = {\n '12px': 'text-xs', '14px': 'text-sm', '16px': 'text-base', '18px': 'text-lg',\n '20px': 'text-xl', '24px': 'text-2xl', '30px': 'text-3xl', '36px': 'text-4xl',\n '48px': 'text-5xl', '60px': 'text-6xl', '72px': 'text-7xl', '96px': 'text-8xl', '128px': 'text-9xl',\n};\n\nconst TW_BORDER_RADIUS: Record<string, string> = {\n '0px': 'rounded-none', '2px': 'rounded-sm', '4px': 'rounded', '6px': 'rounded-md',\n '8px': 'rounded-lg', '12px': 'rounded-xl', '16px': 'rounded-2xl', '24px': 'rounded-3xl',\n '9999px': 'rounded-full',\n};\n\nconst TW_FONT_WEIGHT: Record<string, string> = {\n '100': 'font-thin', '200': 'font-extralight', '300': 'font-light', '400': 'font-normal',\n '500': 'font-medium', '600': 'font-semibold', '700': 'font-bold', '800': 'font-extrabold', '900': 'font-black',\n};\n\nconst TW_LINE_HEIGHT: Record<string, string> = {\n '1': 'leading-none', '1.25': 'leading-tight', '1.375': 'leading-snug',\n '1.5': 'leading-normal', '1.625': 'leading-relaxed', '2': 'leading-loose',\n};\n\nfunction rgbToHex(r: number, g: number, b: number): string {\n return '#' + [r, g, b].map(c => Math.round(c).toString(16).padStart(2, '0')).join('');\n}\n\nfunction nearestTwSpacing(value: string, prefix: string): string | undefined {\n const tw = TW_SPACING[value];\n if (tw) return `${prefix}-${tw}`;\n return undefined;\n}\n\nfunction nearestTwColor(hex: string): string | undefined {\n // Common Tailwind color mappings\n const TW_COLORS: Record<string, string> = {\n '#000000': 'black', '#ffffff': 'white', '#f9fafb': 'gray-50', '#f3f4f6': 'gray-100',\n '#e5e7eb': 'gray-200', '#d1d5db': 'gray-300', '#9ca3af': 'gray-400', '#6b7280': 'gray-500',\n '#4b5563': 'gray-600', '#374151': 'gray-700', '#1f2937': 'gray-800', '#111827': 'gray-900',\n '#030712': 'gray-950', '#ef4444': 'red-500', '#f97316': 'orange-500', '#eab308': 'yellow-500',\n '#22c55e': 'green-500', '#3b82f6': 'blue-500', '#6366f1': 'indigo-500', '#8b5cf6': 'violet-500',\n '#a855f7': 'purple-500', '#ec4899': 'pink-500',\n };\n return TW_COLORS[hex.toLowerCase()];\n}\n\nfunction extractDesignTokensTool(selector?: string): unknown {\n const root = selector ? document.querySelector(selector) : document.body;\n if (!root) return { error: `Element not found: ${selector}` };\n\n const colorMap = new Map<string, number>();\n const spacingMap = new Map<string, number>();\n const typographyMap = new Map<string, { fontFamily: string; fontSize: string; fontWeight: string; lineHeight: string; count: number }>();\n const borderRadiusMap = new Map<string, number>();\n const shadowMap = new Map<string, number>();\n\n const walker = document.createTreeWalker(root, NodeFilter.SHOW_ELEMENT, {\n acceptNode(node) {\n if (isInspectorElement(node as Element)) return NodeFilter.FILTER_REJECT;\n return NodeFilter.FILTER_ACCEPT;\n },\n });\n\n let visited = 0;\n const MAX_ELEMENTS = 500;\n let node: Node | null = walker.currentNode;\n\n while (node && visited < MAX_ELEMENTS) {\n const el = node as Element;\n const cs = window.getComputedStyle(el);\n\n // Colors\n const bgColor = cs.backgroundColor;\n const textColor = cs.color;\n const borderColor = cs.borderColor;\n for (const c of [bgColor, textColor, borderColor]) {\n if (c && c !== 'rgba(0, 0, 0, 0)' && c !== 'transparent') {\n colorMap.set(c, (colorMap.get(c) || 0) + 1);\n }\n }\n\n // Spacing (margin and padding individual sides)\n for (const prop of ['margin-top', 'margin-right', 'margin-bottom', 'margin-left', 'padding-top', 'padding-right', 'padding-bottom', 'padding-left']) {\n const val = cs.getPropertyValue(prop);\n if (val && val !== '0px') {\n spacingMap.set(val, (spacingMap.get(val) || 0) + 1);\n }\n }\n\n // Typography\n const fontFamily = cs.fontFamily.split(',')[0].trim().replace(/[\"']/g, '');\n const fontSize = cs.fontSize;\n const fontWeight = cs.fontWeight;\n const lineHeight = cs.lineHeight;\n const typoKey = `${fontFamily}|${fontSize}|${fontWeight}|${lineHeight}`;\n const existing = typographyMap.get(typoKey);\n if (existing) {\n existing.count++;\n } else {\n typographyMap.set(typoKey, { fontFamily, fontSize, fontWeight, lineHeight, count: 1 });\n }\n\n // Border radius\n const br = cs.borderRadius;\n if (br && br !== '0px') {\n borderRadiusMap.set(br, (borderRadiusMap.get(br) || 0) + 1);\n }\n\n // Shadows\n const shadow = cs.boxShadow;\n if (shadow && shadow !== 'none') {\n shadowMap.set(shadow, (shadowMap.get(shadow) || 0) + 1);\n }\n\n node = walker.nextNode();\n visited++;\n }\n\n // Build results\n const colors = Array.from(colorMap.entries())\n .sort((a, b) => b[1] - a[1])\n .slice(0, 30)\n .map(([value, count]) => {\n const parsed = parseColor(value);\n const hex = parsed ? rgbToHex(parsed[0], parsed[1], parsed[2]) : value;\n const twColor = nearestTwColor(hex);\n return { value, hex, count, tailwind: twColor || undefined };\n });\n\n const spacing = Array.from(spacingMap.entries())\n .sort((a, b) => parseFloat(a[0]) - parseFloat(b[0]))\n .slice(0, 20)\n .map(([value, count]) => {\n const scale = Math.round(parseFloat(value) / 4);\n return { value, scale, count, tailwind: TW_SPACING[value] || undefined };\n });\n\n const typography = Array.from(typographyMap.values())\n .sort((a, b) => b.count - a.count)\n .slice(0, 15)\n .map(t => {\n const twParts: string[] = [];\n if (TW_FONT_SIZE[t.fontSize]) twParts.push(TW_FONT_SIZE[t.fontSize]);\n if (TW_FONT_WEIGHT[t.fontWeight]) twParts.push(TW_FONT_WEIGHT[t.fontWeight]);\n // Compute line-height ratio\n const lhPx = parseFloat(t.lineHeight);\n const fsPx = parseFloat(t.fontSize);\n if (!isNaN(lhPx) && !isNaN(fsPx) && fsPx > 0) {\n const ratio = Math.round((lhPx / fsPx) * 1000) / 1000;\n const ratioStr = String(ratio);\n if (TW_LINE_HEIGHT[ratioStr]) twParts.push(TW_LINE_HEIGHT[ratioStr]);\n }\n return {\n fontFamily: t.fontFamily,\n fontSize: t.fontSize,\n fontWeight: t.fontWeight,\n lineHeight: t.lineHeight,\n count: t.count,\n tailwind: twParts.length > 0 ? twParts.join(' ') : undefined,\n };\n });\n\n const borderRadius = Array.from(borderRadiusMap.entries())\n .sort((a, b) => b[1] - a[1])\n .slice(0, 10)\n .map(([value, count]) => ({\n value,\n count,\n tailwind: TW_BORDER_RADIUS[value] || undefined,\n }));\n\n const shadows = Array.from(shadowMap.entries())\n .sort((a, b) => b[1] - a[1])\n .slice(0, 10)\n .map(([value, count]) => ({ value, count }));\n\n return {\n elementsScanned: visited,\n colors,\n spacing,\n typography,\n borderRadius,\n shadows,\n };\n}\n\n// --- compare_screenshots ---\nfunction compareScreenshotsTool(before: string, after: string): Promise<unknown> {\n if (!before || !after) return Promise.resolve({ error: 'Both before and after data URLs are required' });\n\n return new Promise((resolve) => {\n const imgBefore = new Image();\n const imgAfter = new Image();\n let loadedCount = 0;\n\n function onLoad() {\n loadedCount++;\n if (loadedCount < 2) return;\n\n try {\n const width = Math.min(imgBefore.width, imgAfter.width);\n const height = Math.min(imgBefore.height, imgAfter.height);\n\n if (width === 0 || height === 0) {\n resolve({ error: 'Images have zero dimensions' });\n return;\n }\n\n const canvasBefore = document.createElement('canvas');\n canvasBefore.width = width;\n canvasBefore.height = height;\n const ctxBefore = canvasBefore.getContext('2d')!;\n ctxBefore.drawImage(imgBefore, 0, 0);\n\n const canvasAfter = document.createElement('canvas');\n canvasAfter.width = width;\n canvasAfter.height = height;\n const ctxAfter = canvasAfter.getContext('2d')!;\n ctxAfter.drawImage(imgAfter, 0, 0);\n\n const dataBefore = ctxBefore.getImageData(0, 0, width, height).data;\n const dataAfter = ctxAfter.getImageData(0, 0, width, height).data;\n\n const GRID_COLS = 10;\n const GRID_ROWS = 10;\n const cellW = Math.floor(width / GRID_COLS);\n const cellH = Math.floor(height / GRID_ROWS);\n\n const totalPixels = width * height;\n let changedPixels = 0;\n const THRESHOLD = 30; // pixel difference threshold\n const changedRegions: Array<{ row: number; col: number; avgDiff: number }> = [];\n\n for (let row = 0; row < GRID_ROWS; row++) {\n for (let col = 0; col < GRID_COLS; col++) {\n const startX = col * cellW;\n const startY = row * cellH;\n const endX = Math.min(startX + cellW, width);\n const endY = Math.min(startY + cellH, height);\n let cellDiffSum = 0;\n let cellPixels = 0;\n let cellChanged = 0;\n\n for (let y = startY; y < endY; y++) {\n for (let x = startX; x < endX; x++) {\n const i = (y * width + x) * 4;\n const dr = Math.abs(dataBefore[i] - dataAfter[i]);\n const dg = Math.abs(dataBefore[i + 1] - dataAfter[i + 1]);\n const db = Math.abs(dataBefore[i + 2] - dataAfter[i + 2]);\n const diff = (dr + dg + db) / 3;\n cellDiffSum += diff;\n cellPixels++;\n if (diff > THRESHOLD) {\n cellChanged++;\n changedPixels++;\n }\n }\n }\n\n const avgDiff = cellPixels > 0 ? Math.round((cellDiffSum / cellPixels) * 100) / 100 : 0;\n if (avgDiff > 2) {\n changedRegions.push({ row, col, avgDiff });\n }\n }\n }\n\n const changePercent = Math.round((changedPixels / totalPixels) * 10000) / 100;\n\n // Build summary\n let regionDesc = 'no significant changes detected';\n if (changedRegions.length > 0) {\n changedRegions.sort((a, b) => b.avgDiff - a.avgDiff);\n const topRegions = changedRegions.slice(0, 3);\n const regionNames = topRegions.map(r => {\n const vPos = r.row < 3 ? 'top' : r.row > 6 ? 'bottom' : 'middle';\n const hPos = r.col < 3 ? 'left' : r.col > 6 ? 'right' : 'center';\n return `${vPos}-${hPos}`;\n });\n regionDesc = `mostly in ${regionNames.join(', ')} region${regionNames.length > 1 ? 's' : ''}`;\n }\n\n const summary = `${changePercent}% of the page changed, ${regionDesc}`;\n\n resolve({\n totalPixels,\n changedPixels,\n changePercent,\n changedRegions,\n dimensions: { width, height },\n summary,\n });\n } catch (err: any) {\n resolve({ error: `Comparison failed: ${err.message}` });\n }\n }\n\n function onError(which: string) {\n resolve({ error: `Failed to load ${which} image. Ensure it is a valid base64 data URL.` });\n }\n\n imgBefore.onload = onLoad;\n imgAfter.onload = onLoad;\n imgBefore.onerror = () => onError('before');\n imgAfter.onerror = () => onError('after');\n imgBefore.src = before;\n imgAfter.src = after;\n });\n}\n\n// --- inspect_react_state ---\nasync function inspectReactStateTool(selector: string): Promise<unknown> {\n if (!selector) return { error: 'selector is required' };\n const el = document.querySelector(selector);\n if (!el) return { error: `Element not found: ${selector}` };\n\n const result = await inspectReactState(selector);\n if (!result) {\n return { error: 'No React component found or React bridge not ready. Ensure React is loaded and reactMode is enabled.' };\n }\n return result;\n}\n\n// --- validate_page_structure ---\nfunction validatePageStructureTool(selector?: string): unknown {\n const root = selector ? document.querySelector(selector) : document.documentElement;\n if (!root) return { error: `Element not found: ${selector}` };\n\n interface CheckItem {\n check: string;\n status: 'pass' | 'warn' | 'fail';\n message: string;\n count?: number;\n }\n\n interface Section {\n name: string;\n status: 'pass' | 'warn' | 'fail';\n items: CheckItem[];\n weight: number;\n }\n\n const sections: Section[] = [];\n\n // --- Heading hierarchy ---\n {\n const items: CheckItem[] = [];\n const headings = root.querySelectorAll('h1, h2, h3, h4, h5, h6');\n const h1s = root.querySelectorAll('h1');\n const filteredH1s = Array.from(h1s).filter(h => !isInspectorElement(h));\n\n if (filteredH1s.length === 0) {\n items.push({ check: 'h1-presence', status: 'fail', message: 'No h1 element found on the page' });\n } else if (filteredH1s.length === 1) {\n items.push({ check: 'h1-presence', status: 'pass', message: 'Exactly one h1 element found' });\n } else {\n items.push({ check: 'h1-presence', status: 'warn', message: `Multiple h1 elements found (${filteredH1s.length})`, count: filteredH1s.length });\n }\n\n let prevLevel = 0;\n let skippedLevels = 0;\n headings.forEach(h => {\n if (isInspectorElement(h)) return;\n const level = parseInt(h.tagName[1]);\n if (prevLevel > 0 && level > prevLevel + 1) {\n skippedLevels++;\n }\n prevLevel = level;\n });\n\n if (skippedLevels === 0) {\n items.push({ check: 'heading-order', status: 'pass', message: 'No skipped heading levels' });\n } else {\n items.push({ check: 'heading-order', status: 'fail', message: `${skippedLevels} skipped heading level(s)`, count: skippedLevels });\n }\n\n const sectionStatus = items.some(i => i.status === 'fail') ? 'fail' : items.some(i => i.status === 'warn') ? 'warn' : 'pass';\n sections.push({ name: 'Heading Hierarchy', status: sectionStatus, items, weight: 15 });\n }\n\n // --- Landmark structure ---\n {\n const items: CheckItem[] = [];\n const landmarks = [\n { name: 'main', selectors: 'main, [role=\"main\"]', required: true },\n { name: 'nav', selectors: 'nav, [role=\"navigation\"]', required: true },\n { name: 'header', selectors: 'header, [role=\"banner\"]', required: false },\n { name: 'footer', selectors: 'footer, [role=\"contentinfo\"]', required: false },\n { name: 'complementary', selectors: 'aside, [role=\"complementary\"]', required: false },\n ];\n\n for (const lm of landmarks) {\n const found = root.querySelectorAll(lm.selectors);\n const count = Array.from(found).filter(el => !isInspectorElement(el)).length;\n if (count > 0) {\n items.push({ check: `landmark-${lm.name}`, status: 'pass', message: `${lm.name} landmark found`, count });\n } else if (lm.required) {\n items.push({ check: `landmark-${lm.name}`, status: 'fail', message: `Missing ${lm.name} landmark` });\n } else {\n items.push({ check: `landmark-${lm.name}`, status: 'warn', message: `No ${lm.name} landmark (optional)` });\n }\n }\n\n const sectionStatus = items.some(i => i.status === 'fail') ? 'fail' : items.some(i => i.status === 'warn') ? 'warn' : 'pass';\n sections.push({ name: 'Landmark Structure', status: sectionStatus, items, weight: 15 });\n }\n\n // --- Image audit ---\n {\n const items: CheckItem[] = [];\n const imgs = Array.from(root.querySelectorAll('img')).filter(img => !isInspectorElement(img));\n const withAlt = imgs.filter(img => img.hasAttribute('alt') && img.getAttribute('alt')!.trim() !== '');\n const withoutAlt = imgs.filter(img => !img.hasAttribute('alt'));\n const emptyAlt = imgs.filter(img => img.hasAttribute('alt') && img.getAttribute('alt')!.trim() === '' && img.getAttribute('role') !== 'presentation' && !img.hasAttribute('aria-hidden'));\n\n items.push({ check: 'images-total', status: 'pass', message: `${imgs.length} images found`, count: imgs.length });\n\n if (withoutAlt.length === 0) {\n items.push({ check: 'images-alt', status: 'pass', message: 'All images have alt attributes' });\n } else {\n items.push({ check: 'images-alt', status: 'fail', message: `${withoutAlt.length} image(s) missing alt attribute`, count: withoutAlt.length });\n }\n\n if (emptyAlt.length > 0) {\n items.push({ check: 'images-decorative', status: 'warn', message: `${emptyAlt.length} image(s) with empty alt but no role=\"presentation\"`, count: emptyAlt.length });\n }\n\n const sectionStatus = items.some(i => i.status === 'fail') ? 'fail' : items.some(i => i.status === 'warn') ? 'warn' : 'pass';\n sections.push({ name: 'Image Audit', status: sectionStatus, items, weight: 15 });\n }\n\n // --- Link audit ---\n {\n const items: CheckItem[] = [];\n const links = Array.from(root.querySelectorAll('a[href]')).filter(a => !isInspectorElement(a));\n const genericTexts = ['click here', 'read more', 'learn more', 'here', 'more', 'link'];\n const emptyLinks = links.filter(a => {\n const text = (a.textContent || '').trim();\n const ariaLabel = a.getAttribute('aria-label') || '';\n return !text && !ariaLabel && !a.querySelector('img[alt]');\n });\n const genericLinks = links.filter(a => {\n const text = (a.textContent || '').trim().toLowerCase();\n return genericTexts.includes(text) && !a.getAttribute('aria-label');\n });\n\n items.push({ check: 'links-total', status: 'pass', message: `${links.length} links found`, count: links.length });\n\n if (emptyLinks.length === 0) {\n items.push({ check: 'links-empty', status: 'pass', message: 'No empty links found' });\n } else {\n items.push({ check: 'links-empty', status: 'fail', message: `${emptyLinks.length} empty link(s) with no accessible text`, count: emptyLinks.length });\n }\n\n if (genericLinks.length === 0) {\n items.push({ check: 'links-generic', status: 'pass', message: 'No links with generic text' });\n } else {\n items.push({ check: 'links-generic', status: 'warn', message: `${genericLinks.length} link(s) with generic text (e.g., \"click here\", \"read more\")`, count: genericLinks.length });\n }\n\n const sectionStatus = items.some(i => i.status === 'fail') ? 'fail' : items.some(i => i.status === 'warn') ? 'warn' : 'pass';\n sections.push({ name: 'Link Audit', status: sectionStatus, items, weight: 10 });\n }\n\n // --- Form audit ---\n {\n const items: CheckItem[] = [];\n const formInputs = Array.from(root.querySelectorAll('input:not([type=\"hidden\"]):not([type=\"submit\"]):not([type=\"button\"]):not([type=\"reset\"]), textarea, select')).filter(el => !isInspectorElement(el));\n const unlabeled = formInputs.filter(inp => {\n const hasLabel = inp.id && root.querySelector(`label[for=\"${inp.id}\"]`);\n const hasAriaLabel = inp.hasAttribute('aria-label') || inp.hasAttribute('aria-labelledby');\n const wrappedInLabel = inp.closest('label');\n const hasTitle = inp.hasAttribute('title');\n return !hasLabel && !hasAriaLabel && !wrappedInLabel && !hasTitle;\n });\n\n const fieldsets = Array.from(root.querySelectorAll('fieldset')).filter(fs => !isInspectorElement(fs));\n const fieldsetsWithoutLegend = fieldsets.filter(fs => !fs.querySelector('legend'));\n\n if (formInputs.length === 0) {\n items.push({ check: 'form-inputs', status: 'pass', message: 'No form inputs found' });\n } else {\n items.push({ check: 'form-inputs', status: 'pass', message: `${formInputs.length} form input(s) found`, count: formInputs.length });\n\n if (unlabeled.length === 0) {\n items.push({ check: 'form-labels', status: 'pass', message: 'All inputs have associated labels' });\n } else {\n items.push({ check: 'form-labels', status: 'fail', message: `${unlabeled.length} input(s) missing labels`, count: unlabeled.length });\n }\n }\n\n if (fieldsetsWithoutLegend.length > 0) {\n items.push({ check: 'fieldset-legend', status: 'warn', message: `${fieldsetsWithoutLegend.length} fieldset(s) without legend`, count: fieldsetsWithoutLegend.length });\n }\n\n const sectionStatus = items.some(i => i.status === 'fail') ? 'fail' : items.some(i => i.status === 'warn') ? 'warn' : 'pass';\n sections.push({ name: 'Form Audit', status: sectionStatus, items, weight: 15 });\n }\n\n // --- Document structure ---\n {\n const items: CheckItem[] = [];\n const html = document.documentElement;\n\n // lang attribute\n const lang = html.getAttribute('lang');\n if (lang && lang.trim()) {\n items.push({ check: 'doc-lang', status: 'pass', message: `lang attribute set: \"${lang}\"` });\n } else {\n items.push({ check: 'doc-lang', status: 'fail', message: 'Missing lang attribute on <html>' });\n }\n\n // title\n const title = document.title;\n if (title && title.trim()) {\n items.push({ check: 'doc-title', status: 'pass', message: `Page title: \"${title.substring(0, 60)}\"` });\n } else {\n items.push({ check: 'doc-title', status: 'fail', message: 'Missing or empty page title' });\n }\n\n // meta viewport\n const viewport = document.querySelector('meta[name=\"viewport\"]');\n if (viewport) {\n items.push({ check: 'doc-viewport', status: 'pass', message: 'Meta viewport tag present' });\n } else {\n items.push({ check: 'doc-viewport', status: 'warn', message: 'No meta viewport tag found' });\n }\n\n // skip-to-content link\n const skipLink = document.querySelector('a[href=\"#main-content\"], a[href=\"#content\"], a[href=\"#main\"], [class*=\"skip\"], [class*=\"Skip\"]');\n if (skipLink) {\n items.push({ check: 'doc-skip-link', status: 'pass', message: 'Skip-to-content link found' });\n } else {\n items.push({ check: 'doc-skip-link', status: 'warn', message: 'No skip-to-content link detected' });\n }\n\n const sectionStatus = items.some(i => i.status === 'fail') ? 'fail' : items.some(i => i.status === 'warn') ? 'warn' : 'pass';\n sections.push({ name: 'Document Structure', status: sectionStatus, items, weight: 15 });\n }\n\n // --- ARIA usage ---\n {\n const items: CheckItem[] = [];\n const ariaElements = Array.from(root.querySelectorAll('[role], [aria-label], [aria-labelledby], [aria-describedby], [aria-hidden], [aria-live], [aria-expanded], [aria-checked], [aria-selected]')).filter(el => !isInspectorElement(el));\n\n items.push({ check: 'aria-usage', status: 'pass', message: `${ariaElements.length} element(s) with ARIA attributes`, count: ariaElements.length });\n\n const validRoles = new Set(['alert','alertdialog','application','article','banner','button','cell','checkbox','columnheader','combobox','complementary','contentinfo','definition','dialog','directory','document','feed','figure','form','grid','gridcell','group','heading','img','link','list','listbox','listitem','log','main','marquee','math','menu','menubar','menuitem','menuitemcheckbox','menuitemradio','navigation','none','note','option','presentation','progressbar','radio','radiogroup','region','row','rowgroup','rowheader','scrollbar','search','searchbox','separator','slider','spinbutton','status','switch','tab','table','tablist','tabpanel','term','textbox','timer','toolbar','tooltip','tree','treegrid','treeitem']);\n const roleElements = Array.from(root.querySelectorAll('[role]')).filter(el => !isInspectorElement(el));\n const invalidRoles = roleElements.filter(el => {\n const role = el.getAttribute('role') || '';\n return !validRoles.has(role);\n });\n\n if (invalidRoles.length === 0 && roleElements.length > 0) {\n items.push({ check: 'aria-valid-roles', status: 'pass', message: 'All ARIA roles are valid' });\n } else if (invalidRoles.length > 0) {\n items.push({ check: 'aria-valid-roles', status: 'fail', message: `${invalidRoles.length} invalid ARIA role(s)`, count: invalidRoles.length });\n }\n\n // Check for aria-hidden on focusable elements\n const hiddenFocusable = Array.from(root.querySelectorAll('[aria-hidden=\"true\"] a, [aria-hidden=\"true\"] button, [aria-hidden=\"true\"] input, [aria-hidden=\"true\"] [tabindex]')).filter(el => !isInspectorElement(el));\n if (hiddenFocusable.length > 0) {\n items.push({ check: 'aria-hidden-focusable', status: 'warn', message: `${hiddenFocusable.length} focusable element(s) inside aria-hidden containers`, count: hiddenFocusable.length });\n }\n\n const sectionStatus = items.some(i => i.status === 'fail') ? 'fail' : items.some(i => i.status === 'warn') ? 'warn' : 'pass';\n sections.push({ name: 'ARIA Usage', status: sectionStatus, items, weight: 15 });\n }\n\n // --- Calculate score ---\n let totalWeight = 0;\n let earnedWeight = 0;\n for (const section of sections) {\n totalWeight += section.weight;\n if (section.status === 'pass') {\n earnedWeight += section.weight;\n } else if (section.status === 'warn') {\n earnedWeight += section.weight * 0.5;\n }\n // fail = 0\n }\n\n const score = totalWeight > 0 ? Math.round((earnedWeight / totalWeight) * 100) : 0;\n\n return {\n score,\n sections: sections.map(s => ({\n name: s.name,\n status: s.status,\n items: s.items,\n })),\n };\n}\n\n// ========== Tier 3 Tools ==========\n\n// --- map_to_tailwind ---\nfunction mapToTailwindTool(selector: string): unknown {\n if (!selector) return { error: 'selector is required' };\n const el = document.querySelector(selector);\n if (!el) return { error: `Element not found: ${selector}` };\n\n const cs = window.getComputedStyle(el);\n const classes: string[] = [];\n const grouped: Record<string, string[]> = {\n layout: [], spacing: [], sizing: [], typography: [], colors: [], borders: [], effects: [], flexbox: [],\n };\n\n // --- Tailwind lookup tables ---\n const spacingScale: Record<string, string> = {\n '0px': '0', '1px': 'px', '2px': '0.5', '4px': '1', '6px': '1.5', '8px': '2', '10px': '2.5',\n '12px': '3', '14px': '3.5', '16px': '4', '20px': '5', '24px': '6', '28px': '7', '32px': '8',\n '36px': '9', '40px': '10', '44px': '11', '48px': '12', '56px': '14', '64px': '16',\n '80px': '20', '96px': '24',\n };\n\n const fontSizeMap: Record<string, string> = {\n '12px': 'text-xs', '14px': 'text-sm', '16px': 'text-base', '18px': 'text-lg',\n '20px': 'text-xl', '24px': 'text-2xl', '30px': 'text-3xl', '36px': 'text-4xl',\n '48px': 'text-5xl', '60px': 'text-6xl', '72px': 'text-7xl', '96px': 'text-8xl', '128px': 'text-9xl',\n };\n\n const fontWeightMap: Record<string, string> = {\n '100': 'font-thin', '200': 'font-extralight', '300': 'font-light', '400': 'font-normal',\n '500': 'font-medium', '600': 'font-semibold', '700': 'font-bold', '800': 'font-extrabold', '900': 'font-black',\n };\n\n const borderRadiusMap: Record<string, string> = {\n '0px': 'rounded-none', '2px': 'rounded-sm', '4px': 'rounded', '6px': 'rounded-md',\n '8px': 'rounded-lg', '12px': 'rounded-xl', '16px': 'rounded-2xl', '24px': 'rounded-3xl',\n '9999px': 'rounded-full',\n };\n\n const displayMap: Record<string, string> = {\n 'block': 'block', 'inline-block': 'inline-block', 'inline': 'inline', 'flex': 'flex',\n 'inline-flex': 'inline-flex', 'grid': 'grid', 'inline-grid': 'inline-grid', 'none': 'hidden',\n 'table': 'table', 'table-row': 'table-row', 'table-cell': 'table-cell',\n };\n\n const positionMap: Record<string, string> = {\n 'static': 'static', 'relative': 'relative', 'absolute': 'absolute', 'fixed': 'fixed', 'sticky': 'sticky',\n };\n\n const overflowMap: Record<string, string> = {\n 'auto': 'overflow-auto', 'hidden': 'overflow-hidden', 'scroll': 'overflow-scroll', 'visible': 'overflow-visible',\n };\n\n const textAlignMap: Record<string, string> = {\n 'left': 'text-left', 'center': 'text-center', 'right': 'text-right', 'justify': 'text-justify',\n };\n\n const textTransformMap: Record<string, string> = {\n 'uppercase': 'uppercase', 'lowercase': 'lowercase', 'capitalize': 'capitalize', 'none': 'normal-case',\n };\n\n const flexDirMap: Record<string, string> = {\n 'row': 'flex-row', 'row-reverse': 'flex-row-reverse', 'column': 'flex-col', 'column-reverse': 'flex-col-reverse',\n };\n\n const justifyMap: Record<string, string> = {\n 'flex-start': 'justify-start', 'flex-end': 'justify-end', 'center': 'justify-center',\n 'space-between': 'justify-between', 'space-around': 'justify-around', 'space-evenly': 'justify-evenly',\n 'start': 'justify-start', 'end': 'justify-end', 'normal': 'justify-normal',\n };\n\n const alignItemsMap: Record<string, string> = {\n 'flex-start': 'items-start', 'flex-end': 'items-end', 'center': 'items-center',\n 'baseline': 'items-baseline', 'stretch': 'items-stretch', 'start': 'items-start', 'end': 'items-end',\n };\n\n const flexWrapMap: Record<string, string> = {\n 'wrap': 'flex-wrap', 'wrap-reverse': 'flex-wrap-reverse', 'nowrap': 'flex-nowrap',\n };\n\n function addCls(cls: string, group: string) {\n classes.push(cls);\n if (grouped[group]) grouped[group].push(cls);\n }\n\n function mapSpacing(value: string, prefix: string, group: string) {\n const tw = spacingScale[value];\n if (tw !== undefined) addCls(`${prefix}-${tw}`, group);\n }\n\n // --- Layout ---\n const display = cs.display;\n if (displayMap[display]) addCls(displayMap[display], 'layout');\n\n const position = cs.position;\n if (positionMap[position] && position !== 'static') addCls(positionMap[position], 'layout');\n\n const overflow = cs.overflow;\n if (overflowMap[overflow] && overflow !== 'visible') addCls(overflowMap[overflow], 'layout');\n\n // --- Spacing ---\n const spacingProps = [\n { css: 'padding-top', tw: 'pt' }, { css: 'padding-right', tw: 'pr' },\n { css: 'padding-bottom', tw: 'pb' }, { css: 'padding-left', tw: 'pl' },\n { css: 'margin-top', tw: 'mt' }, { css: 'margin-right', tw: 'mr' },\n { css: 'margin-bottom', tw: 'mb' }, { css: 'margin-left', tw: 'ml' },\n ];\n for (const sp of spacingProps) {\n const val = cs.getPropertyValue(sp.css);\n if (val && val !== '0px') mapSpacing(val, sp.tw, 'spacing');\n }\n\n // --- Sizing ---\n const width = cs.width;\n if (width && spacingScale[width]) addCls(`w-${spacingScale[width]}`, 'sizing');\n else if (width === '100%') addCls('w-full', 'sizing');\n else if (width === 'auto') addCls('w-auto', 'sizing');\n\n const height = cs.height;\n if (height && spacingScale[height]) addCls(`h-${spacingScale[height]}`, 'sizing');\n else if (height === '100%') addCls('h-full', 'sizing');\n else if (height === 'auto') addCls('h-auto', 'sizing');\n\n const minWidth = cs.minWidth;\n if (minWidth === '0px') addCls('min-w-0', 'sizing');\n else if (minWidth === '100%') addCls('min-w-full', 'sizing');\n\n const maxWidth = cs.maxWidth;\n if (maxWidth === 'none') addCls('max-w-none', 'sizing');\n else if (maxWidth === '100%') addCls('max-w-full', 'sizing');\n\n const minHeight = cs.minHeight;\n if (minHeight === '0px') addCls('min-h-0', 'sizing');\n else if (minHeight === '100%') addCls('min-h-full', 'sizing');\n else if (minHeight === '100vh') addCls('min-h-screen', 'sizing');\n\n const maxHeight = cs.maxHeight;\n if (maxHeight === 'none') addCls('max-h-none', 'sizing');\n else if (maxHeight === '100%') addCls('max-h-full', 'sizing');\n\n // --- Typography ---\n const fontSize = cs.fontSize;\n if (fontSizeMap[fontSize]) addCls(fontSizeMap[fontSize], 'typography');\n\n const fontWeight = cs.fontWeight;\n if (fontWeightMap[fontWeight]) addCls(fontWeightMap[fontWeight], 'typography');\n\n const lineHeight = cs.lineHeight;\n if (lineHeight !== 'normal' && fontSize) {\n const lhPx = parseFloat(lineHeight);\n const fsPx = parseFloat(fontSize);\n if (!isNaN(lhPx) && !isNaN(fsPx) && fsPx > 0) {\n const ratio = Math.round((lhPx / fsPx) * 1000) / 1000;\n const lhMap: Record<string, string> = {\n '1': 'leading-none', '1.25': 'leading-tight', '1.375': 'leading-snug',\n '1.5': 'leading-normal', '1.625': 'leading-relaxed', '2': 'leading-loose',\n };\n if (lhMap[String(ratio)]) addCls(lhMap[String(ratio)], 'typography');\n }\n }\n\n const letterSpacing = cs.letterSpacing;\n if (letterSpacing && letterSpacing !== 'normal') {\n const lsMap: Record<string, string> = {\n '-0.05em': 'tracking-tighter', '-0.025em': 'tracking-tight', '0em': 'tracking-normal',\n '0.025em': 'tracking-wide', '0.05em': 'tracking-wider', '0.1em': 'tracking-widest',\n };\n if (lsMap[letterSpacing]) addCls(lsMap[letterSpacing], 'typography');\n }\n\n const textAlign = cs.textAlign;\n if (textAlignMap[textAlign]) addCls(textAlignMap[textAlign], 'typography');\n\n const textTransform = cs.textTransform;\n if (textTransformMap[textTransform] && textTransform !== 'none') addCls(textTransformMap[textTransform], 'typography');\n\n // --- Colors ---\n const textColor = cs.color;\n if (textColor) {\n const parsed = parseColor(textColor);\n if (parsed) {\n const hex = rgbToHex(parsed[0], parsed[1], parsed[2]);\n const tw = nearestTwColor(hex);\n if (tw) addCls(`text-${tw}`, 'colors');\n }\n }\n\n const bgColor = cs.backgroundColor;\n if (bgColor && bgColor !== 'rgba(0, 0, 0, 0)' && bgColor !== 'transparent') {\n const parsed = parseColor(bgColor);\n if (parsed) {\n const hex = rgbToHex(parsed[0], parsed[1], parsed[2]);\n const tw = nearestTwColor(hex);\n if (tw) addCls(`bg-${tw}`, 'colors');\n }\n }\n\n // --- Borders ---\n const borderWidth = cs.borderTopWidth;\n if (borderWidth && borderWidth !== '0px') {\n const bwMap: Record<string, string> = { '1px': 'border', '2px': 'border-2', '4px': 'border-4', '8px': 'border-8' };\n if (bwMap[borderWidth]) addCls(bwMap[borderWidth], 'borders');\n }\n\n const borderRadius = cs.borderRadius;\n if (borderRadius && borderRadiusMap[borderRadius]) addCls(borderRadiusMap[borderRadius], 'borders');\n\n const bColor = cs.borderColor;\n if (bColor && borderWidth && borderWidth !== '0px') {\n const parsed = parseColor(bColor);\n if (parsed) {\n const hex = rgbToHex(parsed[0], parsed[1], parsed[2]);\n const tw = nearestTwColor(hex);\n if (tw) addCls(`border-${tw}`, 'borders');\n }\n }\n\n // --- Effects ---\n const opacity = cs.opacity;\n if (opacity !== '1') {\n const opVal = Math.round(parseFloat(opacity) * 100);\n const opMap: Record<number, string> = { 0: 'opacity-0', 5: 'opacity-5', 10: 'opacity-10', 20: 'opacity-20', 25: 'opacity-25', 30: 'opacity-30', 40: 'opacity-40', 50: 'opacity-50', 60: 'opacity-60', 70: 'opacity-70', 75: 'opacity-75', 80: 'opacity-80', 90: 'opacity-90', 95: 'opacity-95' };\n if (opMap[opVal] !== undefined) addCls(opMap[opVal], 'effects');\n }\n\n const boxShadow = cs.boxShadow;\n if (boxShadow && boxShadow !== 'none') {\n addCls('shadow', 'effects');\n }\n\n // --- Flexbox/Grid ---\n if (display === 'flex' || display === 'inline-flex') {\n const flexDir = cs.flexDirection;\n if (flexDirMap[flexDir] && flexDir !== 'row') addCls(flexDirMap[flexDir], 'flexbox');\n\n const justify = cs.justifyContent;\n if (justifyMap[justify] && justify !== 'normal' && justify !== 'flex-start') addCls(justifyMap[justify], 'flexbox');\n\n const alignItems = cs.alignItems;\n if (alignItemsMap[alignItems] && alignItems !== 'stretch' && alignItems !== 'normal') addCls(alignItemsMap[alignItems], 'flexbox');\n\n const flexWrap = cs.flexWrap;\n if (flexWrapMap[flexWrap] && flexWrap !== 'nowrap') addCls(flexWrapMap[flexWrap], 'flexbox');\n\n const gap = cs.gap;\n if (gap && gap !== 'normal' && gap !== '0px') {\n const tw = spacingScale[gap];\n if (tw) addCls(`gap-${tw}`, 'flexbox');\n }\n }\n\n if (display === 'grid' || display === 'inline-grid') {\n const gap = cs.gap;\n if (gap && gap !== 'normal' && gap !== '0px') {\n const tw = spacingScale[gap];\n if (tw) addCls(`gap-${tw}`, 'flexbox');\n }\n\n const cols = cs.gridTemplateColumns;\n if (cols && cols !== 'none') {\n const colCount = cols.split(/\\s+/).length;\n if (colCount >= 1 && colCount <= 12) addCls(`grid-cols-${colCount}`, 'flexbox');\n }\n\n const rows = cs.gridTemplateRows;\n if (rows && rows !== 'none') {\n const rowCount = rows.split(/\\s+/).length;\n if (rowCount >= 1 && rowCount <= 6) addCls(`grid-rows-${rowCount}`, 'flexbox');\n }\n }\n\n return { selector, classes, grouped };\n}\n\n// --- get_performance_metrics ---\nfunction getPerformanceMetricsTool(): unknown {\n try {\n const result: Record<string, unknown> = {};\n\n // Navigation timing\n try {\n const navEntries = performance.getEntriesByType('navigation') as PerformanceNavigationTiming[];\n if (navEntries.length > 0) {\n const nav = navEntries[0];\n result.loadTime = Math.round(nav.loadEventEnd - nav.startTime);\n result.domContentLoaded = Math.round(nav.domContentLoadedEventEnd - nav.startTime);\n result.domInteractive = Math.round(nav.domInteractive - nav.startTime);\n result.ttfb = Math.round(nav.responseStart - nav.requestStart);\n result.dnsLookup = Math.round(nav.domainLookupEnd - nav.domainLookupStart);\n result.tcpConnect = Math.round(nav.connectEnd - nav.connectStart);\n }\n } catch { /* ignore */ }\n\n // Paint timing (FP, FCP)\n try {\n const paintEntries = performance.getEntriesByType('paint');\n for (const entry of paintEntries) {\n if (entry.name === 'first-paint') {\n result.firstPaint = Math.round(entry.startTime);\n } else if (entry.name === 'first-contentful-paint') {\n result.firstContentfulPaint = Math.round(entry.startTime);\n }\n }\n } catch { /* ignore */ }\n\n // LCP\n try {\n const lcpEntries = performance.getEntriesByType('largest-contentful-paint');\n if (lcpEntries.length > 0) {\n const lastLcp = lcpEntries[lcpEntries.length - 1];\n result.largestContentfulPaint = Math.round(lastLcp.startTime);\n }\n } catch { /* ignore */ }\n\n // CLS from layout-shift entries\n try {\n const layoutShifts = performance.getEntriesByType('layout-shift') as any[];\n let clsValue = 0;\n for (const entry of layoutShifts) {\n if (!entry.hadRecentInput) {\n clsValue += entry.value || 0;\n }\n }\n result.cumulativeLayoutShift = Math.round(clsValue * 10000) / 10000;\n } catch { /* ignore */ }\n\n // DOM node count\n try {\n result.domNodes = document.querySelectorAll('*').length;\n } catch { /* ignore */ }\n\n // Resource stats\n try {\n const resources = performance.getEntriesByType('resource') as PerformanceResourceTiming[];\n result.resourceCount = resources.length;\n let totalTransferSize = 0;\n for (const r of resources) {\n totalTransferSize += r.transferSize || 0;\n }\n result.totalTransferSize = totalTransferSize;\n result.totalTransferSizeFormatted = totalTransferSize > 1048576\n ? `${(totalTransferSize / 1048576).toFixed(2)} MB`\n : `${(totalTransferSize / 1024).toFixed(2)} KB`;\n } catch { /* ignore */ }\n\n // Memory (Chrome only)\n try {\n const mem = (performance as any).memory;\n if (mem) {\n result.memory = {\n usedJSHeapSize: mem.usedJSHeapSize,\n totalJSHeapSize: mem.totalJSHeapSize,\n jsHeapSizeLimit: mem.jsHeapSizeLimit,\n usedFormatted: `${(mem.usedJSHeapSize / 1048576).toFixed(2)} MB`,\n totalFormatted: `${(mem.totalJSHeapSize / 1048576).toFixed(2)} MB`,\n };\n }\n } catch { /* ignore */ }\n\n // Event listener estimate\n try {\n const allEls = document.querySelectorAll('*');\n let listenerEstimate = 0;\n // Check for common event attributes\n const eventAttrs = ['onclick', 'onchange', 'onsubmit', 'onkeydown', 'onkeyup', 'onmouseover', 'onfocus', 'onblur', 'oninput'];\n allEls.forEach(el => {\n for (const attr of eventAttrs) {\n if (el.hasAttribute(attr)) listenerEstimate++;\n }\n });\n result.estimatedInlineListeners = listenerEstimate;\n } catch { /* ignore */ }\n\n return result;\n } catch (err: any) {\n return { error: `Failed to get performance metrics: ${err.message}` };\n }\n}\n\n// --- generate_test_code ---\nfunction generateTestCodeTool(selector: string, framework?: string, _assertions?: string[]): unknown {\n if (!selector) return { error: 'selector is required' };\n const el = document.querySelector(selector);\n if (!el) return { error: `Element not found: ${selector}` };\n\n const fw = framework === 'cypress' ? 'cypress' : 'playwright';\n const cs = window.getComputedStyle(el);\n const rect = el.getBoundingClientRect();\n const tag = el.tagName.toLowerCase();\n const text = (el.textContent || '').trim().substring(0, 100);\n const role = el.getAttribute('role');\n const ariaLabel = el.getAttribute('aria-label');\n const isVisible = rect.width > 0 && rect.height > 0 && cs.display !== 'none' && cs.visibility !== 'hidden';\n\n const assertionList: Array<{ type: string; value: string }> = [];\n\n // Collect element info for assertions\n assertionList.push({ type: 'visibility', value: String(isVisible) });\n if (text) assertionList.push({ type: 'text', value: text });\n if (role) assertionList.push({ type: 'role', value: role });\n if (ariaLabel) assertionList.push({ type: 'aria-label', value: ariaLabel });\n\n // Key CSS properties\n assertionList.push({ type: 'display', value: cs.display });\n if (cs.fontSize) assertionList.push({ type: 'font-size', value: cs.fontSize });\n if (cs.color) assertionList.push({ type: 'color', value: cs.color });\n\n // Tag-specific assertions\n if (tag === 'a') {\n const href = (el as HTMLAnchorElement).href;\n if (href) assertionList.push({ type: 'href', value: href });\n }\n if (tag === 'input' || tag === 'textarea') {\n const inp = el as HTMLInputElement;\n if (inp.value) assertionList.push({ type: 'value', value: inp.value });\n if (inp.placeholder) assertionList.push({ type: 'placeholder', value: inp.placeholder });\n if (inp.type) assertionList.push({ type: 'input-type', value: inp.type });\n }\n if (tag === 'img') {\n const img = el as HTMLImageElement;\n if (img.alt !== undefined) assertionList.push({ type: 'alt', value: img.alt });\n if (img.src) assertionList.push({ type: 'src', value: img.src.substring(0, 200) });\n }\n if (tag === 'button') {\n assertionList.push({ type: 'enabled', value: String(!(el as HTMLButtonElement).disabled) });\n }\n\n // Children count\n const childCount = el.children.length;\n if (childCount > 0) assertionList.push({ type: 'children-count', value: String(childCount) });\n\n let testCode = '';\n const escapedSelector = selector.replace(/'/g, \"\\\\'\");\n const escapedText = text.replace(/'/g, \"\\\\'\").substring(0, 60);\n\n if (fw === 'playwright') {\n const lines: string[] = [];\n lines.push(`import { test, expect } from '@playwright/test';`);\n lines.push(``);\n lines.push(`test('${tag} element should be correctly rendered', async ({ page }) => {`);\n lines.push(` const element = page.locator('${escapedSelector}');`);\n lines.push(``);\n\n // Visibility\n if (isVisible) {\n lines.push(` // Visibility`);\n lines.push(` await expect(element).toBeVisible();`);\n }\n\n // Text content\n if (text) {\n lines.push(``);\n lines.push(` // Text content`);\n lines.push(` await expect(element).toHaveText(/${escapedText.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&').substring(0, 40)}/);`);\n }\n\n // CSS assertions\n lines.push(``);\n lines.push(` // CSS properties`);\n lines.push(` await expect(element).toHaveCSS('display', '${cs.display}');`);\n if (cs.fontSize) lines.push(` await expect(element).toHaveCSS('font-size', '${cs.fontSize}');`);\n\n // Role/accessibility\n if (role) {\n lines.push(``);\n lines.push(` // Accessibility`);\n lines.push(` await expect(element).toHaveAttribute('role', '${role}');`);\n }\n if (ariaLabel) {\n if (!role) { lines.push(``); lines.push(` // Accessibility`); }\n lines.push(` await expect(element).toHaveAttribute('aria-label', '${ariaLabel.replace(/'/g, \"\\\\'\")}');`);\n }\n\n // Tag-specific\n if (tag === 'a' && (el as HTMLAnchorElement).href) {\n lines.push(``);\n lines.push(` // Link attributes`);\n lines.push(` await expect(element).toHaveAttribute('href', '${(el as HTMLAnchorElement).getAttribute('href')?.replace(/'/g, \"\\\\'\")}');`);\n }\n if (tag === 'input' || tag === 'textarea') {\n const inp = el as HTMLInputElement;\n lines.push(``);\n lines.push(` // Form input`);\n if (inp.placeholder) lines.push(` await expect(element).toHaveAttribute('placeholder', '${inp.placeholder.replace(/'/g, \"\\\\'\")}');`);\n if (inp.value) lines.push(` await expect(element).toHaveValue('${inp.value.replace(/'/g, \"\\\\'\").substring(0, 60)}');`);\n }\n if (tag === 'button') {\n lines.push(``);\n lines.push(` // Button state`);\n if (!(el as HTMLButtonElement).disabled) {\n lines.push(` await expect(element).toBeEnabled();`);\n } else {\n lines.push(` await expect(element).toBeDisabled();`);\n }\n }\n if (tag === 'img') {\n lines.push(``);\n lines.push(` // Image`);\n const img = el as HTMLImageElement;\n if (img.alt !== undefined) lines.push(` await expect(element).toHaveAttribute('alt', '${img.alt.replace(/'/g, \"\\\\'\")}');`);\n }\n\n // Children structure\n if (childCount > 0) {\n lines.push(``);\n lines.push(` // Structure`);\n lines.push(` const children = element.locator('> *');`);\n lines.push(` await expect(children).toHaveCount(${childCount});`);\n }\n\n lines.push(`});`);\n testCode = lines.join('\\n');\n } else {\n // Cypress\n const lines: string[] = [];\n lines.push(`describe('${tag} element', () => {`);\n lines.push(` it('should be correctly rendered', () => {`);\n lines.push(` cy.get('${escapedSelector}').as('element');`);\n lines.push(``);\n\n // Visibility\n if (isVisible) {\n lines.push(` // Visibility`);\n lines.push(` cy.get('@element').should('be.visible');`);\n }\n\n // Text\n if (text) {\n lines.push(``);\n lines.push(` // Text content`);\n lines.push(` cy.get('@element').should('contain.text', '${escapedText.substring(0, 40)}');`);\n }\n\n // CSS\n lines.push(``);\n lines.push(` // CSS properties`);\n lines.push(` cy.get('@element').should('have.css', 'display', '${cs.display}');`);\n if (cs.fontSize) lines.push(` cy.get('@element').should('have.css', 'font-size', '${cs.fontSize}');`);\n\n // Accessibility\n if (role) {\n lines.push(``);\n lines.push(` // Accessibility`);\n lines.push(` cy.get('@element').should('have.attr', 'role', '${role}');`);\n }\n if (ariaLabel) {\n if (!role) { lines.push(``); lines.push(` // Accessibility`); }\n lines.push(` cy.get('@element').should('have.attr', 'aria-label', '${ariaLabel.replace(/'/g, \"\\\\'\")}');`);\n }\n\n // Tag-specific\n if (tag === 'a' && (el as HTMLAnchorElement).getAttribute('href')) {\n lines.push(``);\n lines.push(` // Link attributes`);\n lines.push(` cy.get('@element').should('have.attr', 'href', '${(el as HTMLAnchorElement).getAttribute('href')?.replace(/'/g, \"\\\\'\")}');`);\n }\n if (tag === 'input' || tag === 'textarea') {\n const inp = el as HTMLInputElement;\n lines.push(``);\n lines.push(` // Form input`);\n if (inp.placeholder) lines.push(` cy.get('@element').should('have.attr', 'placeholder', '${inp.placeholder.replace(/'/g, \"\\\\'\")}');`);\n if (inp.value) lines.push(` cy.get('@element').should('have.value', '${inp.value.replace(/'/g, \"\\\\'\").substring(0, 60)}');`);\n }\n if (tag === 'button') {\n lines.push(``);\n lines.push(` // Button state`);\n if (!(el as HTMLButtonElement).disabled) {\n lines.push(` cy.get('@element').should('not.be.disabled');`);\n } else {\n lines.push(` cy.get('@element').should('be.disabled');`);\n }\n }\n if (tag === 'img') {\n lines.push(``);\n lines.push(` // Image`);\n const img = el as HTMLImageElement;\n if (img.alt !== undefined) lines.push(` cy.get('@element').should('have.attr', 'alt', '${img.alt.replace(/'/g, \"\\\\'\")}');`);\n }\n\n // Children\n if (childCount > 0) {\n lines.push(``);\n lines.push(` // Structure`);\n lines.push(` cy.get('@element').children().should('have.length', ${childCount});`);\n }\n\n lines.push(` });`);\n lines.push(`});`);\n testCode = lines.join('\\n');\n }\n\n return { framework: fw, testCode, assertions: assertionList };\n}\n\n// --- inspect_tab_order ---\nfunction inspectTabOrderTool(selector?: string): unknown {\n const root = selector ? document.querySelector(selector) : document.body;\n if (!root) return { error: `Element not found: ${selector}` };\n\n const focusableSelector = 'a[href], button, input:not([type=\"hidden\"]), select, textarea, [tabindex], [contenteditable=\"true\"], [contenteditable=\"\"]';\n const allFocusable = Array.from(root.querySelectorAll(focusableSelector)).filter(el => !isInspectorElement(el));\n\n const warnings: Array<{ message: string; selector: string }> = [];\n const tabOrderItems: Array<{\n index: number; selector: string; tagName: string; text: string;\n tabindex: number; role: string | null; visible: boolean; issues?: string[];\n }> = [];\n\n // Separate into positive tabindex, zero tabindex, and negative tabindex\n const positiveTabindex: Array<{ el: Element; tabindex: number }> = [];\n const zeroTabindex: Element[] = [];\n const negativeTabindex: Element[] = [];\n\n for (const el of allFocusable) {\n const tabindexAttr = el.getAttribute('tabindex');\n const tabindexVal = tabindexAttr !== null ? parseInt(tabindexAttr, 10) : 0;\n\n // Elements natively focusable without tabindex get tabindex=0 behavior\n const isNativelyFocusable = /^(a|button|input|select|textarea)$/i.test(el.tagName) && tabindexAttr === null;\n\n if (tabindexAttr !== null && tabindexVal > 0) {\n positiveTabindex.push({ el, tabindex: tabindexVal });\n } else if (tabindexAttr !== null && tabindexVal < 0) {\n negativeTabindex.push(el);\n } else if (isNativelyFocusable || (tabindexAttr !== null && tabindexVal === 0)) {\n zeroTabindex.push(el);\n }\n }\n\n // Sort positive tabindex by value\n positiveTabindex.sort((a, b) => a.tabindex - b.tabindex);\n\n // Build ordered list: positive first, then zero (DOM order), then note negative\n let orderIndex = 1;\n\n function getElInfo(el: Element, tabindexVal: number): typeof tabOrderItems[0] {\n const cs = window.getComputedStyle(el);\n const rect = el.getBoundingClientRect();\n const visible = rect.width > 0 && rect.height > 0 && cs.display !== 'none' && cs.visibility !== 'hidden' && cs.opacity !== '0';\n const tag = el.tagName.toLowerCase();\n const text = (el.textContent || (el as HTMLInputElement).value || el.getAttribute('aria-label') || el.getAttribute('title') || '').trim().substring(0, 80);\n const role = el.getAttribute('role');\n const issues: string[] = [];\n\n // Flag issues\n if (tabindexVal > 0) {\n issues.push(`tabindex=\"${tabindexVal}\" reorders focus \u2014 use tabindex=\"0\" instead`);\n warnings.push({ message: `Positive tabindex (${tabindexVal}) disrupts natural tab order`, selector: getSelector(el) });\n }\n if (!visible && tabindexVal >= 0) {\n issues.push('Element is focusable but not visible');\n warnings.push({ message: 'Focusable but invisible element', selector: getSelector(el) });\n }\n if (tabindexVal === -1 && (tag === 'a' || tag === 'button' || tag === 'input' || tag === 'select' || tag === 'textarea')) {\n issues.push('Important interactive element removed from tab order');\n warnings.push({ message: `${tag} element has tabindex=\"-1\" \u2014 removed from tab order`, selector: getSelector(el) });\n }\n\n return {\n index: orderIndex++,\n selector: getSelector(el),\n tagName: tag,\n text,\n tabindex: tabindexVal,\n role,\n visible,\n issues: issues.length > 0 ? issues : undefined,\n };\n }\n\n // Add positive tabindex elements first\n for (const { el, tabindex } of positiveTabindex) {\n tabOrderItems.push(getElInfo(el, tabindex));\n }\n\n // Add zero tabindex elements (DOM order)\n for (const el of zeroTabindex) {\n tabOrderItems.push(getElInfo(el, 0));\n }\n\n // Add negative tabindex elements (not tabbable, noted for reference)\n for (const el of negativeTabindex) {\n const info = getElInfo(el, -1);\n info.index = -1; // Mark as not in tab order\n orderIndex--; // Don't count these in the order\n tabOrderItems.push(info);\n }\n\n return {\n totalFocusable: allFocusable.length,\n tabbable: positiveTabindex.length + zeroTabindex.length,\n notTabbable: negativeTabindex.length,\n tabOrder: tabOrderItems,\n warnings,\n };\n}\n\n// ========== Helpers ==========\nfunction getClassList(el: Element): string[] {\n if (!el.className || typeof el.className !== 'string') return [];\n return el.className.trim().split(/\\s+/).filter(c => !c.startsWith('di-'));\n}\n\nfunction getAttributes(el: Element): Record<string, string> {\n const attrs: Record<string, string> = {};\n for (const attr of Array.from(el.attributes)) {\n if (!attr.name.startsWith('di-')) attrs[attr.name] = attr.value;\n }\n return attrs;\n}\n\n// ========== Feature 9: list_assets tool ==========\nfunction listAssetsTool(): unknown {\n const images: Array<{ src: string; alt: string; width: number; height: number; format: string }> = [];\n const svgs: Array<{ selector: string; viewBox: string; width: number; height: number }> = [];\n const backgroundImages: Array<{ selector: string; url: string }> = [];\n\n // <img> elements\n document.querySelectorAll('img').forEach(img => {\n if (isInspectorElement(img)) return;\n const src = img.src || img.getAttribute('data-src') || '';\n if (!src) return;\n const ext = src.split('?')[0].split('.').pop()?.toLowerCase() || '';\n images.push({\n src,\n alt: img.alt || '',\n width: img.naturalWidth || img.width || 0,\n height: img.naturalHeight || img.height || 0,\n format: ext,\n });\n });\n\n // <svg> elements\n document.querySelectorAll('svg').forEach((svg) => {\n if (isInspectorElement(svg)) return;\n svgs.push({\n selector: getSelector(svg),\n viewBox: svg.getAttribute('viewBox') || '',\n width: parseInt(svg.getAttribute('width') || '') || Math.round(svg.getBoundingClientRect().width),\n height: parseInt(svg.getAttribute('height') || '') || Math.round(svg.getBoundingClientRect().height),\n });\n });\n\n // CSS background images\n const allEls = document.querySelectorAll('*');\n const limit = Math.min(allEls.length, 500);\n for (let i = 0; i < limit; i++) {\n const el = allEls[i];\n if (isInspectorElement(el)) continue;\n const cs = window.getComputedStyle(el);\n const bgImage = cs.backgroundImage;\n if (bgImage && bgImage !== 'none') {\n const urlMatch = bgImage.match(/url\\([\"']?([^\"')]+)[\"']?\\)/);\n if (urlMatch && urlMatch[1] && !urlMatch[1].startsWith('data:')) {\n backgroundImages.push({\n selector: getSelector(el),\n url: urlMatch[1],\n });\n }\n }\n }\n\n return {\n images: images.slice(0, 50),\n svgs: svgs.slice(0, 30),\n backgroundImages: backgroundImages.slice(0, 30),\n };\n}\n\n// ========== Feature 10: export_bug_report tool ==========\nfunction exportBugReportTool(format?: string): unknown {\n const items = state.selectedElements;\n const bugCtx = getBugContext();\n const fmt = format || 'markdown';\n\n switch (fmt) {\n case 'github':\n return { format: 'github', text: toGitHubIssue(items, bugCtx) };\n case 'linear':\n // Linear uses similar markdown format\n return { format: 'linear', text: toGitHubIssue(items, bugCtx) };\n case 'bug-report':\n return { format: 'bug-report', text: toBugReport(items, bugCtx) };\n case 'markdown':\n default:\n return { format: 'markdown', text: toMarkdownFn(items, state.outputMode) };\n }\n}\n", "import { state, addSelection, addThreadMessage, setAnnotationIntent, createAnnotationMeta } from './core';\nimport { INTENT_OPTIONS, SEVERITY_OPTIONS } from '../shared/constants';\nimport type { AnnotationIntent, AnnotationSeverity } from '../shared/types';\n\nlet popupEl: HTMLElement | null = null;\nlet currentTarget: Element | null = null;\nlet shadowRoot: ShadowRoot;\n\nexport function initInlinePopup(sr: ShadowRoot): void {\n shadowRoot = sr;\n}\n\nexport function showInlinePopup(target: Element): void {\n currentTarget = target;\n\n // Remove existing popup\n hideInlinePopup();\n\n // Create popup\n popupEl = document.createElement('div');\n popupEl.className = 'di-inline-popup';\n\n const rect = target.getBoundingClientRect();\n\n // Intent buttons\n const intentBtns = INTENT_OPTIONS.map(o =>\n `<button class=\"di-ip-intent\" data-intent=\"${o.value}\" title=\"${o.label}\">${o.icon}</button>`\n ).join('');\n\n // Severity buttons\n const severityBtns = SEVERITY_OPTIONS.map(o =>\n `<button class=\"di-ip-severity\" data-severity=\"${o.value}\" data-color=\"${o.color}\">${o.label}</button>`\n ).join('');\n\n popupEl.innerHTML = `\n <div class=\"di-ip-intents\">${intentBtns}</div>\n <div class=\"di-ip-severities\">${severityBtns}</div>\n <div class=\"di-ip-input-row\">\n <input type=\"text\" class=\"di-ip-input\" placeholder=\"Add a note (Enter to confirm)\" autofocus>\n <button class=\"di-ip-submit\">\u2713</button>\n </div>\n <div class=\"di-ip-hint\">Enter: Add with note | Esc: Add without note</div>\n `;\n\n shadowRoot.appendChild(popupEl);\n\n // Position popup below the element\n const popupW = 260;\n let left = rect.left + rect.width / 2 - popupW / 2;\n let top = rect.bottom + 6;\n\n // Keep within viewport\n if (left < 8) left = 8;\n if (left + popupW > window.innerWidth - 8) left = window.innerWidth - popupW - 8;\n if (top + 100 > window.innerHeight) top = rect.top - 100;\n\n popupEl.style.left = left + 'px';\n popupEl.style.top = top + 'px';\n\n // Bind events\n let selectedIntent: AnnotationIntent | undefined;\n let selectedSeverity: AnnotationSeverity | undefined;\n\n popupEl.querySelectorAll('.di-ip-intent').forEach(btn => {\n btn.addEventListener('click', (e) => {\n e.stopPropagation();\n const val = (btn as HTMLElement).dataset.intent as AnnotationIntent;\n if (selectedIntent === val) {\n selectedIntent = undefined;\n popupEl!.querySelectorAll('.di-ip-intent').forEach(b => b.classList.remove('active'));\n } else {\n selectedIntent = val;\n popupEl!.querySelectorAll('.di-ip-intent').forEach(b => b.classList.remove('active'));\n btn.classList.add('active');\n }\n });\n });\n\n popupEl.querySelectorAll('.di-ip-severity').forEach(btn => {\n btn.addEventListener('click', (e) => {\n e.stopPropagation();\n const val = (btn as HTMLElement).dataset.severity as AnnotationSeverity;\n const color = (btn as HTMLElement).dataset.color!;\n if (selectedSeverity === val) {\n selectedSeverity = undefined;\n popupEl!.querySelectorAll('.di-ip-severity').forEach(b => {\n b.classList.remove('active');\n (b as HTMLElement).style.cssText = '';\n });\n } else {\n selectedSeverity = val;\n popupEl!.querySelectorAll('.di-ip-severity').forEach(b => {\n b.classList.remove('active');\n (b as HTMLElement).style.cssText = '';\n });\n btn.classList.add('active');\n (btn as HTMLElement).style.cssText = `background:${color}20;border-color:${color};color:${color}`;\n }\n });\n });\n\n const input = popupEl.querySelector('.di-ip-input') as HTMLInputElement;\n const submitBtn = popupEl.querySelector('.di-ip-submit') as HTMLButtonElement;\n\n function submit() {\n const comment = input.value.trim();\n addElementWithComment(comment, selectedIntent, selectedSeverity);\n }\n\n input.addEventListener('keydown', (e) => {\n e.stopPropagation(); // Prevent inspector shortcuts\n if (e.key === 'Enter') {\n e.preventDefault();\n submit();\n } else if (e.key === 'Escape') {\n e.preventDefault();\n addElementWithComment('', selectedIntent, selectedSeverity);\n }\n });\n\n submitBtn.addEventListener('click', (e) => {\n e.stopPropagation();\n submit();\n });\n\n // Focus input\n requestAnimationFrame(() => input.focus());\n}\n\nfunction addElementWithComment(comment: string, intent?: AnnotationIntent, severity?: AnnotationSeverity): void {\n if (!currentTarget) return;\n\n const meta = createAnnotationMeta();\n if (comment) meta.note = comment;\n if (intent) meta.intent = intent;\n if (severity) meta.severity = severity;\n\n addSelection({\n ...meta,\n type: 'element', el: currentTarget,\n selector: '', smartSelector: '', tagName: '', classes: '',\n boundingBox: '', textContent: '', hierarchy: [],\n computedStyles: [], extendedStyles: {},\n });\n\n hideInlinePopup();\n currentTarget = null;\n}\n\nexport function hideInlinePopup(): void {\n if (popupEl && popupEl.parentNode) {\n popupEl.remove();\n }\n popupEl = null;\n}\n\nexport function isInlinePopupVisible(): boolean {\n return popupEl !== null;\n}\n"],
|
|
5
|
+
"mappings": "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AAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;A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",
|
|
6
|
+
"names": ["shadowRoot", "getReactInfo", "onKeyDown", "shadowRoot", "getHierarchy", "fiber", "comp", "resolve", "parseColor", "relativeLuminance", "node", "rgbToHex", "node", "parseColor", "rgbToHex", "resolve", "shadowRoot", "panelEl"]
|
|
7
|
+
}
|